private void RefreshMetadataThread (object state)
{
int total = ServiceManager.DbConnection.Query<int> ("SELECT count(*) FROM CoreTracks");
if (total <= 0) {
return;
}
UserJob job = new UserJob (Catalog.GetString ("Refreshing Metadata"));
job.SetResources (Resource.Cpu, Resource.Disk, Resource.Database);
job.PriorityHints = PriorityHints.SpeedSensitive;
job.Status = Catalog.GetString ("Scanning...");
job.IconNames = new string [] { "system-search", "gtk-find" };
job.Register ();
HyenaSqliteCommand select_command = new HyenaSqliteCommand (
String.Format (
"SELECT {0} FROM {1} WHERE {2}",
DatabaseTrackInfo.Provider.Select,
DatabaseTrackInfo.Provider.From,
DatabaseTrackInfo.Provider.Where
)
);
int count = 0;
using (var reader = ServiceManager.DbConnection.Query (select_command)) {
while (reader.Read ()) {
DatabaseTrackInfo track = null;
try {
track = DatabaseTrackInfo.Provider.Load (reader);
if (track != null && track.Uri != null && track.Uri.IsFile) {
try {
using (var file = StreamTagger.ProcessUri (track.Uri)) {
StreamTagger.TrackInfoMerge (track, file, true);
}
} catch (Exception e) {
Log.Warning (String.Format ("Failed to update metadata for {0}", track),
e.GetType ().ToString (), false);
}
track.Save (false);
track.Artist.Save ();
track.Album.Save ();
job.Status = String.Format ("{0} - {1}", track.DisplayArtistName, track.DisplayTrackTitle);
}
} catch (Exception e) {
Log.Warning (String.Format ("Failed to update metadata for {0}", track), e.ToString (), false);
}
job.Progress = (double)++count / (double)total;
}
}
if (ServiceManager.DbConnection.Query<int> ("SELECT count(*) FROM CoreConfiguration WHERE Key = 'MetadataVersion'") == 0) {
Execute (String.Format ("INSERT INTO CoreConfiguration (EntryID, Key, Value) VALUES (null, 'MetadataVersion', {0})", CURRENT_METADATA_VERSION));
} else {
Execute (String.Format ("UPDATE CoreConfiguration SET Value = {0} WHERE Key = 'MetadataVersion'", CURRENT_METADATA_VERSION));
}
job.Finish ();
ServiceManager.SourceManager.MusicLibrary.NotifyTracksChanged ();
}