Esempio n. 1
0
 /// <summary>
 /// 트랙 2개 재생 시작 (하나는 메인, 하나는 사이드)
 /// </summary>
 public void StartWithTwoTrack(Data.Track mainTrack, int startStep, Data.Track sideTrack, int sideStep, Data.TransitionScenario transcen)
 {
     m_cmdQueue.Enqueue(new Command()
     {
         type = Command.Type.StartWithTwoTrack, param1 = mainTrack, param2 = startStep, param3 = sideTrack, param4 = sideStep, param5 = transcen
     });
 }
Esempio n. 2
0
        void _StartWithTwoTrack(Data.Track mainTrack, int startStep, Data.Track sideTrack, int sideStep, Data.TransitionScenario transcen)
        {
            var newreq = new NewStartTwoTrackRequest(this);

            newreq.Setup(mainTrack, startStep, sideTrack, sideStep, transcen);
            m_reqQueue.Enqueue(newreq);
        }
Esempio n. 3
0
        void _StartWithOneTrack(Data.Track track, int startStep, bool reverse = false)
        {
            var newreq = new NewStartOneTrackRequest(this);

            newreq.Setup(track, reverse);
            m_reqQueue.Enqueue(newreq);
        }
Esempio n. 4
0
 /// <summary>
 /// 트랜지션 단계 진행. 새 트랙을 준비한다.
 /// </summary>
 /// <param name="newTrack"></param>
 /// <param name="transcen"></param>
 /// <param name="reverse"></param>
 public void StepMove(int step, Data.Track newTrack, Data.TransitionScenario transcen, int newstep = -1, bool reverse = false)
 {
     m_cmdQueue.Enqueue(new Command()
     {
         type = Command.Type.StepMove, param1 = step, param2 = newTrack, param3 = transcen, param4 = newstep, param5 = reverse
     });
 }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="step"></param>
        /// <param name="newTrack"></param>
        /// <param name="transcen"></param>
        /// <param name="reverse"></param>
        /// <returns>cmd 를 소모해야하는지 여부. true일 경우 큐에서 날린다. false일 경우 날리지 않고 다음 프레임에 계속 체크해본다</returns>
        bool _StepMove(int step, Data.Track newTrack, Data.TransitionScenario transcen, int newstep = -1, bool reverse = false)
        {
            //Debug.Log(string.Format("m_curTrackStep : {0}, step : {1}", m_curTrackStep, step));
            if (m_curTrackStep == step)                                         // 동일한 step으로 진행하는 요청이 들어온 경우엔 무시한다.
            {
                Debug.Log("[LibSequentia] same step");
                return(true);
            }

            // 현재 진행중인 요청이 stepmove고, 한번 더 진행이 가능한 경우에는 따로 요청을 늘리지 않는다. (자연 -> 강제 전환으로 바꾸는 것임)
            var stepMoveReq = m_reqQueue.Count > 0 ? m_reqQueue.Peek() as StepMoveRequest : null;

            if (stepMoveReq != null && stepMoveReq.MoveOnceMore(reverse))
            {
                return(true);
            }

            if (stepMoveReq == null)                                    // 현재 진행중인 요청이 stepmove가 아닌 경우에만 새 명령을 추가한다.
            {
                var newreq = new StepMoveRequest(this);
                //var newstep		= m_newTrackIsOn? m_newTrackStep : m_curTrackStep;
                //newstep			+= reverse? -1 : 1;
                newreq.Setup(step, newstep, reverse, newTrack, transcen);

                m_reqQueue.Enqueue(newreq);

                return(true);
            }
            else
            {                                                                                   // stepmove가 맞긴 맞는데 위 moveoncemore 를 실패한 경우라면, 이 명령은 소모해서는 안됨
                return(false);
            }
        }
Esempio n. 6
0
 public void Setup(Data.Track curtrack, int curstep, Data.Track newtrack, int newstep, Data.TransitionScenario tscen)
 {
     m_curtrack = curtrack;
     m_curstep  = curstep;
     m_newtrack = newtrack;
     m_newstep  = newstep;
     m_tscen    = tscen;
 }
Esempio n. 7
0
        /// <summary>
        /// For a given Track database record determine the path using the given destination folder
        /// </summary>
        /// <param name="track">Populate track database record</param>
        /// <param name="destinationFolder">Optional Root folder defaults to Library Folder from Settings</param>
        public static string PathForTrack(IRoadieSettings configuration, Data.Track track, string destinationFolder = null)
        {
            destinationFolder = destinationFolder ?? configuration.LibraryFolder;
            if (string.IsNullOrEmpty(track.FilePath) || string.IsNullOrEmpty(track.FileName))
            {
                return(null);
            }
            var directoryInfo = new DirectoryInfo(Path.Combine(destinationFolder, track.FilePath, track.FileName));

            return(directoryInfo.FullName);
        }
Esempio n. 8
0
        public static Track Map(this Data.Track t)
        {
            Track track = new Track()
            {
                ID          = t.ID,
                EventID     = t.Event_ID,
                Name        = t.Name,
                Description = t.Description
            };

            return(track);
        }
Esempio n. 9
0
 /// <summary>
 /// 두 트랙 모두 설정 (초기화 목적)
 /// </summary>
 /// <param name="mainTrack"></param>
 /// <param name="sideTrack"></param>
 /// <param name="trans"></param>
 public IMessageHandle[] SetBothTracks(Data.Track mainTrack, Data.Track sideTrack, Data.TransitionScenario trans)
 {
     return(new IMessageHandle[]
     {
         EnqueAndMakeHandle(new Message()
         {
             type = Message.Type.BothTrack, parameter = mainTrack, parameter2 = sideTrack
         }),
         EnqueAndMakeHandle(new Message()
         {
             type = Message.Type.NewTransitionScenario, parameter = trans
         }),
     });
 }
Esempio n. 10
0
 /// <summary>
 /// 새 트랙 올리기. 재생은 하지 않음. 다음번 진행 타이밍에 맞춰서 시작
 /// </summary>
 /// <param name="track"></param>
 public IMessageHandle[] SetNewTrack(Data.Track track, Data.TransitionScenario trans)
 {
     return(new IMessageHandle[]
     {
         EnqueAndMakeHandle(new Message()
         {
             type = Message.Type.NewTrack, parameter = track
         }),
         EnqueAndMakeHandle(new Message()
         {
             type = Message.Type.NewTransitionScenario, parameter = trans
         }),
     });
 }
Esempio n. 11
0
        public void CreateTrack(Track track)
        {
            using (OCCDB db = new OCCDB())
            {
                Data.Track t = new Data.Track()
                {
                    Event_ID    = track.EventID,
                    Name        = track.Name,
                    Description = track.Description
                };

                db.Tracks.Add(t);

                db.SaveChanges();
            }
        }
Esempio n. 12
0
        public void DeleteTrack(int id)
        {
            using (OCCDB db = new OCCDB())
            {
                Data.Track track = (from t in db.Tracks.Include("Sessions") where t.ID == id select t).FirstOrDefault();

                if (track.Sessions.Count > 0)
                {
                    throw new Exception("Can't delete a track that contains sessions!");
                }

                db.Tracks.Remove(track);

                db.SaveChanges();
            }
        }
Esempio n. 13
0
        public void AddTrack(Track track)
        {
            using (OCCDB db = new OCCDB())
            {
                Data.Track t = new Data.Track()
                {
                    EventID = track.EventID,
                    Name = track.Name,
                    Description = track.Description
                };

                db.Tracks.Add(t);

                db.SaveChanges();
            }
        }
Esempio n. 14
0
            public void Setup(int targetStep, int newStep, bool reverse, Data.Track newtrack = null, Data.TransitionScenario trans = null)
            {
                // 새 트랙이 진행중이면서 진행방향이 일치하는 경우 newStep을 사용한다. (새 트랙에 타겟팅중이므로)
                bool usingNewStep = ctrl.m_newTrackIsOn && reverse == ctrl.m_newTrackWasReversed;

                //Debug.Log(usingNewStep? "using newStep" : "using targetStep");

                m_targetStep = usingNewStep? newStep : targetStep;
                m_reverse    = reverse;
                m_newTrack   = ctrl.m_newTrackIsOn? null : newtrack;                            // 새 트랙이 올라와있다면 newtrack은 무시한다.
                m_trans      = trans;

                m_wasNaturalTransition = (targetStep % 2 == 1);

                //Debug.Log(string.Format("[stepmove setup] targetStep : {0} reverse : {1} ... ctrl.m_newTrackIsOn : {2}", targetStep, reverse, ctrl.m_newTrackIsOn));
            }
Esempio n. 15
0
        public static Track AsTrackWithSessions(this Data.Track t)
        {
            Track track = new Track()
            {
                ID          = t.ID,
                EventID     = t.Event_ID,
                Name        = t.Name,
                Description = t.Description
            };

            foreach (var sesion in t.Sessions)
            {
                track.Sessions.Add(sesion.Map());
            }

            return(track);
        }
Esempio n. 16
0
 /// <summary>
 /// 트랙 1개 재생 시작
 /// </summary>
 /// <param name="track"></param>
 public void StartWithOneTrack(Data.Track track, int startStep, bool reverse = false)
 {
     // NOTE : StartWithOneTrack 은 맨 앞쪽 섹션만 시작 가능하므로 이렇게 처리되지 않는 경우는 StartWithTwoTrack 으로 처리한다
     if (!reverse && startStep <= 1 || reverse && startStep >= (track.sectionCount + 1) * 2 - 1)
     {
         m_cmdQueue.Enqueue(new Command()
         {
             type = Command.Type.StartWithOneTrack, param1 = track, param2 = startStep, param3 = reverse
         });
     }
     else
     {
         m_cmdQueue.Enqueue(new Command()
         {
             type = Command.Type.StartWithTwoTrack, param1 = track, param2 = startStep, param3 = null, param4 = -1, param5 = null
         });
     }
 }
        internal static MappingSearch.Data.Track CreateLocationFromNewLocationModel(NewTrackModel newLocation)
        {
            Data.Track track = new Data.Track();
            track.City = FormInputHelper.StripInput(newLocation.City);
            track.Details = FormInputHelper.StripInput(newLocation.Details);
            track.State = FormInputHelper.StripInput(newLocation.State);
            track.ZipCode = FormInputHelper.StripInput(newLocation.Zip);
            track.StreetAddress = FormInputHelper.StripInput(newLocation.StreetAddress);

            GoogleGeoCodeResponse latLong = GetLatLongOfZip(newLocation.Zip);
            track.Name = FormInputHelper.StripInput(newLocation.TrackName);
            track.Lat = Convert.ToDouble(latLong.results[0].geometry.location.lat);
            track.Long = Convert.ToDouble(latLong.results[0].geometry.location.lng);
            track.TrackLength = newLocation.TrackLength;
            track.Approved = false;
            track.TrackWebsite = CorrectSiteUrl(newLocation.TrackWebSite);
            track.SubmittedBy = System.Web.HttpContext.Current.User.Identity.Name;

            return track;
        }
Esempio n. 18
0
 public static TrackList FromDataTrack(string trackPlayUrl,
                                       Data.Track track,
                                       int releaseMediaNumber,
                                       Release release,
                                       Data.Artist artist,
                                       Data.Artist trackArtist,
                                       string baseUrl,
                                       Image trackThumbnail,
                                       Image releaseThumbnail,
                                       Image artistThumbnail,
                                       Image trackArtistThumbnail)
 {
     return(new TrackList
     {
         DatabaseId = track.Id,
         Id = track.RoadieId,
         Track = new DataToken
         {
             Text = track.Title,
             Value = track.RoadieId.ToString()
         },
         Release = ReleaseList.FromDataRelease(release, artist, baseUrl, artistThumbnail, releaseThumbnail),
         LastPlayed = track.LastPlayed,
         Artist = ArtistList.FromDataArtist(artist, artistThumbnail),
         TrackArtist = trackArtist == null ? null : ArtistList.FromDataArtist(trackArtist, trackArtistThumbnail),
         TrackNumber = track.TrackNumber,
         MediaNumber = releaseMediaNumber,
         CreatedDate = track.CreatedDate,
         LastUpdated = track.LastUpdated,
         Duration = track.Duration,
         FileSize = track.FileSize,
         ReleaseDate = release.ReleaseDate,
         PlayedCount = track.PlayedCount,
         Rating = track.Rating,
         Status = track.Status,
         Title = track.Title,
         TrackPlayUrl = trackPlayUrl,
         Thumbnail = trackThumbnail
     });
 }
Esempio n. 19
0
            protected override bool OnStart()
            {
                if (player.isPlaying)                                   // 재생중이면 계속 보류
                {
                    return(false);
                }

                ctrl.m_curTrackStep        = 0;                         // 초기화
                ctrl.m_newTrackStep        = 0;
                ctrl.m_newTrackIsOn        = false;
                ctrl.m_lastMoveWasReversed = false;

                var reverse = false;                                    // NOTE : 무조건 정방향 진행으로 설정한다.

                // NOTE : curstep/newstep 의 자연/강제 트랜지션 여부가 따로 놀면 안될텐데... 제한하는 코드가 필요한가?
                var curstep_next = m_curstep + (m_curstep % 2);
                var newstep_next = m_newstep + (m_newstep % 2);

                bool directNewTrack = m_newstep == 3;                           // 바로 newtrack을 재생해야 하는 경우인지

                if (directNewTrack)
                {
                    m_curtrack = m_newtrack;
                    m_curstep  = m_newstep;
                    m_newtrack = null;
                }

                if (m_newtrack == null)                                         // 트랙 한개만 초기화
                {
                    player.SetNewTrack(m_curtrack, m_tscen);
                    var handle = player.ProgressStepTo(m_curstep, reverse);
                    handle.consumedDelegate = () =>
                    {
                        ctrl.m_curTrackStep        = curstep_next;
                        ctrl.m_lastMoveWasReversed = reverse;
                        ctrl.m_newTrackWasReversed = reverse;
                        ctrl.m_newTrackIsOn        = false;
                        Debug.Log("m_curTrackStep <- nextstep (NewStartOneTrackRequest) : " + ctrl.m_curTrackStep);
                    };
                    handle.transitionDelegate = () =>
                    {
                        Debug.Log("transition over - curstep_next : " + curstep_next);
                        isComplete = true;
                    };
                }
                else
                {                                                                                       // 두 트랙 초기화
                    player.SetBothTracks(m_curtrack, m_newtrack, m_tscen);
                    var handle = player.ProgressStepTo(m_curstep, reverse);
                    handle.consumedDelegate = () =>
                    {
                        ctrl.m_curTrackStep        = curstep_next;
                        ctrl.m_newTrackStep        = newstep_next;
                        ctrl.m_lastMoveWasReversed = reverse;
                        ctrl.m_newTrackWasReversed = reverse;
                        ctrl.m_newTrackIsOn        = true;
                    };
                    handle.transitionDelegate = () =>
                    {
                        isComplete = true;
                    };
                }

                return(true);
            }
Esempio n. 20
0
        public void CreateTrack(Track track)
        {
            using (var db = new CC.Data.CCDB())
            {
                Data.Track t = new Data.Track()
                {
                    Event_ID = track.EventID,
                    Name = track.Name,
                    Description = track.Description
                };

                db.Tracks.Add(t);

                db.SaveChanges();
            }
        }
Esempio n. 21
0
        /// <summary>
        /// Returns the Directory for a Track (just directory not Track FileName)
        /// </summary>
        /// <param name="artist">Artist For release</param>
        /// <param name="release">Release</param>
        /// <param name="track">Track</param>
        /// <param name="destinationFolder">Optional Root folder defaults to Library Folder from Settings</param>
        public static string TrackPath(IRoadieSettings configuration, Data.Artist artist, Data.Release release, Data.Track track, string destinationFolder = null)
        {
            var fileInfo = new FileInfo(FolderPathHelper.TrackFullPath(configuration, artist.SortNameValue, release.Title, release.ReleaseDate.Value, track.Title, track.TrackNumber, destinationFolder));

            return(fileInfo.Directory.Name);
        }
Esempio n. 22
0
 public void Setup(Data.Track track, bool reverse)
 {
     m_newTrack	= track;
     m_reverse	= reverse;
 }
Esempio n. 23
0
            public void Setup(int targetStep, int newStep, bool reverse, Data.Track newtrack = null, Data.TransitionScenario trans = null)
            {
                // 새 트랙이 진행중이면서 진행방향이 일치하는 경우 newStep을 사용한다. (새 트랙에 타겟팅중이므로)
                bool usingNewStep	= ctrl.m_newTrackIsOn && reverse == ctrl.m_newTrackWasReversed;
                //Debug.Log(usingNewStep? "using newStep" : "using targetStep");

                m_targetStep	= usingNewStep? newStep : targetStep;
                m_reverse		= reverse;
                m_newTrack		= ctrl.m_newTrackIsOn? null : newtrack;	// 새 트랙이 올라와있다면 newtrack은 무시한다.
                m_trans			= trans;

                m_wasNaturalTransition	= (targetStep % 2 == 1);

                //Debug.Log(string.Format("[stepmove setup] targetStep : {0} reverse : {1} ... ctrl.m_newTrackIsOn : {2}", targetStep, reverse, ctrl.m_newTrackIsOn));
            }
Esempio n. 24
0
            protected override bool OnStart()
            {
                if (player.isPlaying)			// 재생중이면 계속 보류
                    return false;

                ctrl.m_curTrackStep	= 0;		// 초기화
                ctrl.m_newTrackStep	= 0;
                ctrl.m_newTrackIsOn	= false;
                ctrl.m_lastMoveWasReversed	= false;

                var reverse = false;			// NOTE : 무조건 정방향 진행으로 설정한다.

                // NOTE : curstep/newstep 의 자연/강제 트랜지션 여부가 따로 놀면 안될텐데... 제한하는 코드가 필요한가?
                var curstep_next	= m_curstep + (m_curstep % 2);
                var newstep_next	= m_newstep	+ (m_newstep % 2);

                bool directNewTrack	= m_newstep == 3;	// 바로 newtrack을 재생해야 하는 경우인지
                if (directNewTrack)
                {
                    m_curtrack	= m_newtrack;
                    m_curstep	= m_newstep;
                    m_newtrack	= null;
                }

                if (m_newtrack == null)				// 트랙 한개만 초기화
                {
                    player.SetNewTrack(m_curtrack, m_tscen);
                    var handle		= player.ProgressStepTo(m_curstep, reverse);
                    handle.consumedDelegate	= () =>
                    {
                        ctrl.m_curTrackStep			= curstep_next;
                        ctrl.m_lastMoveWasReversed	= reverse;
                        ctrl.m_newTrackWasReversed	= reverse;
                        ctrl.m_newTrackIsOn			= false;
                        Debug.Log("m_curTrackStep <- nextstep (NewStartOneTrackRequest) : " + ctrl.m_curTrackStep);
                    };
                    handle.transitionDelegate = () =>
                    {
                        Debug.Log("transition over - curstep_next : " + curstep_next);
                        isComplete	= true;
                    };
                }
                else
                {									// 두 트랙 초기화

                    player.SetBothTracks(m_curtrack, m_newtrack, m_tscen);
                    var handle		= player.ProgressStepTo(m_curstep, reverse);
                    handle.consumedDelegate = () =>
                        {
                            ctrl.m_curTrackStep			= curstep_next;
                            ctrl.m_newTrackStep			= newstep_next;
                            ctrl.m_lastMoveWasReversed	= reverse;
                            ctrl.m_newTrackWasReversed	= reverse;
                            ctrl.m_newTrackIsOn			= true;
                        };
                    handle.transitionDelegate = () =>
                        {
                            isComplete	= true;
                        };
                }

                return true;
            }
Esempio n. 25
0
 public void Setup(Data.Track curtrack, int curstep, Data.Track newtrack, int newstep, Data.TransitionScenario tscen)
 {
     m_curtrack	= curtrack;
     m_curstep	= curstep;
     m_newtrack	= newtrack;
     m_newstep	= newstep;
     m_tscen		= tscen;
 }
Esempio n. 26
0
        public async Task <OperationResult <Data.Release> > PerformMetaDataProvidersReleaseSearch(AudioMetaData metaData, string artistFolder = null, int?submissionId = null)
        {
            SimpleContract.Requires <ArgumentNullException>(metaData != null, "Invalid MetaData");

            var sw = new Stopwatch();

            sw.Start();

            var result = new Data.Release
            {
                Title        = metaData.Release.ToTitleCase(false),
                TrackCount   = (short)(metaData.TotalTrackNumbers ?? 0),
                ReleaseDate  = SafeParser.ToDateTime(metaData.Year),
                SubmissionId = submissionId
            };
            var resultsExceptions = new List <Exception>();
            var releaseGenres     = new List <string>();

            // Add any Genre found in the given MetaData
            if (metaData.Genres != null)
            {
                releaseGenres.AddRange(metaData.Genres);
            }
            var releaseLabels    = new List <ReleaseLabelSearchResult>();
            var releaseMedias    = new List <ReleaseMediaSearchResult>();
            var releaseImageUrls = new List <string>();

            var dontDoMetaDataProvidersSearchArtists = this.Configuration.DontDoMetaDataProvidersSearchArtists;

            if (!dontDoMetaDataProvidersSearchArtists.Any(x => x.Equals(metaData.Artist, StringComparison.OrdinalIgnoreCase)))
            {
                try
                {
                    #region ITunes

                    if (this.ITunesReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("ITunesReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var iTunesResult = await this.ITunesReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (iTunesResult.IsSuccess)
                        {
                            var i = iTunesResult.Data.First();
                            if (i.AlternateNames != null)
                            {
                                result.AlternateNames = result.AlternateNames.AddToDelimitedList(i.AlternateNames);
                            }
                            if (i.Tags != null)
                            {
                                result.Tags = result.Tags.AddToDelimitedList(i.Tags);
                            }
                            if (i.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(i.Urls);
                            }
                            if (i.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(i.ImageUrls);
                            }
                            if (i.ReleaseGenres != null)
                            {
                                releaseGenres.AddRange(i.ReleaseGenres);
                            }
                            result.CopyTo(new Data.Release
                            {
                                ReleaseDate = result.ReleaseDate ?? i.ReleaseDate,
                                AmgId       = i.AmgId,
                                Profile     = i.Profile,
                                ITunesId    = i.iTunesId,
                                Title       = result.Title ?? i.ReleaseTitle,
                                Thumbnail   = i.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(i.ReleaseThumbnailUrl) : null,
                                ReleaseType = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(i.ReleaseType) : result.ReleaseType
                            });
                            if (i.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(i.ReleaseLabel);
                            }
                            if (i.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(i.ReleaseMedia);
                            }
                        }
                        if (iTunesResult.Errors != null)
                        {
                            resultsExceptions.AddRange(iTunesResult.Errors);
                        }
                    }

                    #endregion ITunes

                    #region MusicBrainz

                    if (this.MusicBrainzReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("MusicBrainzReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var mbResult = await this.MusicBrainzReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (mbResult.IsSuccess)
                        {
                            var mb = mbResult.Data.First();
                            if (mb.AlternateNames != null)
                            {
                                result.AlternateNames = result.AlternateNames.AddToDelimitedList(mb.AlternateNames);
                            }
                            if (mb.Tags != null)
                            {
                                result.Tags = result.Tags.AddToDelimitedList(mb.Tags);
                            }
                            if (mb.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(mb.Urls);
                            }
                            if (mb.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(mb.ImageUrls);
                            }
                            if (mb.ReleaseGenres != null)
                            {
                                releaseGenres.AddRange(mb.ReleaseGenres);
                            }
                            if (!string.IsNullOrEmpty(mb.ReleaseTitle) && !mb.ReleaseTitle.Equals(result.Title, StringComparison.OrdinalIgnoreCase))
                            {
                                result.AlternateNames.AddToDelimitedList(new string[] { mb.ReleaseTitle });
                            }
                            result.CopyTo(new Data.Release
                            {
                                ReleaseDate   = result.ReleaseDate ?? mb.ReleaseDate,
                                AmgId         = mb.AmgId,
                                Profile       = mb.Profile,
                                TrackCount    = mb.ReleaseMedia != null ? (short)mb.ReleaseMedia.Sum(x => x.TrackCount) : (short)0,
                                MusicBrainzId = mb.MusicBrainzId,
                                ITunesId      = mb.iTunesId,
                                Title         = result.Title ?? mb.ReleaseTitle,
                                Thumbnail     = mb.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(mb.ReleaseThumbnailUrl) : null,
                                ReleaseType   = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(mb.ReleaseType) : result.ReleaseType
                            });
                            if (mb.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(mb.ReleaseLabel);
                            }
                            if (mb.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(mb.ReleaseMedia);
                            }
                        }
                        if (mbResult.Errors != null)
                        {
                            resultsExceptions.AddRange(mbResult.Errors);
                        }
                    }

                    #endregion MusicBrainz

                    #region LastFm

                    if (this.LastFmReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("LastFmReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var lastFmResult = await this.LastFmReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (lastFmResult.IsSuccess)
                        {
                            var l = lastFmResult.Data.First();
                            if (l.AlternateNames != null)
                            {
                                result.AlternateNames = result.AlternateNames.AddToDelimitedList(l.AlternateNames);
                            }
                            if (l.Tags != null)
                            {
                                result.Tags = result.Tags.AddToDelimitedList(l.Tags);
                            }
                            if (l.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(l.Urls);
                            }
                            if (l.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(l.ImageUrls);
                            }
                            if (l.ReleaseGenres != null)
                            {
                                releaseGenres.AddRange(l.ReleaseGenres);
                            }
                            if (!string.IsNullOrEmpty(l.ReleaseTitle) && !l.ReleaseTitle.Equals(result.Title, StringComparison.OrdinalIgnoreCase))
                            {
                                result.AlternateNames.AddToDelimitedList(new string[] { l.ReleaseTitle });
                            }
                            result.CopyTo(new Data.Release
                            {
                                ReleaseDate   = result.ReleaseDate ?? l.ReleaseDate,
                                AmgId         = l.AmgId,
                                Profile       = l.Profile,
                                LastFMId      = l.LastFMId,
                                LastFMSummary = l.LastFMSummary,
                                MusicBrainzId = l.MusicBrainzId,
                                ITunesId      = l.iTunesId,
                                Title         = result.Title ?? l.ReleaseTitle,
                                Thumbnail     = l.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(l.ReleaseThumbnailUrl) : null,
                                ReleaseType   = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(l.ReleaseType) : result.ReleaseType
                            });
                            if (l.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(l.ReleaseLabel);
                            }
                            if (l.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(l.ReleaseMedia);
                            }
                        }
                        if (lastFmResult.Errors != null)
                        {
                            resultsExceptions.AddRange(lastFmResult.Errors);
                        }
                    }

                    #endregion LastFm

                    #region Spotify

                    if (this.SpotifyReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("SpotifyReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var spotifyResult = await this.SpotifyReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (spotifyResult.IsSuccess)
                        {
                            var s = spotifyResult.Data.First();
                            if (s.Tags != null)
                            {
                                result.Tags = result.Tags.AddToDelimitedList(s.Tags);
                            }
                            if (s.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(s.Urls);
                            }
                            if (s.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(s.ImageUrls);
                            }
                            if (s.ReleaseGenres != null)
                            {
                                releaseGenres.AddRange(s.ReleaseGenres);
                            }
                            if (!string.IsNullOrEmpty(s.ReleaseTitle) && !s.ReleaseTitle.Equals(result.Title, StringComparison.OrdinalIgnoreCase))
                            {
                                result.AlternateNames.AddToDelimitedList(new string[] { s.ReleaseTitle });
                            }
                            result.CopyTo(new Data.Release
                            {
                                ReleaseDate   = result.ReleaseDate ?? s.ReleaseDate,
                                AmgId         = s.AmgId,
                                Profile       = this.HttpEncoder.HtmlEncode(s.Profile),
                                SpotifyId     = s.SpotifyId,
                                MusicBrainzId = s.MusicBrainzId,
                                ITunesId      = s.iTunesId,
                                Title         = result.Title ?? s.ReleaseTitle,
                                Thumbnail     = s.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(s.ReleaseThumbnailUrl) : null,
                                ReleaseType   = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(s.ReleaseType) : result.ReleaseType
                            });
                            if (s.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(s.ReleaseLabel);
                            }
                            if (s.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(s.ReleaseMedia);
                            }
                        }
                        if (spotifyResult.Errors != null)
                        {
                            resultsExceptions.AddRange(spotifyResult.Errors);
                        }
                    }

                    #endregion Spotify

                    #region Discogs

                    if (this.DiscogsReleaseSearchEngine.IsEnabled)
                    {
                        this.Logger.LogTrace("DiscogsReleaseSearchEngine Release Search for ArtistName [{0}], ReleaseTitle [{1}]", metaData.Artist, result.Title);
                        var discogsResult = await this.DiscogsReleaseSearchEngine.PerformReleaseSearch(metaData.Artist, result.Title, 1);

                        if (discogsResult.IsSuccess)
                        {
                            var d = discogsResult.Data.First();
                            if (d.Urls != null)
                            {
                                result.URLs = result.URLs.AddToDelimitedList(d.Urls);
                            }
                            if (d.ImageUrls != null)
                            {
                                releaseImageUrls.AddRange(d.ImageUrls);
                            }
                            if (d.AlternateNames != null)
                            {
                                result.AlternateNames = result.AlternateNames.AddToDelimitedList(d.AlternateNames);
                            }
                            if (!string.IsNullOrEmpty(d.ReleaseTitle) && !d.ReleaseTitle.Equals(result.Title, StringComparison.OrdinalIgnoreCase))
                            {
                                result.AlternateNames.AddToDelimitedList(new string[] { d.ReleaseTitle });
                            }
                            result.CopyTo(new Data.Release
                            {
                                Profile     = this.HttpEncoder.HtmlEncode(d.Profile),
                                DiscogsId   = d.DiscogsId,
                                Title       = result.Title ?? d.ReleaseTitle,
                                Thumbnail   = d.ReleaseThumbnailUrl != null ? WebHelper.BytesForImageUrl(d.ReleaseThumbnailUrl) : null,
                                ReleaseType = result.ReleaseType == ReleaseType.Unknown ? SafeParser.ToEnum <ReleaseType>(d.ReleaseType) : result.ReleaseType
                            });
                            if (d.ReleaseLabel != null)
                            {
                                releaseLabels.AddRange(d.ReleaseLabel);
                            }
                            if (d.ReleaseMedia != null)
                            {
                                releaseMedias.AddRange(d.ReleaseMedia);
                            }
                        }
                        if (discogsResult.Errors != null)
                        {
                            resultsExceptions.AddRange(discogsResult.Errors);
                        }
                    }

                    #endregion Discogs
                }
                catch (Exception ex)
                {
                    this.Logger.LogError(ex);
                }

                this.Logger.LogTrace("Metadata Providers Search Complete. [{0}]", sw.ElapsedMilliseconds);
            }
            else
            {
                this.Logger.LogTrace("Skipped Metadata Providers Search, DontDoMetaDataProvidersSearchArtists set for Artist [{0}].", metaData.Artist);
            }

            if (result.AlternateNames != null)
            {
                result.AlternateNames = string.Join("|", result.AlternateNames.ToListFromDelimited().Distinct().OrderBy(x => x));
            }
            if (result.URLs != null)
            {
                result.URLs = string.Join("|", result.URLs.ToListFromDelimited().Distinct().OrderBy(x => x));
            }
            if (result.Tags != null)
            {
                result.Tags = string.Join("|", result.Tags.ToListFromDelimited().Distinct().OrderBy(x => x));
            }
            if (releaseGenres.Any())
            {
                result.Genres = new List <ReleaseGenre>();
                foreach (var releaseGenre in releaseGenres.Where(x => !string.IsNullOrEmpty(x)).GroupBy(x => x).Select(x => x.First()))
                {
                    var rg = releaseGenre.Trim();
                    if (!string.IsNullOrEmpty(rg))
                    {
                        result.Genres.Add(new Data.ReleaseGenre
                        {
                            Genre = (this.DbContext.Genres.Where(x => x.Name.ToLower() == rg.ToLower()).FirstOrDefault() ?? new Data.Genre {
                                Name = rg
                            })
                        });
                    }
                }
                ;
            }
            if (releaseImageUrls.Any())
            {
                var imageBag = new ConcurrentBag <Data.Image>();
                var i        = releaseImageUrls.Select(async url =>
                {
                    imageBag.Add(await WebHelper.GetImageFromUrlAsync(url));
                });
                await Task.WhenAll(i);

                // If the release has images merge any fetched images
                var existingImages = result.Images != null?result.Images.ToList() : new List <Data.Image>();

                existingImages.AddRange(imageBag.ToList());
                // Now set release images to be unique image based on image hash
                result.Images = existingImages.Where(x => x != null && x.Bytes != null).GroupBy(x => x.Signature).Select(x => x.First()).Take(this.Configuration.Processing.MaximumReleaseImagesToAdd).ToList();
                if (result.Thumbnail == null && result.Images != null)
                {
                    result.Thumbnail = result.Images.First().Bytes;
                }
            }

            if (releaseLabels.Any())
            {
                result.Labels = releaseLabels.GroupBy(x => x.CatalogNumber).Select(x => x.First()).Select(x => new Data.ReleaseLabel
                {
                    CatalogNumber = x.CatalogNumber,
                    BeginDate     = x.BeginDate,
                    EndDate       = x.EndDate,
                    Status        = Statuses.New,
                    Label         = new Data.Label
                    {
                        Name           = x.Label.LabelName,
                        SortName       = x.Label.LabelSortName,
                        MusicBrainzId  = x.Label.MusicBrainzId,
                        BeginDate      = x.Label.StartDate,
                        EndDate        = x.Label.EndDate,
                        ImageUrl       = x.Label.LabelImageUrl,
                        AlternateNames = x.Label.AlternateNames.ToDelimitedList(),
                        URLs           = x.Label.Urls.ToDelimitedList(),
                        Status         = Statuses.New
                    }
                }).ToList();
            }

            if (releaseMedias.Any())
            {
                var resultReleaseMedias = new List <Data.ReleaseMedia>();
                foreach (var releaseMedia in releaseMedias.GroupBy(x => x.ReleaseMediaNumber).Select(x => x.First()))
                {
                    var rm = new Data.ReleaseMedia
                    {
                        MediaNumber = releaseMedia.ReleaseMediaNumber ?? 0,
                        SubTitle    = releaseMedia.ReleaseMediaSubTitle,
                        TrackCount  = releaseMedia.TrackCount ?? 0,
                        Status      = Statuses.New
                    };
                    var rmTracks = new List <Data.Track>();
                    foreach (var releaseTrack in releaseMedias.Where(x => x.ReleaseMediaNumber == releaseMedia.ReleaseMediaNumber)
                             .SelectMany(x => x.Tracks)
                             .Where(x => x.TrackNumber.HasValue)
                             .OrderBy(x => x.TrackNumber))
                    {
                        var foundTrack = true;
                        var rmTrack    = rmTracks.FirstOrDefault(x => x.TrackNumber == releaseTrack.TrackNumber.Value);
                        if (rmTrack == null)
                        {
                            Data.Artist trackArtist = null;
                            if (releaseTrack.Artist != null)
                            {
                                trackArtist = new Data.Artist
                                {
                                    Name       = releaseTrack.Artist.ArtistName,
                                    SpotifyId  = releaseTrack.Artist.SpotifyId,
                                    ArtistType = releaseTrack.Artist.ArtistType
                                };
                            }
                            rmTrack = new Data.Track
                            {
                                TrackArtist    = trackArtist,
                                TrackArtists   = releaseTrack.Artists,
                                TrackNumber    = releaseTrack.TrackNumber.Value,
                                MusicBrainzId  = releaseTrack.MusicBrainzId,
                                SpotifyId      = releaseTrack.SpotifyId,
                                AmgId          = releaseTrack.AmgId,
                                Title          = releaseTrack.Title,
                                AlternateNames = releaseTrack.AlternateNames.ToDelimitedList(),
                                Duration       = releaseTrack.Duration,
                                Tags           = releaseTrack.Tags.ToDelimitedList(),
                                ISRC           = releaseTrack.ISRC,
                                LastFMId       = releaseTrack.LastFMId,
                                Status         = Statuses.New
                            };
                            foundTrack = false;
                        }
                        rmTrack.Duration      = rmTrack.Duration ?? releaseTrack.Duration;
                        rmTrack.MusicBrainzId = rmTrack.MusicBrainzId ?? releaseTrack.MusicBrainzId;
                        rmTrack.SpotifyId     = rmTrack.SpotifyId ?? releaseTrack.SpotifyId;
                        rmTrack.AmgId         = rmTrack.AmgId ?? releaseTrack.AmgId;
                        rmTrack.Title         = rmTrack.Title ?? releaseTrack.Title;
                        rmTrack.Duration      = releaseTrack.Duration;
                        rmTrack.Tags          = rmTrack.Tags == null?releaseTrack.Tags.ToDelimitedList() : rmTrack.Tags.AddToDelimitedList(releaseTrack.Tags);

                        rmTrack.AlternateNames = rmTrack.AlternateNames == null?releaseTrack.AlternateNames.ToDelimitedList() : rmTrack.AlternateNames.AddToDelimitedList(releaseTrack.AlternateNames);

                        rmTrack.ISRC     = rmTrack.ISRC ?? releaseTrack.ISRC;
                        rmTrack.LastFMId = rmTrack.LastFMId ?? releaseTrack.LastFMId;
                        if (!foundTrack)
                        {
                            rmTracks.Add(rmTrack);
                        }
                    }
                    rm.Tracks     = rmTracks;
                    rm.TrackCount = (short)rmTracks.Count();
                    resultReleaseMedias.Add(rm);
                }
                result.Medias     = resultReleaseMedias;
                result.TrackCount = (short)releaseMedias.SelectMany(x => x.Tracks).Count();
            }

            if (metaData.Images != null && metaData.Images.Any())
            {
                var image = metaData.Images.FirstOrDefault(x => x.Type == AudioMetaDataImageType.FrontCover);
                if (image == null)
                {
                    image = metaData.Images.FirstOrDefault();
                }
                // If there is an image on the metadata file itself then that over-rides metadata providers.
                if (image != null)
                {
                    result.Thumbnail = image.Data;
                }
            }
            if (!string.IsNullOrEmpty(artistFolder))
            {
                // If any file exist for cover that over-rides whatever if found in metadata providers.
                var releaseFolder = new DirectoryInfo(result.ReleaseFileFolder(artistFolder));
                if (releaseFolder.Exists)
                {
                    var cover = ImageHelper.FindImageTypeInDirectory(releaseFolder, ImageType.Release);
                    if (cover.Any())
                    {
                        // Read image and convert to jpeg
                        var coverFileName = cover.First().FullName;
                        result.Thumbnail = File.ReadAllBytes(coverFileName);
                        this.Logger.LogDebug("Using Release Cover File [{0}]", coverFileName);
                    }
                }
            }

            if (result.Thumbnail != null)
            {
                result.Thumbnail = ImageHelper.ResizeImage(result.Thumbnail, this.Configuration.ThumbnailImageSize.Width, this.Configuration.ThumbnailImageSize.Height);
                result.Thumbnail = ImageHelper.ConvertToJpegFormat(result.Thumbnail);
            }
            sw.Stop();
            return(new OperationResult <Data.Release>
            {
                Data = result,
                IsSuccess = result != null,
                Errors = resultsExceptions,
                OperationTime = sw.ElapsedMilliseconds
            });
        }
Esempio n. 27
0
 public void Setup(Data.Track track, bool reverse)
 {
     m_newTrack = track;
     m_reverse  = reverse;
 }