Use unique albums (concat artist) to handle the album art
[mussorgsky] / src / tracker_backend.py
index b0cc8db..23fa0b4 100755 (executable)
@@ -21,6 +21,25 @@ RDF_NO_ARTIST = RDF_NO_PROPX % "Audio:Artist"
 RDF_NO_ALBUM = RDF_NO_PROPX % "Audio:Album"
 RDF_NO_TITLE = RDF_NO_PROPX % "Audio:Title"
 
+RDF_ANY_MISSING_METADATA = """
+<rdfq:Condition>
+  <rdfq:or>
+    <rdfq:equals>
+      <rdfq:Property name="Audio:Artist" />
+      <rdf:String></rdf:String> 
+    </rdfq:equals>
+    <rdfq:equals>
+      <rdfq:Property name="Audio:Title" />
+      <rdf:String></rdf:String> 
+    </rdfq:equals>
+    <rdfq:equals>
+      <rdfq:Property name="Audio:Album" />
+      <rdf:String></rdf:String> 
+    </rdfq:equals>
+  </rdfq:or>
+</rdfq:Condition>
+"""
+
 
 class TrackerBackend:
 
@@ -51,31 +70,16 @@ class TrackerBackend:
                                             "Audio:Album",
                                             "File:Mime"],
                                            "", [], rdf_query, False,
-                                           [], False, 0, 32000)
+                                           ["Audio:DateAdded"], True, 0, 32000)
         return results
 
-
-    def get_songs_without_artist (self):
-        """
-        Return tuples with the following fields:
-        (uri, "Music", artist, title, album, mimetype)
-        """
-        return self.__run_rdf_query (RDF_NO_ARTIST)
-    
-    def get_songs_without_title (self):
+    def get_all_broken_songs (self):
         """
         Return tuples with the following fields:
         (uri, "Music", artist, title, album, mimetype)
         """
-        return self.__run_rdf_query (RDF_NO_TITLE)
+        return self.__run_rdf_query (RDF_ANY_MISSING_METADATA)
     
-    def get_songs_without_album (self):
-        """
-        Return tuples with the following fields:
-        (uri, "Music", artist, title, album, mimetype)
-        """
-        return self.__run_rdf_query (RDF_NO_ALBUM)
-
     def get_all_songs (self):
         return self.__run_rdf_query ("")
 
@@ -90,30 +94,43 @@ class TrackerBackend:
                                                     ["Audio:Artist"],
                                                     "", False, 0, 32000)
 
-    def get_all_pairs_artist_album (self):
-        return self.iface_metadata.GetUniqueValues ("Music",
-                                                    ["Audio:Artist", "Audio:Album"],
-                                                    "", False, 0, 32000)
+    def get_all_pairs_album_artist (self):
+        return self.iface_metadata.GetUniqueValuesWithAggregates ("Music",
+                                                                  ["Audio:Album"],
+                                                                  "",
+                                                                  ["CONCAT"],
+                                                                  ["Audio:Artist"],
+                                                                  False, 0, 32000)
 
 # Test
 if __name__ == "__main__":
 
-    tracker = TrackerBackend ()
+    import sys
+    from optparse import OptionParser
+
+    parser = OptionParser()
+    parser.add_option ("-n", "--numbers", dest="print_numbers",
+                       action="store_true", default=True,
+                       help="Print stats about broken files")
+    
+    parser.add_option ("-p", "--pairs", dest="pairs_artist_album",
+                       action="store_true", default=True,
+                       help="Print all pairs (album, artist)")
 
-    print "Songs without artist: " + str(tracker.count_songs_wo_artist ())
+    (options, args) = parser.parse_args ()
 
-    results = tracker.get_songs_without_artist ()
-    for r in results:
-        print "'%s', '%s', '%s', '%s', '%s'" % (r[0], r[2], r[3], r[4], r[5])
+    if (not options.print_numbers and not options.pairs_artist_album):
+        parser.print_help ()
+        sys.exit (-1)
 
-    
-    print "Songs without album " + str(tracker.count_songs_wo_album ())
-    print "Songs without title " + str(tracker.count_songs_wo_title ())
+    tracker = TrackerBackend ()
+    if (options.print_numbers):
+        print tracker.count_songs_wo_artist (), "Songs without artist"
+        print tracker.count_songs_wo_title (), "Songs without title"
+        print tracker.count_songs_wo_album (), "Songs without album"
+
+    if (options.pairs_artist_album):
+        for (album, artist) in tracker.get_all_pairs_artist_album ():
+            print album,"-",artist
 
-    albums = tracker.get_list_of_known_albums ()
-    print "%d different albums" % (len (albums))
-    for a in albums:
-        print a[0]
     
-    print "\nAll songs:"
-    print tracker.get_all_songs ()