Example #1
0
        /// <summary>
        /// 파일 재생을 요청하고, 단건에 대해 재생목록에 추가한다.
        /// </summary>
        /// <param name="fileInfo"></param>
        void PlayItem(MediaInfo fileInfo)
        {
            //리오더 모드가 아닐때만 처리
            if (ReorderMode == ListViewReorderMode.Disabled &&
                string.IsNullOrEmpty(fileInfo.OccuredError))
            {
                //UI에 로딩된 파일이면 업데이트를 위해 데이터 취득
                var mi = PlaylistSource.FirstOrDefault(x => x.Path == fileInfo.Path);
                //화면에 로딩되지 않은 상태이면 DB에서 로딩
                if (mi == null)
                {
                    mi = fileDAO.GetPlayList(fileInfo.Path);
                }

                //재생 처리
                MessengerInstance.Send <Message>(new Message("Play", mi), CCPlayerViewModel.NAME);
            }
        }
Example #2
0
        /// <summary>
        /// 다른 뷰모델들로 부터 수신된 메세지를 처리한다.
        /// </summary>
        private void RegisterMessages()
        {
            //재생목록 메세지 수신
            MessengerInstance.Register <Message>(this, NAME, (msg) =>
            {
                switch (msg.Key)
                {
                case "Activated":
                    if (loadingModel != LoadingMode.None)
                    {
                        PlaylistSource.Clear();
                        LoadFiles();
                    }
                    break;

                case "MoveToSection":
                    //재생목록 섹션으로 이동
                    MoveToSection(msg.GetValue <HubSection>());
                    break;

                case "BackPressed":
                    msg.GetValue <BackPressedEventArgs>().Handled = true;
                    if (SelectionMode != ListViewSelectionMode.None)
                    {
                        //선택 모드 변경
                        SelectionMode               = ListViewSelectionMode.None;
                        MainButtonGroupVisible      = true;
                        CheckListButtonGroupVisible = false;
                        ReorderButtonGroupVisible   = false;
                    }
                    else
                    {
                        //종료 확인
                        MessengerInstance.Send <Message>(new Message("ConfirmTermination", null), MainViewModel.NAME);
                    }
                    break;

                case "FolderDeleted":
                    //허브섹션을 반대 방향으로 들어오는 경우, 모든 비디오 DB가 초기화 되어 있지 않으면 초기화를 시킨다.
                    MessengerInstance.Send <Message>(new Message("CheckFolderSyncForPlaylist", null), AllVideoViewModel.NAME);
                    //탐색기에서 삭제된 폴더 삭제 Trigger
                    //재생 목록 생성전 모든 비디오 파일과 재생 목록을 동기화하여 존재하지 않는 파일을 재생목록에서 제거
                    fileDAO.CleanPlayList();
                    //로딩 요청 상태 변경
                    loadingModel = LoadingMode.Caching;
                    break;

                case "PlayItem":
                    PlayItem(msg.GetValue <MediaInfo>());
                    break;

                case "PlayList":
                    loadingModel = LoadingMode.Caching;
                    var list     = msg.GetValue <IEnumerable <MediaInfo> >();
                    MessengerInstance.Send <Message>(new Message("MoveToPlaylistSection", list.Count() > 1), CCPlayerViewModel.NAME);
                    //재생 목록 생성전 모든 비디오 파일과 재생 목록을 동기화하여 존재하지 않는 파일을 재생목록에서 제거
                    fileDAO.CleanPlayList();
                    //재생 목록 생성
                    MakePlaylist(list);
                    break;

                case "UpdatePausedTime":
                    var source = msg.GetValue <MediaInfo>();
                    fileDAO.UpdatePlayList(new MediaInfo[] { source });
                    //화면 업데이트 처리
                    var item = PlaylistSource.FirstOrDefault(x => x.Path == source.Path);
                    if (item != null)
                    {
                        item.RunningTime = source.RunningTime;
                        item.PausedTime  = source.PausedTime;
                    }
//                        System.Diagnostics.Debug.WriteLine(string.Format("재생시간 업데이트 : {0}", TimeSpan.FromSeconds(source.PausedTime)));
                    break;

                case "FileAssociation":
                    var value = msg.GetValue <FileActivatedEventArgs>();
                    if (value.Files != null && value.Files.Count > 0)
                    {
                        var file = value.Files.FirstOrDefault();

                        if (file != null && file.IsOfType(Windows.Storage.StorageItemTypes.File))
                        {
                            var mi = new MediaInfo((StorageFile)file);

                            //로딩 패널 표시
                            var loader     = ResourceLoader.GetForCurrentView();
                            var loadingMsg = string.Format(loader.GetString("Loading"), loader.GetString("Video"));
                            MessengerInstance.Send(new Message("ShowLoadingPanel", new KeyValuePair <string, bool>(loadingMsg, true)), MainViewModel.NAME);

                            DispatcherHelper.CheckBeginInvokeOnUI(async() =>
                            {
                                try
                                {
                                    StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(mi.ParentFolderPath);
                                    IReadOnlyList <StorageFile> fileStorageList = await folder.GetFilesAsync();
                                    List <StorageFile> subtitleList             = fileStorageList.Where(x => x.IsSubtitleFile()).ToList();

                                    var pathName = mi.Path.Remove(mi.Path.Length - Path.GetExtension(mi.Path).Length);
                                    //자막 검색
                                    foreach (var ext in CCPlayerConstant.SUBTITLE_FILE_SUFFIX)
                                    {
                                        StorageFile subtitleFile = null;
                                        try
                                        {
                                            subtitleFile = new List <StorageFile>(subtitleList).FirstOrDefault(x => Path.GetExtension(x.Path).ToUpper() == ext.ToUpper() &&
                                                                                                               x.Path.Length > ext.Length && x.Path.Remove(x.Path.Length - ext.Length).ToUpper().Contains(pathName.ToUpper()));
                                        }
                                        catch (Exception) { }

                                        if (subtitleFile != null)
                                        {
                                            subtitleList.Remove(subtitleFile);

                                            //자막을 미디어 파일에 연결
                                            mi.AddSubtitle(new SubtitleInfo(subtitleFile));
                                        }
                                    }
                                }
                                catch (System.UnauthorizedAccessException)
                                { }

                                //재생 처리
                                MessengerInstance.Send <Message>(new Message("Play", mi), CCPlayerViewModel.NAME);
                            });
                        }
                    }
                    break;

                case "ShowErrorFile":
                    if (PlaylistSource.Any())
                    {
                        var kv = msg.GetValue <KeyValuePair <string, MediaInfo> >();
                        var mi = PlaylistSource.FirstOrDefault(f => f.Path == kv.Value.Path);
                        if (mi != null)
                        {
                            mi.OccuredError = kv.Key + "\n";
                        }
                    }
                    break;

                case "RemovePlayList":
                    OnRemovePlayList(msg.GetValue <MediaInfo>());
                    break;
                }
            });
        }