Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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));
                }
            }
        }