#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)で実行。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS