private async Task<PlayableBase> GetTrack(FileInfo fileInfo, List<string> supportedExtensions) { var extension = fileInfo.Extension.Remove(0, 1); //--- STEP 1: Check the track --- //Check the extension if (!supportedExtensions.Any(x => string.Equals(x, extension, StringComparison.OrdinalIgnoreCase))) return null; AudioInformation audioInformation = null; //Check the file if ( !(await Task.Run( () => _musicDataManager.MusicManager.AudioEngine.TestAudioFile(fileInfo.FullName, out audioInformation)))) //If the audio engine can't open the track, skip return null; LocalPlayable track; //--- STEP 2: Get information from the file --- //Search if track is already in the database if (SearchTrack(fileInfo.FullName, out track)) return track; //Create a new track with some information we already have track = new LocalPlayable { Extension = extension.ToUpper(), TrackPath = fileInfo.FullName, Duration = audioInformation.Duration, SampleRate = Math.Round(audioInformation.SampleRate / 1000d, 1) }; string filenameArtistName = null; string tagArtistName = null; string internetArtistName = null; string albumName = null; string title = null; /* Information priority: 1. Tag 2. Internet 3. Filename */ try { //Let's have a look in the tags using (var tagLibInfo = File.Create(fileInfo.FullName)) //We look into the tags. Perhaps we'll find something interesting { track.Title = tagLibInfo.Tag.Title; if (!string.IsNullOrEmpty(tagLibInfo.Tag.MusicBrainzArtistId)) track.Artist = await GetArtistByMusicBrainzId(tagLibInfo.Tag.MusicBrainzArtistId); //Ui, that's awesome else tagArtistName = tagLibInfo.Tag.FirstPerformer ?? tagLibInfo.Tag.FirstAlbumArtist; //Both is okay if (tagLibInfo.Tag.Pictures.Any()) { if (tagLibInfo.Tag.Pictures.Count() > 1) Debug.Print("tagLibInfo.Tag.Pictures.Length > 1"); track.Cover = new TagImage(fileInfo.FullName); } track.Bitrate = tagLibInfo.Properties.AudioBitrate; albumName = tagLibInfo.Tag.Album; } } catch (Exception) { //Do nothing } //At the next step, the title must have a value if (track.Title == null || (tagArtistName == null && track.Artist == null)) { var match = Regex.Match(Path.GetFileNameWithoutExtension(fileInfo.FullName), @"(?<artist>([a-zA-Z].+?)) - (?<title>(.[^\(\[-]+))"); if (match.Success) { title = match.Groups["title"].Value.Trim(); if (tagArtistName == null) filenameArtistName = match.Groups["artist"].Value; } else { title = Path.GetFileNameWithoutExtension(fileInfo.FullName); if (tagArtistName == null) filenameArtistName = string.Empty; } } //Now we search the track in the internet. If we have find something, we set all information which has to be set var trackInfo = await _musicDataManager.LastfmApi.GetTrackInformation(track.Title ?? title, track.Artist?.Name ?? tagArtistName ?? filenameArtistName); if (trackInfo != null) { if (track.Title == null) track.Title = trackInfo.Name; if (!string.IsNullOrEmpty(trackInfo.MusicBrainzId)) { var temp = SearchTrackByMusicBrainzId(trackInfo.MusicBrainzId); if (temp != null) return temp; //Check if we already have a track with this id track.MusicBrainzId = trackInfo.MusicBrainzId; } if (track.Cover == null) track.Cover = trackInfo.CoverImage; if (track.Artist == null) { track.Artist = await SearchArtist(tagArtistName, trackInfo.Artist, filenameArtistName, track.MusicBrainzId); if (track.Artist == null) internetArtistName = trackInfo.Artist; } } else if(track.Title == null) { track.Title = title; } if (track.Artist == null) { var name = tagArtistName ?? internetArtistName ?? filenameArtistName; if (!string.IsNullOrEmpty(name)) { var artist = await _musicDataManager.LastfmApi.SearchArtistOnline(name); track.Artist = artist ?? new Artist(name); } else { track.Artist = _musicDataManager.Artists.UnknownArtist; } } if (!_musicDataManager.Artists.ArtistDictionary.ContainsKey(track.Artist.Guid)) await _musicDataManager.Artists.AddArtist(track.Artist); if (!string.IsNullOrWhiteSpace(albumName)) { track.Album = _musicDataManager.Albums.Collection.FirstOrDefault( x => string.Equals(x.Value.Name, albumName, StringComparison.OrdinalIgnoreCase)).Value; if (track.Album == null) { var album = new Album { Name = albumName, Guid = Guid.NewGuid() }; await _musicDataManager.Albums.AddAlbum(album); track.Album = album; } if (track.Artist != _musicDataManager.Artists.UnknownArtist && !track.Album.Artists.Contains(track.Artist)) { track.Album.Artists.Add(track.Artist); await _musicDataManager.Albums.UpdateAlbumArtists(track.Album); } } await _musicDataManager.Tracks.AddTrack(track); return track; }
private bool SearchTrack(string path, out LocalPlayable playable) { foreach (var playableBase in _musicDataManager.Tracks.Tracks) { var localTrack = playableBase as LocalPlayable; if (localTrack != null && localTrack.TrackPath == path) { playable = localTrack; return true; } } playable = null; return false; }