internal override void ScanningThreadMain(PlatformIO.DriveInfo drive, AudioCdVolume volume, BufferedVolumeItemWriter writer) { if (Options.ComputeHashs) { SendScannerWarning(S._("Hashcode generation not implemented for audio cds yet.")); volume.IsHashed = false; } AudioCdRootVolumeItem root = GetNewVolumeItem <AudioCdRootVolumeItem>(VolumeDatabase.ID_NONE, "/", null, MetadataStore.Empty, VolumeItemType.AudioCdRootVolumeItem); LocalDisc localdisc = LocalDisc.GetFromDevice(drive.Device); if (localdisc == null) { throw new ApplicationException("Could not read contents of the audio cd"); } TimeSpan[] durations = localdisc.GetTrackDurations(); List <AudioTrackVolumeItem> items = new List <AudioTrackVolumeItem>(); for (int i = 0; i < durations.Length; i++) { AudioTrackVolumeItem item = GetNewVolumeItem <AudioTrackVolumeItem>(root.ItemID, "Track " + (i + 1), MIME_TYPE_AUDIO_TRACK, MetadataStore.Empty, VolumeItemType.AudioTrackVolumeItem); item.SetAudioTrackVolumeItemFields(durations[i]); items.Add(item); VolumeInfo.Tracks++; VolumeInfo.Duration = VolumeInfo.Duration.Add(durations[i]); } // retrieve musicbrainz metadata // (the metadata field of AudioTrackVolumeItems is set // depending on the EnableMusicBrainz flag) if (Options.EnableMusicBrainz) { try { // may throw MusicBrainzNotFoundException Release release = Release.Query(localdisc).PerfectMatch(); CheckForCancellationRequest(); if (release == null) { SendScannerWarning(S._("No MusicBrainz metadata available for this disc.")); } else { var tracks = release.GetTracks(); if (tracks.Count != items.Count) { SendScannerWarning(S._("The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.")); } else { string albumTitle = release.GetTitle(); int releaseYear = GetReleaseYear(release); for (int i = 0; i < tracks.Count; i++) { items[i].Name = tracks[i].GetTitle(); items[i].MetaData = GetMetadata(tracks[i], albumTitle, releaseYear); } volume.Title = albumTitle; // preset category ReleaseType rtype = release.GetReleaseType(); if (rtype == ReleaseType.Album || rtype == ReleaseType.EP || rtype == ReleaseType.Compilation || rtype == ReleaseType.Remix) { volume.Category = PRESELECTED_CATEGORY; } } } } catch (MusicBrainzNotFoundException) { SendScannerWarning(S._("Error connecting to MusicBrainz server.")); } } volume.SetAudioCdVolumeFields(VolumeInfo.Tracks, VolumeInfo.Duration); // write items if (this.HasDB) { writer.Write(root); foreach (AudioTrackVolumeItem item in items) { writer.Write(item); } } }
public void FillRoot(Volume volume, VolumeDatabase db) { if (volume == null) { throw new ArgumentNullException("volume"); } if (db == null) { throw new ArgumentNullException("db"); } this.database = db; TreeModel model; VolumeType volType = volume.GetVolumeType(); ResetView(); switch (volType) { case VolumeType.FileSystemVolume: InitView(volType, out model); // load volume root FileSystemVolume fsv = (FileSystemVolume)volume; DirectoryVolumeItem item = fsv.GetRoot(); AppendDirRows((TreeStore)model, TreeIter.Zero, item); Model = model; /*ColumnsAutosize();*/ break; case VolumeType.AudioCdVolume: InitView(volType, out model); // load volume root AudioCdVolume avol = (AudioCdVolume)volume; AudioCdRootVolumeItem root = avol.GetRoot(); AudioTrackVolumeItem[] tracks = root.GetTracks(); ListStore store = (ListStore)model; if (tracks.Length == 0) { store.AppendValues(null, STR_EMPTY, STR_EMPTY, STR_EMPTY); } else { foreach (AudioTrackVolumeItem track in tracks) { store.AppendValues(GetImage(track), track.Name, (track.Artist.Length == 0 ? S._("Unknown") : track.Artist), string.Format("{0:D2}:{1:D2}", track.Duration.Minutes, track.Duration.Seconds), track); } } Model = model; /*ColumnsAutosize();*/ break; default: throw new NotImplementedException("Items view has not been implemented for this volumetype"); } }