Merge branch 'cc-5709-airtime-analyzer' of github.com:sourcefabric/Airtime into cc-5709-airtime-analyzer

This commit is contained in:
drigato 2014-04-16 17:24:15 -04:00
commit f27ce3af9e
5 changed files with 54 additions and 44 deletions

View File

@ -30,27 +30,33 @@ class AnalyzerPipeline:
temporary randomly generated name, which is why we want temporary randomly generated name, which is why we want
to know what the original name was. to know what the original name was.
""" """
if not isinstance(queue, multiprocessing.queues.Queue): try:
raise TypeError("queue must be a multiprocessing.Queue()") if not isinstance(queue, multiprocessing.queues.Queue):
if not isinstance(audio_file_path, unicode): raise TypeError("queue must be a multiprocessing.Queue()")
raise TypeError("audio_file_path must be unicode. Was of type " + type(audio_file_path).__name__ + " instead.") if not isinstance(audio_file_path, unicode):
if not isinstance(import_directory, unicode): raise TypeError("audio_file_path must be unicode. Was of type " + type(audio_file_path).__name__ + " instead.")
raise TypeError("import_directory must be unicode. Was of type " + type(import_directory).__name__ + " instead.") if not isinstance(import_directory, unicode):
if not isinstance(original_filename, unicode): raise TypeError("import_directory must be unicode. Was of type " + type(import_directory).__name__ + " instead.")
raise TypeError("original_filename must be unicode. Was of type " + type(original_filename).__name__ + " instead.") if not isinstance(original_filename, unicode):
raise TypeError("original_filename must be unicode. Was of type " + type(original_filename).__name__ + " instead.")
# Analyze the audio file we were told to analyze:
# First, we extract the ID3 tags and other metadata:
metadata = dict() # Analyze the audio file we were told to analyze:
metadata = MetadataAnalyzer.analyze(audio_file_path, metadata) # First, we extract the ID3 tags and other metadata:
metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata) metadata = dict()
metadata["import_status"] = 0 # imported metadata = MetadataAnalyzer.analyze(audio_file_path, metadata)
metadata = FileMoverAnalyzer.move(audio_file_path, import_directory, original_filename, metadata)
# Note that the queue we're putting the results into is our interprocess communication metadata["import_status"] = 0 # imported
# back to the main process.
# Note that the queue we're putting the results into is our interprocess communication
# Pass all the file metadata back to the main analyzer process, which then passes # back to the main process.
# it back to the Airtime web application.
queue.put(metadata) # Pass all the file metadata back to the main analyzer process, which then passes
# it back to the Airtime web application.
queue.put(metadata)
except Exception as e:
# Ensures the traceback for this child process gets written to our log files:
logging.exception(e)
raise e

View File

@ -49,9 +49,6 @@ class MetadataAnalyzer(Analyzer):
mime_magic = magic.Magic(mime=True) mime_magic = magic.Magic(mime=True)
metadata["mime"] = mime_magic.from_file(filename) metadata["mime"] = mime_magic.from_file(filename)
if isinstance(info, mutagen.mp3.MPEGInfo):
print "mode is: " + str(info.mode)
#Try to get the number of channels if mutagen can... #Try to get the number of channels if mutagen can...
try: try:
#Special handling for getting the # of channels from MP3s. It's in the "mode" field #Special handling for getting the # of channels from MP3s. It's in the "mode" field

View File

@ -6,5 +6,8 @@ stop on runlevel [!2345]
respawn respawn
env LANG='en_US.UTF-8'
env LC_ALL='en_US.UTF-8'
exec su www-data -c "airtime_analyzer" exec su www-data -c "airtime_analyzer"

View File

@ -22,15 +22,15 @@ def test_basic():
q = multiprocessing.Queue() q = multiprocessing.Queue()
#This actually imports the file into the "./Test Artist" directory. #This actually imports the file into the "./Test Artist" directory.
AnalyzerPipeline.run_analysis(q, DEFAULT_AUDIO_FILE, u'.', filename) AnalyzerPipeline.run_analysis(q, DEFAULT_AUDIO_FILE, u'.', filename)
results = q.get() metadata = q.get()
assert results['track_title'] == u'Test Title' assert metadata['track_title'] == u'Test Title'
assert results['artist_name'] == u'Test Artist' assert metadata['artist_name'] == u'Test Artist'
assert results['album_title'] == u'Test Album' assert metadata['album_title'] == u'Test Album'
assert results['year'] == u'1999' assert metadata['year'] == u'1999'
assert results['genre'] == u'Test Genre' assert metadata['genre'] == u'Test Genre'
assert results['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't.
assert results['length_seconds'] == 3.90925 assert abs(metadata['length_seconds'] - 3.9) < 0.1
assert results["length"] == str(datetime.timedelta(seconds=results["length_seconds"])) assert metadata["length"] == str(datetime.timedelta(seconds=metadata["length_seconds"]))
assert os.path.exists(DEFAULT_IMPORT_DEST) assert os.path.exists(DEFAULT_IMPORT_DEST)
@raises(TypeError) @raises(TypeError)

View File

@ -25,7 +25,7 @@ def test_mp3_mono():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 1 assert metadata['channels'] == 1
assert metadata['bit_rate'] == 64000 assert metadata['bit_rate'] == 64000
assert metadata['length_seconds'] == 3.90925 assert abs(metadata['length_seconds'] - 3.9) < 0.1
assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't.
assert metadata['track_total'] == u'10' # MP3s can have a track_total assert metadata['track_total'] == u'10' # MP3s can have a track_total
#Mutagen doesn't extract comments from mp3s it seems #Mutagen doesn't extract comments from mp3s it seems
@ -35,7 +35,7 @@ def test_mp3_jointstereo():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 2 assert metadata['channels'] == 2
assert metadata['bit_rate'] == 128000 assert metadata['bit_rate'] == 128000
assert metadata['length_seconds'] == 3.90075 assert abs(metadata['length_seconds'] - 3.9) < 0.1
assert metadata['mime'] == 'audio/mpeg' assert metadata['mime'] == 'audio/mpeg'
assert metadata['track_total'] == u'10' # MP3s can have a track_total assert metadata['track_total'] == u'10' # MP3s can have a track_total
@ -44,7 +44,7 @@ def test_mp3_simplestereo():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 2 assert metadata['channels'] == 2
assert metadata['bit_rate'] == 128000 assert metadata['bit_rate'] == 128000
assert metadata['length_seconds'] == 3.90075 assert abs(metadata['length_seconds'] - 3.9) < 0.1
assert metadata['mime'] == 'audio/mpeg' assert metadata['mime'] == 'audio/mpeg'
assert metadata['track_total'] == u'10' # MP3s can have a track_total assert metadata['track_total'] == u'10' # MP3s can have a track_total
@ -53,7 +53,7 @@ def test_mp3_dualmono():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 2 assert metadata['channels'] == 2
assert metadata['bit_rate'] == 128000 assert metadata['bit_rate'] == 128000
assert metadata['length_seconds'] == 3.90075 assert abs(metadata['length_seconds'] - 3.9) < 0.1
assert metadata['mime'] == 'audio/mpeg' assert metadata['mime'] == 'audio/mpeg'
assert metadata['track_total'] == u'10' # MP3s can have a track_total assert metadata['track_total'] == u'10' # MP3s can have a track_total
@ -63,7 +63,7 @@ def test_ogg_mono():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 1 assert metadata['channels'] == 1
assert metadata['bit_rate'] == 80000 assert metadata['bit_rate'] == 80000
assert metadata['length_seconds'] == 3.8394104308390022 assert abs(metadata['length_seconds'] - 3.8) < 0.1
assert metadata['mime'] == 'application/ogg' assert metadata['mime'] == 'application/ogg'
assert metadata['comment'] == u'Test Comment' assert metadata['comment'] == u'Test Comment'
@ -72,7 +72,7 @@ def test_ogg_stereo():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 2 assert metadata['channels'] == 2
assert metadata['bit_rate'] == 112000 assert metadata['bit_rate'] == 112000
assert metadata['length_seconds'] == 3.8394104308390022 assert abs(metadata['length_seconds'] - 3.8) < 0.1
assert metadata['mime'] == 'application/ogg' assert metadata['mime'] == 'application/ogg'
assert metadata['comment'] == u'Test Comment' assert metadata['comment'] == u'Test Comment'
@ -84,7 +84,7 @@ def test_aac_mono():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 1 assert metadata['channels'] == 1
assert metadata['bit_rate'] == 80000 assert metadata['bit_rate'] == 80000
assert metadata['length_seconds'] == 3.8394104308390022 assert abs(metadata['length_seconds'] - 3.8) < 0.1
assert metadata['mime'] == 'video/mp4' assert metadata['mime'] == 'video/mp4'
assert metadata['comment'] == u'Test Comment' assert metadata['comment'] == u'Test Comment'
''' '''
@ -94,7 +94,7 @@ def test_aac_stereo():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 2 assert metadata['channels'] == 2
assert metadata['bit_rate'] == 102619 assert metadata['bit_rate'] == 102619
assert metadata['length_seconds'] == 3.8626303854875284 assert abs(metadata['length_seconds'] - 3.8) < 0.1
assert metadata['mime'] == 'video/mp4' assert metadata['mime'] == 'video/mp4'
assert metadata['comment'] == u'Test Comment' assert metadata['comment'] == u'Test Comment'
@ -110,7 +110,7 @@ def test_mp3_utf8():
assert metadata['track_number'] == u'1' assert metadata['track_number'] == u'1'
assert metadata['channels'] == 2 assert metadata['channels'] == 2
assert metadata['bit_rate'] == 128000 assert metadata['bit_rate'] == 128000
assert metadata['length_seconds'] == 3.90075 assert abs(metadata['length_seconds'] - 3.9) < 0.1
assert metadata['mime'] == 'audio/mpeg' assert metadata['mime'] == 'audio/mpeg'
assert metadata['track_total'] == u'10' # MP3s can have a track_total assert metadata['track_total'] == u'10' # MP3s can have a track_total
@ -143,7 +143,11 @@ def test_mp3_bad_channels():
check_default_metadata(metadata) check_default_metadata(metadata)
assert metadata['channels'] == 1 assert metadata['channels'] == 1
assert metadata['bit_rate'] == 64000 assert metadata['bit_rate'] == 64000
assert metadata['length_seconds'] == 3.90925 print metadata['length_seconds']
assert abs(metadata['length_seconds'] - 3.9) < 0.1
assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't. assert metadata['mime'] == 'audio/mpeg' # Not unicode because MIMEs aren't.
assert metadata['track_total'] == u'10' # MP3s can have a track_total assert metadata['track_total'] == u'10' # MP3s can have a track_total
#Mutagen doesn't extract comments from mp3s it seems #Mutagen doesn't extract comments from mp3s it seems
def test_unparsable_file():
MetadataAnalyzer.analyze(u'README.rst', dict())