今さらPython

おうちの雑品スクリプトの第二弾、video2mp4 をpython化します。 まず、元のRuby版はこんな感じ。

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化すると……。

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ではモジュールのimportなしで動いていた 点ね。
ここは正直いって Pythonの欠点 だと思うけど、それは日本語と米語どっちが優れてるか、みたいな話でそもそも意味がない。そこは「 別の言語だから 」と気にしない事ね。

機能解説

必要な機能

必要な機能は以下の通り。

引数の処理(sys.argv)

sys.argvを使い、for i in に噛ませる。

ファイル診断(re.compile+re.search)

引数で指示したやつの中で、webm(ネットで拾ったやつに多い)、avi(アクションカメラ1号)、mov(アクションカメラ2号)、mkv(古い動画類)が対象。
re.compileでパターンを作っておいて、searchで確認する。

変換先ファイル名の作成(re.sub)

re.compileで作ったパターンを利用し、re.subで変換する。

変換先ファイルがあるか?(os.path.isfile)

os.path.isfile を使う。
実際には「ファイルがない時」なので、 not を手前にかませる。

ffmpegの実行(subprocess.run)

subprocess.run(文字列, shell=True)で実行。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-12-04 (日) 17:36:18