private DirectoryInfo CreateArtistAlbumFormat(string writeFolder, IArtist artist, IAlbum album)
        {
            var albumFolderName = string.Format("{0} - {1}", artist.Name, album.Title);
            var fullPath        = Path.Combine(writeFolder, albumFolderName);

            return(CreateDirectory(fullPath));
        }
 public AlbumPostController(IArtist artist, IImage image, IAlbum album, IAlbumSong albumSong)
 {
     _artist    = artist;
     _image     = image;
     _album     = album;
     _albumSong = albumSong;
 }
        internal void Publish(IArtist o)
        {
            Artist tr = o as Artist;

            if (!RawCollection.Contains(tr))
                BasicRegister(tr);
        }
Example #4
0
        public static ArtistInfo FromArtist(IArtist artist)
        {
            if (artist == null)
                return null;

            return new ArtistInfo(artist.Id, artist.Name);
        }
Example #5
0
 public HomeController(ITreck trecks, IGenres genres, IAlbums albums, IArtist artist)
 {
     _trecks = trecks;
     _genres = genres;
     _albums = albums;
     _artist = artist;
 }
Example #6
0
        public override IArtist GetArtist(ISecurityContext securityContext, IMediaFactory mediaFactory, IMetadataRepository mediaItemRepository)
        {
            IArtist artist = null;
            var     track  = mediaItemRepository.GetByTarget <ITrack>(Location).FirstOrDefault();

            if (track != null)
            {
                artist = mediaItemRepository.GetByLocation <IArtist>(track.Creator);
                if (artist != null)
                {
                    return(artist);
                }
            }

            if (id3v2Tag == null || id3v2Tag.JoinedPerformers == null)
            {
                return(new MediaItemBuilder <IArtist>(securityContext, mediaFactory).GetDefault());
            }

            var artistName = id3v2Tag.JoinedPerformers;
            var summary    = string.Empty;

            artist = mediaItemRepository.GetByName <IArtist>(artistName).FirstOrDefault();
            if (artist != null)
            {
                return(artist);
            }

            var builder = new MediaItemBuilder <IArtist>(securityContext, mediaFactory)
                          .Identity(artistName, summary);

            return(builder.ToMediaItem());
        }
 public void GoToArtist(IArtist iartist)
 {
     this.GenreNavigation.PropertyChanged -= NavigatorChanged;
     this.GenreNavigation.Item = null;
     DoGoToArtist(iartist);
     this.GenreNavigation.PropertyChanged += NavigatorChanged;
 }
Example #8
0
        public bool Validate(Song song)
        {
            //check the artist ID is valid
            IArtist artist = _artistRepository.GetArtist(song.songArtistID);

            if (artist == null)
            {
                return(false);
            }
            //check the genre id is valid
            else if (_genreRepository.GetGenre(song.songGenreID) == null)
            {
                return(false);
            }
            //check the year it's released to make sure it's not outside the active years range
            else if (artist.startingDate.Year > song.releaseDate.Year ||
                     (artist.endingDate.HasValue && artist.endingDate.Value.Year < song.releaseDate.Year))
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
Example #9
0
        public IEnumerable<ITrack> GetArtistTracks(IArtist artist, int? page = null, Timestamp startTime = null, Timestamp endTime = null)
        {
            IApiMethod method = this.CreateApiMethod("user.getArtistTracks");

            method.AddParameter("artist", artist.Name);

            if (page.HasValue)
            {
                method.AddParameter("page", page.ToString());
            }
            if (startTime != null)
            {
                method.AddParameter("startTimestamp", startTime.ToString());
            }
            if (endTime != null)
            {
                method.AddParameter("endTimestamp", endTime.ToString());
            }

            var response = method.Execute();

            JArray tracks = (JArray)response["lfm"]["artisttracks"]["track"];

            foreach (var track in tracks)
            {
                yield return new Track { Url = track.Value<string>("url"), Name = track.Value<string>("name") };

            }
        }
 public static void ThrowIfNull(this IArtist artist)
 {
     if (artist == null)
     {
         throw new ArgumentNullException(nameof(artist));
     }
 }
        private void DoGoToArtist(IArtist iartist)
        {
            if (iartist == null)
                return;

            this.ArtistNavigation.Item = iartist;
        }
Example #12
0
        // BUG: This is currently returning inconsistent values if run multiple times with the same artist. Lyrics API sometimes returns an empty string for a song even if it does have it in its
        // database and has successfully retrieved it before. Reason is unknown - rate limiting? - but is very difficult to filter for as it still returns a 200 response
        public async Task <double> GetArtistAverageSongLength(IArtist artist)
        {
            var q = new Query("Aire Logic Technical Test", "1.0", "heliomance.github.com");
            var lyricLengthLookups = new List <Task <int> >();

            var works = await q.BrowseArtistWorksAsync(artist.Id);

            lyricLengthLookups.AddRange(works.Results.Select(work => GetSongLength(artist.Name, work.Title)));

            while (works.Offset + works.Results.Count < works.TotalResults)
            {
                works = await works.NextAsync();

                lyricLengthLookups.AddRange(works.Results.Select(work => GetSongLength(artist.Name, work.Title)));
            }

            Console.WriteLine($"Found {lyricLengthLookups.Count} works by that artist on MusicBrainz");

            // Only count non-instrumental songs where the lyrics where actually found
            var songLengths = (await Task.WhenAll(lyricLengthLookups)).Where(l => l > 0).ToList();

            Console.WriteLine($"Found lyrics for {songLengths.Count} songs");

            // If no songs are found, or all songs are instrumental, return -1 without further calculation (avoids an error if the lyrics API doesn't have any songs by that artist)
            if (songLengths.Any())
            {
                return(songLengths.Average());
            }

            return(-1);
        }
Example #13
0
        public void PainterCreationWithoutReflectionTest()
        {
            SimpleFactory factory = SimpleFactory.GetFactory();
            IArtist       x       = factory.GetArtist(typeof(Painter));

            Assert.AreSame(x.GetType(), typeof(Painter));
        }
 public HomeController(IArtist artist, IArtWork artwork, IGroup group, IUserLogin userlogin)
 {
     _artist    = artist;
     _artwork   = artwork;
     _group     = group;
     _userlogin = userlogin;
 }
Example #15
0
        public void OneTimeSetUp()
        {
            var    deezer = DeezerSession.CreateNew();
            string token  = "frmFoXgyyO1ATzluA6gZIFIoWAf8b8G4tGWHaoxtDN9oCKMghM";

            if (string.IsNullOrEmpty(token))
            {
                throw new NotLoggedInException();
            }

            deezer.Login(token)
            .GetAwaiter().GetResult();

            _user = deezer.User;

            _album = deezer.Browse.GetAlbumById(302127)
                     .GetAwaiter().GetResult();

            _artist = deezer.Browse.GetArtistById(27)
                      .GetAwaiter().GetResult();

            _track = deezer.Browse.GetTrackById(3135556)
                     .GetAwaiter().GetResult();

            _playlist = deezer.Browse.GetPlaylistById(908622995)
                        .GetAwaiter().GetResult();

            _radio = deezer.Browse.GetRadioById(6)
                     .GetAwaiter().GetResult();
        }
Example #16
0
 public void RemoveArtist(IArtist artist)
 {
     if (_database.Artists.Contains(artist))
     {
         _database.Artists.Remove(artist);
     }
 }
 public TopHitsAlbumBrowse(IAlbum album, IArtist artist, IArray <ITrack> tracks, ISession session)
 {
     this.Album   = album;
     this.Artist  = artist;
     this.Tracks  = tracks;
     this.Session = session;
 }
        private async Task <uint> GetTrackCount(IArtist artist)
        {
            uint offset     = 0;
            uint fetchCount = 50;
            uint trackCount = 0;

            while (true)
            {
                foreach (var album in await artist.Albums(CancellationToken.None, offset, fetchCount))
                {
                    await Task.Delay(_delayConfiguration.CheckArtistForUpdatesBackgroundJob_GetTrackCountDelay);

                    var apiAlbum = await _deezerApiService.GetDeezerApi().Albums.GetById(album.Id, CancellationToken.None);

                    trackCount += apiAlbum.TrackCount;
                }

                if (offset >= artist.NumberOfAlbums)
                {
                    break;
                }

                offset += fetchCount;
            }

            return(trackCount);
        }
Example #19
0
 public void AddAlbum(IAlbum album, IArtist artist)
 {
     artist         = ArtistInDBConfirmation(artist);
     album.ArtistID = artist.ID;
     _database.AddAlbum(album);
     RemoveIfDuplicate(album);
 }
 public MusicianPostController(IArtist artist, IArtistMusician artistMusician, IMusician musician, IImage image)
 {
     _artist         = artist;
     _artistMusician = artistMusician;
     _musician       = musician;
     _image          = image;
 }
 public Task <IEnumerable <AlbumModel> > LoadAlbumsByArtist(IArtist artist)
 {
     using var db = new SQLiteConnection(ConnectionString);
     return(db.QueryAsync <AlbumModel>(
                @"SELECT DISTINCT artist, album, genre, year FROM Tracks WHERE artist = @Artist ORDER BY album",
                artist));
 }
Example #22
0
 public bool Equals(IArtist other)
 {
     if (ReferenceEquals(null, other))
         return false;
     if (ReferenceEquals(this, other))
         return true;
     return Equals(Name, other.Name);
 }
Example #23
0
        public void ToAlbumsByArtist(IArtist artist)
        {
            Func <IArtist, Task <IEnumerable <IAlbum> > > f = ViewModel.GetAlbumsByArtist;

            albumListControl.GetAlbums = f.Partial(artist);
            ViewFrame.NavigationService.Navigate(albumListControl);
            ViewFrame.NavigationUIVisibility = NavigationUIVisibility.Hidden;
        }
Example #24
0
        public void CopyProperties(IArtist other)
        {
            other.CheckArgument(nameof(other));

            Id         = other.Id;
            RowVersion = other.RowVersion;
            Name       = other.Name;
        }
Example #25
0
 internal static IntPtr GetPointer(IArtist artist)
 {
     if (artist.GetType() == typeof(ArtistWrapper))
     {
         return(((ArtistWrapper)artist).artist.artistPtr);
     }
     throw new ArgumentException("Invalid artist");
 }
Example #26
0
        public void Initialize(IArtist artist)
        {
            _artist = artist;

            Name = _artist.Name;

            RaisePropertyChanged(() => Albums);
        }
Example #27
0
 public IEnumerable <IDirectory> GetDirectories(IArtist artist)
 {
     return(ExecuteWithCaching(m_ArtistDirectoriesCache, artist, (IArtist a) =>
     {
         var directories = artist.Albums.SelectMany(GetDirectories).Distinct().ToList();
         return CombineCommonAncestors(directories).ToList();
     }));
 }
Example #28
0
 public void WriteViolation(IRule <IArtist> violatedRule, Severity severity, IArtist artist)
 {
     // add violations to all directories contain files that are from this artist
     foreach (var directory in m_MetadataMapper.GetDirectories(artist))
     {
         AddRuleViolation(directory, violatedRule);
     }
 }
Example #29
0
 public async Task <IEnumerable <IAlbum> > GetAlbumsByArtist(IArtist artist)
 {
     return(artist.Id.HasValue
         ? (await source.GetAlbumsByArtist(artist.Id.Value))
            .Bind(TryDeserialize <IEnumerable <AlbumResponse> >)
            .Match(err => Enumerable.Empty <IAlbum>(), x => x)
         : Enumerable.Empty <IAlbum>());
 }
 public LoadSongsViewModel()
 {
     _artist = new Artist();
     _album = new Album();
     _discography = new Discography();
     _songs = new List<Song>();
     _artistContact = new ArtistContact();
 }
        private void UnPublish(IArtist o)
        {
            Artist tr = o as Artist;

            IObjectState ios = tr;
            ios.ObjectStateChanges -= LifeChanges;
            RawCollection.Remove(tr);
        }
 public SearchRestController(IArtist artist, IGenre genre, IAlbum album, IMusician musician, IArtistGenre artistGenre)
 {
     _artist      = artist;
     _genre       = genre;
     _album       = album;
     _musician    = musician;
     _artistGenre = artistGenre;
 }
Example #33
0
 public Work(WorkType type, IWork parent, IArtist artist, string name, short year, uint number)
 {
     this.type = type;
     this.parent = parent;
     this.artist = artist;
     this.name = name ?? string.Empty;
     this.year = year;
     this.number = number;
 }
        public void SaveArtist(IArtist artist)
        {
            var collection = _db.GetCollection(_collectionName);
            var query      = Query.EQ("Artist", artist.Name);

            var writeArtist = DataMapper.GetArtistAsBson(artist);

            collection.Update(query, Update.Replace(writeArtist), UpdateFlags.Upsert);
        }
Example #35
0
        public static Artist ConvertToDto(IArtist artist)
        {
            using (artist)
            {
                artist.WaitUntilLoaded();

                return Mapper.Map<IArtist, Artist>(artist);
            }
        }
Example #36
0
 public Work(WorkType type, IWork parent, IArtist artist, string name, short year, uint number)
 {
     this.type   = type;
     this.parent = parent;
     this.artist = artist;
     this.name   = name ?? string.Empty;
     this.year   = year;
     this.number = number;
 }
Example #37
0
 public MainController(IGenre genre, IArtist artist, IArtistGenre artistGenre, IImage image,
                       IArtistMusician artistMusician)
 {
     _genre          = genre;
     _artist         = artist;
     _artistGenre    = artistGenre;
     _image          = image;
     _artistMusician = artistMusician;
 }
Example #38
0
 public MusicController(ITreck trecks, IPlaylist playlists, IPlaylistTreck playlistsTreck, IGenres genres, IAlbums albums, IArtist artist)
 {
     _trecks         = trecks;
     _playlists      = playlists;
     _playlistsTreck = playlistsTreck;
     _genres         = genres;
     _albums         = albums;
     _artist         = artist;
 }
Example #39
0
        public void Delete(IArtist artist)
        {
            if (!_artistRepository.Exists(artist.Id))
            {
                throw new NotFoundException(artist.Id, "artist");
            }

            _artistRepository.Delete(artist.Id);
        }
Example #40
0
        private void RemoveIfDuplicate(IArtist artist)
        {
            IArtist foundArtist = _database.FindArtist(artist);

            if (foundArtist != artist)
            {
                _database.RemoveArtist(artist);
            }
        }
Example #41
0
        public static Task<IArtistBrowse> BrowseAsync(
            this ISession session,
            IArtist artist,
            ArtistBrowseType type,
            object userState = null)
        {
            var tcs = new TaskCompletionSource<IArtistBrowse>();

            var browse = session.Browse(artist, type, userState);
            browse.Completed += (sender, args) => tcs.SetResult(browse);
            return tcs.Task;
        }
 public ViewResult Artist(IArtist artist)
 {
     if (ModelState.IsValid)
     {
         return View(new ArtistViewData(artist));
     }
     else
     {
         // captured by [HandleError]
         throw new ArgumentException(ModelState["artist"].Errors.First().ErrorMessage);
     }
 }
Example #43
0
 public ArtistInformation(IArtist artist, Dispatcher dispatcher)
 {
     _portraits = new NotifyCollection<BitmapSource>();
     _tracks = new NotifyCollection<Track>();
     _albums = new NotifyCollection<Album>();
     _similarArtists = new NotifyCollection<Artist>();
     _dispatcher = dispatcher;
     _artist = artist;
     _browse = _artist.Browse();
     _isLoading = !_browse.IsComplete;
     _browse.Completed += ArtistBrowseCompleted;
 }
Example #44
0
        public override IClip GetClip(ISecurityContext securityContext, IMediaFactory mediaFactory, IMetadataRepository mediaItemRepository, IArtist artist, IAlbum album)
        {
            var clip = mediaItemRepository.GetByTarget<IClip>(Location).FirstOrDefault();
            if (clip != null)
            {
                return clip;
            }

            var name = GetClipName();
            var summary = string.Empty;
            var number = GetClipNumber();
            var date = GetDate();
            var duration = file != null && file.Properties != null ? file.Properties.Duration : TimeSpan.FromMinutes(5);
            var height = file != null && file.Properties != null ? (uint)file.Properties.VideoHeight : 480;
            var width = file != null && file.Properties != null ? (uint)file.Properties.VideoWidth : 640;

            var builder = new MediaItemBuilder<IClip>(securityContext, mediaFactory)
                .Identity(name, summary, date, date, number)
                .Size(duration, height, width)
                .Target(Location, Type.Name);

            return builder.ToMediaItem();
        }
 public Recommendation(IArtist artist, float rating)
 {
     Artist = artist;
     Value = rating;
 }
Example #46
0
 private INotifyEnumerable<IAlbum> GetAlbums(IArtist artist)
 {
     return new NotifyCollection<IAlbum>(Builder<Album>
         .CreateListOfSize(_random.Next(3, 5))
         .WhereAll()
         .Has(a => a.Year = _random.Next(1990, 2011))
         .Has(a => a.Name = _albumNames[_random.Next(0, _albumNames.Length - 1)])
         .Has(a => a.Artist = artist)
         .Has(a => a.Info = GetAlbumInformation(a))
         .Has(a => a.IsAvailable = true)
         .Build());
 }
Example #47
0
        private Task<Stream> GetArtistImageTask(ISession session, IArtist artist)
        {
            LoginService.EnsureUserIsLoggedIn();
            return session
                .BrowseAsync(artist, ArtistBrowseType.NoTracks | ArtistBrowseType.NoAlbums)
                .ContinueWith(t =>
                {
                    using (t.Result)
                    {
                        if (t.Result.Portraits.Count > 0)
                        {
                            using (var image = t.Result.Portraits[0])
                            {
                                if (image.WaitUntilLoaded())
                                {
                                    return new MemoryStream(image.Data);
                                }

                                return new MemoryStream();
                            }
                        }

                        if (t.Result.Albums.Count > 0)
                        {
                            foreach (var album in t.Result.Albums)
                            {
                                using (album)
                                {
                                    if (album.WaitUntilLoaded() && !string.IsNullOrEmpty(album.CoverId))
                                    {
                                        return GetImage(album.CoverId);
                                    }
                                }
                            }
                        }
                    }

                    return new MemoryStream();
                });
        }
Example #48
0
 private IArtistInformation GetArtistInformation(IArtist artist)
 {
     return Builder<ArtistInformation>
         .CreateNew()
         .With(i => i.Albums = GetAlbums(artist))
         .With(i => i.Biography = _latinText)
         .Build();
 }
Example #49
0
 public virtual IAlbum GetAlbum(ISecurityContext securityContext, IMediaFactory mediaFactory, IMetadataRepository mediaItemRepository, IArtist artist)
 {
     return null;
 }
Example #50
0
 public IArtistBrowse Browse(IArtist artist, object userData = null)
 {
     return Browse(artist, ArtistBrowseType.Full, userData);
 }
Example #51
0
 public virtual ITrack GetTrack(ISecurityContext securityContext, IMediaFactory mediaFactory, IMetadataRepository mediaItemRepository, IAudioStreamFactory audioStreamFactory, IArtist artist, IAlbum album)
 {
     return null;
 }
Example #52
0
        public IArtistBrowse Browse(IArtist artist, ArtistBrowseType browseType, object userData = null)
        {
            if (!(artist is INativeObject))
            {
                throw new ArgumentException("Invalid type");
            }

            AssertHandle();

            var browse = new NativeArtistBrowse(this, artist.GetHandle(), browseType);
            browse.Initialize();
            return browse;
        }
        public void Save()
        {
            Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase();

            if (_artist.ArtistId == 0)
            {
                //ADD ARTIST
                IRepository<IArtist> artist = new ArtistRepository(db);
                IRepositoryBLL<IArtist> artistRepoBll = new ArtistRepositoryBLL(artist);
                _artist = artistRepoBll.Add(_artist);

                //ADD ARTIST CONTACT
                IRepository<IArtistContact> contact1 = new ArtistContactRepository(db);
                IRepositoryBLL<IArtistContact> contactBll = new ArtistContactRepositoryBLL(contact1);
                _artistContact.ArtistId = _artist.ArtistId;
                _artistContact = contactBll.Add(_artistContact);

                //ADD DISCOGRAPHY
                IRepository<IDiscography> disco = new DiscographyRepository(db);
                IRepositoryBLL<IDiscography> discoBll = new DiscographyRepositoryBLL(disco);
                _discography.ArtistId = _artist.ArtistId;
                _discography = discoBll.Add(_discography);
            }

            if (_album.AlbumId == 0)
            {
                //ADD ALBUM
                IRepository<IAlbum> album1 = new AlbumRepository(db);
                IRepositoryBLL<IAlbum> albumBll = new AlbumRepositoryBLL(album1);
                _album.ArtistId = _artist.ArtistId;
                _album = albumBll.Add(_album);
            }

            //ADD SONGS
            IRepository<ISong> song1 = new SongRepository(db);
            IRepositoryBLL<ISong> songBll = new SongRepositoryBLL(song1);
            foreach (Song item in _songs)
            {
                item.AlbumId = _album.AlbumId;
                songBll.Add(item);
            }
        }
 private static IObservableCollection<TrackView> GetTrackCollectionFromMusicObject(IArtist iartist)
 {
     return iartist.Albums.LiveSelectMany(al=>al.Tracks).LiveSelect(t=> TrackView.GetTrackView(t));
 }
 private static IObservableCollection<IAlbum> GetAlbumCollectionFromMusicObject(IArtist iartist)
 {
     return iartist.Albums;
 }
Example #56
0
        public virtual IAlbum GetAlbum(ISecurityContext securityContext, IMediaFactory mediaFactory, IMetadataRepository mediaItemRepository, IArtist artist)
        {
            IAlbum album = null;
            var clip = mediaItemRepository.GetByTarget<IClip>(Location).FirstOrDefault();
            if (clip != null)
            {
                album = mediaItemRepository.GetByLocation<IAlbum>(clip.Catalog);
                if (album != null)
                    return album;
            }

            var albumName = GetAlbumName();
            var summary = string.Empty;
            album = mediaItemRepository.GetByName<IAlbum>(albumName).FirstOrDefault();
            if (album != null)
            {
                return album;
            }

            var albumNumber = GetAlbumNumber();
            var date = GetDate();

            var builder = new MediaItemBuilder<IAlbum>(securityContext, mediaFactory)
                .Identity(albumName, summary, date, date, albumNumber)
                .Creator(artist.Location, artist.Name);

            return builder.ToMediaItem();
        }
Example #57
0
        public override IAlbum GetAlbum(ISecurityContext securityContext, IMediaFactory mediaFactory, IMetadataRepository mediaItemRepository, IArtist artist)
        {
            IAlbum album = null;
            var track = mediaItemRepository.GetByTarget<ITrack>(Location).FirstOrDefault();
            if (track != null)
            {
                album = mediaItemRepository.GetByLocation<IAlbum>(track.Catalog);
                if (album != null)
                    return album;
            }

            var albumTitle = "Unknown Album";
            var summary = string.Empty;
            //var albumTag = GetTags().Where(x => x.Type == Id3v2TagType.Album).FirstOrDefault();
            if (id3v2Tag != null && id3v2Tag.Album != null)
            {
                albumTitle = id3v2Tag.Album; //albumTag.Tuple.ToString();
                album = mediaItemRepository.GetByCreatorAndName<IAlbum>(artist.Location, albumTitle);
                if (album != null)
                    return album;
            }

            var builder = new MediaItemBuilder<IAlbum>(securityContext, mediaFactory)
                .Identity(albumTitle, summary)
                .Creator(artist.Location, artist.Name);

            return builder.ToMediaItem();
        }
Example #58
0
 public ArtistViewData(IArtist artist)
 {
     Artist = artist;
 }
Example #59
0
 internal static IntPtr GetPointer(IArtist artist)
 {
     if (artist.GetType() == typeof(ArtistWrapper))
         return ((ArtistWrapper)artist).artist.artistPtr;
     throw new ArgumentException("Invalid artist");
 }
Example #60
0
        public override ITrack GetTrack(ISecurityContext securityContext, IMediaFactory mediaFactory, IMetadataRepository mediaItemRepository, IAudioStreamFactory audioStreamFactory, IArtist artist, IAlbum album)
        {
            var track = mediaItemRepository.GetByTarget<ITrack>(Location).FirstOrDefault();
            //if (track != null)
                //return track;

            if (id3v2Tag == null)
            {
                if (track != null)
                    return track;

                var builder = new MediaItemBuilder<ITrack>(securityContext, mediaFactory)
                    .Identity("Unknown", string.Empty)
                    .Creator(artist.Location, artist.Name)
                    .Catalog(album.Location, album.Name)
                    .Target(Location, Type.Name);

                return builder.ToMediaItem();
            }

            var name = id3v2Tag.Title != null ? id3v2Tag.Title : "Unknown Track";
            var summary = id3v2Tag.Lyrics ?? string.Empty;
            
            var recordDate = DateTime.MinValue;
            if (id3v2Tag != null && id3v2Tag.RecordingDate > DateTime.MinValue)
                recordDate = id3v2Tag.RecordingDate;
            else if (id3v1Tag != null && id3v1Tag.Year >= DateTime.MinValue.Year && id3v1Tag.Year <= DateTime.MaxValue.Year)
                recordDate = new DateTime((int)id3v1Tag.Year, 1, 1);

            var releaseDate = DateTime.MinValue;
            if (id3v2Tag != null && id3v2Tag.ReleaseDate > DateTime.MinValue)
                releaseDate = id3v2Tag.ReleaseDate;
            else if (id3v1Tag != null && id3v1Tag.Year >= DateTime.MinValue.Year && id3v1Tag.Year <= DateTime.MaxValue.Year)
                releaseDate = new DateTime((int)id3v1Tag.Year, 1, 1);

            var number = id3v2Tag.Track;
            var duration = id3v2Tag.Duration;
            if (duration == TimeSpan.Zero)
            {
                using (var audioStream = audioStreamFactory.CreateAudioStream(Location))
                {
                    if (audioStream != null)
                    {
                        duration = audioStream.Duration;
                    }
                }
            }

            var thumbnail = Guid.Empty.ToUrn();
            var thumbnailData = id3v2Tag.Pictures != null && id3v2Tag.Pictures.Length > 0 ? id3v2Tag.Pictures[0].Data.ToArray() : new byte[0];

            var trackId = track != null ? track.Location : Guid.NewGuid().ToUrn();

            var fullBuilder = new MediaItemBuilder<ITrack>(securityContext, mediaFactory)
                .Identity(name, summary, recordDate, releaseDate, number, trackId)
                .Size(duration)
                .Creator(artist.Location, artist.Name)
                .Catalog(album.Location, album.Name)
                .Target(Location, Type.Name)
                .Thumbnail(thumbnail, thumbnailData);

            return fullBuilder.ToMediaItem();
        }