f1a4f8b9b0bb1010ec0ac1975957ae884514c55d
[mussorgsky] / src / mutagen_backend.py
1 #!/usr/bin/env python2.5
2 import mutagen
3
4 class MutagenBackend ():
5
6     def __init__ (self):
7         self.formats = {"audio/mpeg": self.__id3_writer ,
8                         "audio/x-ms-wma" : self.__wma_writer }
9     def get_supported_mimes (self):
10         return self.formats.keys ()
11
12     def save_metadata_on_file (self, filename, mime, artist, title, album):
13         if (self.formats.has_key (mime)):
14             return self.formats[mime] (filename, artist, title, album)
15         else:
16             return False
17
18     def __id3_writer (self, filename, artist, title, album):
19         from mutagen.mp3 import MP3
20         from mutagen.easyid3 import EasyID3
21         audio = MP3 (filename, ID3=EasyID3)
22         try:
23             audio.add_tags (ID3=EasyID3)
24             print "Adding tags to %s" % (filename)
25         except mutagen.id3.error:
26             # It already has tags!
27             pass
28
29         audio["artist"] = artist
30         audio["title"] = title
31         audio["album"] = album
32         try:
33             audio.save()
34             return True
35         except:
36             return False
37
38     def __wma_writer (self, filename, artist, title, album):
39         from mutagen.asf import ASF
40         audio = ASF (filename)
41         audio["Author"] = artist
42         audio["Title"] = title
43         audio["WM/AlbumTitle"] = album
44         try:
45             audio.save()
46             return True
47         except:
48             return False
49
50
51
52
53 if __name__ == "__main__":
54
55     # use id3lib for verification
56     import pyid3lib
57
58     def verify (filename, expected_artist, expected_title, expected_album):
59         from mutagen.easyid3 import EasyID3
60         audio = EasyID3 (filename)
61         assert audio["artist"][0] == expected_artist
62         assert audio["title"][0] == expected_title
63         assert audio["album"][0] == expected_album
64
65     def verify_wma (filename, expected_artist, expected_title, expected_album):
66         from mutagen.asf import ASF
67         audio = ASF (filename)
68         assert str(audio["Author"][0]) == expected_artist
69         assert str(audio["Title"][0]) == expected_title
70         assert str(audio["WM/AlbumTitle"][0]) == expected_album
71         
72
73     writer = MutagenBackend ()
74
75     TEST_FILE = "test-files/strange.mp3"
76     TEST_FILE_TO_BREAK = "test-files/strange-fixed.mp3"
77
78     out = open (TEST_FILE_TO_BREAK, 'w')
79     out.write (open (TEST_FILE,'r').read ())
80     out.close ()
81     
82     writer.save_metadata_on_file (TEST_FILE_TO_BREAK, "audio/mpeg",
83                                   "artist_test", "title_test", "album_test")
84     verify (TEST_FILE_TO_BREAK, "artist_test", "title_test", "album_test")
85     
86     writer.save_metadata_on_file (TEST_FILE_TO_BREAK, "audio/mpeg",
87                                   "artist_test_2", "title_test_2", "album_2")
88     verify (TEST_FILE_TO_BREAK, "artist_test_2", "title_test_2", "album_2")
89
90
91
92     READONLY_FILE = "test-files/no-write.mp3"
93     assert not writer.save_metadata_on_file (READONLY_FILE, "audio/mpeg",
94                                              "artist_test", "title_test", "album_test")
95
96
97     WMA_FILE = "test-files/hooverphonic.wma"
98     assert writer.save_metadata_on_file (WMA_FILE, "audio/x-ms-wma",
99                                   "artist_wma", "title_wma", "album_wma")
100     verify_wma (WMA_FILE, "artist_wma", "title_wma", "album_wma")
101
102     assert writer.save_metadata_on_file (WMA_FILE, "audio/x-ms-wma",
103                                   "artist_wma_2", "title_wma_2", "album_wma_2")
104     verify_wma (WMA_FILE, "artist_wma_2", "title_wma_2", "album_wma_2")