Set all columns in the model so the view is updated
[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     def verify (filename, expected_artist, expected_title, expected_album):
56         from mutagen.easyid3 import EasyID3
57         audio = EasyID3 (filename)
58         assert audio["artist"][0] == expected_artist
59         assert audio["title"][0] == expected_title
60         assert audio["album"][0] == expected_album
61
62     def verify_wma (filename, expected_artist, expected_title, expected_album):
63         from mutagen.asf import ASF
64         audio = ASF (filename)
65         assert str(audio["Author"][0]) == expected_artist
66         assert str(audio["Title"][0]) == expected_title
67         assert str(audio["WM/AlbumTitle"][0]) == expected_album
68         
69
70     writer = MutagenBackend ()
71
72     TEST_FILE = "test-files/strange.mp3"
73     TEST_FILE_TO_BREAK = "test-files/strange-fixed.mp3"
74
75     out = open (TEST_FILE_TO_BREAK, 'w')
76     out.write (open (TEST_FILE,'r').read ())
77     out.close ()
78     
79     writer.save_metadata_on_file (TEST_FILE_TO_BREAK, "audio/mpeg",
80                                   "artist_test", "title_test", "album_test")
81     verify (TEST_FILE_TO_BREAK, "artist_test", "title_test", "album_test")
82     
83     writer.save_metadata_on_file (TEST_FILE_TO_BREAK, "audio/mpeg",
84                                   "artist_test_2", "title_test_2", "album_2")
85     verify (TEST_FILE_TO_BREAK, "artist_test_2", "title_test_2", "album_2")
86
87
88
89     READONLY_FILE = "test-files/no-write.mp3"
90     assert not writer.save_metadata_on_file (READONLY_FILE, "audio/mpeg",
91                                              "artist_test", "title_test", "album_test")
92
93
94     WMA_FILE = "test-files/hooverphonic.wma"
95     assert writer.save_metadata_on_file (WMA_FILE, "audio/x-ms-wma",
96                                   "artist_wma", "title_wma", "album_wma")
97     verify_wma (WMA_FILE, "artist_wma", "title_wma", "album_wma")
98
99     assert writer.save_metadata_on_file (WMA_FILE, "audio/x-ms-wma",
100                                   "artist_wma_2", "title_wma_2", "album_wma_2")
101     verify_wma (WMA_FILE, "artist_wma_2", "title_wma_2", "album_wma_2")