diff --git a/Headphones.py b/Headphones.py index ba494c51..7f9139fe 100755 --- a/Headphones.py +++ b/Headphones.py @@ -84,7 +84,7 @@ def main(): # Put the database in the DATA_DIR headphones.DB_FILE = os.path.join(headphones.DATA_DIR, 'headphones.db') - headphones.CFG = ConfigObj(headphones.CONFIG_FILE) + headphones.CFG = ConfigObj(headphones.CONFIG_FILE, encoding='utf-8') # Read config & start logging headphones.initialize() diff --git a/data/interfaces/default/config.html b/data/interfaces/default/config.html index 1a5c113c..31d0f4b4 100644 --- a/data/interfaces/default/config.html +++ b/data/interfaces/default/config.html @@ -260,7 +260,7 @@

Re-Encoding Options:


-

Convert Lossless to mp3

+

Re-encode downloads during postprocessing

Note: this option requires the lame or ffmpeg encoder

<% @@ -269,14 +269,52 @@ ffmpegselect = '' else: lameselect = '' - ffmpegselect = 'selected="selected"' + ffmpegselect = 'selected="selected"' %> -

Encoder: - Bitrate: kbps
+ + Format:

+
+

Bitrate: + + <% + if config["samplingfrequency"] == 44100: + freq44100 = 'selected="selected"' + freq48000 = '' + else: + freq44100 = '' + freq48000 = 'selected="selected"' + %> + Sampling:

+
+

Advance Encode Options:


Path to Encoder:

@@ -287,5 +325,5 @@


(Web Interface changes require a restart to take effect) - +  diff --git a/data/interfaces/remix/config.html b/data/interfaces/remix/config.html index 07763d08..f9aab2cc 100644 --- a/data/interfaces/remix/config.html +++ b/data/interfaces/remix/config.html @@ -260,8 +260,8 @@

Re-Encoding Options:


-

Convert Lossless to mp3

- Note: this option requires the lame or ffdshow encoder +

Re-encode Postprocessed Albuns

+ Note: this option requires the lame or ffmpeg encoder

<% if config['encoder'] == 'lame': @@ -269,14 +269,88 @@ ffmpegselect = '' else: lameselect = '' - ffmpegselect = 'selected="selected"' + ffmpegselect = 'selected="selected"' %> -

Encoder: - Bitrate: kbps
+ + <% + if config['encoderoutputformat'] == 'ogg': + oggselect = 'selected="selected"' + mp3select = '' + m4aselect = '' + elif config['encoderoutputformat'] == 'm4a': + oggselect = '' + m4aselect = 'selected="selected"' + mp3select = '' + else: + oggselect = '' + m4aselect = '' + mp3select = 'selected="selected"' + %> + Format:

+
+ <% + if config["bitrate"] == 64: + bitrate64select = 'selected="selected"' + bitrate128select = '' + bitrate192select = '' + bitrate256select = '' + bitrate320select = '' + elif config["bitrate"] == 128: + bitrate64select = '' + bitrate128select = 'selected="selected"' + bitrate192select = '' + bitrate256select = '' + bitrate320select = '' + elif config["bitrate"] == 192: + bitrate64select = '' + bitrate128select = '' + bitrate192select = 'selected="selected"' + bitrate256select = '' + bitrate320select = '' + elif config["bitrate"] == 256: + bitrate64select = '' + bitrate128select = '' + bitrate192select = '' + bitrate256select = 'selected="selected"' + bitrate320select = '' + else: + bitrate64select = '' + bitrate128select = '' + bitrate192select = '' + bitrate256select = '' + bitrate320select = 'selected="selected"' + %> +

Bitrate: + + <% + if config["samplingfrequency"] == 44100: + freq44100 = 'selected="selected"' + freq48000 = '' + else: + freq44100 = '' + freq48000 = 'selected="selected"' + %> + Sampling:

+
+

Advance Encode Options:


Path to Encoder:

@@ -288,4 +362,4 @@


(Web Interface changes require a restart to take effect) - + \ No newline at end of file diff --git a/headphones/__init__.py b/headphones/__init__.py index ab59ae4d..30b6917f 100755 --- a/headphones/__init__.py +++ b/headphones/__init__.py @@ -308,7 +308,10 @@ def initialize(): CURRENT_VERSION = versioncheck.getVersion() # Check for new versions - LATEST_VERSION = versioncheck.checkGithub() + try: + LATEST_VERSION = versioncheck.checkGithub() + except: + LATEST_VERSION = CURRENT_VERSION __INITIALIZED__ = True return True @@ -444,8 +447,8 @@ def config_write(): new_config['General']['encode'] = int(ENCODE) new_config['General']['encoder'] = ENCODER - new_config['General']['bitrate'] = BITRATE - new_config['General']['samplingfrequency'] = SAMPLINGFREQUENCY + new_config['General']['bitrate'] = int(BITRATE) + new_config['General']['samplingfrequency'] = int(SAMPLINGFREQUENCY) new_config['General']['encoderfolder'] = ENCODERFOLDER new_config['General']['advancedencoder'] = ADVANCEDENCODER new_config['General']['encoderoutputformat'] = ENCODEROUTPUTFORMAT diff --git a/headphones/encode.py b/headphones/encode.py index 77a435b4..27ec44b3 100644 --- a/headphones/encode.py +++ b/headphones/encode.py @@ -55,8 +55,8 @@ def encode(albumPath): logger.warn('Can not reencode .ogg music "%s"' % (music)) else: command(encoder,music,musicTempFiles[i],albumPath) - elif (headphones.ENCODEROUTPUTFORMAT=='mp3'): - if (music.endswith('.mp3') and (infoMusic.bitrate/1000<=headphones.BITRATE)): + elif (headphones.ENCODEROUTPUTFORMAT=='mp3' or headphones.ENCODEROUTPUTFORMAT=='m4a'): + if (music.endswith('.'+headphones.ENCODEROUTPUTFORMAT) and (infoMusic.bitrate/1000<=headphones.BITRATE)): logger.warn('Music "%s" has bitrate<="%skbit" will not be reencoded' % (music,headphones.BITRATE)) else: command(encoder,music,musicTempFiles[i],albumPath) @@ -83,8 +83,10 @@ def command(encoder,musicSource,musicDest,albumPath): cmd=encoder+ ' -i' cmd=cmd+ ' "' + musicSource + '"' if headphones.ENCODEROUTPUTFORMAT=='ogg': - cmd=cmd+ ' -acodec vorbis -strict experimental' - cmd=cmd+ ' -ac 2 -map_metadata 0:0,s0 -vn -ar ' + str(headphones.SAMPLINGFREQUENCY) + ' -ab ' + str(headphones.BITRATE) + 'k' + cmd=cmd+ ' -acodec libvorbis' + if headphones.ENCODEROUTPUTFORMAT=='m4a': + cmd=cmd+ ' -strict experimental' + cmd=cmd+ ' -y -ac 2 -map_metadata 0:0,s0 -vn -ar ' + str(headphones.SAMPLINGFREQUENCY) + ' -ab ' + str(headphones.BITRATE) + 'k' cmd=cmd+ ' ' + headphones.ADVANCEDENCODER cmd=cmd+ ' "' + musicDest + '"' return_code = call(cmd, shell=True) diff --git a/headphones/librarysync.py b/headphones/librarysync.py index 990c2d3c..81808890 100644 --- a/headphones/librarysync.py +++ b/headphones/librarysync.py @@ -8,6 +8,13 @@ from headphones import db, logger, helpers, importer def libraryScan(dir=None): + # 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']): + myDB.action('UPDATE tracks SET Location=? WHERE TrackID=?', [None, track['TrackID']]) + if not dir: dir = headphones.MUSIC_DIR @@ -162,14 +169,6 @@ def libraryScan(dir=None): continue logger.info('Done checking empty filepaths') - - # 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']): - myDB.action('UPDATE tracks SET Location=? WHERE TrackID=?', [None, track['TrackID']]) - logger.info('Done syncing library with directory: %s' % dir) # Clean up the new artist list diff --git a/headphones/postprocessor.py b/headphones/postprocessor.py index 7a779e6e..10db91bd 100644 --- a/headphones/postprocessor.py +++ b/headphones/postprocessor.py @@ -110,6 +110,11 @@ def verify(albumid, albumpath): release = myDB.action('SELECT * from albums WHERE AlbumID=?', [albumid]).fetchone() tracks = myDB.select('SELECT * from tracks WHERE AlbumID=?', [albumid]) + try: + albumpath = str(albumpath) + except UnicodeEncodeError: + albumpath = unicode(albumpath).encode('unicode_escape') + downloaded_track_list = [] for r,d,f in os.walk(albumpath): @@ -324,7 +329,7 @@ def moveFiles(albumpath, release, tracks): folder = newfolder break - logger.info('Moving files from %s to %s' % (albumpath, destination_path)) + logger.info('Moving files from %s to %s' % (albumpath, destination_path.encode('utf-8'))) try: os.makedirs(destination_path) @@ -416,7 +421,7 @@ def renameFiles(albumpath, downloaded_track_list, release): new_file = os.path.join(albumpath, new_file_name) - logger.debug('Renaming %s ---> %s' % (downloaded_track, new_file_name)) + logger.debug('Renaming %s ---> %s' % (downloaded_track, new_file_name.encode('utf-8'))) try: os.rename(downloaded_track, new_file) except Exception, e: diff --git a/headphones/sab.py b/headphones/sab.py index 8c20d717..6174aca6 100644 --- a/headphones/sab.py +++ b/headphones/sab.py @@ -65,7 +65,7 @@ def sendNZB(nzb): params['mode'] = 'addfile' multiPartParams = {"nzbfile": (nzb.name+".nzb", nzb.extraInfo[0])} - if not headphones.SAB_HOST.startswith('http://') or headphones.SAB_HOST.startswith('https://'): + if not headphones.SAB_HOST.startswith('http'): headphones.SAB_HOST = 'http://' + headphones.SAB_HOST url = headphones.SAB_HOST + "/" + "api?" + urllib.urlencode(params) diff --git a/headphones/webserve.py b/headphones/webserve.py index 42db5f84..17c4f5aa 100644 --- a/headphones/webserve.py +++ b/headphones/webserve.py @@ -352,9 +352,11 @@ class WebInterface(object): "interface_list" : interface_list, "encode": checked(headphones.ENCODE), "encoder": headphones.ENCODER, - "bitrate": headphones.BITRATE, + "bitrate": int(headphones.BITRATE), "encoderfolder": headphones.ENCODERFOLDER, - "advancedencoder": headphones.ADVANCEDENCODER + "advancedencoder": headphones.ADVANCEDENCODER, + "encoderoutputformat": headphones.ENCODEROUTPUTFORMAT, + "samplingfrequency": int(headphones.SAMPLINGFREQUENCY) } return serve_template(templatename="config.html", title="Settings", config=config) config.exposed = True @@ -365,7 +367,7 @@ class WebInterface(object): usenet_retention=None, nzbmatrix=0, nzbmatrix_username=None, nzbmatrix_apikey=None, newznab=0, newznab_host=None, newznab_apikey=None, nzbsorg=0, nzbsorg_uid=None, nzbsorg_hash=None, newzbin=0, newzbin_uid=None, newzbin_password=None, preferred_quality=0, preferred_bitrate=None, detect_bitrate=0, move_files=0, rename_files=0, correct_metadata=0, cleanup_files=0, add_album_art=0, embed_album_art=0, destination_dir=None, folder_format=None, file_format=None, include_extras=0, interface=None, log_dir=None, - encode=0, encoder=None, bitrate=None, encoderfolder=None, advancedencoder=None): + encode=0, encoder=None, bitrate=None, samplingfrequency=None, encoderfolder=None, advancedencoder=None, encoderoutputformat=None): headphones.HTTP_HOST = http_host headphones.HTTP_PORT = http_port @@ -410,9 +412,11 @@ class WebInterface(object): headphones.LOG_DIR = log_dir headphones.ENCODE = encode headphones.ENCODER = encoder - headphones.BITRATE = bitrate + headphones.BITRATE = int(bitrate) + headphones.SAMPLINGFREQUENCY = int(samplingfrequency) headphones.ENCODERFOLDER = encoderfolder headphones.ADVANCEDENCODER = advancedencoder + headphones.ENCODEROUTPUTFORMAT = encoderoutputformat headphones.config_write()