1
# Copyright 2005 Alexey Bobyakov <claymore.ws@gmail.com>, Joe Wreschnig
2
# Copyright 2006 Lukas Lalinsky
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License version 2 as
6
# published by the Free Software Foundation
8
# $Id: mp4.py 4047 2007-04-30 03:49:58Z piman $
14
from formats._audio import AudioFile
16
extensions = ['.mp4', '.m4a']
17
if gst.registry_get_default().find_plugin("faad") is None:
21
from mutagen.mp4 import MP4
25
class MP4File(AudioFile):
26
multiple_values = False
33
"aART": "albumartist",
34
"\xa9wrt": "composer",
37
"\xa9grp": "grouping",
40
"\xa9too": "encodedby",
41
"----:com.apple.iTunes:MusicBrainz Artist Id":
42
"musicbrainz_artistid",
43
"----:com.apple.iTunes:MusicBrainz Track Id": "musicbrainz_trackid",
44
"----:com.apple.iTunes:MusicBrainz Album Id": "musicbrainz_albumid",
45
"----:com.apple.iTunes:MusicBrainz Album Artist Id":
46
"musicbrainz_albumartistid",
47
"----:com.apple.iTunes:MusicIP PUID": "musicip_puid",
48
"----:com.apple.iTunes:MusicBrainz Album Status":
49
"musicbrainz_albumstatus",
50
"----:com.apple.iTunes:MusicBrainz Album Type":
51
"musicbrainz_albumtype",
52
"----:com.apple.iTunes:MusicBrainz Album Release Country":
55
__rtranslate = dict([(v, k) for k, v in __translate.iteritems()])
59
"trkn": "tracknumber",
61
__rtupletranslate = dict([(v, k) for k, v in __tupletranslate.iteritems()])
63
def __init__(self, filename):
66
self["~#length"] = int(audio.info.length)
67
self["~#bitrate"] = int(audio.info.bitrate)
68
for key, values in audio.items():
69
if key in self.__tupletranslate:
70
name = self.__tupletranslate[key]
71
cur, total = values[0]
73
self[name] = u"%d/%d" % (cur, total)
75
self[name] = unicode(cur)
76
elif key in self.__translate:
77
name = self.__translate[key]
79
self[name] = "\n".join(map(unicode, values))
80
elif key.startswith("----"):
81
self[name] = "\n".join(
82
map(lambda v: util.decode(v).strip("\x00"), values))
84
self[name] = "\n".join(values)
86
self["~picture"] = "y"
87
self.sanitize(filename)
90
audio = MP4(self["~filename"])
91
for key in self.__rtranslate.keys() + self.__rtupletranslate.keys():
95
for key in self.realkeys():
96
try: name = self.__rtranslate[key]
97
except KeyError: continue
98
values = self.list(key)
100
values = map(int, values)
101
elif name.startswith("----"):
102
values = map(lambda v: v.encode("utf-8"), values)
104
track, tracks = self("~#track"), self("~#tracks", 0)
106
audio["trkn"] = [(track, tracks)]
107
disc, discs = self("~#disc"), self("~#discs", 0)
109
audio["disk"] = [(disc, discs)]
113
def can_change(self, key=None):
114
OK = self.__rtranslate.keys() + self.__rtupletranslate.keys()
115
if key is None: return OK
116
else: return super(MP4File, self).can_change(key) and (key in OK)
118
def get_format_cover(self):
119
tag = MP4(self["~filename"])
120
for cover in tag.get("covr", []):
121
fn = tempfile.NamedTemporaryFile()