New method to get all pairs artist/album
[mussorgsky] / src / tracker_backend.py
1 #!/usr/bin/env python2.5
2 import dbus
3 import os
4
5 TRACKER = 'org.freedesktop.Tracker'
6 TRACKER_OBJ = '/org/freedesktop/Tracker/Metadata'
7 TRACKER_SEARCH_OBJ = '/org/freedesktop/Tracker/Search'
8
9 RDF_NO_PROPX = """
10 <rdfq:Condition>
11   <rdfq:and>
12     <rdfq:equals>
13       <rdfq:Property name="%s" />
14       <rdf:String></rdf:String> 
15     </rdfq:equals>
16   </rdfq:and>
17 </rdfq:Condition>
18 """
19
20 RDF_NO_ARTIST = RDF_NO_PROPX % "Audio:Artist"
21 RDF_NO_ALBUM = RDF_NO_PROPX % "Audio:Album"
22 RDF_NO_TITLE = RDF_NO_PROPX % "Audio:Title"
23
24
25 class TrackerBackend:
26
27     def __init__ (self):
28         print "Tracker backend up"
29         bus = dbus.SessionBus ()
30         self.tracker_metadata = bus.get_object (TRACKER, TRACKER_OBJ)
31         self.iface_metadata = dbus.Interface (self.tracker_metadata,
32                                               "org.freedesktop.Tracker.Metadata")
33
34         self.tracker_search = bus.get_object (TRACKER, TRACKER_SEARCH_OBJ)
35         self.iface_search = dbus.Interface (self.tracker_search,
36                                             "org.freedesktop.Tracker.Search")
37         
38     def count_songs_wo_artist (self):
39         return self.iface_metadata.GetCount ("Music", "*", RDF_NO_ARTIST)
40
41     def count_songs_wo_title (self):
42         return self.iface_metadata.GetCount ("Music", "*", RDF_NO_TITLE)
43
44     def count_songs_wo_album (self):
45         return self.iface_metadata.GetCount ("Music", "*", RDF_NO_ALBUM)
46
47     def __run_rdf_query (self, rdf_query):
48         results = self.iface_search.Query (-1, "Music",
49                                            ["Audio:Artist",
50                                             "Audio:Title",
51                                             "Audio:Album",
52                                             "File:Mime"],
53                                            "", [], rdf_query, False,
54                                            [], False, 0, 32000)
55         return results
56
57
58     def get_songs_without_artist (self):
59         """
60         Return tuples with the following fields:
61         (uri, "Music", artist, title, album, mimetype)
62         """
63         return self.__run_rdf_query (RDF_NO_ARTIST)
64     
65     def get_songs_without_title (self):
66         """
67         Return tuples with the following fields:
68         (uri, "Music", artist, title, album, mimetype)
69         """
70         return self.__run_rdf_query (RDF_NO_TITLE)
71     
72     def get_songs_without_album (self):
73         """
74         Return tuples with the following fields:
75         (uri, "Music", artist, title, album, mimetype)
76         """
77         return self.__run_rdf_query (RDF_NO_ALBUM)
78
79     def get_all_songs (self):
80         return self.__run_rdf_query ("")
81
82
83     def get_list_of_known_albums (self):
84         return self.iface_metadata.GetUniqueValues ("Music",
85                                                     ["Audio:Album"],
86                                                     "", False, 0, 32000)
87
88     def get_list_of_known_artists (self):
89         return self.iface_metadata.GetUniqueValues ("Music",
90                                                     ["Audio:Artist"],
91                                                     "", False, 0, 32000)
92
93     def get_all_pairs_artist_album (self):
94         return self.iface_metadata.GetUniqueValues ("Music",
95                                                     ["Audio:Artist", "Audio:Album"],
96                                                     "", False, 0, 32000)
97
98 # Test
99 if __name__ == "__main__":
100
101     tracker = TrackerBackend ()
102
103     print "Songs without artist: " + str(tracker.count_songs_wo_artist ())
104
105     results = tracker.get_songs_without_artist ()
106     for r in results:
107         print "'%s', '%s', '%s', '%s', '%s'" % (r[0], r[2], r[3], r[4], r[5])
108
109     
110     print "Songs without album " + str(tracker.count_songs_wo_album ())
111     print "Songs without title " + str(tracker.count_songs_wo_title ())
112
113     albums = tracker.get_list_of_known_albums ()
114     print "%d different albums" % (len (albums))
115     for a in albums:
116         print a[0]
117     
118     print "\nAll songs:"
119     print tracker.get_all_songs ()