Pythonista3を使ってTwitterの検索にヒットした画像と動画をiPhoneに自動保存する

#背景
前回の記事（[Pythonista3を使ってTwitterのTLをiphoneに音読してもらう](https://qiita.com/sho6o/items/f59bdee7051c1d56d664)）と動機はほぼ同じです。今回はTwitterの検索結果から画像と動画のみを抽出してiPhoneに自動保存します。

#環境
iPhone8 13.2.3
Pythonista3 3.2
Tweepy 3.8.0

#準備
・Pythonista3のインストール
・Twitter APIの登録申請
・StaShのインストール
・tweepy, requests, youtube-dlのインストール

#コード
```python:sav_photo_video.py
#!Pythonista3
#twitterから検索に一致した画像をiphoneのアルバムに納めるプログラム

import os, requests, photos, youtube_dl
import twitterconfig
from twitterconfig import api

#検索する言葉から画像と動画のurlのリストを返す関数
def twitter_to_url_out(q, max_id):
    gazou_suu = 0
    douga_suu = 0
    kensakukekka = api.search(q = q, count = 20, max_id = max_id)
    if max_id != None:
        kensakukekka = kensakukekka[1:]
    gazou_url_list = []
    douga_url_list = []
    max_id_list = []
    for match_tweet in kensakukekka:
        max_id_list.append(match_tweet.id)
        try:
            video_url = match_tweet.extended_entities['media'][0]['video_info']['variants'][1]['url']
            douga_url_list.append(video_url)
        except:
            try:
                for x in match_tweet.extended_entities['media']:
                    gazou_url = x['media_url']
                    gazou_url_list.append(gazou_url)
            except:    
                continue
    max_id = min(max_id_list)
    gazou_url_list = sorted(set(gazou_url_list), key=gazou_url_list.index)
    douga_url_list = sorted(set(douga_url_list), key=douga_url_list.index)
    return max_id, gazou_url_list, douga_url_list

#url_listを引数にとって、それぞれの動画を保存する関数
def douga_hozon(urllist):
    douga_suu = 0
    for url in urllist:
        try:
            with youtube_dl.YoutubeDL() as ydl:
                ydl.download([url])
            douga_suu += 1
        except:
            continue
    return douga_suu

#url_listを引数にとって、それぞれの画像を保存する関数
def gazou_hozon(urllist):
    gazou_list = []
    for url in urllist:
        response = requests.get(url)    
        try:
            response.raise_for_status()
        except:
            continue
        filename = str(url.split('/')[-1])
        newfile = open(filename,'wb')
        for chunk in response.iter_content(10000):
            newfile.write(chunk)
        newfile.close()
        gazou_list.append(filename)
    image_asset_list = []
    for gazou in gazou_list:
        image_asset = photos.create_image_asset(gazou)
        image_asset_list.append(image_asset)
        try:
            os.remove(gazou)
        except:
            continue
    album_list = photos.get_albums()
    album_name_dict = {}
    number = 0
    for album in album_list:
        album_name = str(album).split('"')[1]
        album_name_dict[album_name] = number
        number += 1
    if kensakukotoba in album_name_dict.keys():
        new_album = album_list[int(album_name_dict[kensakukotoba])]
    else:
        new_album = photos.create_album(kensakukotoba)
    new_album.add_assets(image_asset_list)
    gazou_suu = len(image_asset_list)
    return gazou_suu


kensakukotoba = input('検索したい言葉は\n')
hosiikazu = int(input('欲しい画像数は\n'))
max_id = None
s_gazou_url_list = []
s_douga_url_list = []
syu_kai = 1
while len(s_gazou_url_list) < hosiikazu:
    print(str(syu_kai) + '周目')
    max_id, gazou_url_list, douga_url_list = twitter_to_url_out(q = kensakukotoba, max_id = max_id)
    syu_kai += 1
    for gazou_url in gazou_url_list:
        s_gazou_url_list.append(gazou_url)
    for douga_url in douga_url_list:
        s_douga_url_list.append(douga_url)
    s_gazou_url_list = sorted(set(s_gazou_url_list), key=s_gazou_url_list.index)
    s_douga_url_list = sorted(set(s_douga_url_list), key=s_douga_url_list.index)
    if syu_kai == 30:
        break
douga_suu = douga_hozon(s_douga_url_list)
gazou_suu = gazou_hozon(s_gazou_url_list)
print('保存終了(画像数：' + str(gazou_suu) + ' , 動画数：' + str(douga_suu) + ')')
```

#結果
初めの状態。写真もアルバムもありません。
<img width="375" alt="写真 2020-02-04 20 06 53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569810/702e147c-21a4-45be-267d-f9e2e8be2f6b.png">

プログラムを開いて検索キーワードと保存したい最低枚数を指定
<img width="375" alt="写真 2020-02-04 20 08 57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569810/8a777775-39c4-0b80-980e-a3b8578b6422.png">

少し待って・・・
<img width="375" alt="写真 2020-02-04 20 09 08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569810/da749010-7392-36b7-0f80-982ffd97a5bc.png">

保存終了とでたら終了です。
<img width="375" alt="写真 2020-02-04 20 09 37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569810/b0eaaed2-7646-3c11-9dff-0f621d5993ba.png">

再度見てみると自動的にアルバムが作成され、今回保存された画像が格納されています。
<img width="375" alt="写真 2020-02-04 20 09 53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569810/1b47bb45-c232-eb64-7da9-4cebb986c2ef.png">

<img width="375" alt="写真 2020-02-04 20 10 33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569810/0f7b431c-093c-240d-7432-556c2bf11378.png">

動画はpythonista内のコードがあるディレクトリにあります。
<img width="375" alt="写真 2020-02-04 20 10 52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569810/c5639906-8db0-2529-d744-37f6c9267720.png">

#解説
動画を写真と同じようにアルバムに収める方法が分かりませんでした。(pythonistaのphotosが動画に非対応？)分かる方がいらっしゃったらぜひ教えてください。
検索回数のリミットや検索方法は、各自使いやすいように変更してください。

#課題
何度か使っていて気になったこと
○動画のより良い保存方法
とりあえず時間があるときにフォルダ分けくらいはできるようにしようかなと思いました。

○重複する画像の自動削除
何度か同じキーワードで検索すると、どうしても同じ画像がちらほら保存されている状態に。同じ名前のアルバムはできないようにしていますが、検索結果と既存のアルバムを比較する部分があるといいかなと思いました。

#結論
やりたいことは形になりました！が、使いやすくするための改善の余地はまだまだありそうです・・・