mirror of
https://github.com/rembo10/headphones.git
synced 2026-04-05 12:39:26 +01:00
Merge branch 'master' of https://github.com/rembo10/headphones into develop
This commit is contained in:
@@ -10,7 +10,8 @@
|
||||
%if album['Status'] == 'Skipped':
|
||||
<li><a href="queueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=False">Mark Album as Wanted</a></li>
|
||||
%elif album['Status'] == 'Wanted':
|
||||
<li><a href="unqueueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=False">Mark Album as Skipped</a></li>
|
||||
<li><a href="queueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=True">Force Check</a></li>
|
||||
<li><a href="unqueueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}">Mark Album as Skipped</a></li>
|
||||
%else:
|
||||
<li><a href="queueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=False">Retry Download</a></li>
|
||||
<li><a href="queueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=True">Try New Version</a></li>
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
%if album['Status'] == 'Skipped':
|
||||
<li><a href="queueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=False">Mark Album as Wanted</a></li>
|
||||
%elif album['Status'] == 'Wanted':
|
||||
<li><a href="unqueueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=False">Mark Album as Skipped</a></li>
|
||||
<li><a href="queueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=True">Force Check</a></li>
|
||||
<li><a href="unqueueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}">Mark Album as Skipped</a></li>
|
||||
%else:
|
||||
<li><a href="queueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=False">Retry Download</a></li>
|
||||
<li><a href="queueAlbum?AlbumID=${album['AlbumID']}&ArtistID=${album['ArtistID']}&new=True">Try New Version</a></li>
|
||||
|
||||
@@ -37,20 +37,23 @@ def scanMusic(dir=None):
|
||||
for song in results:
|
||||
try:
|
||||
f = MediaFile(song)
|
||||
albumartist = f.albumartist
|
||||
artist = f.artist
|
||||
except:
|
||||
logger.warn('Could not read file: %s' % song)
|
||||
continue
|
||||
else:
|
||||
if albumartist and albumartist != 'Various Artists':
|
||||
artist = albumartist
|
||||
elif artist:
|
||||
pass
|
||||
if f.albumartist:
|
||||
artist = f.albumartist
|
||||
elif f.artist:
|
||||
artist = f.artist
|
||||
else:
|
||||
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])
|
||||
if not f.album:
|
||||
album = None
|
||||
else:
|
||||
album = f.album
|
||||
|
||||
myDB.action('INSERT INTO have VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?)', [artist, album, f.track, f.title, f.length, f.bitrate, f.genre, f.date, f.mb_trackid])
|
||||
|
||||
# Get the average bitrate if the option is selected
|
||||
if headphones.DETECT_BITRATE:
|
||||
|
||||
@@ -60,7 +60,7 @@ class RotatingLogger(object):
|
||||
logger.debug(message)
|
||||
elif level == 'INFO':
|
||||
logger.info(message)
|
||||
elif level == 'WARN':
|
||||
elif level == 'WARNING':
|
||||
logger.warn(message)
|
||||
else:
|
||||
logger.error(message)
|
||||
@@ -74,7 +74,7 @@ def info(message):
|
||||
headphones_log.log(message, level='INFO')
|
||||
|
||||
def warn(message):
|
||||
headphones_log.log(message, level='WARN')
|
||||
headphones_log.log(message, level='WARNING')
|
||||
|
||||
def error(message):
|
||||
headphones_log.log(message, level='ERROR')
|
||||
|
||||
@@ -51,7 +51,14 @@ def findArtist(name, limit=1):
|
||||
artistdict = findArtistbyAlbum(name)
|
||||
|
||||
if not artistdict:
|
||||
return False
|
||||
logger.debug('Cannot determine the best match from an artist/album search. Using top match instead')
|
||||
artistlist.append({
|
||||
'name': result.artist.name,
|
||||
'uniquename': result.artist.getUniqueName(),
|
||||
'id': u.extractUuid(result.artist.id),
|
||||
'url': result.artist.id,
|
||||
'score': result.score
|
||||
})
|
||||
|
||||
else:
|
||||
artistlist.append(artistdict)
|
||||
@@ -393,7 +400,14 @@ def findArtistbyAlbum(name):
|
||||
|
||||
myDB = db.DBConnection()
|
||||
|
||||
artist = myDB.action('SELECT AlbumTitle from have WHERE ArtistName=?', [name]).fetchone()
|
||||
artist = myDB.action('SELECT AlbumTitle from have WHERE ArtistName=? AND AlbumTitle IS NOT NULL ORDER BY RANDOM()', [name]).fetchone()
|
||||
|
||||
if not artist:
|
||||
return False
|
||||
|
||||
# Probably not neccessary but just want to double check
|
||||
if not artist['AlbumTitle']:
|
||||
return False
|
||||
|
||||
term = '"'+artist['AlbumTitle']+'" AND artist:"'+name+'"'
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ def checkFolder():
|
||||
album_path = os.path.join(headphones.DOWNLOAD_DIR, album['FolderName'])
|
||||
|
||||
if os.path.exists(album_path):
|
||||
logger.debug('Found %s. Verifying....' % album['FolderName'])
|
||||
verify(album['AlbumID'], album_path)
|
||||
|
||||
def verify(albumid, albumpath):
|
||||
@@ -118,29 +119,49 @@ def verify(albumid, albumpath):
|
||||
downloaded_track_list.append(os.path.join(r, files))
|
||||
|
||||
# test #1: metadata - usually works
|
||||
logger.debug('Verifying metadata...')
|
||||
|
||||
for downloaded_track in downloaded_track_list:
|
||||
try:
|
||||
f = MediaFile(downloaded_track)
|
||||
except Exception, e:
|
||||
logger.info("Exception from MediaFile for: " + downloaded_track + " : " + str(e))
|
||||
continue
|
||||
if helpers.latinToAscii(f.artist.lower()).encode('UTF-8') == helpers.latinToAscii(release['ArtistName'].lower()).encode('UTF-8') and helpers.latinToAscii(f.album.lower()).encode('UTF-8') == helpers.latinToAscii(release['AlbumTitle'].lower()).encode('UTF-8'):
|
||||
|
||||
metaartist = helpers.latinToAscii(f.artist.lower()).encode('UTF-8')
|
||||
dbartist = helpers.latinToAscii(release['ArtistName'].lower()).encode('UTF-8')
|
||||
metaalbum = helpers.latinToAscii(f.album.lower()).encode('UTF-8')
|
||||
dbalbum = helpers.latinToAscii(release['AlbumTitle'].lower()).encode('UTF-8')
|
||||
|
||||
logger.debug('Matching metadata artist: %s with artist name: %s' % (metaartist, dbartist))
|
||||
logger.debug('Matching metadata album: %s with album name: %s' % (metaalbum, dbalbum))
|
||||
|
||||
if metaartist == dbartist and metaalbum == dbalbum:
|
||||
doPostProcessing(albumid, albumpath, release, tracks, downloaded_track_list)
|
||||
return
|
||||
|
||||
# test #2: filenames
|
||||
logger.debug('Metadata check failed. Verifying filenames...')
|
||||
for downloaded_track in downloaded_track_list:
|
||||
track_name = os.path.splitext(downloaded_track)[0]
|
||||
split_track_name = re.sub('[\.\-\_]', ' ', track_name).lower()
|
||||
for track in tracks:
|
||||
if helpers.latinToAscii(track['TrackTitle'].lower()).encode('UTF-8') in helpers.latinToAscii(split_track_name).encode('UTF-8'):
|
||||
|
||||
dbtrack = helpers.latinToAscii(track['TrackTitle'].lower()).encode('UTF-8')
|
||||
filetrack = helpers.latinToAscii(split_track_name).encode('UTF-8')
|
||||
logger.debug('Checking if track title: %s is in file name: %s' % (dbtrack, filetrack))
|
||||
|
||||
if dbtrack in filetrack:
|
||||
doPostProcessing(albumid, albumpath, release, tracks, downloaded_track_list)
|
||||
return
|
||||
|
||||
# test #3: number of songs and duration
|
||||
logger.debug('Filename check failed. Verifying album length...')
|
||||
db_track_duration = 0
|
||||
downloaded_track_duration = 0
|
||||
|
||||
logger.debug('Total music files in %s: %i' % (albumpath, len(downloaded_track_list)))
|
||||
logger.debug('Total tracks for this album in the database: %i' % len(tracks))
|
||||
if len(tracks) == len(downloaded_track_list):
|
||||
|
||||
for track in tracks:
|
||||
@@ -157,8 +178,10 @@ def verify(albumid, albumpath):
|
||||
except:
|
||||
downloaded_track_duration = False
|
||||
break
|
||||
|
||||
|
||||
if downloaded_track_duration and db_track_duration:
|
||||
logger.debug('Downloaded album duration: %i' % downloaded_track_duration)
|
||||
logger.debug('Database track duration: %i' % db_track_duration)
|
||||
delta = abs(downloaded_track_duration - db_track_duration)
|
||||
if delta < 240:
|
||||
doPostProcessing(albumid, albumpath, release, tracks, downloaded_track_list)
|
||||
|
||||
@@ -437,17 +437,17 @@ def verifyresult(title, artistterm, term):
|
||||
|
||||
title = re.sub('[\.\-\/\_]', ' ', title)
|
||||
|
||||
if artistterm != 'Various Artists':
|
||||
|
||||
if not re.search('^' + re.escape(artistterm), title, re.IGNORECASE):
|
||||
logger.info("Removed from results: " + title + " (artist not at string start).")
|
||||
return False
|
||||
elif re.search(re.escape(artistterm) + '\w', title, re.IGNORECASE | re.UNICODE):
|
||||
logger.info("Removed from results: " + title + " (post substring result).")
|
||||
return False
|
||||
elif re.search('\w' + re.escape(artistterm), title, re.IGNORECASE | re.UNICODE):
|
||||
logger.info("Removed from results: " + title + " (pre substring result).")
|
||||
return False
|
||||
#if artistterm != 'Various Artists':
|
||||
#
|
||||
# if not re.search('^' + re.escape(artistterm), title, re.IGNORECASE):
|
||||
# #logger.info("Removed from results: " + title + " (artist not at string start).")
|
||||
# #return False
|
||||
# elif re.search(re.escape(artistterm) + '\w', title, re.IGNORECASE | re.UNICODE):
|
||||
# logger.info("Removed from results: " + title + " (post substring result).")
|
||||
# return False
|
||||
# elif re.search('\w' + re.escape(artistterm), title, re.IGNORECASE | re.UNICODE):
|
||||
# logger.info("Removed from results: " + title + " (pre substring result).")
|
||||
# return False
|
||||
|
||||
#another attempt to weed out substrings. We don't want "Vol III" when we were looking for "Vol II"
|
||||
tokens = re.split('\W', term, re.IGNORECASE | re.UNICODE)
|
||||
|
||||
Reference in New Issue
Block a user