Merge branch 'cc-5709-airtime-analyzer' of github.com:sourcefabric/Airtime into cc-5709-airtime-analyzer
This commit is contained in:
commit
f27ce3af9e
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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())
|
||||||
|
|
Loading…
Reference in New Issue