X-Git-Url: https://disinclined.org/git/?a=blobdiff_plain;f=likes_pandora.py;h=5e376ffe87e631b9b3af9167026a5051f9fd450a;hb=89f2b2f1b7ddb55674e599d854938e574e31e4af;hp=cd066e880a58ad79a68885c9a9b001d3c3a59012;hpb=8e57a07a7ec649864e8152b8d3e1e1a1e5fba14f;p=i_like_pandora.git diff --git a/likes_pandora.py b/likes_pandora.py old mode 100644 new mode 100755 index cd066e8..5e376ff --- a/likes_pandora.py +++ b/likes_pandora.py @@ -1,26 +1,32 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + __author__ = ("Dylan Lloyd ") __license__ = "BSD" # SETTINGS -USER = 'alphabethos' -DIR = '/home/dylan/pandora/' +USER = 'alphabethos' # pandora account name http://pandora.com/people +DIR = '/home/dylan/pandora/' # where to download the videos - will not be automatically created YT_DL = '/usr/bin/youtube-dl' # Path to youtube-dl -NOTIFICATIONS = True -DEFAULT_ICON ='/usr/share/icons/gnome/48x48/mimetypes/gnome-mime-application-x-shockwave-flash.png' +NOTIFICATIONS = True # False +DEFAULT_ICON ='/usr/share/icons/gnome/48x48/mimetypes/gnome-mime-application-x-shockwave-flash.png' # for notifications YT_OPT = '--no-progress --ignore-errors --continue --max-quality=22 -o "%(stitle)s---%(id)s.%(ext)s"' # END OF SETTINGS +from BeautifulSoup import BeautifulSoup import urllib import urllib2 -from BeautifulSoup import BeautifulSoup -import pynotify -import tempfile -import string -import hashlib import os -import shlex, subprocess import re +import copy +import shlex, subprocess + +if NOTIFICATIONS: + import pynotify + import hashlib + import tempfile + import string def fetch_stations(user): """ This takes a pandora username and returns the a list of the station tokens that the user is subscribed to. """ @@ -39,7 +45,7 @@ def fetch_tracks(stations): """ Takes a list of station tokens and returns a list of youtube search urls. What this should really do is just return the Title + Artist strings. """ - search_urls = [] + search_strings = [] for station in stations: page = urllib.urlopen('http://www.pandora.com/favorites/station_tablerows_thumb_up.vm?token=' + station + '&sort_col=thumbsUpDate') page = BeautifulSoup(page) @@ -54,39 +60,45 @@ def fetch_tracks(stations): if len(titles) == len(artists): i = 0 for title in titles: - search_url = 'http://youtube.com/results?search_query=' + urllib.quote_plus(title + ' ' + artists[i]) - search_urls.append(search_url) + search_string = title + ' ' + artists[i] + search_strings.append(search_string) i += 1 else: pass ## ERROR - return search_urls + return search_strings -def fetch_search_video_ids(search_urls): +def fetch_search_video_ids(search_strings): """ This takes a list of youtube search urls and tries to find the first result. It returns a list of youtube video ids. It really should take a list of ids instead. """ video_list = [] - for url in search_urls: - page = urllib.urlopen(url) + for search_string in search_strings: + search_url = 'http://youtube.com/results?search_query=' + urllib.quote_plus(search_string) + page = urllib.urlopen(search_url) page = BeautifulSoup(page) result = page.find('div', attrs={'class':'video-main-content'}) + if result == None: + print 'odd feedback for search, could not find div at ', search_url + continue for attr, value in result.attrs: if attr == 'id' and len(value[19:]) == 11: video_list.append(value[19:]) elif attr == 'id': - print 'odd feedback for url', url, " : ", value[19:] + print 'odd feedback for search', search_url, " : ", value[19:] return video_list -def check_for_existing(): - """ Checks the download-folder for existing videos with same id and removes from videolist. """ - videolist = get_video_ids() +def check_for_existing(video_list): + """ Checks the download-folder for existing videos with same id and removes from video_list. """ filelist = os.listdir(DIR) - for video in copy.deepcopy(videolist): + i = 0 + for video in copy.deepcopy(video_list): for files in filelist: if re.search(video,files): - del videolist[video] - return videolist + del video_list[i] + i -= 1 + i += 1 + return video_list def fetch_videos(videolist): """ Uses subprocess to trigger a download using youtube-dl of the list created earlier, and triggers notifications if enabled. """ @@ -95,7 +107,7 @@ def fetch_videos(videolist): if NOTIFICATIONS: regex = re.compile("\[download\] Destination: (.+)") for item in videolist: if item: - thread = subprocess.Popen(args + [item], stdout=subprocess.PIPE) + thread = subprocess.Popen(args + ["http://youtube.com/watch?v=" + item], stdout=subprocess.PIPE) output = thread.stdout.read() if NOTIFICATIONS: video_file = regex.findall(output) @@ -134,8 +146,11 @@ def fetch_videos(videolist): def main(): stations = fetch_stations(USER) + if len(stations) == 0: + print 'are you sure your pandora profile is public?' search_urls = fetch_tracks(stations) video_list = fetch_search_video_ids(search_urls) + video_list = check_for_existing(video_list) fetch_videos(video_list) if __name__ == "__main__":