From 0596de1d389479a8a80c55d36d84655d48a3dde5 Mon Sep 17 00:00:00 2001 From: Remy Date: Wed, 20 Jul 2011 16:19:27 -0700 Subject: [PATCH] New feature: Download a new version or retry same version. Bug fixes: New albums not being marked as wanted, existing albums status changing to Skipped --- headphones/importer.py | 42 +++++++++++++++++++++++++----------------- headphones/searcher.py | 30 +++++++++++++++++++++++++----- headphones/updater.py | 2 +- headphones/webserve.py | 6 +++--- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/headphones/importer.py b/headphones/importer.py index 8af1bd36..ff9511ae 100644 --- a/headphones/importer.py +++ b/headphones/importer.py @@ -146,6 +146,9 @@ def addArtisttoDB(artistid): for rg in artist['releasegroups']: rgid = rg['id'] + + # check if the album already exists + rg_exists = myDB.select("SELECT * from albums WHERE AlbumID=?", [rg['id']]) try: releaseid = mb.getReleaseGroup(rgid) @@ -164,27 +167,32 @@ def addArtisttoDB(artistid): logger.info(u"Now adding/updating album: " + rg['title']) controlValueDict = {"AlbumID": rg['id']} - newValueDict = {"ArtistID": artistid, - "ArtistName": artist['artist_name'], - "AlbumTitle": rg['title'], - "AlbumASIN": release['asin'], - "ReleaseDate": release['date'], - "DateAdded": helpers.today(), - "Status": "Skipped" - } + + if len(rg_exists): + + newValueDict = {"AlbumASIN": release['asin'], + "ReleaseDate": release['date'], + } + + else: + + newValueDict = {"ArtistID": artistid, + "ArtistName": artist['artist_name'], + "AlbumTitle": rg['title'], + "AlbumASIN": release['asin'], + "ReleaseDate": release['date'], + "DateAdded": helpers.today(), + } + + if release['date'] > helpers.today(): + newValueDict['Status'] = "Wanted" + else: + newValueDict['Status'] = "Skipped" myDB.upsert("albums", newValueDict, controlValueDict) # I changed the albumid from releaseid -> rgid, so might need to delete albums that have a releaseid - myDB.action('DELETE from albums WHERE AlbumID=?', [release['id']]) - - latestrelease = myDB.select("SELECT ReleaseDate, DateAdded from albums WHERE AlbumID=?", [rg['id']]) - - if latestrelease[0][0] > latestrelease[0][1]: - logger.info(release['title'] + u" is an upcoming album. Setting its status to 'Wanted'...") - controlValueDict = {"AlbumID": release['id']} - newValueDict = {"Status": "Wanted"} - myDB.upsert("albums", newValueDict, controlValueDict) + myDB.action('DELETE from albums WHERE AlbumID=?', [release['id']]) for track in release['tracks']: diff --git a/headphones/searcher.py b/headphones/searcher.py index badf67dd..325c428f 100644 --- a/headphones/searcher.py +++ b/headphones/searcher.py @@ -7,7 +7,7 @@ import os, re import headphones from headphones import logger, db, helpers -def searchNZB(albumid=None): +def searchNZB(albumid=None, new=False): myDB = db.DBConnection() @@ -185,7 +185,7 @@ def searchNZB(albumid=None): if headphones.PREFERRED_QUALITY == 2 and headphones.PREFERRED_BITRATE: - logger.debug('Target bitrate: %i kbps' % headphones.PREFERRED_BITRATE) + logger.debug('Target bitrate: %s kbps' % headphones.PREFERRED_BITRATE) tracks = myDB.select('SELECT TrackDuration from tracks WHERE AlbumID=?', [albumid]) @@ -201,18 +201,38 @@ def searchNZB(albumid=None): delta = abs(targetsize - result[1]) newlist.append((result[0], result[1], result[2], delta)) - bestqual = sorted(newlist, key=lambda title: title[3])[0] + nzblist = sorted(newlist, key=lambda title: title[3]) except Exception, e: logger.debug('Error: %s' % str(e)) logger.info('No track information for %s - %s. Defaulting to highest quality' % (albums[0], albums[1])) - bestqual = sorted(resultlist, key=lambda title: title[1], reverse=True)[0] + nzblist = sorted(resultlist, key=lambda title: title[1], reverse=True) else: - bestqual = sorted(resultlist, key=lambda title: title[1], reverse=True)[0] + nzblist = sorted(resultlist, key=lambda title: title[1], reverse=True) + + + if new: + # Checks to see if it's already downloaded + i = 0 + + while i < len(nzblist): + alreadydownloaded = myDB.select('SELECT * from snatched WHERE URL=?', [nzblist[i][2]]) + + if len(alreadydownloaded) >= 1: + logger.info('%s has already been downloaded. Skipping.' % nzblist[i][0]) + i += 1 + + else: + bestqual = nzblist[i] + break + + else: + bestqual = nzblist[0] + logger.info(u"Found best result: %s (%s) - %s" % (bestqual[0], bestqual[2], helpers.bytes_to_mb(bestqual[1]))) downloadurl = bestqual[2] diff --git a/headphones/updater.py b/headphones/updater.py index 5a817859..ae626109 100644 --- a/headphones/updater.py +++ b/headphones/updater.py @@ -6,7 +6,7 @@ def dbUpdate(): myDB = db.DBConnection() - activeartists = myDB.select('SELECT ArtistID, ArtistName from artists WHERE Status="Active"') + activeartists = myDB.select('SELECT ArtistID, ArtistName from artists WHERE Status="Active" or Status="Loading"') logger.info('Starting update for %i active artists' % len(activeartists)) diff --git a/headphones/webserve.py b/headphones/webserve.py index 134824da..55b1ef32 100644 --- a/headphones/webserve.py +++ b/headphones/webserve.py @@ -126,7 +126,7 @@ class WebInterface(object): elif results[i][3] == 'Downloaded': newStatus = '''%s[retry]''' % (results[i][3], results[i][2], ArtistID) elif results[i][3] == 'Snatched': - newStatus = '''%s[retry]''' % (results[i][3], results[i][2], ArtistID) + newStatus = '''%s[retry][new]''' % (results[i][3], results[i][2], ArtistID, results[i][2], ArtistID) else: newStatus = '%s' % (results[i][3]) page.append(''' @@ -283,7 +283,7 @@ class WebInterface(object): deleteArtist.exposed = True - def queueAlbum(self, AlbumID, ArtistID): + def queueAlbum(self, AlbumID, ArtistID, new=False): logger.info(u"Marking album: " + AlbumID + "as wanted...") myDB = db.DBConnection() @@ -292,7 +292,7 @@ class WebInterface(object): myDB.upsert("albums", newValueDict, controlValueDict) import searcher - threading.Thread(target=searcher.searchNZB, args=[AlbumID]).start() + threading.Thread(target=searcher.searchNZB, args=[AlbumID, new]).start() raise cherrypy.HTTPRedirect("artistPage?ArtistID=%s" % ArtistID)