YouTubeからopusで正方形のサムネ付きでダウンロード(Download from YouTube with square thumbnails in opus)

題名の通りです。
今まで、opusではサムネをつけられないと思っていて、mp3にわざわざ変えていたのですが、やっとどうにかする方法を見つけました。
```
yt-dlp -x -f "bestaudio[acodec=opus]" "url" --embed-thumbnail --convert-thumbnails jpg --exec-before-download "ffmpeg -i %(thumbnails.-1.filepath)q -vf crop=\"'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\" _%(thumbnails.-1.filepath)q" --exec-before-download "rm %(thumbnails.-1.filepath)q" --exec-before-download "mv _%(thumbnails.-1.filepath)q %(thumbnails.-1.filepath)q"
```
長いので、改行すると
```
yt-dlp -x -f "bestaudio[acodec=opus]" "url" --embed-thumbnail --convert-thumbnails jpg 
--exec-before-download "ffmpeg -i %(thumbnails.-1.filepath)q -vf crop=\"'if(gt(ih,iw),iw,ih)':'if(gt(iw,ih),ih,iw)'\" _%(thumbnails.-1.filepath)q" 
--exec-before-download "rm %(thumbnails.-1.filepath)q" 
--exec-before-download "mv _%(thumbnails.-1.filepath)q %(thumbnails.-1.filepath)q"
```
結局ffmpegで埋め込む方法も、opusencで埋め込む方法もわからなかったです。
ので、後からくっつける方法が分からずじまい、、、
おおよそ[ここ](https://github.com/yt-dlp/yt-dlp/issues/980)にお世話になりました。
mp3の時とは違うらしくmp3では[ここ](https://github.com/yt-dlp/yt-dlp/issues/429)にやり方があります。

---
### Pythonで使う。
自分はpythonから使うので、そのために色々いじりました。結果以下のようになりました。
```
def getTitle(url):
    from youtubesearchpython import Video
    ydl_audio_opts = {
        'noplaylist': 'True',
        'nocheckcertificate': 'True'}
    replaceList={' ' : '_',
                 '　' : '_',
                 ':' : '-',
                 '[' : '「',
                 ']' : '」',
                 '/' : '／',
                 '\n': ''}
    title=Video.getInfo(url)["title"]
    for key, value in replaceList.items():
        title=title.replace(key, value)
    print("getTitle Done")
    return title

def download_opus(url,path,title):
    import subprocess
    script=f"yt-dlp -x -f 'bestaudio[acodec=opus]' --no-check-certificate --no-playlist -o '{path}/{title}.%(ext)s' '{url}' "\
    "--embed-thumbnail --convert-thumbnails jpg --exec-before-download "\
    "\"ffmpeg -y -i %(thumbnails.-1.filepath)q -vf crop=\\\"'if(gt(ih,iw),iw,ih)' : 'if(gt(iw,ih),ih,iw)'\\\" %(thumbnails.-1.filepath)q\""
    devnull = open('/dev/null', 'w')
    subprocess.run(script, stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True, executable="/bin/zsh")
```

前半の`getTitle`は、youtubesearchpythonというやつを使っていて、入れたくない文字を辞書型にして消しています。
特に困ったことなく適当に作れました。一応[ここ](http://ms.cocolog-nifty.com/ms/2021/06/post-5072de.html)を参考にしました。

後半の`download_opus`は大変でした。
まず、`ffmpeg~`の部分で、このページの一番上に書かれている、他サイトからのコピペは、
1. 変換後ファイルを名前を変えて作成
1. 変換前ファイルを削除
1. 変換後ファイルの名前を変換前ファイルと同じに   

とやっていて、これが無駄に感じたので、`-y`のオプションで上書き保存するようにして、解決

次に、`subprocess.run`の`executable="/bin/zsh"`ですが、macではshellにzshを使用するので、これに設定
見た感じ、winのshと文法(特に`"`と`'`らへん)が違うようなので、winでは動かないかもですが、自分はwinを持っていなので、、、
[参考にしたサイト](https://stackoverflow.com/questions/46781136/syntax-error-near-unexpected-token-when-using-multiple-input-streams-from-zc)

また、上から変えたところとして、一番自分でもよくわかっていないのが、`\`によるエスケープシーケンスです
2重にエスケープシーケンスしなければならないことに気づくまで結構かかりました。
割と色々試してやっと上手くいった感じですので、説明はできかねます。まあ、ただの大学生なので、多めに見てください



サムネは自分のmac環境だとfoobar2000モバイルで表示されました。普通のは試してません。
他に表示できるアプリがありましたら教えてほしいです。
ちなみにwebmはサムネイル非対応とどこかに書いてありました。
手元にあるopusに手元にあるjpgをくっつける方法がわかる人は教えていただければと思います,,,