おうちの雑品スクリプトの第二弾、video2mp4 をpython化します。 まず、元のRuby版はこんな感じ。
#!/usr/bin/ruby album = "default" artist = "default" ARGV.each{|f| if f =~ /\-(album|artist)/ if f =~ /\-album=(.+)$/i album = $1.clone elsif f =~ /\-artist=(.+)$/i artist = $1.clone end next end p f if File.exist?(f) == true && f =~ /\.(mkv|webm|avi|mov)$/i ofn = f.gsub(/\.(mkv|webm|avi|mov)$/i,".mp4") p ofn if f != ofn && File.exist?(ofn) == false Dir.mkdir("mp4") if File.exist?("mp4") == false system("ffmpeg -i \"#{f}\" -y -metadata ALBUM=\"#{album}\" -metadata ARTIST=\"#{artist}\" \"mp4/#{ofn}\"") else p "Exist #{ofn}" end else p "Not Exist #{f}" p "Exist" if File.exist?(f) == true p "ExistOK" if f =~ /\.(ogv|mkv|webm|avi|mov)$/i end }
ふむふむ。
メタ情報いじってるのは歴史的経緯で、今は使ってないのでこの機会に取っ払いましょうか。
他にもいくつか、今は不要なのを消します。
さて、これをpython化すると……。
#!/usr/bin/python3 import os import re import subprocess import sys p = re.compile(r'\.(avi|mov|mkv|webm)$',flags=re.IGNORECASE) for i in sys.argv: if(p.search(i) != None): j = re.sub(p,'.mp4',i) if(not os.path.isfile(j)): print("不在:"+j) x = "nice -n 20 ffmpeg -i \""+i+"\" \""+j+"\"" subprocess.run(x,shell=True)
うん、最低限の機能だけ載せたら、めっちゃスッキリしたわね。
興味深いのは、Rubyでは追加モジュールなしで動いていた点ね。
ここは正直いって **Pythonの欠点** だと思うけど、それは日本語と米語どっちが優れてるか、みたいな話でそもそも意味がない。そこは「別の言語だから」と気にしない事ね。
必要な機能は以下の通り。
sys.argvを使い、for i in に噛ませる。
引数で指示したやつの中で、webm(ネットで拾ったやつに多い)、avi(アクションカメラ1号)、mov(アクションカメラ2号)、mkv(古い動画類)が対象。
re.compileでパターンを作っておいて、searchで確認する。
re.compileで作ったパターンを利用し、re.subで変換する。
os.path.isfile を使う。
実際には「ファイルがない時」なので、 **not** を手前にかませる。
subprocess.run(文字列, shell=True)で実行。