見出し画像

Pythonista3とショートカットを利用したワンタップYouTubeダウンローダー

リファレンスとかオフラインで音楽聞く用にyoutubeダウンロードしたいなって思ったのでつくった。ネット上のダウンローダーだと詐欺広告のポップアップとか出ていろいろめんどいのでこれならワンタップで済む。

注1:DLした映像はあくまで個人利用まで。転載や悪用はダメ絶対。

注2:Pythonistaをこれのために買うのはもったいないので、恒常的にpythonを使う人か、これから勉強する人(pythonistaだけで勉強するのはあまりお勧めしない)以外には推奨しない

注3:説明用のスクショがiPhoneになったりiPadになったりするけど特に意味はないので無視して

下準備

0.用意するもの

iPhone(iPadでもOK)
Pythonista3 ¥1200

iPhoneでPythonをやるためだけに¥1200も払えるあなたは𝓥𝓮𝓻𝔂 𝓡𝓲𝓬𝓱

1.yt-dlpを使えるようにする

注:Python3.12からdistutilsが廃止されるらしいのでそれに付随してpipを利用すると警告が出るようになっている。distutilsはPythonでパッケージコンテンツを取り扱うときに用いる標準モジュール。これはモジュール開発者側が対応することなので今回は警告されても無視してOK。

今回のプログラムはyt-dlpという外部ライブラリを用いる。yt-dlpのインストールにはpipというパッケージ拡張モジュールが必要。pythonista3の基幹はデフォルトでpython3.1なのでpipが標準搭載されてる。なのでpip自体のインストールにかんしては特になにもしなくてOK。でもiphoneはエンドユーザーに公開されてるコマンドラインがないので、stashっていうライブラリを使ってコマンドラインを作成する必要がある。ややこしいのでいったん整理。

yt-dlp
↓のための
pip
↓のための
コマンドライン
↓のための stash

をインストールしていくよ。

pythonistaを開いたら左下の+ボタンからEmpty Scriptを選択、名前をstashinst.py(名前わかればなんでもOK)にして

import requests as r; exec(r.get('http://bit.ly/get-stash').text)

上のコードをはりつける。

それができたら右上の実行ボタンをおして、

Please Restart Pythonista and run launch_stash.py under the Home directory to start StaSh.

みたいな表示がでたら成功。
いったんpythonistaアプリを落として再起動する。

再起動するとさっき作ったstashinst.pyの同じディレクトリ内にlaunch_stash.pyっていうファイルが生成されているので、それをタップして実行。

そうするとコマンドラインが使えるようになる。

次にコマンドラインに

pip install yt-dlp

と入力。エンターをおすとインストールが始まる。

パッケージを展開できない系のErrorが発生したときはThis iPhone(This iPad)直下のsite-packages-nフォルダ(nは任意の数字)を削除したあと、Pythonistaのアップデートが来てないかを確認するとよい。

パッケージを展開できない例

2.ディレクトリを調べる

つぎに動画のダウンロード先とプログラムの格納先を調べる。iphoneはエクスプローラーやfinderのようにディレクトリの絶対パスを参照できる機能がないのでpyhtonを使って調べていく。

まずは動画のダウンロード先。
ファイルアプリからThis iPhone(This iPad)直下に新しいフォルダを作成(名前はわかればなんでもOK)ここではMAINとつける。フォルダを作成したらpythonistaに戻り、EXTERNAL FILESのOPEN...→Folder...→さっき作ったフォルダを開く。

ファイルアプリ
This iPadの直下
EXTERNAL FILESのOpenから選択

そしたら左下の+ボタンでEmpty Scriptを選択、search_path.py(名前はわか以下ry)を作成する。 作成したpyに以下を張り付け

import os
folder = os.getcwd()
print(folder) 

実行すると

/private/var/mobile/containers/Shared/AppGroup/英数字の羅列/File Provider Storage/さっき作ったフォルダ名

というpathが出てくるのでこれをどっかにメモっとく。


次にプログラムの格納先を調べる。
流れは一緒だけど一つだけ注意点。プログラムの格納先はPyhtonistaのSCRIPT LIBRARYの中に保存すること。後述するがこれの中に作らないと一部の機能が使えなくなって今回のショートカットが作れなくなる。

今回はThis iPhone(This iPad)の中にYTDLというフォルダをつくりここに格納していく。フォルダを作るには右下の+ボタンのNew Folderから。

ファイルアプリから参照できるThis iPadと
Pythonistaから参照できるThis iPadは違うので注意

YTDLの中にsearch_path.pyをつくり、さきほどと同じ

import os
folder = os.getcwd()
print(folder)

を張り付けて実行。

/private/var/mobile/containers/Shared/AppGroup/英数字の羅列/Pythonista3/Documents/YTDL

こっちもどっかにメモしておく。さっきのpathと混じらないように気を付けて。 これでパスの取得は終了。

3.ログファイルの作成

ファイルアプリを開き先ほど作成したMAINフォルダの中にsysを作成する。

作成後にショートカットアプリを開く。新規ショートカットで空テキストを作成。「ファイルを保存」ブロックで空テキストをsysに保存に変更。サブパスにfilelog.txtと入力。上書きにチェックを入れる

保存先を尋ねるのチェックを外すとフォルダを指定できるようになる

実行後にファイルアプリにもどりsysの中にfilelogというファイルが生成されていれば成功。このショートカットは削除してOK

このログファイルは後々重要になる。
これで下準備は完了。いよいよ本丸を構築していく。

Pythonistaでの操作

1.DL.pyの作成

先ほど作成したYTDLフォルダの中にEmpty ScriptでDL.py(名前以下ry)を作成し以下のコードを張り付け

from yt_dlp import YoutubeDL
import clipboard
import os
import glob
import shutil

url = clipboard.get()
ydl_opts = {'format': 'best'}
with YoutubeDL(ydl_opts) as ydl:
    result = ydl.download([url])
    print(result)

here = 'ここにYTDLのパスをはりつけ'

move = 'ここに動画のダウンロード先のパスをはりつけ'

for file in glod.glod(here + "/*.mp4"):
    do = shutil.move(file,move)

url = clipboard.get()でクリップボードの内容を取得

ydl_opts = {'format': 'best'}でダウンロードするときの画質とか音質を指定。今回は最高設定で固定

withの中ででurl先の動画をダウンロード

forの中でダウンロードした動画をhereからmoveのパスに移動する

ちなみにydl_optsのメタデータで保存先を指定する方法もあるのだが、なぜかパスを認識せず動作しなかったので、glodとshutilを用いてダウンロード後にファイルを移動させている。

2.URLの発行

ショートカットアプリからPythonistaでコードを実行するには起動用のURLを発行する必要がある。作成したDL.pyの右上にあるレンチのマークをタップしShortcuts...を開くと一番下の項にPythonista URLというボタンがあるのでそれを押す。

PythonisitaURLの開かれたタブの一番上にCopy URLという項があるので押してCopiedという表示がでたら成功。このURLはSCRIPT LIBRALYの中にあるコードにしか発行できない。一番最初にプログラムの格納をSCRIPT LIBRALY内に作らなければいけなかった理由がこれ。

コピーされたURLはショートカット編で用いるのでどこかにメモっておく。

ショートカットでの操作

1.ショートカットの流れ

初めにフローチャートもどきを書いておくと

クリップボードの内容を参照

YouTubeのリンクである
No→表示「リンクを取得できませんでした」
Yes→DL.pyを実行

MAINフォルダを確認する

新しいファイルが存在する
No→MAINフォルダの確認に戻る
Yes→ファイルの名前を変更

こんな感じになる。ここで問題になるのがMAINフォルダの確認である。 ショートカットには無限回の繰り返しが存在せず有限回でしかスクリプトを繰り返すことができないため複数のショートカットに分割して動作させる必要がある。そこで今回は3つのショートカットを作成していく。

・Localizer
実行役
リンクの検出

・file searcher
ダウンロードした動画を検出

・name change
ダウンロードした動画の名前を変更

上のショートカットが下のショートカットを参照するので作成する順番は逆になる。では早速name changeを作る。

2.name changeの作成

注:ショートカットのバグなのか、たまに紐づけがうまくいかないことがあるのでスクショ通りの紐づけができないときはいったんアプリを落として再起動すると大概うまくいく。

スクショを参考にしてGUIブロックを構築
ショートカットの引数の種類を変更するには長押し、変数の種類を変更するには一回タップで出来る

含むではなく等しいにしてしまうと摘出できないので注意

GUIブロックの種類(上から順)
フォルダの内容を取得
ファイルにフィルタを適用
各項目を繰り返す
 名前を取得
 入力を要求
 ファイルの名前を変更
繰り返しの終了

動作内容の説明
初めにMAINフォルダの内容を取得する。

次に取得した内容から[]を名前に含むファイルを選別する。これはyt-dlpでダウンロードした動画ファイルはファイル名末尾に"[動画ID]"をふくむため。

摘出したファイルの名前を取得して、「テキストを要求」の表示枠に張り付ける。これによりユーザーはなんの動画かを認識してファイルに名前を付けれるようになる。

最後にユーザーから受け取った名前にファイルの名前を変更する。

これを適合するファイルすべてに繰り返すために「各項目を繰り返し」で囲む。これで複数の動画をダウンロードした場合でも名前を変更できる。

これでname changeは完成。

3.file searcherの作成

スクショを参考にしてGUIブロックを構築

GUIブロックの種類(上から順)
フォルダの内容を取得
入力からテキストを取得
テキストを結合
フォルダからファイルを取得
入力からテキストを取得
If文
 ショートカットを実行
その他の場合
 ショートカットを実行
If文の終了

動作内容の説明
MAINフォルダの内容を取得する。

取得したフォルダ内容(つまりディレクトリ構造)をテキストに変換し、改行で結合する。こうすることで改行リストを作成することができる。

次に、下準備で作成したfilelog.txtをテキストとして取得する。filelogにはMAINのディレクトリ構造を格納する。これは最後のLocalizerで記述する。

先ほど作った改行リストとfilelogに格納されたテキストを比較し、一致するならまだファイルのダウンロードが終わっていないということなので、自身を実行しMAINフォルダの監視を続ける(自分自身を実行することにより疑似的に無限回の繰り返しを再現している)

ディレクトリ構造が一致しなくなったとき、新たなファイルが生成されたということになるので先ほど作ったnamge changeを起動する。

これでfile searcherも完成。

4.Localizerの作成

スクショを参考にしてGUIブロックを構築

GUIブロックの種類(上から順)
フォルダの内容を取得
入力からテキストを取得
テキストを結合
ファイルを保存
If文
 URLを開く
 ショートカットを実行
その他の場合
 If文
  URLを開く
  ショートカットを実行
 その他の場合
  テキスト
  結果を表示
  ショートカットを実行
 If文の終了
If文の終了

動作内容の説明
MAINフォルダの内容を取得する。

取得したディレクトリ構造をテキストに変換し改行で結合、filelog.txtに上書きする。こうすることでDLする前のディレクトリ構造を保存しておける。

If文でクリップボードを取得し、youtubeリンクかどうか確認する。youtubeのリンクをコピーした際にフルURLとショートURLの可能性があるため二重Ifを用いてyoutube.comとyoutu.beで確認している。

クリップボードの内容がyoutubeのリンクであった場合、Pythonistaで作成したDL.pyを実行するようにする。ここでURLの発行で生成したURLを「URLを開く」に張り付けるとショートカットからPythonistaでpythonのコードを実行できるようになる。

以降はfile searcherでダウンロードの終了を待ち、動画が検出されたらname changeで名前を変える。

If文ではじかれた場合、リンクを取得できなかったという表記をだしてname changeだけ実行するようにする。(name changeは実行しなくてもOK)

最後にLocalizerをホームに追加すればすべての製作工程は終了。
お疲れ様でした。

使い方

コピーしてタップするだけ

ダウンロードしたい動画を開き、Youtubeアプリだったら画面下の共有ボタンから、SafariやChromeなどのブラウザーで開いている場合はURL欄をタップしてコピー。

URLをコピー出来たら、先ほどホームに追加したLocalizerのアイコンをクリックするだけでダウンロードの開始、名前を付けて保存ができる。

テキストの領域につけたい名前を入力する

一番最初はクリップボードからの貼り付けを許可しますか?みたいな警告がでるけど、常に許可をおすか、設定アプリのPythonistaでほかのAppからペーストを許可にすればあとは何もでなくなる。

ダウンロードが終わったらファイルアプリから動画を見れる

https://www.youtube.com/watch?v=s5bZ9J3IBQkより

おまけ

作成したショートカットを長押しすると移動という項目あるので、新しい項目からYoutubeDownloaderとか名前つけてまとめてあげるとわかりやすいかも。ご自由に

以上~
よきYouTubeライフを

この記事が気に入ったらサポートをしてみませんか?