iPhoneでショートカットappを使って、safariからYouTubeをダウンロードする
こんにちは、この記事が初のpythonを習いたての大学生です。
個人的な興味で題のようなものを作成したくなり、作るにあたってpythonを使用してみました。
使う際は当然自己責任でお願いします。
その中で躓いた点について、同じようなことをしようとしている、同じようなプログラミングレベルの人の役に立てばと思います。
プログラミングのぷの字に触れたばかりの人間ですので、コードが汚いだとか、例外処理がとかはご勘弁を
動作環境について
自分の確認している環境はiphone Xs ios17.1.2 a-shell ver1.12.5です。
それ以外の環境だったりはよくわからないので悪しからず
使用手順
まず最初に作ったものの使い方から。
1.「a-Shell」のインストール、設定等
今回の方法では「a-Shell」というアプリを使用します。ので、ダウンロード
2.「MyYt_dlpUseFfmpeg.py」、実行ショートカットの作成
その後、以下のurlのショートカットを実行して、~/DocumentsにMyYt_dlpUseFfmpeg.pyを作ります。
※24/1/7更新
その後、以下のurlのショートカットを入れて、youtubeの共有マークから、「Yt-dlp」を押してダウンロードします。
3.使用の際のオプション
「Yt-dlp」を使うと下のように選択するようでる。
現在は画像とは少し変わっていて
- オーディオファイル(mp3)
いっちゃん音質のいいものをmp3でダウンロード - オーディオファイル(opus)
いっちゃん音質のいいものをopusでダウンロード(わからなければ使わない方がいい) - 720p,mp4(h264,mp4a)
720pの動画を、30fps以下になるようにmp4でダウンロード - 最高画質,音質のmp4(h264,mp4a)
名前の通り、 - 最高画質,音質のmp4(vp9,opus)
非推奨
opus以外はサムネイル付きで、Fileアプリの、このiPhone内/a-Shellにダウンロードされます。
「a-Shell」について
iOS上でシンプルなUnixライクな端末を使える。コマンド解釈にios_systemを使用するそう。
cを使ったものに関しては外から入れても動かないようですが、ffmpegに関しては要望が多かったのか、専用にチューニングしたものが最初から入っているようです。ので、今回pythonで使うためにラッパーである「ffmpeg-python」を入れていますが、ffmpeg本体は追加でインストールする必要はないです(.wasmで入れなきゃいけないなどと書かれているのは昔の話です)。
参考:https://github.com/holzschu/a-shell/issues/8#issuecomment-923821182
pythonで実行するわけ
ここからは作るにあたって躓いた点について書き残す、メモとなります。
まず、「a-Shell」の存在を知り、Yt-dlpで直接スマホでyoutubeをダウンロードできるんじゃ?となり、いつもターミナルで実行している文を入れてみると、「--embed-thumbnail」がうまく動作せず、毎回別れたままになってしまいました。
※「--embed-thumbnail」:サムネイルをyoutubeから取ってきて動画にくっつける
また、youtubeのタイトルをそのまま動画ファイルのタイトルにすると、保存するとき「/」で勝手にホルダーを作ってしまうなどの不便さがありました。
そこで、複数行にわたっての実行を試す際、実行結果の変数への入れ方がどうにも分かりませんでした(以下は試した)。
x=$(~~)
ので、pythonの実行ファイルを作って、それをa-shellから実行するという形をとりました。
「MyYt_dlpUseFfmpeg.py」の中身
以下の順で実行しています。
- 1.Yt_dlpのpythonWrapperを使ってタイトルの取得
- 2.Yt_dlpでsubprocessを使ってサムネのダウンロード
- 3.Yt_dlpのpythonWrapperで動画orオーディオのダウンロード
- 4.(audioのみ)ffmpegのpythonWrapperでwebm→mp3
- 5.ffmpegのpythonWrapperでサムネと動画を合体
1.Yt_dlpのpythonWrapperを使ってタイトルの取得
Yt_dlpを使って(参考①)タイトルの取得を取得して、入ると困る文字列を他の文字に置き換えて(参考②)います。
Yt_dlpのpythonでの実行の仕方は、③のサイトでやりたいことのオプションを作って、①のサイトの「利用可能なオプション」を使ってpythonのコードにします。
④でダウンロードしたものの拡張子を表示するための「.extract_info」を見つけました。
※なぜか、サムネのダウンロードだけで「'」が無視されることがわかりました。
具体的には、サムネのダウンロード時にファイル名に「'」を使おうとするとこれが消えます。
9/10の更新で問題は多分解決しています
参考にしたサイト
①https://note.com/note_fumi/n/n72b755dac88a
②https://www.kabegiwablog.com/entry/2018/06/25/100000
③https://vlike-vlife.netlify.app/posts/cli_yt-dlp
2.Yt_dlpでsubprocessを使ってサムネのダウンロード
※2023/4/11に追加、変更した項目
どうやらmp3にffmpegでサムネをつける際にはwebpではいけないようです。
mp4にはwebpのままで大丈夫なので、何で何だろう、、、
その際に「--convert-thumbnails 」を使いたいんだけど、Wrapperで見つからなかったので、ここだけsubprocessで実行してます。
(前回の内容だとダウンロードしたサムネがwebp以外だとエラーになってしまうので、jpgに固定するための変更)
参考にしたサイト
https://lightrun.com/answers/ytdl-org-youtube-dl-how-can-i-download-thumbnails-in-pngjpg-format-
3.Yt_dlpのpythonWrapperで動画orオーディオのダウンロード
1.と同じサイトを参考にダウンロード用のものを作ってます。
下のサイトでダウンロードしたものの拡張子を表示するための「.extract_info」を見つけました。
参考にしたサイト
https://diy-programming.site/youtube/download/
4.Yt_dlpのpythonWrapperで動画orオーディオのダウンロード
名前の通り。「overwrite_output=True」は上書きokかどうか
「**{'qscale:a': 1}」は音の品質みたいな、、、
参考にしたサイト
https://github.com/kkroening/ffmpeg-python
5.ffmpegのpythonWrapperでサムネと動画を合体
名前の通り。「overwrite_output=True」は上書きokかどうか
ショートカットにて
特段何もしてないですが、一応。
1つ目のショートカットは、テキストに「MyYt_dlpUseFfmpeg.py」の内容を書いて、テキストファイルを作成しているだけです。qiitaにファイルをあげる機能がない?のかなと思い、こうしました。
2つ目のショートカットは、ただ単に「MyYt_dlpUseFfmpeg.py」を実行しているだけです。
あと、~/Documents/trachの中に一時ファイルを溜め込んで最後に消しています。
youtubeに対策されたのか、動かなくなることがある件について
この前、HTTP Error 403: Forbidden
とか言って、動かなくなることがありました。
多分ですがyoutubeが拒否していたのかなと思います。
既にyt-dlpが対応しているので、アップデートしたら動くようになります。
「a-Shell」アプリを開いて
pip install -U yt-dlp
を実行し、念の為「a-Shell」アプリを再起動。そのあとは普通に使えるようになるかと思います。
それで同じようにダメな場合、全く別の原因か、まだyt-dlpが対応できていないかだと思うので、しばらく待ちましょう。
https://github.com/yt-dlp/yt-dlp/issues/7984
更新履歴
※2024/1/7
かなり大幅に変更
内容は、コメントに全て書いてしまったので、気になる人は探してみてください
※2023/9/14
- 「MyYt_dlpUseFfmpeg.py」をダウンロードし直してください。
- 「a-Shell」でコマンド
pip install Pillow
を実行してください - 9/10のバグがまだちょっと残っていたので、変更
- 音楽ファイルの時、サムネを正方形にしました。
※2023/9/10
- バグを見つけたので本当に少し手直し、「MyYt_dlpUseFfmpeg.py」の中身の「1」に記述
- yt-dlpの更新についてを追加、この記事の一番最後に追加しました。
※2023/4/11
- 使用手順の1のショートカットを変更しました。2つ目のショートカットはそのまま使えます。
- 内容は「MyYt_dlpUseFfmpeg.py」の中身の「2」です。