Per prendere pratica con le API dello zio Google, gdata, e per non dimenticarmi come si programma in Python, ho scritto questo programmino che scandaglia i preferiti di un utente YouTube (username="106ohm", per esempio) e ne estrae la durata in secondi; sommando le durate si ottiene una stima di quanto una persona è malata di youtubite...
Ho riscontrato i seguenti problemi:
1. con yt_service.GetYouTubeVideoFeed(uri) si possono estrarre Feed di massimo 50 Entry: bisogna fare un ciclo generale -io l'ho fatto di 20 Entry*- che modifica l'uri; dunque è necessario conoscere lo schema dell'uri...
2. yt_service.GetYouTubeVideoFeed(uri) smatta se riceve un uri non corretto. Nel nostro caso significa che sono finiti i chuck, e dunque ci si può fermare (occorrono due controlli dunque sulla suddetta: il primo per assicurarsi che favorites_feed_chuck non sia vuota, il secondo per assicurarsi che contenga informazioni sensate)
3. anche se la entry è non vuota potrebbe non essere definito entry.media.duration.seconds (capita per esempio quando un utente segna un video come preferito, ma questo viene ritirato in seguito dall'autore o dai gestori) e dunque c'è bisogno di un try in più.
4. Convertire in modo brutale i secondi in anni, giorni, ore, minuti e secondi è una palla.
=>Inizio codice
#!/usr/bin/env python
#importo cio' che mi occorre
import gdata.youtube
import gdata.youtube.service
#inizializzo questo oggetto prima di fare qualsiasi cosa
yt_service= gdata.youtube.service.YouTubeService()
##
#DEFINIZIONE FUNZIONI UTILI
##
#definisco una funzione per estrarre informazioni dalle entry
def PrintEntryDetails(entry):
print 'Video title: %s' % entry.media.title.text
## print 'Video published on: %s ' % entry.published.text
## print 'Video description: %s' % entry.media.description.text
## print 'Video category: %s' % entry.media.category[0].text
## print 'Video tags: %s' % entry.media.keywords.text
## print 'Video watch page: %s' % entry.media.player.url
## print 'Video flash player URL: %s' % entry.GetSwfUrl()
## print 'Video duration: %s' % entry.media.duration.seconds
# non entry.media attributes
#print 'Video geo location: %s' % entry.geo.location()
## print 'Video view count: %s' % entry.statistics.view_count
## print 'Video rating: %s' % entry.rating.average
# show alternate formats
## for alternate_format in entry.media.content:
## if 'isDefault' not in alternate_format.extension_attributes:
## print 'Alternate format: %s | url: %s ' % (alternate_format.type, alternate_format.url)
# show thumbnails
## for thumbnail in entry.media.thumbnail:
## print 'Thumbnail url: %s' % thumbnail.url
#definisco una funzione che lancia PrintEntryDetails per ogni entry di un dato feed
def PrintVideoFeed(feed):
for entry in feed.entry:
PrintEntryDetails(entry)
##
#FINE DEFINIZIONE FUNZIONI
##
##stampo i primi 20 video preferiti
##username="106ohm"
##uri= 'http://gdata.youtube.com/feeds/api/users/%s/favorites?v=2&start-index=1&max-results=20' % username
##favorites_feed = yt_service.GetYouTubeVideoFeed(uri)
##PrintVideoFeed(favorites_feed)
#sommo le durate dei video preferiti
username="106ohm"
max_results=20
uri= 'http://gdata.youtube.com/feeds/api/users/%s/favorites?v=2&start-index=1&max-results=%s' % (username, max_results)
favorites_feed_chuck = yt_service.GetYouTubeVideoFeed(uri)
count = 0
chuck=0
start_index=1
while favorites_feed_chuck is not None:
for entry in favorites_feed_chuck.entry:
if entry is not None:
try:
count = count + int(entry.media.duration.seconds)
except:
#per sapere quali video non vengono considerati
#print PrintEntryDetails(entry)
pass
chuck = chuck + 1
start_index = start_index + 20
uri= 'http://gdata.youtube.com/feeds/api/users/%s/favorites?v=2&start-index=%s&max-results=%s' % (username, start_index, max_results)
try:
favorites_feed_chuck = yt_service.GetYouTubeVideoFeed(uri)
except:
break
print 'totale: %s secondi' % count
#converto in termini di secondi, minuti, ore, giorni ed anni
minuts = count / 60
seconds = count - minuts*60
hours = minuts / 60
minuts = minuts - hours*60
days = hours / 24
hours = hours - days * 24
years = days / 365
days = days - years * 356
print 'durata totale: %s anni %s giorni %s ore %s minuti %s secondi' % (years, days, hours, minuts, seconds)
=>Fine codice
Commenti:
ho commentato tante altre belle cose... Forse in seguito troverò il tempo di usarle per qualche figata.
*la scelta di max_results=20 implica un maggior numero di cicli while, ma un minor numero di cicli for entry in ... A voi decidere se cambiarlo o meno.
Nessun commento:
Posta un commento