banshee r4087 - in trunk/banshee: . src/Extensions/Banshee.CoverArt/Banshee.CoverArt



Author: gburt
Date: Tue Jun  3 18:10:17 2008
New Revision: 4087
URL: http://svn.gnome.org/viewvc/banshee?rev=4087&view=rev

Log:
2008-06-03  Gabriel Burt  <gabriel burt gmail com>

	* src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs:
	* src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs: And
	recommit the patch, now that Aaron approves. :)


Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs
   trunk/banshee/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs

Modified: trunk/banshee/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtJob.cs	Tue Jun  3 18:10:17 2008
@@ -3,6 +3,7 @@
 //
 // Authors:
 //   James Willcox <snorp novell com>
+//   Gabriel Burt <gburt novell com>
 //
 // Copyright (C) 2005-2008 Novell, Inc.
 //
@@ -31,17 +32,21 @@
 using System.Data;
 using System.IO;
 using System.Threading;
+
 using Mono.Unix;
+using Gtk;
+
+using Hyena;
+using Hyena.Data.Sqlite;
 
 using Banshee.Base;
 using Banshee.Collection;
+using Banshee.Collection.Database;
 using Banshee.Collection.Gui;
 using Banshee.Kernel;
 using Banshee.Metadata;
 using Banshee.ServiceStack;
 using Banshee.Library;
-using Hyena;
-using Gtk;
 
 namespace Banshee.CoverArt
 {
@@ -50,6 +55,29 @@
         private const int BatchSize = 10;
         
         private DateTime last_scan = DateTime.MinValue;
+        private TimeSpan retry_every = TimeSpan.FromDays (7);
+
+        private static string query = @"
+                SELECT {0}
+                FROM CoreAlbums, CoreArtists, CoreTracks
+                WHERE
+                    CoreAlbums.ArtistID = CoreArtists.ArtistID AND
+                    CoreTracks.AlbumID = CoreAlbums.AlbumID AND
+                    CoreTracks.DateUpdatedStamp > ? AND
+                    CoreTracks.PrimarySourceID = ? AND
+                    CoreTracks.AlbumID NOT IN (
+                        SELECT AlbumID FROM CoverArtDownloads WHERE
+                            LastAttempt > ? OR Downloaded = 1)
+                {1}";
+
+        private static HyenaSqliteCommand count_query = new HyenaSqliteCommand (String.Format (query,
+            "count(DISTINCT CoreAlbums.AlbumID)", null
+        ));
+
+        private static HyenaSqliteCommand select_query = new HyenaSqliteCommand (String.Format (query,
+            "DISTINCT CoreAlbums.AlbumID, CoreAlbums.Title, CoreArtists.Name",
+            "LIMIT ?"
+        ));
         
         public CoverArtJob (DateTime lastScan) : base (Catalog.GetString ("Downloading Cover Art"))
         {
@@ -62,87 +90,72 @@
             Register ();
             Scheduler.Schedule (this);
         }
-        
-        private IDataReader RunQuery (int iteration, bool count)
+
+        private IDataReader RunQuery ()
         {
-            string query = String.Format (@"
-                SELECT {0}, CoreAlbums.Title, CoreArtists.Name
-                FROM CoreAlbums, CoreArtists, CoreTracks
-                WHERE
-                    CoreAlbums.ArtistID = CoreArtists.ArtistID AND
-                    CoreTracks.AlbumID = CoreAlbums.AlbumID AND
-                    CoreTracks.DateUpdatedStamp > ? AND
-                    CoreTracks.PrimarySourceID = ?
-                    ORDER BY CoreAlbums.Title ASC
-                    LIMIT {1} OFFSET {2}
-                ", count ? "count(DISTINCT CoreAlbums.AlbumID)" : "DISTINCT CoreAlbums.AlbumID",
-                BatchSize, iteration * BatchSize);
-            
-            return ServiceManager.DbConnection.Query (query, last_scan,
-                                                      ServiceManager.SourceManager.MusicLibrary.DbId);
-        }
-        
-        private void FetchForTrack (TrackInfo track)
-        {
-            try {
-                IMetadataLookupJob job = MetadataService.Instance.CreateJob (track);
-                job.Run ();
-            } catch (Exception e) {
-                Log.Exception (e);
-            }
+            return ServiceManager.DbConnection.Query (select_query,
+                last_scan, ServiceManager.SourceManager.MusicLibrary.DbId, last_scan - retry_every, BatchSize
+            );
         }
         
         public void Run ()
         {
-            this.Status = Catalog.GetString ("Preparing...");
-            this.IconNames = new string [] {Stock.Network};
-            
-            int current_track_count = 0;
-            int total_track_count = 0;
-            int offset = 0;
-            using (IDataReader reader = RunQuery (offset, true)) {
-                if (reader.Read ()) {
-                    total_track_count = reader.GetInt32 (0);
-                }
-            }
+            Status = Catalog.GetString ("Preparing...");
+            IconNames = new string [] {Stock.Network};
             
-            if (total_track_count == 0) {
-                Finish ();
-                return;
-            }
-
-            TrackInfo track = new TrackInfo ();
+            int current = 0;
+            int total = 0;
 
+            DatabaseTrackInfo track = new DatabaseTrackInfo ();
             while (true) {
-                using (IDataReader reader = RunQuery (offset++, false)) {
-                    int batch_count = 0;
+                total = current + ServiceManager.DbConnection.Query<int> (count_query, last_scan, ServiceManager.SourceManager.MusicLibrary.DbId, last_scan - retry_every);
+                if (total == 0 || total <= current) {
+                    break;
+                }
+
+                using (IDataReader reader = RunQuery ()) {
                     while (reader.Read ()) {
                         if (IsCancelRequested) {
                             Finish ();
                             return;
                         }
                         
-                        batch_count++;
-                        if (!CoverArtSpec.CoverExists (reader.GetString (2),
-                                                       reader.GetString (1))) {
-                            track.AlbumTitle = reader.GetString (1);
-                            track.ArtistName = reader.GetString (2);
-                            
-                            Log.DebugFormat ("Downloading cover art for {0} - {1}", track.ArtistName, track.AlbumTitle);
-                            this.Progress = (double) current_track_count / (double) total_track_count;
-                            this.Status = String.Format (Catalog.GetString ("{0} - {1}"), track.ArtistName, track.AlbumTitle);
-                            FetchForTrack (track);
-                        }
-                        
-                        current_track_count++;
+                        track.AlbumTitle = reader.GetString (1);
+                        track.ArtistName = reader.GetString (2);
+                        track.AlbumId = Convert.ToInt32 (reader[0]);
+
+                        Log.DebugFormat ("Downloading cover art for {0} - {1}", track.ArtistName, track.AlbumTitle);
+
+                        Progress = (double) current / (double) total;
+                        Status = String.Format (Catalog.GetString ("{0} - {1}"), track.ArtistName, track.AlbumTitle);
+
+                        FetchForTrack (track);
+                        current++;
                     }
-                    
-                    if (batch_count != BatchSize)
-                        break;
                 }
             }
             
             Finish ();
         }
+
+        private void FetchForTrack (DatabaseTrackInfo track)
+        {
+            try {
+                if (String.IsNullOrEmpty (track.AlbumTitle) || track.AlbumTitle == Catalog.GetString ("Unknown Album") ||
+                    String.IsNullOrEmpty (track.ArtistName) || track.ArtistName == Catalog.GetString ("Unknown Artist")) {
+                    // Do not try to fetch album art for these
+                } else {
+                    IMetadataLookupJob job = MetadataService.Instance.CreateJob (track);
+                    job.Run ();
+                }
+            } catch (Exception e) {
+                Log.Exception (e);
+            } finally {
+                bool have_cover_art = CoverArtSpec.CoverExists (track.ArtistName, track.AlbumTitle);
+                ServiceManager.DbConnection.Execute (
+                    "INSERT OR REPLACE INTO CoverArtDownloads (AlbumID, Downloaded, LastAttempt) VALUES (?, ?, ?)",
+                    track.AlbumId, have_cover_art, DateTime.Now);
+            }
+        }
     }
 }

Modified: trunk/banshee/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.CoverArt/Banshee.CoverArt/CoverArtService.cs	Tue Jun  3 18:10:17 2008
@@ -3,6 +3,7 @@
 //
 // Authors:
 //   James Willcox <snorp novell com>
+//   Gabriel Burt <gburt novell com>
 //
 // Copyright (C) 2005-2008 Novell, Inc.
 //
@@ -61,6 +62,15 @@
         
         void IExtensionService.Initialize ()
         {
+            if (!ServiceManager.DbConnection.TableExists ("CoverArtDownloads")) {
+                ServiceManager.DbConnection.Execute (@"
+                    CREATE TABLE CoverArtDownloads (
+                        AlbumID     INTEGER UNIQUE,
+                        Downloaded  BOOLEAN,
+                        LastAttempt INTEGER NOT NULL
+                    )");
+            }
+
             action_service = ServiceManager.Get<InterfaceActionService> ();
             
             if (!ServiceStartup ()) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]