-added OGG support as well as cue_in unit tests for mp3 and ogg files

This commit is contained in:
martin 2010-12-31 12:20:17 -05:00
parent c24a152eba
commit 9f26a70ca9
4 changed files with 106 additions and 53 deletions

View file

@ -463,7 +463,7 @@ class Playout:
""" """
Handle files on NAS. Pre-cueing not implemented at the moment. Handle files on NAS. Pre-cueing not implemented at the moment.
(not needed by openbroadcast, feel free to add this) (not needed by openbroadcast, feel free to add this)
Here an implementation for localy stored files. Here's an implementation for locally stored files.
Works the same as with remote files, just replaced API-download with Works the same as with remote files, just replaced API-download with
file copy. file copy.
""" """

View file

@ -0,0 +1,42 @@
import unittest
from util.cue_file import CueFile
from mutagen.mp3 import MP3
from mutagen.oggvorbis import OggVorbis
import random
import string
class test(unittest.TestCase):
"""
A test class for the cue_in module.
"""
def setUp(self):
self.cue_file = CueFile()
def test_cue_mp3(self):
src = '../audio_samples/OpSound/Peter_Rudenko_-_Opening.mp3'
dst = '/tmp/' + "".join([random.choice(string.letters) for i in xrange(10)]) + '.mp3'
self.cue_file.cue(src, dst, 5, 5)
src_length = MP3(src).info.length
dst_length = MP3(dst).info.length
print src + " " + str(src_length)
print dst + " " + str(dst_length)
self.assertTrue(dst_length < src_length)
def test_cue_ogg(self):
src = '../audio_samples/OpSound/ACDC_-_Back_In_Black-sample.ogg'
dst = '/tmp/' + "".join([random.choice(string.letters) for i in xrange(10)]) + '.ogg'
self.cue_file.cue(src, dst, 5, 5)
src_length = OggVorbis(src).info.length
dst_length = OggVorbis(dst).info.length
print src + " " + str(src_length)
print dst + " " + str(dst_length)
self.assertTrue(dst_length < src_length)
if __name__ == '__main__':
unittest.main()

View file

@ -79,7 +79,7 @@ dst = TEMP_DIR + 'lstf_' + "".join( [random.choice(string.letters) for i in xran
# get length of track using mutagen. # get length of track using mutagen.
#audio #audio
#command #command
if src.endswith('.mp3'): if src.lower().endswith('.mp3'):
audio = MP3(src) audio = MP3(src)
dur = round(audio.info.length, 3) dur = round(audio.info.length, 3)
@ -115,7 +115,7 @@ if src.endswith('.mp3'):
sys.stderr.write('abs: ' + str(str_cue_out) + '\n\n') sys.stderr.write('abs: ' + str(str_cue_out) + '\n\n')
command = 'mp3cut -o %s -t %s-%s %s' % (dst, str_cue_in, str_cue_out, src) command = 'mp3cut -o %s -t %s-%s %s' % (dst, str_cue_in, str_cue_out, src)
elif src.endswith('.ogg'): elif src.lower().endswith('.ogg'):
audio = OggVorbis(src) audio = OggVorbis(src)
dur = audio.info.length dur = audio.info.length
sys.stderr.write('duration: ' + str(dur) + '\n') sys.stderr.write('duration: ' + str(dur) + '\n')

View file

@ -11,7 +11,7 @@ import os
import logging import logging
from mutagen.mp3 import MP3 from mutagen.mp3 import MP3
from mutagen.oggvorbis import OggVorbis
class CueFile(): class CueFile():
@ -24,56 +24,67 @@ class CueFile():
logger = logging.getLogger("cue_file.cue") logger = logging.getLogger("cue_file.cue")
logger.debug("cue file: %s %s %s %s", src, dst, cue_in, cue_out) logger.debug("cue file: %s %s %s %s", src, dst, cue_in, cue_out)
# mutagen if src.lower().endswith('.mp3'):
audio = MP3(src) # mutagen
dur = round(audio.info.length, 3) audio = MP3(src)
dur = round(audio.info.length, 3)
logger.debug("duration by mutagen: %s", dur) logger.debug("duration by mutagen: %s", dur)
cue_out = round(float(dur) - cue_out, 3) cue_out = round(float(dur) - cue_out, 3)
str_cue_in = str(timedelta(seconds=cue_in)).replace(".", "+") # hh:mm:ss+mss, eg 00:00:20+000 str_cue_in = str(timedelta(seconds=cue_in)).replace(".", "+") # hh:mm:ss+mss, eg 00:00:20+000
str_cue_out = str(timedelta(seconds=cue_out)).replace(".", "+") # str_cue_out = str(timedelta(seconds=cue_out)).replace(".", "+") #
""" """
now a bit a hackish part, don't know how to do this better... now a bit a hackish part, don't know how to do this better...
need to cut the digits after the "+" need to cut the digits after the "+"
""" """
ts = str_cue_in.split("+") ts = str_cue_in.split("+")
try: try:
if len(ts[1]) == 6: if len(ts[1]) == 6:
ts[1] = ts[1][0:3] ts[1] = ts[1][0:3]
str_cue_in = "%s+%s" % (ts[0], ts[1]) str_cue_in = "%s+%s" % (ts[0], ts[1])
except Exception, e: except Exception, e:
pass pass
ts = str_cue_out.split("+") ts = str_cue_out.split("+")
try: try:
if len(ts[1]) == 6: if len(ts[1]) == 6:
ts[1] = ts[1][0:3] ts[1] = ts[1][0:3]
str_cue_out = "%s+%s" % (ts[0], ts[1]) str_cue_out = "%s+%s" % (ts[0], ts[1])
except Exception, e: except Exception, e:
pass pass
#sys.stderr.write(str(timedelta(seconds=cue_in)).replace(".", "+") + '\n\n') logger.debug("in: %s", str_cue_in)
logger.debug("in: %s", str_cue_in) logger.debug("out: %s", str(str_cue_out) )
logger.debug("out: %s", str(str_cue_out) )
# command = 'mp3cut -o %s -t %s-%s %s' % (dst, str_cue_in, str_cue_out, src); command = 'mp3cut -o %s -t %s-%s %s' % (dst + '.tmp.mp3', str_cue_in, str_cue_out, src);
# logger.info("command: %s", command) logger.info("command: %s", command)
# os.system(command + ' >/dev/null') print command
# os.system(command + ' > /dev/null 2>&1')
# command = 'mp3val -f %s' % (dst);
# logger.info("command: %s", command)
# os.system(command + ' >/dev/null')
command = 'mp3cut -o %s -t %s-%s %s' % (dst + '.tmp.mp3', str_cue_in, str_cue_out, src); command = 'lame -b 32 %s %s' % (dst + '.tmp.mp3', dst);
logger.info("command: %s", command) logger.info("command: %s", command)
os.system(command + ' >/dev/null') print command
os.system(command + ' > /dev/null 2>&1')
command = 'lame -b 32 %s %s' % (dst + '.tmp.mp3', dst); elif src.lower().endswith('.ogg'):
logger.info("command: %s", command) audio = OggVorbis(src)
os.system(command + ' >/dev/null') dur = audio.info.length
sys.stderr.write('duration: ' + str(dur) + '\n')
cue_out = float(dur) - cue_out
#convert input format of ss.mmm to milliseconds and to string<
str_cue_in = str(int(round(cue_in*1000)))
#convert input format of ss.mmm to milliseconds and to string
str_cue_out = str(int(round(cue_out*1000)))
command = 'oggCut -s %s -e %s %s %s' % (str_cue_in, str_cue_out, src, dst)
logger.info("command: %s", command)
os.system(command + ' > /dev/null 2>&1')
else:
logger.debug("in: %s", 'File name with invalid extension. File will not be cut\n')
return dst return dst