Ты тюбик

amused emoticon

Меня слегка достало то, что те видеоклипы которые я в свое время положил на YouTube в Favorites, потому что они мне нравились, все время куда-то пропадают по той или иной дурной причине. Выкачав всю пачку, я подумал и написал вот такой скриптик, авось кому пригодится.

Этот скриптик крутится у меня по cron, и скачивает то, что я добавил в Favorites, до того, как до него доберутся чьи-нибудь загребущие руки. Тупо, но функционально.

Для работы требуется Python 2.6+, Python GData API и качалка youtube-dl. Теоретически может поехать под виндой, но смысл.

#!/usr/bin/python

import gdata.youtube
import gdata.youtube.service
import re, subprocess, glob, sys

# Куда складывать скачанное. Должно заканчиваться на "/".
DESTINATION = '/mnt/spool/main/Video/YouTube/'
# Ваш юзернейм на YouTube.
USERNAME = 'your youtube username'
# Ваш логин.
LOGIN    = 'your@google.login'
# Ваш пароль.
PASSWORD = 'your google password'

# Дальше собственно код.
extractor = re.compile(""".*\[(?P<video_id>.*)\]\.(.*)\.description""")

downloaded_ids = []

for file in glob.glob(DESTINATION+'*.description'):
    downloaded_ids.append(re.match(extractor,file).group('video_id'))

replacer = re.compile("""(http|https)\://www\.youtube\.com/watch
                         \?v\=(?P<video_id>.*)
                         &feature=youtube_gdata_player""",re.X)

yt_service = gdata.youtube.service.YouTubeService()

# Turn on HTTPS/SSL access.
# Note: SSL is not available at this time for uploads.
yt_service.ssl = True

yt_service = gdata.youtube.service.YouTubeService()
yt_service.email = LOGIN
yt_service.password = PASSWORD
yt_service.source = 'Favourites Log'
yt_service.ProgrammaticLogin()

try:
  favorite_feed = yt_service.GetUserFavoritesFeed(username=USERNAME)
except gdata.service.RequestError:
  print "Google says it's dead."
  sys.exit()  

video_ids = []

for entry in favorite_feed.entry:
    if hasattr(entry,'media') and hasattr(entry.media,'player') \
    and hasattr(entry.media.player,'url'):
        video_ids.append(re.match(replacer, \
        entry.media.player.url).group('video_id'))

for video_id in video_ids:
    if video_id not in downloaded_ids:
        subprocess.call(['youtube-dl','-q','-o' + DESTINATION + \ 
        '%(title)s [%(id)s].%(ext)s', '-w', '-c', \
        '--restrict-filenames', '--write-description', \
        "https://www.youtube.com/?v=%s" % video_id])