@@ -70,7 +70,7 @@ def apply_pixel_to_ascii_strategy(self, pixel):
7070 def apply_end_line_modifier (self , msg ):
7171 return msg
7272
73- def render (self , cap , output = None , with_audio = False ):
73+ def render (self , cap , output = None , output_format = None , with_audio = False ):
7474 """
7575 Iterate each video frame to print a set of ascii chars
7676
@@ -114,9 +114,11 @@ def render(self, cap, output=None, with_audio=False):
114114
115115 if output is not None :
116116 file = open (output , 'w+' )
117- file .write ("#!/bin/bash \n " )
118- file .write ("echo -en '\033 [2J' \n " )
119- file .write ("echo -en '\u001b [0;0H' \n " )
117+
118+ if output_format == 'sh' :
119+ file .write ("#!/bin/bash \n " )
120+ file .write ("echo -en '\033 [2J' \n " )
121+ file .write ("echo -en '\u001b [0;0H' \n " )
120122
121123 time_delta = 1. / fps
122124 counter = 0
@@ -158,11 +160,27 @@ def render(self, cap, output=None, with_audio=False):
158160 print ("\u001b [2A" )
159161 else :
160162 print ("\x1b [2A" )
161- resized_frame = self .resize_frame (frame )
162- msg = self .convert_frame_pixels_to_ascii (resized_frame , new_line_chars = True )
163- file .write ("sleep 0.033 \n " )
164- file .write ("echo -en '" + msg + "'" + "\n " )
165- file .write ("echo -en '\u001b [0;0H' \n " )
163+
164+ if output_format == 'sh' :
165+ resized_frame = self .resize_frame (frame )
166+ msg = self .convert_frame_pixels_to_ascii (resized_frame , new_line_chars = True )
167+ file .write ("sleep 0.033 \n " )
168+ file .write ("echo -en '" + msg + "'" + "\n " )
169+ file .write ("echo -en '\u001b [0;0H' \n " )
170+ elif output_format == 'json' :
171+ # scale each frame according to terminal dimensions
172+ resized_frame = self .resize_frame (frame , (cols , rows ))
173+ msg = self .convert_frame_pixels_to_ascii (resized_frame , (cols , rows ), new_line_chars = True )
174+ lines = msg .split ("\n " )
175+ # remove last line breaks (\n\r) which generate two extra unwanted array elements
176+ lines = lines [0 :- 2 ]
177+ # opening brackets
178+ file .write ("[[\n " if counter == 0 else ",[\n " )
179+ for i in range (len (lines )):
180+ file .write (f"\" { lines [i ]} \" " )
181+ # closing brackets
182+ file .write ("]\n " if i == (len (lines ) - 1 ) else ",\n " )
183+
166184 counter += 1
167185 if with_audio :
168186 stream .close ()
@@ -172,6 +190,10 @@ def render(self, cap, output=None, with_audio=False):
172190 else :
173191 os .system ('cls' ) or None
174192
193+ # close the frame array
194+ if output is not None and output_format == 'json' :
195+ file .write (f"]\n " )
196+
175197 def build_progress (self , progress , total ):
176198 """Build a progress bar in the terminal"""
177199 progress_percent = int (progress / total * 100 )
0 commit comments