kusoimox.hatenablog.jp で更新してあるようにスクリプトからだとアクセスが嫌われてしまって情報がダウンロードできないのですが, ブラウザにそのURLを入力すればファイルとしてダウンロードできます.
ふと,ある動画のサムネが欲しいなぁっと思ったとき,以上の方法でサムネのURLならゲットできるだろうということで ブラウザを使用してURLをゲットしてみました~
サムネのURLを探して...
f`https://youtube.com/get_video_info?video_id={任意のYouTube動画のid}`
をブラウザのURL入力に入力してENTERを押すと,その動画のget_infoがダウンロードされるので, ダウンロードされたらメモ帳なんかのテキストエディタで開き, ”videoDetails”を検索すると,それ以降の文字列に動画の情報が書いてある. その下に"url"というのが複数あり,その隣にサムネのURLが書いてあったりする.
ただ,なんかに変換されている文字列なので,Python
ならば以下の
from urllib.parse import unquote unquote("URLを含んだ部分の文字列")
で人に分かるような文字列にする. それでURLをブラウザに入力すればサムネがダウンロードできる. 動画本体はおそらく無理ですね. 見当たらない...
コレを使えばいいだけだった
※今後使えなく可能性はあるので注意
f'https://i.ytimg.com/vi_webp/{任意のYouTube動画のid}/maxresdefault.webp'
生放送とか特殊なものではない限りは以上のURLに動画IDを貼るだけでおkだと思います.
"webp"というのがサムネの中で最も大きいっぽいです.
JPEGならhttps://i.ytimg.com/vi/{任意のYouTube動画のid}/hqdefault.jpg
でいくつかの動画はサムネをゲットできるはず.
スクリプト
# -*- coding: utf-8 -*-
import os
import mechanize
from mechanize import Browser,Request
from time import sleep
import logging
logging.basicConfig(level=logging.INFO,format='[%(process)d:%(asctime)s] %(message)s')
import sys
if sys.version_info.major < 3:
from urllib2 import HTTPError, URLError
else:
from urllib.error import HTTPError, URLError
def path():
import wx
app=wx.App()
wx.MessageBox('保存先フォルダを選択してください','フォルダ選択',wx.STAY_ON_TOP)
# フォルダ選択ダイアログを作成
folda = wx.DirDialog(None,style=wx.DD_CHANGE_DIR | wx.OK | wx.STAY_ON_TOP,message="保存先フォルダ")
# フォルダが選択されたとき
if folda.ShowModal() == wx.ID_OK:
folda_path = folda.GetPath()
folda.Destroy()
return folda_path
def download(vid:str):
fpath = path()
br = Browser()
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-Agent', 'ja-jp'),
('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
('Connection','keep-alive')]
br.set_handle_robots(False)
while True:
try:
br.open(f'https://i.ytimg.com/vi_webp/{vid}/maxresdefault.webp')
data = br.response().read()
break
except:
sleep(30)
continue
with open(os.path.join(fpath,f"{vid}.webp"),mode="wb") as f:
f.write(data)
logging.info("webp download finish")
from PIL import Image
img = Image.open(os.path.join(fpath,f"{vid}.webp"))
img.save(os.path.join(fpath,f"{vid}.png"),"png")
logging.info("png convert finish")
if __name__ == "__main__":
download(input("Youtube video id:"))
else:
download(sys.args[1])
Pythonで画像をまとめてwebpに変換 | なるころぐ によると,webpはGoogleが開発したフォーマットのようで, JPEGよりも軽量なようです.
ただ,デスクトップの背景に使いたい場合,webpは選択できませんので,
容量を気にしないのであればpngに変換しなければなりません.
そのため,PIL
でpngに変換する処理を上記スクリプトの処理の最後に行っています.
実行してPIL.UnidentifiedImageError: cannot identify image file
が出たら,
pip install --upgrade Pillow
でバージョン7以上にしておきましょう.
・参考