Result of the scripts
watch this at full resolution (full HD), or you will not see anything :)
notes for me and whoever might find this interesting
the logo is using the 'ascii' font JS Cursive, slightly modified on the 'n'
__ __, ,_ _ __, __ _ , _(_,_(_/(__/ (__/ (_(_/(__(_/__(/__/_)_ _/_ (/
that's a nice way to display other fonts in the terminal; see resources for links
to retrieve the file information, i used ffprobe, it dumps a lot of info
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'carnages_creamy_patterns.mov': Metadata: major_brand : qt minor_version : 512 compatible_brands: qt encoder : Lavf56.40.101 Duration: 01:39:01.03, start: 0.000000, bitrate: 200411 kb/s Stream #0:0(eng): Video: qtrle (rle / 0x20656C72), rgb24, 1920x1080, 200408 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc (default) Metadata: handler_name : DataHandler encoder : Lavc56.60.100 qtrle
for the credits, i just used the Stream #0:0, reformated as a tabbed list
other info comes from the file browser (nemo in my case)
here comes the interesting part!
the process requires a minimum of text editing: just create a media_*.py file containing the required vars (with correct types)
example of media info file
from styler import * filename = style("b|yellow") + "carnages_teeny_black.mkv [#6]" + style("") t_date= "date: " + style("b") + "20171019" + style("") t_size= "size: " + style("b") + "2.507.349.390 bytes" + style("") t_duration= "duration: " + style("b") + "00:08:16.8" + style("") t_author = "author:" + style("b") + "françois zajéga" + style("") t_credits = title font: JS Cursive By Joan Stark t_stream = stream #0:0(eng): video: mjpeg yuvj444p(pc, bt470bg/unknown/unknown) 1920x1080 SAR 1:1 DAR 16:9 25 fps 25 tbr 1k tbn 1k tbc (default) encoder: Lavc56.60.100 libx264 t_input= source: width: 1024 height: 544
content of the video here above
the imported script comes from TerminalStyler
the animation is done via another python script:
import os import sys import time from styler import * mediainfo = __import__( str( sys.argv[1] )[:-3], fromlist=["*"] ) ############# config ############# margin = (4,10) logo = __ __, ,_ _ __, __ _ , _(_,_(_/(__/ (__/ (_(_/(__(_/__(/__/_)_ _/_ (/ ret = style("_n") t_mtop = style("_n" + str( margin[0] ) ) t_mlef = style("_s" + str( margin[1] ) ) logo_margined_y = style("_n" + str( margin[0] ) + "|cyan" ) + margin_left( logo, margin[1] ) + style("") logo_margined_w = style("_n" + str( margin[0] ) ) + margin_left( logo, margin[1] ) + style("") credits_margined = margin_left( mediainfo.t_credits, margin[1] ) stream_margined = margin_left( mediainfo.t_stream, margin[1] ) input_margined = margin_left( mediainfo.t_input, margin[1] ) ############# frames ############# frames = [] frames.append( [t_mtop, 4] ) for i in range( 0, 5 ): if i % 2 == 0: frames.append( [logo_margined_w, 0.1] ) else: frames.append( [logo_margined_y, 0.15] ) frames.append( [style("_n" + str( margin[0] + 8 )), 0.1] ) frames.append( [logo_margined_y, 0.5] ) frames.append( [ logo_margined_y + ret + t_mlef + mediainfo.filename + ret + t_mlef, 1] ) authinfo = ret + t_mlef + mediainfo.t_date + ret + t_mlef + mediainfo.t_size + ret + t_mlef + mediainfo.t_duration + ret + t_mlef + mediainfo.t_author for i in range( linecount(stream_margined) ): frames.append( [ logo_margined_y + ret + t_mlef + mediainfo.filename + ret + ret + lines( authinfo, 0, i ), 0.05] ) frames.append( [ logo_margined_y + ret + t_mlef + mediainfo.filename + ret + ret + authinfo + ret, 5] ) techinfo = stream_margined + ret + input_margined for i in range( linecount(stream_margined) ): frames.append( [ logo_margined_y + ret + t_mlef + mediainfo.filename + ret + ret + lines( techinfo, 0, i ), 0.05] ) frames.append( [ logo_margined_y + ret + t_mlef + mediainfo.filename + ret + ret + techinfo, 3] ) frames.append( [ logo_margined_y + ret + t_mlef + mediainfo.filename + ret + ret + techinfo + ret + credits_margined, 2] ) ############# animation ############# for i in frames: os.system('clear') print( i[0] ) sys.stdout.write( t_mlef ) sys.stdout.flush() time.sleep( i[1] )
Once all frames are packed, we just have to loop over them and print the text. Lines sys.stdout allows to offset the cursor by the left margin.
online identity ∋ [ social ∋ [mastodon♥, twitter®, facebook®, diaspora, linkedin®]
∥ repos ∋ [github®, gitlab♥, bitbucket®, sourceforge] ∥ media ∋ [itch.io®, vimeo®, peertube♥, twitch.tv®, tumblr®] ∥ communities ∋ [godotengine♥, openprocessing, stackoverflow, threejs]]