diff --git a/pypo/pypo-cli.py b/pypo/pypo-cli.py index f57a35a42..7c1b27de9 100755 --- a/pypo/pypo-cli.py +++ b/pypo/pypo-cli.py @@ -463,7 +463,7 @@ class Playout: """ Handle files on NAS. Pre-cueing not implemented at the moment. (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 file copy. """ diff --git a/pypo/pypo-cue-in-validator.py b/pypo/pypo-cue-in-validator.py new file mode 100644 index 000000000..df4d06661 --- /dev/null +++ b/pypo/pypo-cue-in-validator.py @@ -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() diff --git a/pypo/scripts/cue_file.py b/pypo/scripts/cue_file.py index a5f908528..4d232ab1b 100755 --- a/pypo/scripts/cue_file.py +++ b/pypo/scripts/cue_file.py @@ -79,7 +79,7 @@ dst = TEMP_DIR + 'lstf_' + "".join( [random.choice(string.letters) for i in xran # get length of track using mutagen. #audio #command -if src.endswith('.mp3'): +if src.lower().endswith('.mp3'): audio = MP3(src) dur = round(audio.info.length, 3) @@ -115,7 +115,7 @@ if src.endswith('.mp3'): 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) -elif src.endswith('.ogg'): +elif src.lower().endswith('.ogg'): audio = OggVorbis(src) dur = audio.info.length sys.stderr.write('duration: ' + str(dur) + '\n') diff --git a/pypo/util/cue_file.py b/pypo/util/cue_file.py index 4a9f1c4f2..0d5f6cab5 100755 --- a/pypo/util/cue_file.py +++ b/pypo/util/cue_file.py @@ -11,7 +11,7 @@ import os import logging from mutagen.mp3 import MP3 - +from mutagen.oggvorbis import OggVorbis class CueFile(): @@ -24,56 +24,67 @@ class CueFile(): logger = logging.getLogger("cue_file.cue") logger.debug("cue file: %s %s %s %s", src, dst, cue_in, cue_out) - # mutagen - audio = MP3(src) - dur = round(audio.info.length, 3) + if src.lower().endswith('.mp3'): + # mutagen + audio = MP3(src) + dur = round(audio.info.length, 3) - logger.debug("duration by mutagen: %s", dur) - - 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_out = str(timedelta(seconds=cue_out)).replace(".", "+") # - - """ - now a bit a hackish part, don't know how to do this better... - need to cut the digits after the "+" - """ - ts = str_cue_in.split("+") - try: - if len(ts[1]) == 6: - ts[1] = ts[1][0:3] - str_cue_in = "%s+%s" % (ts[0], ts[1]) - except Exception, e: - pass - - ts = str_cue_out.split("+") - try: - if len(ts[1]) == 6: - ts[1] = ts[1][0:3] - str_cue_out = "%s+%s" % (ts[0], ts[1]) - except Exception, e: - pass - - #sys.stderr.write(str(timedelta(seconds=cue_in)).replace(".", "+") + '\n\n') - logger.debug("in: %s", str_cue_in) - logger.debug("out: %s", str(str_cue_out) ) + logger.debug("duration by mutagen: %s", dur) + + 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_out = str(timedelta(seconds=cue_out)).replace(".", "+") # + + """ + now a bit a hackish part, don't know how to do this better... + need to cut the digits after the "+" + """ + ts = str_cue_in.split("+") + try: + if len(ts[1]) == 6: + ts[1] = ts[1][0:3] + str_cue_in = "%s+%s" % (ts[0], ts[1]) + except Exception, e: + pass + + ts = str_cue_out.split("+") + try: + if len(ts[1]) == 6: + ts[1] = ts[1][0:3] + str_cue_out = "%s+%s" % (ts[0], ts[1]) + except Exception, e: + pass + + logger.debug("in: %s", str_cue_in) + logger.debug("out: %s", str(str_cue_out) ) -# command = 'mp3cut -o %s -t %s-%s %s' % (dst, str_cue_in, str_cue_out, src); -# logger.info("command: %s", command) -# os.system(command + ' >/dev/null') -# -# 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); + logger.info("command: %s", command) + print command + os.system(command + ' > /dev/null 2>&1') - command = 'mp3cut -o %s -t %s-%s %s' % (dst + '.tmp.mp3', str_cue_in, str_cue_out, src); - logger.info("command: %s", command) - os.system(command + ' >/dev/null') - - command = 'lame -b 32 %s %s' % (dst + '.tmp.mp3', dst); - logger.info("command: %s", command) - os.system(command + ' >/dev/null') - - + command = 'lame -b 32 %s %s' % (dst + '.tmp.mp3', dst); + logger.info("command: %s", command) + print command + os.system(command + ' > /dev/null 2>&1') + elif src.lower().endswith('.ogg'): + audio = OggVorbis(src) + 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