Add plain FLAC support
[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                         "audio/x-flac" : self.__flac_writer }
10
11     def get_supported_mimes (self):
12         return self.formats.keys ()
13
14     def save_metadata_on_file (self, filename, mime, artist, title, album):
15         if (self.formats.has_key (mime)):
16             return self.formats[mime] (filename, artist, title, album)
17         else:
18             return False
19
20     def __id3_writer (self, filename, artist, title, album):
21         from mutagen.mp3 import MP3
22         from mutagen.easyid3 import EasyID3
23         audio = MP3 (filename, ID3=EasyID3)
24         try:
25             audio.add_tags (ID3=EasyID3)
26             print "Adding tags to %s" % (filename)
27         except mutagen.id3.error:
28             # It already has tags!
29             pass
30
31         audio["artist"] = artist
32         audio["title"] = title
33         audio["album"] = album
34         try:
35             audio.save()
36             return True
37         except:
38             return False
39
40     def __wma_writer (self, filename, artist, title, album):
41         from mutagen.asf import ASF
42         audio = ASF (filename)
43         audio["Author"] = artist
44         audio["Title"] = title
45         audio["WM/AlbumTitle"] = album
46         try:
47             audio.save()
48             return True
49         except:
50             return False
51
52     def __flac_writer (self, filename, artist, title, album):
53         from mutagen.flac import FLAC
54         audio = FLAC (filename)
55         audio["artist"] = artist
56         audio["title"] = title
57         audio["album"] = album
58         try:
59             audio.save()
60             return True
61         except:
62             return False
63
64
65 if __name__ == "__main__":
66     import os
67
68     def verify (filename, expected_artist, expected_title, expected_album):
69         from mutagen.easyid3 import EasyID3
70         audio = EasyID3 (filename)
71         assert audio["artist"][0] == expected_artist
72         assert audio["title"][0] == expected_title
73         assert audio["album"][0] == expected_album
74
75     def verify_wma (filename, expected_artist, expected_title, expected_album):
76         from mutagen.asf import ASF
77         audio = ASF (filename)
78         assert str(audio["Author"][0]) == expected_artist
79         assert str(audio["Title"][0]) == expected_title
80         assert str(audio["WM/AlbumTitle"][0]) == expected_album
81         
82     def verify_flac (filename, expected_artist, expected_title, expected_album):
83         from mutagen.flac import FLAC
84         audio = FLAC (filename)
85         assert audio["artist"][0] == expected_artist
86         assert audio["title"][0] == expected_title
87         assert audio["album"][0] == expected_album
88
89     writer = MutagenBackend ()
90
91     TEST_FILE = "test-files/empty.flac"
92     TEST_FILE_TO_BREAK = "test-files/test-result.flac"
93
94     out = open (TEST_FILE_TO_BREAK, 'w')
95     out.write (open (TEST_FILE,'r').read ())
96     out.close ()
97     
98     writer.save_metadata_on_file (TEST_FILE_TO_BREAK, "audio/x-flac",
99                                   "artist_test", "title_test", "album_test")
100     verify_flac (TEST_FILE_TO_BREAK, "artist_test", "title_test", "album_test")
101     
102     writer.save_metadata_on_file (TEST_FILE_TO_BREAK, "audio/x-flac",
103                                   "artist_test_2", "title_test_2", "album_2")
104     verify_flac (TEST_FILE_TO_BREAK, "artist_test_2", "title_test_2", "album_2")
105
106     #os.unlink (TEST_FILE_TO_BREAK)
107
108     print "Pass: FLAC"
109     
110     ## TEST_FILE = "test-files/strange.mp3"
111     ## TEST_FILE_TO_BREAK = "test-files/strange-fixed.mp3"
112
113     ## out = open (TEST_FILE_TO_BREAK, 'w')
114     ## out.write (open (TEST_FILE,'r').read ())
115     ## out.close ()
116     
117     ## writer.save_metadata_on_file (TEST_FILE_TO_BREAK, "audio/mpeg",
118     ##                               "artist_test", "title_test", "album_test")
119     ## verify (TEST_FILE_TO_BREAK, "artist_test", "title_test", "album_test")
120     
121     ## writer.save_metadata_on_file (TEST_FILE_TO_BREAK, "audio/mpeg",
122     ##                               "artist_test_2", "title_test_2", "album_2")
123     ## verify (TEST_FILE_TO_BREAK, "artist_test_2", "title_test_2", "album_2")
124
125
126
127     ## READONLY_FILE = "test-files/no-write.mp3"
128     ## assert not writer.save_metadata_on_file (READONLY_FILE, "audio/mpeg",
129     ##                                          "artist_test", "title_test", "album_test")
130
131
132     ## WMA_FILE = "test-files/hooverphonic.wma"
133     ## assert writer.save_metadata_on_file (WMA_FILE, "audio/x-ms-wma",
134     ##                               "artist_wma", "title_wma", "album_wma")
135     ## verify_wma (WMA_FILE, "artist_wma", "title_wma", "album_wma")
136
137     ## assert writer.save_metadata_on_file (WMA_FILE, "audio/x-ms-wma",
138     ##                               "artist_wma_2", "title_wma_2", "album_wma_2")
139     ## verify_wma (WMA_FILE, "artist_wma_2", "title_wma_2", "album_wma_2")