private void TreatSingleFile(int i, string file, Dictionary <KeyValuePair <string, bool>, AlbumArtistData> localAlbumArtistDatas, Dictionary <KeyValuePair <KeyValuePair <string, AlbumArtistData>, bool>, AlbumData> localAlbumDatas, Dictionary <KeyValuePair <string, bool>, GenreData> localGenreDatas, Dictionary <KeyValuePair <string, bool>, PerformerData> localPerformerDatas) { try { TagFile tagFile = TagFile.Create(file); TrackData track; if (tagFile != null) { if (tagFile.Tag != null) { TagLib.Tag tag = tagFile.Tag; AlbumArtistData albumArtist = localAlbumArtistDatas[new KeyValuePair <string, bool>(_NULL, true)]; AlbumData album = localAlbumDatas[new KeyValuePair <KeyValuePair <string, AlbumArtistData>, bool>(new KeyValuePair <string, AlbumArtistData>(_NULL, albumArtist), true)]; var performers = new List <PerformerData>(); var genres = new List <GenreData>(); var sourceAlbumArtists = new List <string>(); if (tag.AlbumArtists?.Length > 1) { LoadingLogHandler?.BeginInvoke(this, new LoadingLogEventArgs(new LogData($"Multiple album artists for the file : {file}.", LogLevel.Warning), i), null, null); } if (tag.AlbumArtists != null) { sourceAlbumArtists = tag.AlbumArtists.Where(aa => aa != null).ToList(); } if (tag.FirstAlbumArtist != null) { if (!localAlbumArtistDatas.TryGetValue(new KeyValuePair <string, bool>(tag.FirstAlbumArtist, false), out albumArtist)) { albumArtist = new AlbumArtistData(tag.FirstAlbumArtist, false); localAlbumArtistDatas.Add(new KeyValuePair <string, bool>(tag.FirstAlbumArtist, false), albumArtist); } } if (tag.Album != null) { var key = new KeyValuePair <string, AlbumArtistData>(tag.Album, albumArtist); if (!localAlbumDatas.TryGetValue(new KeyValuePair <KeyValuePair <string, AlbumArtistData>, bool>(key, false), out album)) { album = new AlbumData(albumArtist, tag.Album, false); localAlbumDatas.Add(new KeyValuePair <KeyValuePair <string, AlbumArtistData>, bool>(key, false), album); } } if (tag.Performers != null) { foreach (string performer in tag.Performers) { PerformerData performerd = localPerformerDatas[new KeyValuePair <string, bool>(_NULL, true)]; if (performer != null) { if (!localPerformerDatas.TryGetValue(new KeyValuePair <string, bool>(performer, false), out performerd)) { performerd = new PerformerData(performer, false); localPerformerDatas.Add(new KeyValuePair <string, bool>(performer, false), performerd); } } if (!performers.Contains(performerd)) { performers.Add(performerd); } } } if (tag.Genres != null) { foreach (string genre in tag.Genres) { GenreData genred = localGenreDatas[new KeyValuePair <string, bool>(_NULL, true)]; if (genre != null) { if (!localGenreDatas.TryGetValue(new KeyValuePair <string, bool>(genre, false), out genred)) { genred = new GenreData(genre, false); localGenreDatas.Add(new KeyValuePair <string, bool>(genre, false), genred); } } if (!genres.Contains(genred)) { genres.Add(genred); } } } List <byte> frontCoverDatas = ExtractFrontCoverInformations(tag, out string frontCoverMimeType); track = new TrackData(tag.Track, tag.Title ?? _NULL, album, performers, genres, tag.Year, (tagFile.Properties?.Duration).GetValueOrDefault(TimeSpan.Zero), tagFile.Name, sourceAlbumArtists, GetMimeType(tagFile.MimeType), frontCoverMimeType, frontCoverDatas); } else { track = new TrackData(tagFile.Name, (tagFile.Properties?.Duration).GetValueOrDefault(TimeSpan.Zero), localAlbumDatas[new KeyValuePair <KeyValuePair <string, AlbumArtistData>, bool>(new KeyValuePair <string, AlbumArtistData>(_NULL, localAlbumArtistDatas[new KeyValuePair <string, bool>(_NULL, true)]), false)], GetMimeType(tagFile.MimeType)); } } else { track = new TrackData(file, TimeSpan.Zero, localAlbumDatas[new KeyValuePair <KeyValuePair <string, AlbumArtistData>, bool>(new KeyValuePair <string, AlbumArtistData>(_NULL, localAlbumArtistDatas[new KeyValuePair <string, bool>(_NULL, true)]), false)], tagFile.MimeType); } _tracks.Add(track); LoadingLogHandler?.BeginInvoke(this, new LoadingLogEventArgs(new LogData($"The file {file} has been processed.", LogLevel.Information), i), null, null); } catch (Exception exLocal) { LoadingLogHandler?.BeginInvoke(this, new LoadingLogEventArgs(new LogData($"Error while processing {file}.", LogLevel.Error, new KeyValuePair <string, string>("Error message", exLocal.Message)), i), null, null); } }
private void Load() { foreach (string path in _paths) { try { if (Directory.Exists(path)) { List <string> files = new List <string>(); foreach (string extension in _extensions) { string[] extensionFiles = Directory.GetFiles(path, $"*.{extension}", SearchOption.AllDirectories); if (extensionFiles != null) { files.AddRange(extensionFiles); } } files = files.Distinct().ToList(); TotalFilesCount = files.Count; var defaultAlbumArtist = new AlbumArtistData(_NULL, true); var localAlbumArtistDatas = new Dictionary <KeyValuePair <string, bool>, AlbumArtistData> { { new KeyValuePair <string, bool>(_NULL, true), defaultAlbumArtist } }; var localAlbumDatas = new Dictionary <KeyValuePair <KeyValuePair <string, AlbumArtistData>, bool>, AlbumData> { { new KeyValuePair <KeyValuePair <string, AlbumArtistData>, bool>(new KeyValuePair <string, AlbumArtistData>(_NULL, defaultAlbumArtist), true), new AlbumData(defaultAlbumArtist, _NULL, true) } }; var localGenreDatas = new Dictionary <KeyValuePair <string, bool>, GenreData> { { new KeyValuePair <string, bool>(_NULL, true), new GenreData(_NULL, true) } }; var localPerformerDatas = new Dictionary <KeyValuePair <string, bool>, PerformerData> { { new KeyValuePair <string, bool>(_NULL, true), new PerformerData(_NULL, true) } }; int i = 1; foreach (string file in files) { TreatSingleFile(i, file, localAlbumArtistDatas, localAlbumDatas, localGenreDatas, localPerformerDatas); i++; } } } catch (Exception exGlobal) { LoadingLogHandler?.Invoke(this, new LoadingLogEventArgs(new LogData($"An error has occured, the process has been stopped.", LogLevel.Critical, new KeyValuePair <string, string>("Error message", exGlobal.Message)), -1)); } } }