Fixed folder.jpg bug, added forced postprocessing

This commit is contained in:
Remy
2011-07-30 18:31:34 -07:00
parent 7a822dbc95
commit abaf445562
6 changed files with 135 additions and 18 deletions

View File

@@ -66,6 +66,29 @@ h1{
-moz-border-radius: 20px;
border-radius: 20px;
}
.tableleft{
padding: 3px;
background-color: #ffffff;
float: left;
width: 46%;
height: 200px;
margin-top: 25px;
margin-left: 25px;
margin-right: auto;
-moz-border-radius: 20px;
border-radius: 20px;
}
.tableright{
padding: 3px;
background-color: #ffffff;
width: 46%;
height: 200px;
margin-top: 25px;
margin-left: auto;
margin-right: 0px;
-moz-border-radius: 20px;
border-radius: 20px;
}
.nav{
padding: 2px;
font-size:19px;

View File

@@ -1,6 +1,7 @@
import time
from operator import itemgetter
import datetime
import re
import headphones
@@ -97,4 +98,15 @@ def bytes_to_mb(bytes):
def replace_all(text, dic):
for i, j in dic.iteritems():
text = text.replace(i, j)
return text
return text
def extract_data(s):
pattern = re.compile(r'(?P<name>.*?)\s\-\s(?P<album>.*?)\s\[(?P<year>.*?)\]', re.VERBOSE)
match = pattern.match(s)
name = match.group("name")
album = match.group("album")
year = match.group("year")
return (name, album, year)

View File

@@ -360,4 +360,29 @@ def findArtistbyAlbum(name):
artist_dict['score'] = result.score
return artist_dict
def findAlbumID(artist=None, album=None):
term = '"'+album+'" AND artist:"'+artist+'"'
f = ws.ReleaseGroupFilter(query=term, limit=1)
results = None
attempt = 0
while attempt < 5:
try:
results = q.getReleaseGroups(f)
break
except WebServiceError, e:
logger.warn('Attempt to query MusicBrainz for %s failed: %s. Sleeping 5 seconds.' % (name, e))
attempt += 1
time.sleep(5)
time.sleep(1)
if not results:
return False
rgid = u.extractUuid(results[0].releaseGroup.id)
return rgid

View File

@@ -127,8 +127,9 @@ def embedAlbumArt(artwork, downloaded_track_list):
try:
f = MediaFile(downloaded_track)
except:
continue
logger.error('Could not read %s. Not adding album art' % downloaded_track)
logger.debug('Adding album art to: %s' % downloaded_track)
f.art = artwork
f.save()
@@ -136,7 +137,7 @@ def addAlbumArt(artwork, albumpath):
logger.info('Adding album art to folder')
artwork_file_name = os.path.join(albumpath, 'folder.jpg')
file = open(artwork_file_name, 'w')
file = open(artwork_file_name, 'wb')
file.write(artwork)
file.close()
@@ -145,8 +146,12 @@ def cleanupFiles(albumpath):
for r,d,f in os.walk(albumpath):
for files in f:
if not any(files.endswith(x) for x in (".mp3", ".flac", ".aac", ".ogg", ".ape", ".m4a")):
os.remove(os.path.join(r, files))
logger.debug('Removing: %s' % files)
try:
os.remove(os.path.join(r, files))
except Exception, e:
logger.error('Could not remove file: %s. Error: %s' % (files, e))
def moveFiles(albumpath, release, tracks):
try:
@@ -253,6 +258,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))
try:
shutil.move(downloaded_track, new_file)
except Exception, e:
@@ -303,4 +309,42 @@ def renameUnprocessedFolder(albumpath):
else:
os.rename(albumpath, new_folder_name)
return
return
def forcePostProcess():
if not headphones.DOWNLOAD_DIR:
return
else:
download_dir = headphones.DOWNLOAD_DIR
logger.info('Checking to see if there are any folders to process in download_dir: %s' % download_dir)
# Get a list of folders in the download_dir
folders = [d for d in os.listdir(download_dir) if os.path.isdir(os.path.join(download_dir, d))]
if len(folders):
logger.info('Found %i folders: %s' % (len(folders), str(folders)))
pass
else:
logger.info('Found no folders to process in: %s' % download_dir)
return
# Parse the folder names to get artist album info
for folder in folders:
albumpath = unicode(os.path.join(download_dir, folder))
name, album, year = helpers.extract_data(folder)
myDB = db.DBConnection()
release = myDB.action('SELECT AlbumID, ArtistName, AlbumTitle from albums WHERE ArtistName=? and AlbumTitle=?', [name, album]).fetchone()
if release:
logger.info('Found a match in the database: %s - %s. Verifying to make sure it is the correct album' % (release['ArtistName'], release['AlbumTitle']))
verify(release['AlbumID'], albumpath)
else:
logger.info('Querying MusicBrainz for the release group id for: %s - %s' % (name, album))
from headphones import mb
rgid = unicode(mb.findAlbumID(name, album))
if rgid:
verify(rgid, albumpath)

View File

@@ -375,9 +375,10 @@ class WebInterface(object):
else:
lastfm_user_text = 'Last.FM Username'
if headphones.MUSIC_DIR:
music_dir_text = headphones.MUSIC_DIR
music_dir_input = '''<input type="text" value="%s" name="path" size="70" />''' % headphones.MUSIC_DIR
else:
music_dir_text = 'Enter a directory to scan'
music_dir_input = '''<input type="text" value="Enter a Music Directory to scan" onfocus="if
(this.value==this.defaultValue) this.value='';" name="path" size="70" />'''
page = [templates._header]
page.append(templates._logobar)
page.append(templates._nav)
@@ -392,18 +393,25 @@ class WebInterface(object):
<br /><br />
<form action="musicScan" method="GET" align="center">
<input type="text" value="%s" onfocus="if
(this.value==this.defaultValue) this.value='';" name="path" size="70" />
%s
<input type="submit" /></form><br /><br /></div></div>
<div class="table"><div class="config"><h1>Import Your Last.FM Artists</h1><br />
<div class="tableleft"><div class="config"><h1>Import Last.FM Artists</h1><br />
Enter the username whose artists you want to import:<br /><br />
<form action="importLastFM" method="GET" align="center">
<input type="text" value="%s" onfocus="if
(this.value==this.defaultValue) this.value='';" name="username" size="18" />
<input type="submit" /></form><br /><br /></div></div>
<div class="tableright"><div class="config"><h1>Placeholder :-)</h1><br />
<br /><br />
<form action="" method="GET" align="center">
<input type="text" value="" onfocus="if
(this.value==this.defaultValue) this.value='';" name="" size="18" />
<input type="submit" /></form><br /><br /></div></div><br />
<div class="table"><div class="config"><h1>Force Search</h1><br />
<a href="forceSearch">Force Check for Wanted Albums</a><br /><br />
<a href="forceUpdate">Force Update Active Artists</a><br /><br />
<a href="checkGithub">Check for Headphones Updates</a><br /><br /><br /></div></div>''' % (music_dir_text, lastfm_user_text))
<a href="forcePostProcess">Force Post-Process Albums in Download Folder</a><br /><br /><br />
<a href="checkGithub">Check for Headphones Updates</a><br /><br /><br /></div></div>''' % (music_dir_input, lastfm_user_text))
page.append(templates._footer % headphones.CURRENT_VERSION)
return page
manage.exposed = True
@@ -449,6 +457,13 @@ class WebInterface(object):
raise cherrypy.HTTPRedirect("home")
forceSearch.exposed = True
def forcePostProcess(self):
from headphones import postprocessor
threading.Thread(target=postprocessor.forcePostProcess).start()
time.sleep(5)
raise cherrypy.HTTPRedirect("home")
forcePostProcess.exposed = True
def checkGithub(self):
from headphones import versioncheck
versioncheck.checkGithub()

View File

@@ -790,16 +790,14 @@ class MediaFile(object):
albumartist = MediaField(
mp3 = StorageStyle('TPE2'),
mp4 = StorageStyle(
'----:com.apple.iTunes:Album Artist',
as_type=str),
'----:com.apple.iTunes:Album Artist'),
etc = [StorageStyle('album artist'),
StorageStyle('albumartist')]
)
albumtype = MediaField(
mp3 = StorageStyle('TXXX', id3_desc=u'MusicBrainz Album Type'),
mp4 = StorageStyle(
'----:com.apple.iTunes:MusicBrainz Album Type',
as_type=str),
'----:com.apple.iTunes:MusicBrainz Album Type'),
etc = StorageStyle('musicbrainz_albumtype')
)