Esempio n. 1
0
def extract_ogg_tag(path):
    """
		Read tags out of .ogg files encoded with different codecs
		Returns a tuple (tag, error)
	"""
    ogg_tag = None
    error = None

    # Encapsulate all try except blocks in if statements.
    # Only read for tag if it already does not exist.

    if not ogg_tag:
        try:
            # Try to read ogg-Vorbis files
            ogg_tag = OggVorbis(path)

        except Exception:
            # move to next codec type
            pass

    if not ogg_tag:
        try:
            # Try to read ogg-FLAC files
            ogg_tag = OggFLAC(path)

        except Exception:
            # move to next codec type
            pass

    if not ogg_tag:
        # log error for user to see
        error = 'Unable to read metadata from the .ogg/.oga file. Only Vorbis and FLAC are supported.'

    return (ogg_tag, error)
Esempio n. 2
0
	def clean(self):
		file = self.cleaned_data.get('file', False)
		acceptedMime = ['audio/mpeg', 'audio/mpeg3', 'audio/x-mpeg-3', 'audio/ogg', 'application/ogg', 'audio/x-ogg', 'application/x-ogg', 'video/ogg', 'audio/wav', 'audio/x-wav', 'audio/wave', 'audio/x-pn-wav']
		type = "none"
		if file:
			if file._size > 10*1024*1024:
				raise forms.ValidationError(file.name + ': File too large. Max Limit: 10MB')
			elif not file.content_type in acceptedMime:
				raise forms.ValidationError(file.name + ': It is not a mp3, ogg, or wav file')

			try:
				OggVorbis(file.temporary_file_path())
				type = 'OGG'
			except:
				pass

			try:
				OggFLAC(file.temporary_file_path())
				type = 'OGG'
			except:
				pass

			try:
				OggOpus(file.temporary_file_path())
				type = 'OGG'
			except:
				pass

			try:
				OggSpeex(file.temporary_file_path())
				type = 'OGG'
			except:
				pass

			try:
				OggTheora(file.temporary_file_path())
				type = 'OGG'
			except:
				pass

			try:
				MP3(file.temporary_file_path())
				type = 'MP3'
			except:
				pass

			try:
				WavPack(file.temporary_file_path())
				type = 'WAV'
			except:
				pass

			if not type in ['OGG', 'MP3', 'WAV']:
				raise forms.ValidationError(file.name + ': Unsupported file type')

			return file
		else:
			raise forms.ValidationError(file.name + ': File cannot be opened')
Esempio n. 3
0
 def __init__(self, file, threshold=60, duration_distance_threshold=10000):
     self.file = file
     self.threshold = threshold
     self.ddt = duration_distance_threshold
     self.cleaner = re.compile(r"[^A-Za-z0-9 ]").sub
     try:
         self.audio = MP3(file, ID3=EasyID3)
     except:
         try:
             self.audio = FLAC(file)
         except:
             try:
                 self.audio = OggVorbis(file)
             except:
                 try:
                     self.audio = OggFLAC(file)
                 except:
                     try:
                         self.audio = OggTheora(file)
                     except:
                         try:
                             self.audio = APEv2(file)
                         except:
                             try:
                                 self.audio = ASF(file)
                             except:
                                 try:
                                     self.audio = MP4(file)
                                 except:
                                     try:
                                         self.audio = Musepack(file)
                                     except:
                                         try:
                                             self.audio = TrueAudio(file)
                                         except:
                                             try:
                                                 self.audio = WavPack(file)
                                             except:
                                                 raise FileTypeException(
                                                     'Unknown file type, no metadata, or file not found.'
                                                 )
     try:
         [title] = self.audio['title']
         self.title = self.__clean_literal(str(title))
     except:
         self.title = None
     try:
         [artist] = self.audio['artist']
         self.artist = self.__clean_literal(str(artist))
     except:
         self.artist = None
     try:
         [album] = self.audio['album']
         self.album = self.__clean_literal(str(album))
     except:
         self.album = None
     self.mbzQuery()
Esempio n. 4
0
def isAMusicFile(filePath):
    type = "none"
    try:
        OggVorbis(filePath)
        type = 'OGG'
    except:
        pass

    try:
        OggFLAC(filePath)
        type = 'OGG'
    except:
        pass

    try:
        OggOpus(filePath)
        type = 'OGG'
    except:
        pass

    try:
        OggSpeex(filePath)
        type = 'OGG'
    except:
        pass

    try:
        OggTheora(filePath)
        type = 'OGG'
    except:
        pass

    try:
        MP3(filePath)
        type = 'MP3'
    except:
        pass

    try:
        WavPack(filePath)
        type = 'WAV'
    except:
        pass

    if not type in ['OGG', 'MP3', 'WAV']:
        return False

    return True
Esempio n. 5
0
def get_ogg_or_flac(path):
    from mutagen.oggflac import OggFLAC
    from mutagen.oggopus import OggOpus
    from mutagen.oggvorbis import OggVorbis
    from mutagen.flac import FLAC

    try:
        return OggVorbis(path)
    except:
        pass
    try:
        return FLAC(path)
    except:
        pass
    try:
        return OggFLAC(path)
    except:
        pass
    try:
        return OggOpus(path)
    except:
        pass
    return None
Esempio n. 6
0
def get_mutagen_audio (path):
    logging.debug("GET mutagen audio" + path)
    ext = get_file_extension(path)
    audio = None
    if ext == ".flac":
        audio = FLAC(path)
    if ext == ".ape":
        audio = MonkeysAudio(path)
    if ext == ".mp3":
        audio = MP3(path, ID3=EasyID3)
    if ext == ".wv":
        audio = WavPack(path)
    if ext == ".wma":
        audio = ASF(path)
    if ext == ".ogg":
        try:
            audio = OggVorbis(path)
        except:
            from mutagen.oggtheora import OggTheora
            try:
                audio = OggTheora(path)
            except:
                from mutagen.oggflac import OggFLAC
                try:
                    audio = OggFLAC(path)
                except:
                    from mutagen.oggspeex import OggSpeex
                    try:
                        audio = OggSpeex(path)
                    except:
                        logging.error("This file in not ogg format")

    if ext == ".m4a" or ext == ".mp4" or ext == ".mkv":
        audio = MP4(path)

    return audio
Esempio n. 7
0
 def test_module_delete(self):
     delete(self.filename)
     self.scan_file()
     self.failIf(OggFLAC(self.filename).tags)
Esempio n. 8
0
 def setUp(self):
     original = os.path.join("tests", "data", "empty.oggflac")
     fd, self.filename = mkstemp(suffix='.ogg')
     os.close(fd)
     shutil.copy(original, self.filename)
     self.audio = OggFLAC(self.filename)
Esempio n. 9
0
class TOggFLAC(TOggFileType):
    Kind = OggFLAC

    def setUp(self):
        original = os.path.join("tests", "data", "empty.oggflac")
        fd, self.filename = mkstemp(suffix='.ogg')
        os.close(fd)
        shutil.copy(original, self.filename)
        self.audio = OggFLAC(self.filename)

    def test_vendor(self):
        self.failUnless(self.audio.tags.vendor.startswith("reference libFLAC"))
        self.failUnlessRaises(KeyError, self.audio.tags.__getitem__, "vendor")

    def test_streaminfo_bad_marker(self):
        page = OggPage(open(self.filename, "rb")).write()
        page = page.replace(b"fLaC", b"!fLa", 1)
        self.failUnlessRaises(IOError, OggFLACStreamInfo, cBytesIO(page))

    def test_streaminfo_too_short(self):
        page = OggPage(open(self.filename, "rb")).write()
        self.failUnlessRaises(OggError, OggFLACStreamInfo, cBytesIO(page[:10]))

    def test_streaminfo_bad_version(self):
        page = OggPage(open(self.filename, "rb")).write()
        page = page.replace(b"\x01\x00", b"\x02\x00", 1)
        self.failUnlessRaises(IOError, OggFLACStreamInfo, cBytesIO(page))

    def test_flac_reference_simple_save(self):
        if not have_flac: return
        self.audio.save()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_flac_reference_really_big(self):
        if not have_flac: return
        self.test_really_big()
        self.audio.save()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_module_delete(self):
        delete(self.filename)
        self.scan_file()
        self.failIf(OggFLAC(self.filename).tags)

    def test_flac_reference_delete(self):
        if not have_flac: return
        self.audio.delete()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_flac_reference_medium_sized(self):
        if not have_flac: return
        self.audio["foobar"] = "foobar" * 1000
        self.audio.save()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_flac_reference_delete_readd(self):
        if not have_flac: return
        self.audio.delete()
        self.audio.tags.clear()
        self.audio["foobar"] = "foobar" * 1000
        self.audio.save()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_not_my_ogg(self):
        fn = os.path.join('tests', 'data', 'empty.ogg')
        self.failUnlessRaises(IOError, type(self.audio), fn)
        self.failUnlessRaises(IOError, self.audio.save, fn)
        self.failUnlessRaises(IOError, self.audio.delete, fn)

    def test_mime(self):
        self.failUnless("audio/x-oggflac" in self.audio.mime)
Esempio n. 10
0
 def setUp(self):
     original = os.path.join(DATA_DIR, "empty.oggflac")
     fd, self.filename = mkstemp(suffix='.ogg')
     os.close(fd)
     shutil.copy(original, self.filename)
     self.audio = OggFLAC(self.filename)
Esempio n. 11
0
class TOggFLAC(TestCase, TOggFileTypeMixin):
    Kind = OggFLAC
    PADDING_SUPPORT = False

    def setUp(self):
        original = os.path.join(DATA_DIR, "empty.oggflac")
        fd, self.filename = mkstemp(suffix='.ogg')
        os.close(fd)
        shutil.copy(original, self.filename)
        self.audio = OggFLAC(self.filename)

    def tearDown(self):
        os.unlink(self.filename)

    def test_vendor(self):
        self.failUnless(
            self.audio.tags.vendor.startswith("reference libFLAC"))
        self.failUnlessRaises(KeyError, self.audio.tags.__getitem__, "vendor")

    def test_streaminfo_bad_marker(self):
        page = OggPage(open(self.filename, "rb")).write()
        page = page.replace(b"fLaC", b"!fLa", 1)
        self.failUnlessRaises(IOError, OggFLACStreamInfo, cBytesIO(page))

    def test_streaminfo_too_short(self):
        page = OggPage(open(self.filename, "rb")).write()
        self.failUnlessRaises(OggError, OggFLACStreamInfo, cBytesIO(page[:10]))

    def test_streaminfo_bad_version(self):
        page = OggPage(open(self.filename, "rb")).write()
        page = page.replace(b"\x01\x00", b"\x02\x00", 1)
        self.failUnlessRaises(IOError, OggFLACStreamInfo, cBytesIO(page))

    def test_flac_reference_simple_save(self):
        if not have_flac:
            return
        self.audio.save()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_flac_reference_really_big(self):
        if not have_flac:
            return
        self.test_really_big()
        self.audio.save()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_module_delete(self):
        delete(self.filename)
        self.scan_file()
        self.failIf(OggFLAC(self.filename).tags)

    def test_flac_reference_delete(self):
        if not have_flac:
            return
        self.audio.delete()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_flac_reference_medium_sized(self):
        if not have_flac:
            return
        self.audio["foobar"] = "foobar" * 1000
        self.audio.save()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_flac_reference_delete_readd(self):
        if not have_flac:
            return
        self.audio.delete()
        self.audio.tags.clear()
        self.audio["foobar"] = "foobar" * 1000
        self.audio.save()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_not_my_ogg(self):
        fn = os.path.join(DATA_DIR, 'empty.ogg')
        self.failUnlessRaises(IOError, type(self.audio), fn)
        self.failUnlessRaises(IOError, self.audio.save, fn)
        self.failUnlessRaises(IOError, self.audio.delete, fn)

    def test_mime(self):
        self.failUnless("audio/x-oggflac" in self.audio.mime)

    def test_info_pprint(self):
        self.assertTrue(self.audio.info.pprint().startswith(u"Ogg FLAC"))
Esempio n. 12
0
 def setUp(self):
     original = os.path.join("tests", "data", "empty.oggflac")
     fd, self.filename = mkstemp(suffix=".ogg")
     os.close(fd)
     shutil.copy(original, self.filename)
     self.audio = OggFLAC(self.filename)
Esempio n. 13
0
class TOggFLAC(TOggFileType):
    Kind = OggFLAC

    def setUp(self):
        original = os.path.join("tests", "data", "empty.oggflac")
        fd, self.filename = mkstemp(suffix=".ogg")
        os.close(fd)
        shutil.copy(original, self.filename)
        self.audio = OggFLAC(self.filename)

    def test_vendor(self):
        self.failUnless(self.audio.tags.vendor.startswith("reference libFLAC"))
        self.failUnlessRaises(KeyError, self.audio.tags.__getitem__, "vendor")

    def test_streaminfo_bad_marker(self):
        page = OggPage(open(self.filename, "rb")).write()
        page = page.replace(b"fLaC", b"!fLa", 1)
        self.failUnlessRaises(IOError, OggFLACStreamInfo, cBytesIO(page))

    def test_streaminfo_too_short(self):
        page = OggPage(open(self.filename, "rb")).write()
        self.failUnlessRaises(OggError, OggFLACStreamInfo, cBytesIO(page[:10]))

    def test_streaminfo_bad_version(self):
        page = OggPage(open(self.filename, "rb")).write()
        page = page.replace(b"\x01\x00", b"\x02\x00", 1)
        self.failUnlessRaises(IOError, OggFLACStreamInfo, cBytesIO(page))

    def test_flac_reference_simple_save(self):
        if not have_flac:
            return
        self.audio.save()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_flac_reference_really_big(self):
        if not have_flac:
            return
        self.test_really_big()
        self.audio.save()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_module_delete(self):
        delete(self.filename)
        self.scan_file()
        self.failIf(OggFLAC(self.filename).tags)

    def test_flac_reference_delete(self):
        if not have_flac:
            return
        self.audio.delete()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_flac_reference_medium_sized(self):
        if not have_flac:
            return
        self.audio["foobar"] = "foobar" * 1000
        self.audio.save()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_flac_reference_delete_readd(self):
        if not have_flac:
            return
        self.audio.delete()
        self.audio.tags.clear()
        self.audio["foobar"] = "foobar" * 1000
        self.audio.save()
        self.scan_file()
        value = os.system("flac --ogg -t %s 2> %s" % (self.filename, devnull))
        self.failIf(value and value != NOTFOUND)

    def test_not_my_ogg(self):
        fn = os.path.join("tests", "data", "empty.ogg")
        self.failUnlessRaises(IOError, type(self.audio), fn)
        self.failUnlessRaises(IOError, self.audio.save, fn)
        self.failUnlessRaises(IOError, self.audio.delete, fn)

    def test_mime(self):
        self.failUnless("audio/x-oggflac" in self.audio.mime)
Esempio n. 14
0
 def setUp(self):
     self.filename = get_temp_copy(os.path.join(DATA_DIR, "empty.oggflac"))
     self.audio = OggFLAC(self.filename)
Esempio n. 15
0
class TOggFLAC(TestCase, TOggFileTypeMixin):
    Kind = OggFLAC
    PADDING_SUPPORT = False

    def setUp(self):
        self.filename = get_temp_copy(os.path.join(DATA_DIR, "empty.oggflac"))
        self.audio = OggFLAC(self.filename)

    def tearDown(self):
        os.unlink(self.filename)

    def test_vendor(self):
        self.failUnless(
            self.audio.tags.vendor.startswith("reference libFLAC"))
        self.failUnlessRaises(KeyError, self.audio.tags.__getitem__, "vendor")

    def test_streaminfo_bad_marker(self):
        with open(self.filename, "rb") as h:
            page = OggPage(h).write()
        page = page.replace(b"fLaC", b"!fLa", 1)
        self.failUnlessRaises(error, OggFLACStreamInfo, cBytesIO(page))

    def test_streaminfo_too_short(self):
        with open(self.filename, "rb") as h:
            page = OggPage(h).write()
        self.failUnlessRaises(OggError, OggFLACStreamInfo, cBytesIO(page[:10]))

    def test_streaminfo_bad_version(self):
        with open(self.filename, "rb") as h:
            page = OggPage(h).write()
        page = page.replace(b"\x01\x00", b"\x02\x00", 1)
        self.failUnlessRaises(error, OggFLACStreamInfo, cBytesIO(page))

    def test_flac_reference_simple_save(self):
        if not have_flac:
            return
        self.audio.save()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_flac_reference_really_big(self):
        if not have_flac:
            return
        self.test_really_big()
        self.audio.save()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_module_delete(self):
        delete(self.filename)
        self.scan_file()
        self.failIf(OggFLAC(self.filename).tags)

    def test_flac_reference_delete(self):
        if not have_flac:
            return
        self.audio.delete()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_flac_reference_medium_sized(self):
        if not have_flac:
            return
        self.audio["foobar"] = "foobar" * 1000
        self.audio.save()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_flac_reference_delete_readd(self):
        if not have_flac:
            return
        self.audio.delete()
        self.audio.tags.clear()
        self.audio["foobar"] = "foobar" * 1000
        self.audio.save()
        self.scan_file()
        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)

    def test_not_my_ogg(self):
        fn = os.path.join(DATA_DIR, 'empty.ogg')
        self.failUnlessRaises(error, type(self.audio), fn)
        self.failUnlessRaises(error, self.audio.save, fn)
        self.failUnlessRaises(error, self.audio.delete, fn)

    def test_mime(self):
        self.failUnless("audio/x-oggflac" in self.audio.mime)

    def test_info_pprint(self):
        self.assertTrue(self.audio.info.pprint().startswith(u"Ogg FLAC"))
Esempio n. 16
0
def isSongValid(file):
    acceptedMime = [
        'audio/mp3', 'audio/mpeg', 'audio/mpeg3', 'audio/x-mpeg-3',
        'audio/ogg', 'application/ogg', 'audio/x-ogg', 'application/x-ogg',
        'video/ogg', 'audio/wav', 'audio/x-wav', 'audio/wave', 'audio/x-pn-wav'
    ]
    type = "none"
    if file:
        if file._size > 10 * 1024 * 1024:
            return ('File too large. Max Limit: 10MB')
        elif not file.content_type in acceptedMime:
            if settings.DEBUG:
                return ('MIMETYPE: ' + file.content_type +
                        ' Not a mp3, ogg, or wav file')
            else:
                logger.error('MIMETYPE: ' + file.content_type +
                             ' Not a mp3, ogg, or wav file')
                return ('It is not a mp3, ogg, or wav file')

        try:
            OggVorbis(file.temporary_file_path())
            type = 'OGG'
        except:
            pass

        try:
            OggFLAC(file.temporary_file_path())
            type = 'OGG'
        except:
            pass

        try:
            OggOpus(file.temporary_file_path())
            type = 'OGG'
        except:
            pass

        try:
            OggSpeex(file.temporary_file_path())
            type = 'OGG'
        except:
            pass

        try:
            OggTheora(file.temporary_file_path())
            type = 'OGG'
        except:
            pass

        try:
            MP3(file.temporary_file_path())
            type = 'MP3'
        except:
            pass

        try:
            WavPack(file.temporary_file_path())
            type = 'WAV'
        except:
            pass

        if not type in ['OGG', 'MP3', 'WAV']:
            return ('Unsupported file type')

        return True
    else:
        return ('File cannot be opened')