Added musicbrainz mirror switching - set tbueter.com as default, ability to use a local mirror. Hopefully get those 503 errors fixed

This commit is contained in:
Remy Varma
2012-02-13 13:20:45 +00:00
parent 514844ec2d
commit 047c5043e2
5 changed files with 92 additions and 29 deletions

View File

@@ -227,7 +227,7 @@
<tr>
<td>
<br><br><br><br><h2>Torrent:</h2><br>
<h2>Torrent:</h2><br>
</td>
</tr>
@@ -420,17 +420,33 @@
<h3>Path to Encoder:</h3><input type="text" name="encoderfolder" value="${config['encoderfolder']}" size="43">
</div>
</td>
<td>
<h2>Prowl Notification:</h2>
<br>
<h3><input type="checkbox" name="prowl_enabled" id="prowl" value="1" ${config['prowl_enabled']} />Enabled Prowl Notification</h3><br>
<td>
<h2>Prowl Notification:</h2><br>
<h3><input type="checkbox" name="prowl_enabled" id="prowl" value="1" ${config['prowl_enabled']} />Enable Prowl Notifications</h3><br>
<div id="prowloptions">
<h3>API key:</h3><input type="text" name="prowl_keys" value="${config['prowl_keys']}" size="50"><br><br>
<h3>API key:</h3><input type="text" name="prowl_keys" value="${config['prowl_keys']}" size="50"><br><br>
<h3><input type="checkbox" name="prowl_onsnatch" value="1" ${config['prowl_onsnatch']} />Notify on snatch?</h3><br>
<h3>Priority (-2,-1,0,1 or 2):</h3><input type="text" name="prowl_priority" value="${config['prowl_priority']}" size="2">
</div>
</td>
</td>
</tr>
<tr>
<td>
<h3>Muscbrainz Mirror: <select name="mirror"><h3>
%for mirror in config['mirror_list']:
<%
if mirror == headphones.MIRROR:
selected = 'selected="selected"'
else:
selected = ''
if mirror == "localhost":
mirrortext = " (use localhost:7143)"
else:
mirrortext = ''
%>
<option value="${mirror}" ${selected}>${mirror} ${mirrortext}</option>
%endfor
</select>
</table>
</div>

View File

@@ -11,7 +11,7 @@ from lib.configobj import ConfigObj
import cherrypy
from headphones import updater, searcher, importer, versioncheck, logger, postprocessor, version, sab, librarysync
from headphones import versioncheck, logger, version
from headphones.common import *
FULL_PATH = None
@@ -134,6 +134,8 @@ PROWL_ENABLED = True
PROWL_PRIORITY = 1
PROWL_KEYS = None
PROWL_ONSNATCH = True
MIRRORLIST = ["musicbrainz.org","tbueter.com","localhost"]
MIRROR = None
def CheckSection(sec):
""" Check if INI section exists, if not create it """
@@ -195,7 +197,7 @@ def initialize():
NZBMATRIX, NZBMATRIX_USERNAME, NZBMATRIX_APIKEY, NEWZNAB, NEWZNAB_HOST, NEWZNAB_APIKEY, \
NZBSORG, NZBSORG_UID, NZBSORG_HASH, NEWZBIN, NEWZBIN_UID, NEWZBIN_PASSWORD, LASTFM_USERNAME, INTERFACE, FOLDER_PERMISSIONS, \
ENCODERFOLDER, ENCODER, BITRATE, SAMPLINGFREQUENCY, ENCODE, ADVANCEDENCODER, ENCODEROUTPUTFORMAT, ENCODERQUALITY, ENCODERVBRCBR, \
ENCODERLOSSLESS, PROWL_ENABLED, PROWL_PRIORITY, PROWL_KEYS, PROWL_ONSNATCH
ENCODERLOSSLESS, PROWL_ENABLED, PROWL_PRIORITY, PROWL_KEYS, PROWL_ONSNATCH, MIRRORLIST, MIRROR
if __INITIALIZED__:
return False
@@ -207,7 +209,7 @@ def initialize():
CheckSection('Newznab')
CheckSection('NZBsorg')
CheckSection('Newzbin')
CheckSection('Prowl')
CheckSection('Prowl')
# Set global variables based on config file or use defaults
try:
@@ -296,10 +298,12 @@ def initialize():
ENCODERVBRCBR = check_setting_str(CFG, 'General', 'encodervbrcbr', 'cbr')
ENCODERLOSSLESS = bool(check_setting_int(CFG, 'General', 'encoderlossless', 1))
PROWL_ENABLED = bool(check_setting_int(CFG, 'Prowl', 'prowl_enabled', 0))
PROWL_KEYS = check_setting_str(CFG, 'Prowl', 'prowl_keys', '')
PROWL_ONSNATCH = bool(check_setting_int(CFG, 'Prowl', 'prowl_onsnatch', 0))
PROWL_PRIORITY = check_setting_int(CFG, 'Prowl', 'prowl_priority', 0)
PROWL_ENABLED = bool(check_setting_int(CFG, 'Prowl', 'prowl_enabled', 0))
PROWL_KEYS = check_setting_str(CFG, 'Prowl', 'prowl_keys', '')
PROWL_ONSNATCH = bool(check_setting_int(CFG, 'Prowl', 'prowl_onsnatch', 0))
PROWL_PRIORITY = check_setting_int(CFG, 'Prowl', 'prowl_priority', 0)
MIRROR = check_setting_str(CFG, 'General', 'mirror', 'tbueter.com')
if not LOG_DIR:
LOG_DIR = os.path.join(DATA_DIR, 'logs')
@@ -502,6 +506,8 @@ def config_write():
new_config['General']['encodervbrcbr'] = ENCODERVBRCBR
new_config['General']['encoderlossless'] = ENCODERLOSSLESS
new_config['General']['mirror'] = MIRROR
new_config.write()
@@ -512,6 +518,7 @@ def start():
if __INITIALIZED__:
# Start our scheduled background tasks
from headphones import updater, searcher, librarysync, postprocessor
SCHED.add_interval_job(updater.dbUpdate, hours=48)
SCHED.add_interval_job(searcher.searchforalbum, minutes=SEARCH_INTERVAL)

View File

@@ -13,9 +13,32 @@ import headphones
from headphones import logger, db
from headphones.helpers import multikeysort, replace_all
q = ws.Query()
mb_lock = threading.Lock()
# Quick fix to add mirror switching on the fly. Need to probably return the mbhost & mbport that's
# being used, so we can send those values to the log
def startmb():
if headphones.MIRROR == "localhost":
mbhost = "localhost"
mbport = 7143
sleepytime = 0
elif headphones.MIRROR == "tbueter.com":
mbhost = "tbueter.com"
mbport = 3000
sleepytime = 0
else:
mbhost = "musicbrainz.org"
mbport = 80
sleepytime = 1
service = ws.WebService(host=mbhost, port=mbport)
q = ws.Query(service)
return (q, sleepytime)
def findArtist(name, limit=1):
with mb_lock:
@@ -27,6 +50,8 @@ def findArtist(name, limit=1):
chars = set('!?*')
if any((c in chars) for c in name):
name = '"'+name+'"'
q, sleepytime = startmb()
while attempt < 5:
@@ -34,11 +59,11 @@ def findArtist(name, limit=1):
artistResults = q.getArtists(ws.ArtistFilter(query=name, limit=limit))
break
except WebServiceError, e:
logger.warn('Attempt to query MusicBrainz for %s failed: %s' % (name, e))
logger.warn('Attempt to query MusicBrainz for %s failed: %s [%s:%i]' % (name, e, mbhost, mbport))
attempt += 1
time.sleep(5)
time.sleep(1)
time.sleep(sleepytime)
if not artistResults:
return False
@@ -85,6 +110,8 @@ def findRelease(name, limit=1):
chars = set('!?')
if any((c in chars) for c in name):
name = '"'+name+'"'
q, sleepytime = startmb()
while attempt < 5:
@@ -96,7 +123,7 @@ def findRelease(name, limit=1):
attempt += 1
time.sleep(5)
time.sleep(1)
time.sleep(sleepytime)
if not releaseResults:
return False
@@ -126,6 +153,8 @@ def getArtist(artistid, extrasonly=False):
artist = None
attempt = 0
q, sleepytime = startmb()
while attempt < 5:
try:
@@ -139,7 +168,7 @@ def getArtist(artistid, extrasonly=False):
if not artist:
return False
time.sleep(1)
time.sleep(sleepytime)
artist_dict['artist_name'] = artist.name
artist_dict['artist_sortname'] = artist.sortName
@@ -215,6 +244,8 @@ def getReleaseGroup(rgid):
releaseGroup = None
attempt = 0
q, sleepytime = startmb()
while attempt < 5:
try:
@@ -228,7 +259,7 @@ def getReleaseGroup(rgid):
if not releaseGroup:
return False
time.sleep(1)
time.sleep(sleepytime)
# 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.)
for release in releaseGroup.releases:
@@ -257,7 +288,7 @@ def getReleaseGroup(rgid):
logger.debug('%s is not an official live album. Skipping' % releaseResult.name)
continue
time.sleep(1)
time.sleep(sleepytime)
formats = {
'2xVinyl': '2',
@@ -345,6 +376,8 @@ def getRelease(releaseid):
inc = ws.ReleaseIncludes(tracks=True, releaseEvents=True, releaseGroup=True, artist=True)
results = None
attempt = 0
q, sleepytime = startmb()
while attempt < 5:
@@ -359,7 +392,7 @@ def getRelease(releaseid):
if not results:
return False
time.sleep(1)
time.sleep(sleepytime)
release['title'] = results.title
release['id'] = u.extractUuid(results.id)
@@ -414,6 +447,8 @@ def findArtistbyAlbum(name):
f = ws.ReleaseGroupFilter(query=term, limit=1)
results = None
attempt = 0
q, sleepytime = startmb()
while attempt < 5:
@@ -425,7 +460,7 @@ def findArtistbyAlbum(name):
attempt += 1
time.sleep(5)
time.sleep(1)
time.sleep(sleepytime)
if not results:
return False
@@ -447,6 +482,8 @@ def findAlbumID(artist=None, album=None):
f = ws.ReleaseGroupFilter(title=album, artistName=artist, limit=1)
results = None
attempt = 0
q, sleepytime = startmb()
while attempt < 5:
@@ -458,10 +495,10 @@ def findAlbumID(artist=None, album=None):
attempt += 1
time.sleep(5)
time.sleep(1)
time.sleep(sleepytime)
if not results:
return False
rgid = u.extractUuid(results[0].releaseGroup.id)
return rgid
return rgid

View File

@@ -1,6 +1,6 @@
import headphones
from headphones import logger, db, mb, importer
from headphones import logger, db, importer
def dbUpdate():
@@ -15,4 +15,4 @@ def dbUpdate():
artistid = artist[0]
importer.addArtisttoDB(artistid)
logger.info('Update complete')
logger.info('Update complete')

View File

@@ -382,7 +382,9 @@ class WebInterface(object):
"prowl_enabled": checked(headphones.PROWL_ENABLED),
"prowl_onsnatch": checked(headphones.PROWL_ONSNATCH),
"prowl_keys": headphones.PROWL_KEYS,
"prowl_priority": headphones.PROWL_PRIORITY
"prowl_priority": headphones.PROWL_PRIORITY,
"mirror_list": headphones.MIRRORLIST,
"mirror": headphones.MIRROR
}
return serve_template(templatename="config.html", title="Settings", config=config)
config.exposed = True
@@ -395,7 +397,7 @@ class WebInterface(object):
torrentblackhole_dir=None, download_torrent_dir=None, numberofseeders=10, use_isohunt=0, use_kat=0, use_mininova=0,
rename_files=0, correct_metadata=0, cleanup_files=0, add_album_art=0, embed_album_art=0, embed_lyrics=0, destination_dir=None, folder_format=None, file_format=None, include_extras=0, interface=None, log_dir=None,
encode=0, encoder=None, bitrate=None, samplingfrequency=None, encoderfolder=None, advancedencoder=None, encoderoutputformat=None, encodervbrcbr=None, encoderquality=None, encoderlossless=0,
prowl_enabled=0, prowl_onsnatch=0, prowl_keys=None, prowl_priority=0):
prowl_enabled=0, prowl_onsnatch=0, prowl_keys=None, prowl_priority=0, mirror=None):
headphones.HTTP_HOST = http_host
headphones.HTTP_PORT = http_port
@@ -459,6 +461,7 @@ class WebInterface(object):
headphones.PROWL_ONSNATCH = prowl_onsnatch
headphones.PROWL_KEYS = prowl_keys
headphones.PROWL_PRIORITY = prowl_priority
headphones.MIRROR = mirror
headphones.config_write()