Python
python3
Pythonista
youtube-dl

iPhone単体で動画をダウンロードする【pythonista】

1200円払えばios上で無料でPythonが使えるpythonistaというアプリがあります。標準モジュールとしてmatplotlibやnumpyが初めから入っているので、出先の暇つぶしには最適なアプリです。

今回はpythonistaと強力な動画ダウンローダーである「youtube-dl」を使用してiPhone単体で動画のダウンロードをしていきます。shellコマンドで実行するのが基本的な使い方ですが、Pythonでモジュールとしてプログラムに組み込みこむという日本語の記事が無かったのでかいてみました。

youtube-dlはCUIで動くダウンローダーです。youtube以外にも多数の動画サイトに対応しています。対応サイト

はじめに

デフォルトの状態では外部モジュールをインストールすることができないので、pythonistaのコンソール画面(エディター画面を右にスワイプ)で以下のコードを実行して「StaSh」と呼ばれるpythonista専用のシェルを導入します。

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

コンソール画面に再起動を促される文字列が表示されたら、アプリの再起動を行ってください。「launch_stash.py」というファイルが追加されていたら成功です。これを実行するとシェルが起動し、pipコマンドが使用できるようになります。外部モジュールをインストールする際はこちらを毎回起動する必要があります。

youtube-dlをインストールしていきましょう。StaShを起動して以下を実行します。

pip install youtube_dl #インストールする際は「-」ではなく「_」にする

コード

早速組み込んでいきます。インストールしたyoutube-dlをインポートします。
作者様のコードをすこし改変して引用しました。

import youtube_dl

ydl_opts = {}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])

オプション設定は何も記述しなくても動きますが、代表的なオプションとしてファイルネームの指定とフォーマットの指定(mp4/m4a)を紹介しておきます。その他のオプションはAvailable options(117行〜265行目)を参考。

#mp4(動画ファイルの場合)
ydl_opts = {
  'outtmpl':fileName + '.mp4',
  'format':'bestvideo[ext=mp4]'
}

#m4a(音声ファイルの場合)
ydl_opts = {
  'outtmpl':fileName + '.m4a',
  'format':'bestaudio[ext=m4a]'
}

変数fileNameに適当な文字を入れてダウンロードします。outtmplを記述しない場合は動画のタイトルになります。

そのまま保存するとファイルがごちゃごちゃになってしますので、新しくフォルダ(yD_musicとyD_video)を作成しました。

Photo_2018-07-08_13_51_04.png

ダウンロードしたm4aファイルはyD_music。mp4ファイルはyD_videoに振り分けて保存できるようにします。

カレントディレクトリーを調べるために以下のコードをpythonistaのコンソール画面で実行します。

import os; os.getcwd()

#出力
'/private 〜 /Documents'

上記の出力の後ろに新しく作成したフォルダ名を付け足しておきます。

全体像

import youtube_dl,os

def dl(form,url):

    if form == 'm':
        path = 'yD_music'
        form = 'bestaudio[ext=m4a]'

    elif form == 'v':
        path = 'yD_video'
        form = 'bestvideo[ext=mp4]'

    os.chdir('your_path' + path)

    ydl_opts = {'format':form}
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])


form = input('format > ')
url = input('url > ')
dl(form,url)

※your_path部分にgetcwdで取得したpathを記述

操作

Twitterに上げた動画を参照してください。