#author("2022-12-04T17:35:47+09:00","default:yakumo_murakami","yakumo_murakami") #author("2022-12-04T17:36:18+09:00","default:yakumo_murakami","yakumo_murakami") [[今さらPython]] おうちの雑品スクリプトの第二弾、video2mp4 をpython化します。 まず、元のRuby版はこんな感じ。 #contents * Ruby版 [#x049960a] #!/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化すると……。 *Python版 [#qee4d258] #!/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ではモジュールのimportなしで動いていた'' 点ね。~ ここは正直いって ''Pythonの欠点'' だと思うけど、それは日本語と米語どっちが優れてるか、みたいな話でそもそも意味がない。そこは「 ''別の言語だから'' 」と気にしない事ね。 * 機能解説 [#je9e67c8] ** 必要な機能 [#f1d3cb29] 必要な機能は以下の通り。 *** 引数の処理(sys.argv) [#sa3538c7] sys.argvを使い、for i in に噛ませる。 *** ファイル診断(re.compile+re.search) [#d2c30f74] 引数で指示したやつの中で、webm(ネットで拾ったやつに多い)、avi(アクションカメラ1号)、mov(アクションカメラ2号)、mkv(古い動画類)が対象。~ re.compileでパターンを作っておいて、searchで確認する。 *** 変換先ファイル名の作成(re.sub) [#r7d9bed5] re.compileで作ったパターンを利用し、re.subで変換する。 *** 変換先ファイルがあるか?(os.path.isfile) [#h7b995ba] os.path.isfile を使う。~ 実際には「ファイルがない時」なので、 ''not'' を手前にかませる。 *** ffmpegの実行 [#l046a8c6] *** ffmpegの実行(subprocess.run) [#l046a8c6] subprocess.run(文字列, shell=True)で実行。