mirror of
https://github.com/rembo10/headphones.git
synced 2026-05-19 18:15:31 +01:00
Incorporated changes from itsmegb, nzbsearches getting stuck, added timestamp to downloads
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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']}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"])
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user