?

Log in

No account? Create an account
парам пам пам
В общем, вот очередной программизм от меня. На этот раз на питоне… 
28-окт-2011 08:51 pm
пришельцы, мозговой слизень
В общем, вот очередной программизм от меня. На этот раз на питоне

Идея примерно такая: я хочу приходить домой и смотреть свежие видео всяких товарищей, на которых я подписан на ютубике. Я хочу смотреть HD и хочу смотреть именно видео, а не крутящийся лоадер.

Ну и вот, в общем-то фигня, которая сохраняет весь фид подписок пользователя. Аккуратно распихивает всё по video/%username%/, где %username% - это имя чувака, на которого подписались. Файлы смотреть снизу вверх(если упорядочить по алфавиту).

Для работы нужно:
- python > 2.4.3;
- Установленный пакет с gdata API для питона(вот тут мануал). Можно было сделать без него, но я это уже поздно понял;
- google аккаунт;
- youtube аккаунт;
- установленную программку youtube-dl последней версии.

Для начала стоит проверить, что youtube-dl работает вообще. вот так вот:
$ youtube-dl "http://www.youtube.com/watch?v=DKJ2SejHUrY"

Если начинает качать, то все хорошо значит. Если не работает, то запускаем youtude-dl -U, ждем пока проапгрейдится и пробуем заново. Если youtube-dl -U не работает, значит она совсем старая и качать новую версию придется руками из интернетика.
Никакие ошибки не обрабатываются, так что если что-то упадет - ну ой, мне похер.

Алгоритм работы с программой примерно такой:
1. Перед сном запускаем программу
2. С утра просыпаемся и видим, что можно смотреть много всяких видео
3. ...
4. profit

#!/usr/bin/python
import gdata
import gdata.youtube.service
import string
import os
import commands
import sys

google_account = "YOUR GOOGLE ACCOUNT";
google_password = "PASSWORD";
youtube_account = "YOUR YOUTUBE USERNAME";

yt_service = gdata.youtube.service.YouTubeService()
yt_service.email = google_account;
yt_service.password = google_password;
yt_service.source = 'yt-subs'
yt_service.ProgrammaticLogin()

video_feed = yt_service.GetYouTubeVideoFeed( 'https://gdata.youtube.com/feeds/api/users/' + youtube_account + '/newsubscriptionvideos?max-results=50' );

def get_base_path():
    return "video/";

def get_user_path( username ):
    return get_base_path() + username + "/"

def get_filename_tmpl( username, published, id ):
    return get_user_path( username ) + published + "#" + id + ".%(ext)s"

def get_user_time_marker_path( username ):
    return get_user_path( username ) + ".timestamp"

def get_user_time_marker( username ):
    if not os.path.exists( get_user_time_marker_path( username ) ):
        return "0000-00-00T00:00:00";
    f = open( get_user_time_marker_path( username ), "r" )
    timestamp = f.read()
    f.close()
    return timestamp

def set_user_time_marker( username, timestamp ):
    f = open( get_user_time_marker_path( username ), "w" )
    f.write( timestamp )
    f.close()

entries = []
for entry in video_feed.entry:
    entries.append( entry )

entries.reverse()
for entry in entries:
    video_id = entry.id.text[string.rfind( entry.id.text, "/" )+1:]
    published = string.split( entry.published.text, "." )[0]
    username = entry.author[0].name.text

    if not os.path.exists( get_user_path( username ) ):
        os.makedirs( get_user_path( username ) )

    time_marker = get_user_time_marker( username )
    if published > time_marker:
        video_url = "http://www.youtube.com/watch?v=" + video_id
        filename_tmpl = get_filename_tmpl( username, published, video_id )
        command = 'youtube-dl -o "'+filename_tmpl+'" "' + video_url + '"'

        print "downloading " + video_url
        ret = commands.getstatusoutput( command )
        if ret[0] != 0:
            print "Failed to download " + video_url
            sys.exit(1)
        else:
            set_user_time_marker( username, published )


Comments 
(Удалённый комментарий)
29-окт-2011 06:27 am
Чота не понял шутки
This page was loaded дек 11 2018, 6:59 am GMT.