iPhoneでYoutube動画をダウンロードする方法【Pythonista3】

公開日:  

python pythonista3 ios youtube


Pythonを使ってiPhone/iPadだけでyoutubeなどの動画をダウンロードするスクリプトを作成しました。

そもそもiPhoneでPython使えるの?って話ですが、Pythonista3というアプリを使用することでiPhone/iPad上でPythonを動かすことができます。

最初に、これから作成するスクリプトの実際の動作を見てみましょう。
SafariでYoutubeを開いていたら以下の手順で実行します。

①共有ボタンをタップ

①共有ボタンをタップ

②Run Pythonista Scriptをタップ

②Run Pythonista Scriptをタップ

③Download Videoをタップ

③Download Videoをタップ

④ダウンロード完了

④ダウンロード完了

なお、実行にiPadを使用したためiPadの画面になっていますが、iPhoneでも同じです。
以降の説明で出てくる画像はiPadでスクリーンショットを撮っています。

環境

  • iOS 13
  • Pythonista 3.2
  • Python 3.6(Pythonistaの設定で指定します)

Pythonista3とは

Pythonista3はiOSで使用できるPythonの開発環境です。作成したPythonスクリプトを実行できます。pipコマンドで好きなライブラリを追加することもできますし、iOSでの開発に役立つPythonista固有のモジュールもあります。

App Storeからダウンロードできます。1200円くらいします。ちょっと高いです。。

Pythonista3にStaShとyoutube-dlをインストールする

youtube-dlというPythonで作られたツールがあります。これを使って動画をダウンロードできます(youtube以外の動画サイトにも対応しています)。
pipコマンドを使ってインストールできますが、Pythonista3はそのままではpipコマンドは使えませんので、StaSh(bashのようなシェルです)をダウンロードします。

以下をPythonista3のインタラクティブコンソール(Pythonista3を起動して右にスワイプすると出ます)で実行します。

import requests as r; exec(r.get('https://bit.ly/get-stash').text)
StaShをダウンロードする

StaShをダウンロードする

実行すると~/Documents/launch_stash.pyが作成されます。
~/DocumentsはPythonista3のメニューからThis iPad(iPhoneの場合はThis iPhone)をタップしたときに表示される場所です。

launch_stash.pyが作成される

launch_stash.pyが作成される

launch_stash.pyを実行してください。
実行するとシェルが起動するので、以下を入力してyoutube-dlをインストールします。

pip install youtube_dl
youtube-dlをインストールする

youtube-dlをインストールする

これでyoutube-dlが使えるようになりました。
そのままStaSh上でyoutube-dl {動画のリンク}を実行すれば動画のダウンロードができますが、今回はPythonのプログラム内でimportして使用します。

動画をダウンロードする

youtube-dlは自前のPythonスクリプトに簡単に組み込むことができます(本家のREADMEを参考にしました)。
動画をダウンロードするには、以下のように書けばよいです(プログラム全体は後で載せるのでここではイメージだけ)。

from __future__ import unicode_literals
import youtube_dl

# オプション
ydl_opts = {}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    # ダウンロード
    ydl.download(['https://www.youtube.com/watch?v=XXXXXXXX'])

URLの部分を自分のダウンロードしたい動画のリンクにすればよいのですが、それをどうやって指定するのかが問題です。
リンクをコピーしてきてコマンドライン引数に渡すとか、UIを作ってそこから渡すとかあると思いますが、できるだけ簡単にダウンロード実行までつなげたいです。

そこでShare Extensionを利用したいと思います。

Share Extension(共有するボタン)から起動できるようにする

共有ボタン

共有ボタン

記事冒頭のキャプチャでも紹介しましたが、共有ボタンからPythonista3のスクリプトを実行することができます。
このとき、URLや画像などをPythonスクリプトに送ることができます。例えば、SafariのWEBページ上で共有ボタンからスクリプトを実行すると、そのとき見てたページのURLをスクリプトに渡すことができます。

Pythonista3ではShare Extensionのためにappexモジュールが用意されています。
以下に例を示します。

import appex

if not appex.is_running_extension():
    print('This script is intended to be run from the sharing extension.')
    return
url = appex.get_url()
if not url:
    print('No input URL found.')
    return
print(url)

appex.get_url()でURLを取得してます。あとはエラー処理が書いてあるだけです。

~/Documents/Examples/Extensionフォルダ内にもサンプルスクリプトがあるので、参考にできますよ(上の例もそれを参考にしています)。

プログラム全体とショートカットを作成する

先に説明した内容を踏まえて、プログラム全体を作ってみましょう。

フォルダ構成は次のようにしています。

~Documents/
 ├ my_youtube_dl/
 │ └ download_youtube.py
 └ Videos/
フォルダ構成

フォルダ構成

~Documents/my_youtube_dl/download_youtube.pyが動画をダウンロードするスクリプトです。
~Documents/Videos/は動画の保存先のフォルダです。

以下、download_youtube.pyの中身です。
内容としては先に説明した内容をくっつけただけで難しくありません(youtube-dlのオプションなど特に説明していませんが、気になる方は本家を確認してください)。

from __future__ import unicode_literals
import youtube_dl
import os

import appex

DOWNLOAD_DIR = '~/Documents/Videos'


class MyLogger(object):

    def debug(self, msg):
        print(msg)

    def warning(self, msg):
        pass

    def error(self, msg):
        print(msg)


def my_hook(d):
    if d['status'] == 'finished':
        print('Done downloading.')


def download_video(url):
    ydl_opts = {
        'outtmpl': DOWNLOAD_DIR + '/%(title)s.%(ext)s',
        'logger': MyLogger(),
        'progress_hooks': [my_hook]
    }
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])


def main():
    if not appex.is_running_extension():
        print('This script is intended to be run from the sharing extension.')
        return
    url = appex.get_url()
    if not url:
        print('No input URL found.')
        return

    download_video(url)


if __name__ == '__main__':
    main()

処理内容

  1. appexモジュールを使ってURLを取得する(main()関数)。
  2. youtube_dlを使って取得したURLの動画をダウンロードする(download_video(url)関数)。

スクリプトを作成できたらさっそく実行してみましょう、と言いたいところですが、もうひと準備必要です。共有ボタンから起動できるようにショートカットを作成する必要があります。

ショートカットを作成
Pythonista3上で作成したスクリプトを開きます。右上の設定ボタンから「Share…」→「Run Pythonista Script」→「Edit」をタップします。「+」マークのアイコンが表示されるのでタップするとショートカットを作成できます。

設定ボタンからShare...をタップ

設定ボタンからShare...をタップ

Run Pythonista Scriptをタップ

Run Pythonista Scriptをタップ

Editをタップ

Editをタップ

ショートカットを作成する

ショートカットを作成する

ショートカットが作成できたら、記事冒頭のスクリーンショットのように共有ボタンから起動できるようになります。
ちゃんと動くかどうか確認してみてください。

終わりに

以上で解説終わりです。
Pythonista3は前から持ってんですが、最近あまり使ってなかったので、今回スクリプトを作ってみました。内容的にはわざわざiPhone/iPadでやる必要ないんですけどね(。



関連記事