Incorporated changes from itsmegb, nzbsearches getting stuck, added timestamp to downloads

This commit is contained in:
Remy
2011-07-18 23:18:55 -07:00
parent 460b897374
commit 2442f6a954
6 changed files with 69 additions and 72 deletions

View File

@@ -54,7 +54,7 @@ class DBConnection:
logger.error('Database error: %s' % e)
raise
except sqlite3.DatabaseError, e:
logger.error('Fatal Error executing %s :: %s' % (command, e))
logger.error('Fatal Error executing %s :: %s' % (query, e))
raise
return sqlResult

View File

@@ -4,7 +4,7 @@ import datetime
import headphones
from headphones import db, logger
from headphones import logger
def multikeysort(items, columns):
@@ -92,42 +92,4 @@ def bytes_to_mb(bytes):
mb = int(bytes)/1048576
size = '%.1f MB' % mb
return size
def sortNZBList(resultlist, albumid):
"""
Takes a list of NZBresults from searcher.py and sorts them by distance to
a target size based on bitrate * album duration
"""
bitrate = headphones.PREFERRED_BITRATE
myDB = db.DBConnection()
tracks = myDB.select('SELECT TrackDuration from tracks WHERE AlbumID=?', [albumid])
# album length in milliseconds - if there is no track info, return False
try:
albumlength = sum([pair[0] for pair in tracks])
except TypeError:
return False
# target size, in bytes
targetsize = albumlength/1000 * bitrate * 128
logger.info('Target size: %s' % bytes_to_mb(targetsize))
newlist = []
# resultlist = [(title, size, url), (title2, size2, url2)...]
for result in resultlist:
delta = abs(targetsize - result[1])
newlist.append((result[0], result[1], result[2], delta))
bestqual = sorted(newlist, key=lambda title: title[3])[0]
return bestqual
return size

View File

@@ -26,21 +26,19 @@ def scanMusic(dir=None):
logger.error('Can not decode file %s. Error: %s' % (str(files), str(e)))
continue
logger.info(u'%i music files found' % len(results))
logger.info(u'%i music files found. Reading metadata....' % len(results))
if results:
lst = []
bitrates = []
myDB = db.DBConnection()
myDB.action('''DELETE from have''')
for song in results:
try:
f = MediaFile(song)
logger.debug('Reading: %s' % song.decode('UTF-8'))
except:
logger.info("Could not read file: '" + song + "'")
logger.warn('Could not read file: %s' % song.decode('UTF-8'))
else:
if f.albumartist:
artist = f.albumartist
@@ -50,17 +48,17 @@ def scanMusic(dir=None):
continue
myDB.action('INSERT INTO have VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?)', [artist, f.album, f.track, f.title, f.length, f.bitrate, f.genre, f.date, f.mb_trackid])
lst.append(artist)
bitrates.append(f.bitrate)
# Get the average bitrate if the option is selected
if headphones.DETECT_BITRATE:
try:
headphones.PREFERRED_BITRATE = sum(bitrates)/len(bitrates)/1000
except ZeroDivisionError:
logger.error('No bitrates found - cannot automatically detect preferred bitrate')
avgbitrate = myDB.action("SELECT AVG(BitRate) FROM have").fetchone()[0]
headphones.PREFERRED_BITRATE = int(avgbitrate)/1000
except Exception, e:
logger.error('Error detecting preferred bitrate:' + str(e))
artistlist = {}.fromkeys(lst).keys()
artistlist = myDB.action('SELECT DISTINCT ArtistName FROM have').fetchall()
logger.info(u"Preparing to import %i artists" % len(artistlist))
artistlist_to_mbids(artistlist)
@@ -105,7 +103,10 @@ def artistlist_to_mbids(artistlist):
for artist in artistlist:
results = mb.findArtist(artist, limit=1)
results = mb.findArtist(artist['ArtistName'], limit=1)
if not results:
continue
try:
artistid = results[0]['id']
@@ -129,6 +130,9 @@ def addArtisttoDB(artistid):
artist = mb.getArtist(artistid)
if not artist:
return
if artist['artist_name'].startswith('The '):
sortname = artist['artist_name'][4:]
else:
@@ -154,7 +158,14 @@ def addArtisttoDB(artistid):
logger.info('Unable to get release information for %s - it may not be a valid release group' % rg['title'])
continue
if not releaseid:
continue
release = mb.getRelease(releaseid)
if not release:
logger.warn('Unable to get release information for %s. Skipping for now.' % rg['title'])
continue
logger.info(u"Now adding/updating album: " + rg['title'])
controlValueDict = {"AlbumID": rg['id']}

View File

@@ -34,6 +34,10 @@ def findArtist(name, limit=1):
time.sleep(1)
if not artistResults:
return False
for result in artistResults:
artistlist.append({
@@ -67,6 +71,9 @@ def getArtist(artistid):
attempt += 1
time.sleep(1)
if not artist:
return False
time.sleep(1)
artist_dict['artist_name'] = artist.name
@@ -113,6 +120,9 @@ def getReleaseGroup(rgid):
attempt += 1
time.sleep(1)
if not releaseGroup:
return False
time.sleep(1)
# I think for now we have to make separate queries for each release, in order
# to get more detailed release info (ASIN, track count, etc.)
@@ -173,6 +183,9 @@ def getRelease(releaseid):
attempt += 1
time.sleep(1)
if not results:
return False
time.sleep(1)
release['title'] = results.title

View File

@@ -169,12 +169,29 @@ def searchNZB(albumid=None):
if len(resultlist):
if headphones.PREFERRED_QUALITY == 2 and headphones.PREFERRED_BITRATE:
logger.debug('Target bitrate: %i kbps' % headphones.PREFERRED_BITRATE)
tracks = myDB.select('SELECT TrackDuration from tracks WHERE AlbumID=?', [albumid])
try:
albumlength = sum([pair[0] for pair in tracks])
targetsize = albumlength/1000 * headphones.PREFERRED_BITRATE * 128
logger.info('Target size: %s' % helpers.bytes_to_mb(targetsize))
newlist = []
for result in resultlist:
delta = abs(targetsize - result[1])
newlist.append((result[0], result[1], result[2], delta))
bestqual = sorted(newlist, key=lambda title: title[3])[0]
logger.debug('Sorting results list')
bestqual = helpers.sortNZBList(resultlist, albumid)
if not bestqual:
except TypeError:
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]
else:
@@ -213,7 +230,7 @@ def searchNZB(albumid=None):
break
myDB.action('UPDATE albums SET status = "Snatched" WHERE AlbumID=?', [albums[2]])
myDB.action('INSERT INTO snatched VALUES( ?, ?, ?, ?, CURRENT_DATE, ?)', [albums[2], bestqual[0], bestqual[1], bestqual[2], "Snatched"])
myDB.action('INSERT INTO snatched VALUES( ?, ?, ?, ?, DATETIME("NOW", "localtime"), ?)', [albums[2], bestqual[0], bestqual[1], bestqual[2], "Snatched"])
elif headphones.BLACKHOLE:
@@ -228,10 +245,4 @@ def searchNZB(albumid=None):
break
myDB.action('UPDATE albums SET status = "Snatched" WHERE AlbumID=?', [albums[2]])
myDB.action('INSERT INTO snatched VALUES( ?, ?, ?, ?, CURRENT_DATE, ?)', [albums[2], bestqual[0], bestqual[1], bestqual[2], "Snatched"])
myDB.action('INSERT INTO snatched VALUES( ?, ?, ?, ?, DATEIME("NOW", "localtime"), ?)', [albums[2], bestqual[0], bestqual[1], bestqual[2], "Snatched"])

View File

@@ -289,7 +289,6 @@ class WebInterface(object):
import searcher
threading.Thread(target=searcher.searchNZB, args=[AlbumID]).start()
time.sleep(5)
raise cherrypy.HTTPRedirect("artistPage?ArtistID=%s" % ArtistID)
@@ -457,11 +456,12 @@ class WebInterface(object):
snatched = myDB.select('''SELECT AlbumID, Title TEXT, Size INTEGER, URL TEXT, DateAdded TEXT, Status TEXT from snatched order by DateAdded DESC''')
page.append('''<div class="table"><table border="0" cellpadding="3">
<tr><p align="center">History <a class="external" href="clearhistory">clear all</a><br /><br /></p></tr>
<tr>
<th align="center" width="150"></th>
<th align="center" width="300"></th>
<th align="center" width="300"><div class="bigtext">History <a class="external" href="clearhistory">clear all</a><br /><br /></div></th>
<th align="center" width="300"></th>
<th> </th>
<th align="center" width="200"></th>
<th align="right" width="200"></th>
</tr>''')
if len(snatched) == 0:
page.append("""</table><div class="center"></div><table>""")
@@ -470,10 +470,10 @@ class WebInterface(object):
while i < len(snatched):
mb = snatched[i][2] / 1048576
size = '%.2fM' % mb
page.append('''<tr><td align="center" width="300">%s</td>
<td align="center" width="300">%s</td>
<td align="center" width="300">%s</td>
page.append('''<tr><td align="center" width="150">%s</td>
<td align="center" width="300">%s</td>
<td align="center" width="200">%s</td>
<td align="center" width="200">%s</td>
</tr>
''' % (snatched[i][5], snatched[i][1], size, snatched[i][4]))
i += 1