public void Migrate() { int succeeded = 0; int failed = 0; using (BansheeDatabase banshee = new BansheeDatabase(bansheeDb, (playCountUpdateMode == PlaycountUpdateMode.Overwrite))) using (Table tbl = new Table(databaseFiles)) { Logger.LogMessage(1, "Winamp DB successfully opened"); Logger.LogMessage(1, "Setting DryRun to {0}", dryRun); Logger.LogMessage(1, "Setting PlayCountUpdateMode to: {0}", playCountUpdateMode); Logger.LogMessage(1, "Setting RatingUpdateMode to: {0}", ratingUpdateMode); Logger.LogMessage(1, "Backing up Banshee DB: {0}", dryRun ? "Not Needed" : doBackup ? "Yes" : "No"); Console.Error.WriteLine("Press RETURN to migrate data or CTRL+C to abort now"); Console.ReadLine(); Console.Error.WriteLine("Starting migration {0}", dryRun ? "SIMULATION" : "FOR REAL"); banshee.DryRun = dryRun; if (doBackup && !dryRun) { string copy = banshee.CreateBackup(); Logger.LogMessage(1, "Backup of db created as {0}", copy); } foreach (Record row in tbl.Records) { Track winampTrack = new Track(row); BansheeTrack bansheeTrack; if (winampTrack.Title == null || winampTrack.Artist == null) { Logger.LogMessage(0, "Ignoring track since it doesn't contain neccessary information {0}", winampTrack); failed++; continue; } if (winampTrack.Album == null) { if (allowNoAlbum) Logger.LogMessage(1, "{0} - {1} has no album info, but proceeding anyway", winampTrack.Album, winampTrack.Title); else { Logger.LogMessage(0, "{0} - {1} lacks album info. Use --allow-no-album to migrate this track anyway", winampTrack.Artist, winampTrack.Title); failed++; continue; } } if (winampTrack.Album != null) bansheeTrack = banshee.GetTrack(winampTrack.Title, winampTrack.Artist, winampTrack.Album); else bansheeTrack = banshee.GetTrack(winampTrack.Title, winampTrack.Artist); if (bansheeTrack == null) { Logger.LogMessage(0, "Failed to find banshee track for winamp track {0}", winampTrack); failed++; continue; } bool updateRating = false; bool updatePlaycount = false; if (playCountUpdateMode != PlaycountUpdateMode.Ignore) updatePlaycount = true; switch(ratingUpdateMode) { case RatingUpdateMode.OnlyEmpty: updateRating = !bansheeTrack.HasRating && winampTrack.Rating != null; break; case RatingUpdateMode.Overwrite: updateRating = winampTrack.Rating != null; break; case RatingUpdateMode.OverwriteAndClear: updateRating = true; break; default: updateRating = false; break; } bool success = true; if (updatePlaycount && updateRating) success = banshee.UpdateTrack(bansheeTrack.Id, winampTrack.Rating.Value, winampTrack.PlayCount); else if (updatePlaycount) success = banshee.UpdateTrackPlaycount(bansheeTrack.Id, winampTrack.PlayCount); else if (updateRating) success = banshee.UpdateTrackRating(bansheeTrack.Id, winampTrack.Rating.Value); else { Logger.LogMessage(1, "Nothing to do for track {0}", winampTrack); success = false; } if (success) { Logger.LogMessage(1, "SUCCEEDED: Updating {0}-{1}", winampTrack.Artist, winampTrack.Title); succeeded++; } else { Logger.LogMessage(0, "FAILED: Updating {0}-{1}", winampTrack.Artist, winampTrack.Title); } } Logger.LogMessage(0, "All Done {0} tracks ({1:p}) successfully migrated ({2} ({3:p}) failed)", succeeded, succeeded / (double)tbl.NumFiles, failed, failed / (double)tbl.NumFiles); } }
public void DumpWinampData() { using (BansheeDatabase banshee = new BansheeDatabase(bansheeDb, (playCountUpdateMode == PlaycountUpdateMode.Overwrite))) using (Table tbl = new Table(databaseFiles)) { foreach (Record row in tbl.Records) { StringField title = row.GetFieldByType(MetadataField.Title) as StringField; StringField artist = row.GetFieldByType(MetadataField.Artist) as StringField; StringField album = row.GetFieldByType(MetadataField.Album) as StringField; StringField file = row.GetFieldByType(MetadataField.Filename) as StringField; IntegerField rating = row.GetFieldByType(MetadataField.Rating) as IntegerField; IntegerField playcount = row.GetFieldByType(MetadataField.PlayCount) as IntegerField; Console.WriteLine("BEGIN TRACK"); Console.WriteLine("File: {0}", file != null ? file.Value : ""); Console.WriteLine("Title: {0}", title != null ? title.Value : ""); Console.WriteLine("Artist: {0}", artist != null ? artist.Value : ""); Console.WriteLine("Album: {0}", album != null ? album.Value : ""); Console.WriteLine("Rating: {0}", rating != null ? rating.Value : -1); Console.WriteLine("Playcount: {0}", playcount != null ? playcount.Value : 0); } } }