From ffeb4383372851317262132d7d69eab0d2a96390 Mon Sep 17 00:00:00 2001 From: rembo10 Date: Thu, 16 Aug 2012 23:50:32 +0530 Subject: [PATCH] Modified library scan to allow single directories to be appended to the library; postprocessor now used that function to update track counts after post processing is complete --- headphones/librarysync.py | 87 ++++++++++++++++++++++--------------- headphones/postprocessor.py | 49 ++------------------- 2 files changed, 54 insertions(+), 82 deletions(-) diff --git a/headphones/librarysync.py b/headphones/librarysync.py index b7484b1c..3f31d4c0 100644 --- a/headphones/librarysync.py +++ b/headphones/librarysync.py @@ -21,12 +21,16 @@ from lib.beets.mediafile import MediaFile import headphones from headphones import db, logger, helpers, importer -def libraryScan(dir=None): +# You can scan a single directory and append it to the current library by specifying append=True, ArtistID & ArtistName +def libraryScan(dir=None, append=False, ArtistID=None, ArtistName=None): if not dir: dir = headphones.MUSIC_DIR - - dir = dir.encode(headphones.SYS_ENCODING) + + # If we're appending a dir, it's coming from the post processor which is + # already bytestring + if not append: + dir = dir.encode(headphones.SYS_ENCODING) if not os.path.isdir(dir): logger.warn('Cannot find directory: %s. Not scanning' % dir.decode(headphones.SYS_ENCODING)) @@ -34,12 +38,15 @@ def libraryScan(dir=None): myDB = db.DBConnection() - # Clean up bad filepaths - tracks = myDB.select('SELECT Location, TrackID from tracks WHERE Location IS NOT NULL') + if not append: + # Clean up bad filepaths + tracks = myDB.select('SELECT Location, TrackID from tracks WHERE Location IS NOT NULL') - for track in tracks: - if not os.path.isfile(track['Location'].encode(headphones.SYS_ENCODING)): - myDB.action('UPDATE tracks SET Location=?, BitRate=?, Format=? WHERE TrackID=?', [None, None, None, track['TrackID']]) + for track in tracks: + if not os.path.isfile(track['Location'].encode(headphones.SYS_ENCODING)): + myDB.action('UPDATE tracks SET Location=?, BitRate=?, Format=? WHERE TrackID=?', [None, None, None, track['TrackID']]) + + myDB.action('DELETE from have') logger.info('Scanning music directory: %s' % dir) @@ -47,8 +54,6 @@ def libraryScan(dir=None): bitrates = [] song_list = [] - - myDB.action('DELETE from have') for r,d,f in os.walk(dir): for files in f: @@ -290,32 +295,42 @@ def libraryScan(dir=None): logger.info('Completed matching tracks from directory: %s' % dir) - # Clean up the new artist list - unique_artists = {}.fromkeys(new_artists).keys() - current_artists = myDB.select('SELECT ArtistName, ArtistID from artists') - artist_list = [f for f in unique_artists if f.lower() not in [x[0].lower() for x in current_artists]] - - # Update track counts - logger.info('Updating current artist track counts') - - for artist in current_artists: - # Have tracks are selected from tracks table and not all tracks because of duplicates - # We update the track count upon an album switch to compliment this - havetracks = len(myDB.select('SELECT TrackTitle from tracks WHERE ArtistID like ? AND Location IS NOT NULL', [artist['ArtistID']])) + len(myDB.select('SELECT TrackTitle from have WHERE ArtistName like ?', [artist['ArtistName']])) - myDB.action('UPDATE artists SET HaveTracks=? WHERE ArtistID=?', [havetracks, artist['ArtistID']]) + if not append: + # Clean up the new artist list + unique_artists = {}.fromkeys(new_artists).keys() + current_artists = myDB.select('SELECT ArtistName, ArtistID from artists') - logger.info('Found %i new artists' % len(artist_list)) - - if len(artist_list): - if headphones.ADD_ARTISTS: - logger.info('Importing %i new artists' % len(artist_list)) - importer.artistlist_to_mbids(artist_list) - else: - logger.info('To add these artists, go to Manage->Manage New Artists') - myDB.action('DELETE from newartists') - for artist in artist_list: - myDB.action('INSERT into newartists VALUES (?)', [artist]) + artist_list = [f for f in unique_artists if f.lower() not in [x[0].lower() for x in current_artists]] + + # Update track counts + logger.info('Updating current artist track counts') + + for artist in current_artists: + # Have tracks are selected from tracks table and not all tracks because of duplicates + # We update the track count upon an album switch to compliment this + havetracks = len(myDB.select('SELECT TrackTitle from tracks WHERE ArtistID=? AND Location IS NOT NULL', [artist['ArtistID']])) + len(myDB.select('SELECT TrackTitle from have WHERE ArtistName like ?', [artist['ArtistName']])) + myDB.action('UPDATE artists SET HaveTracks=? WHERE ArtistID=?', [havetracks, artist['ArtistID']]) + + logger.info('Found %i new artists' % len(artist_list)) + + if len(artist_list): + if headphones.ADD_ARTISTS: + logger.info('Importing %i new artists' % len(artist_list)) + importer.artistlist_to_mbids(artist_list) + else: + logger.info('To add these artists, go to Manage->Manage New Artists') + myDB.action('DELETE from newartists') + for artist in artist_list: + myDB.action('INSERT into newartists VALUES (?)', [artist]) + + if headphones.DETECT_BITRATE: + headphones.PREFERRED_BITRATE = sum(bitrates)/len(bitrates)/1000 + + else: + # If we're appending a new album to the database, update the artists total track counts + logger.info('Updating artist track counts') + + havetracks = len(myDB.select('SELECT TrackTitle from tracks WHERE ArtistID=? AND Location IS NOT NULL', [ArtistID])) + len(myDB.select('SELECT TrackTitle from have WHERE ArtistName like ?', [ArtistName])) + myDB.action('UPDATE artists SET HaveTracks=? WHERE ArtistID=?', [havetracks, ArtistID]) - if headphones.DETECT_BITRATE: - headphones.PREFERRED_BITRATE = sum(bitrates)/len(bitrates)/1000 diff --git a/headphones/postprocessor.py b/headphones/postprocessor.py index 6a90c706..3c855494 100644 --- a/headphones/postprocessor.py +++ b/headphones/postprocessor.py @@ -26,7 +26,7 @@ from lib.beets import autotag from lib.beets.mediafile import MediaFile import headphones -from headphones import db, albumart, lyrics, logger, helpers +from headphones import db, albumart, librarysync, lyrics, logger, helpers postprocessor_lock = threading.Lock() @@ -269,21 +269,8 @@ def doPostProcessing(albumid, albumpath, release, tracks, downloaded_track_list) logger.error('No DESTINATION_DIR has been set. Set "Destination Directory" to the parent directory you want to move the files to') pass - myDB = db.DBConnection() - # There's gotta be a better way to update the have tracks - sqlite - - trackcount = myDB.select('SELECT HaveTracks from artists WHERE ArtistID=?', [release['ArtistID']]) - - if not trackcount[0][0]: - cur_track_count = 0 - else: - cur_track_count = trackcount[0][0] - - new_track_count = cur_track_count + len(downloaded_track_list) - myDB.action('UPDATE artists SET HaveTracks=? WHERE ArtistID=?', [new_track_count, release['ArtistID']]) - myDB.action('UPDATE albums SET status = "Downloaded" WHERE AlbumID=?', [albumid]) - myDB.action('UPDATE snatched SET status = "Processed" WHERE AlbumID=?', [albumid]) - updateHave(albumpath) + # Update the have tracks + librarysync.libraryScan(dir=albumpath, append=True, ArtistID=release['ArtistID'], ArtistName=release['ArtistName']) logger.info('Post-processing for %s - %s complete' % (release['ArtistName'], release['AlbumTitle'])) @@ -577,36 +564,6 @@ def renameFiles(albumpath, downloaded_track_list, release): except Exception, e: logger.error('Error renaming file: %s. Error: %s' % (downloaded_track, e)) continue - -def updateHave(albumpath): - - results = [] - - for r,d,f in os.walk(albumpath): - for files in f: - if any(files.lower().endswith('.' + x.lower()) for x in headphones.MEDIA_FORMATS): - results.append(os.path.join(r, files)) - - if results: - - myDB = db.DBConnection() - - for song in results: - try: - f = MediaFile(song) - #logger.debug('Reading: %s' % song.decode('UTF-8')) - except: - logger.warn('Could not read file: %s' % song) - continue - else: - if f.albumartist: - artist = f.albumartist - elif f.artist: - artist = f.artist - else: - continue - - myDB.action('UPDATE tracks SET Location=?, BitRate=?, Format=? WHERE ArtistName LIKE ? AND AlbumTitle LIKE ? AND TrackTitle LIKE ?', [unicode(song, headphones.SYS_ENCODING, errors="replace"), f.bitrate, f.format, artist, f.album, f.title]) def renameUnprocessedFolder(albumpath):