Example #1
0
 public void AddNew(StorageItemInfo item)
 {
     if (this[item.Hash] == null)
     {
         this.Items.Add(item.Hash, item);
     }
 }
Example #2
0
        /// <summary>
        /// 탐색기 루트에 추가된 폴더 리스트를 조회한다.
        /// </summary>
        /// <param name="addedFolderList">조회된 결과를 담을 리스트</param>
        /// <param name="command">리스트의 버튼을 위한 커맨드</param>
        /// <returns>조회된 결과 리스트</returns>
        //public void LoadAddedFolderList(ICollection<FolderInfo> addedFolderList, ICommand command1, ICommand command2, bool includeProtectedFolder)
        public void LoadAddedFolderList(ICollection <StorageItemInfo> addedFolderList, bool nameAscending, Action <StorageItemInfo> action)
        {
            string sql = DML_SELECT.Replace("${COLUMN}", string.Empty);

            sql += " ORDER BY NAME " + (nameAscending ? "ASC" : "DESC");

            using (var stmt = conn.Prepare(sql))
            {
                stmt.Bind("@FOLDER_TYPE", (int)SubType.RootFolder);
                while (stmt.Step() == SQLitePCL.SQLiteResult.ROW)
                {
                    StorageItemInfo fi = GetRowData(stmt);

                    //이름이 중복되는 경우 경로를 표시
                    if (addedFolderList.Any(x => x.Name == fi.Name))
                    {
                        fi.Name = string.Format("{0} ({1})", fi.Name, Path.GetPathRoot(fi.Path));
                    }

                    addedFolderList.Add(fi);

                    if (action != null)
                    {
                        action.Invoke(fi);
                    }
                }
            }
        }
Example #3
0
        protected async void LoadThumbnailAsync(StorageItemInfo file, ICollection <Thumbnail> thumbnailList, bool useUnsupportedThumbnail)
        {
            var child = await file.GetStorageFileAsync();

            var thumbnail = thumbnailList?.FirstOrDefault(x => x.Name == file.Name.ToLower() && x.ParentPath == file.ParentFolderPath.ToLower() &&
                                                          x.Size == file.Size && x.CreatedDateTime == child.DateCreated.DateTime);

            if (thumbnail == null)
            {
                //썸네일 로드
                StorageItemThumbnail thumb = null;
                if (!string.IsNullOrEmpty(child.ContentType))
                {
                    thumb = await child.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem);
                }

                if (thumb?.Type == ThumbnailType.Image)
                {
                    //비디오 런닝타임 설정
                    var videoProperty = await child.Properties.GetVideoPropertiesAsync();

                    file.Duration = videoProperty.Duration;
                    //썸네일 설정
                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        var bi = new BitmapImage();
                        bi.SetSourceAsync(thumb).Completed = new AsyncActionCompletedHandler((setSourceAction, setSourceStaus) =>
                        {
                            if (setSourceStaus == Windows.Foundation.AsyncStatus.Completed)
                            {
                                file.ImageItemsSource = bi;
                            }
                        });
                    });
                }
                else if (useUnsupportedThumbnail)
                {
                    child.OpenReadAsync().Completed = (asyncStream, status) =>
                    {
                        if (status == Windows.Foundation.AsyncStatus.Completed)
                        {
                            //썸네일을 로드하지 못한 경우  FFmpeg으로 처리
                            var stream = asyncStream.GetResults();
                            if (stream != null)
                            {
                                var ffInfo = CCPlayer.UWP.Factory.MediaInformationFactory.CreateMediaInformationFromStream(stream);
                                LoadThumbnailFromMediaInformaion(file, ffInfo);
                            }
                        }
                    };
                }
            }
            else if (useUnsupportedThumbnail)
            {
                //캐싱 이미지 로드
                LoadCachedThumbnail(file, thumbnail);
            }
        }
Example #4
0
        public void FileTapped(object sender, TappedRoutedEventArgs args)
        {
            StorageItemInfo sii  = null;
            var             elem = args.OriginalSource as FrameworkElement;

            if (elem != null && (sii = elem.DataContext as StorageItemInfo) != null)
            {
                RequestPlayback(Settings.Playback.DefaultDecoderType, sii, false);
            }
        }
Example #5
0
        private void FolderTapped(object sender, TappedRoutedEventArgs args)
        {
            StorageItemInfo sii  = null;
            var             elem = args.OriginalSource as FrameworkElement;

            if (elem != null && (sii = elem.DataContext as StorageItemInfo) != null)
            {
                LoadFoldersAsync(sii);
            }
        }
Example #6
0
 private void FileRightTapped(object sender, RightTappedRoutedEventArgs args)
 {
     if (args.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse)
     {
         StorageItemInfo sii  = null;
         var             elem = args.OriginalSource as FrameworkElement;
         if (elem != null && (sii = elem.DataContext as StorageItemInfo) != null)
         {
             ShowMediaInfoFlyout(sii);
         }
     }
 }
Example #7
0
 protected async Task SaveThumbail(StorageItemInfo file, byte[] data)
 {
     await SaveThumbail((pngPixel) =>
                        new Thumbnail()
     {
         Name            = file.Name,
         ParentPath      = file.ParentFolderPath,
         Size            = file.Size,
         RunningTime     = file.Duration,
         CreatedDateTime = file.DateCreated.DateTime,
         ThumbnailData   = pngPixel
     }, data);
 }
Example #8
0
 private void FileHolding(object sender, HoldingRoutedEventArgs args)
 {
     if (args.HoldingState == Windows.UI.Input.HoldingState.Started &&
         args.PointerDeviceType != Windows.Devices.Input.PointerDeviceType.Mouse)
     {
         StorageItemInfo sii  = null;
         var             elem = args.OriginalSource as FrameworkElement;
         if (elem != null && (sii = elem.DataContext as StorageItemInfo) != null)
         {
             ShowMediaInfoFlyout(sii);
         }
     }
 }
Example #9
0
        private InlineQueryResultBase PhotoResult(StorageItemInfo file)
        {
            string url = string.Format(urlFormat, file.Hash);

            return(new InlineQueryResultPhoto(id: file.Hash, url, url)
            {
                Caption = file.Name + " Capt",
                ParseMode = ParseMode.Html,
                PhotoWidth = 100,
                PhotoHeight = 100,
                Description = file.Name + "Desc"
            });
        }
Example #10
0
        private async void RequestPlayback(DecoderTypes decoderType, StorageItemInfo storageItemInfo, bool isPrevOrNext)
        {
            if (!VersionHelper.IsUnlockNetworkPlay)
            {
                MessengerInstance.Send(new Message(), "CheckInterstitialAd");
                return;
            }

            if (!isPrevOrNext)
            {
                MessengerInstance.Send(new Message("IsOpen", true)
                                       .Add("LoadingTitle", ResourceLoader.GetForCurrentView().GetString("Loading/Playback/Text")), "ShowLoadingPanel");
            }

            //현재 파일 이후의 파일들을 모두 지금 재생중에 추가
            var files = StorageItemGroupSource.Where(x => x.Type == StorageItemTypes.File).SelectMany(x => x.Items).ToList();

            PlayListFile currPlayListFile = null;
            PlayListFile prevPlayListFile = null;
            PlayListFile nextPlayListFile = null;

            for (int i = 0; i < files.Count; i++)
            {
                var file    = await files[i].GetStorageFileAsync();
                var orgFile = await storageItemInfo.GetStorageFileAsync();

                if (file.FolderRelativeId == orgFile.FolderRelativeId)
                {
                    currPlayListFile = new PlayListFile(file);

                    if (i > 0)
                    {
                        prevPlayListFile = new PlayListFile(await files[i - 1].GetStorageFileAsync());
                    }

                    if (i + 1 < files.Count)
                    {
                        nextPlayListFile = new PlayListFile(await files[i + 1].GetStorageFileAsync());
                    }
                    break;
                }
            }

            MessengerInstance.Send(
                new Message()
                .Add("PrevPlayListFile", prevPlayListFile)
                .Add("CurrPlayListFile", currPlayListFile)
                .Add("NextPlayListFile", nextPlayListFile)
                .Add("DecoderType", decoderType),
                "RequestPlayback");
        }
Example #11
0
        private void ShowMediaInfoFlyout(StorageItemInfo sii)
        {
            MessengerInstance.Send(new Message("IsOpen", true)
                                   .Add("LoadingTitle", ResourceLoader.GetForCurrentView().GetString("Loading/MediaInformation/Text")),
                                   "ShowLoadingPanel");

            MessengerInstance.Send <Message <DecoderTypes> >(
                new Message <DecoderTypes>((decoderType) =>
            {
                RequestPlayback(decoderType, sii, false);
            })
                .Add("StorageItemInfo", sii)
                .Add("ButtonName", "CodecInformation"),
                "ShowMediaFileInformation");
        }
Example #12
0
        private async void LoadLastestFolder()
        {
            StorageFolder   folder     = null;
            StorageItemInfo folderInfo = null;
            var             entry      = StorageApplicationPermissions.MostRecentlyUsedList.Entries.FirstOrDefault(x => x.Metadata.StartsWith(LastestMediaServerFolder));

            if (!string.IsNullOrEmpty(entry.Token))
            {
                var           paths    = entry.Metadata.Substring(LastestMediaServerFolder.Length);
                List <string> pathList = paths.Split(new char[] { '/' }).ToList();

                if (pathList.Count > 0)
                {
                    string path = pathList[0];
                    folder = (await KnownFolders.MediaServerDevices.GetFoldersAsync()).FirstOrDefault(x => x.Name == path);

                    if (folder != null)
                    {
                        //루트 폴더 등록
                        _FolderStack.Push(folder);
                        pathList.RemoveAt(0);

                        foreach (var p in pathList)
                        {
                            var folders = await folder.GetFoldersAsync();

                            folder = folders.FirstOrDefault(x => x.Name == p);

                            if (folder != null)
                            {
                                _FolderStack.Push(folder);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
            }

            if (folder != null)
            {
                folderInfo = new StorageItemInfo(folder);
            }

            LoadFoldersAsync(folderInfo);
        }
        public StorageItemsProvider()
        {
            DirectoryInfo d     = new DirectoryInfo(SolutionSettings.Default.RootOfMediaFolder);
            var           Items = d.EnumerateFileSystemInfos("*", SearchOption.AllDirectories).AsEnumerable();

            foreach (var itemi in Items)
            {
                if ("*.jpg|*.jpeg|*.bmp|*.gif|*.png|*.mov|*.mp4|*.3gp".IndexOf(itemi.Extension) == -1 && itemi is FileInfo)
                {
                    continue;
                }

                StorageItemInfo item = new StorageItemInfo(itemi);
                items.Add(item.Hash, item);
            }
        }
Example #14
0
        public SQLiteResult Update(StorageItemInfo folderInfo)
        {
            SQLiteResult result = SQLiteResult.EMPTY;

            //폴더 등록
            using (var stmt = conn.Prepare(DML_UPDATE))
            {
                stmt.Bind("@FAL_TOKEN", folderInfo.FalToken);
                stmt.Bind("@PATH", folderInfo.Path);
                stmt.Bind("@FOLDER_TYPE", (int)folderInfo.SubType);

                result = stmt.Step();
            }

            return(result);
        }
Example #15
0
        protected async Task <ImageSource> GetThumbnailAsync(StorageFile file, ICollection <Thumbnail> thumbnailList, bool useUnsupportedThumbnail)
        {
            ImageSource imageSource     = null;
            var         basicProperties = await file.GetBasicPropertiesAsync();

            var fi = new StorageItemInfo(file)
            {
                Size = basicProperties.Size
            };
            var thumbnail = thumbnailList?.FirstOrDefault(x => x.Name == fi.Name.ToLower() && x.ParentPath == fi.ParentFolderPath.ToLower() &&
                                                          x.Size == fi.Size && x.CreatedDateTime == file.DateCreated.DateTime);

            if (thumbnail == null)
            {
                //썸네일 로드
                StorageItemThumbnail thumb = null;
                if (!string.IsNullOrEmpty(file.ContentType))
                {
                    thumb = await file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem);
                }

                if (thumb?.Type == ThumbnailType.Image)
                {
                    //썸네일 설정
                    await DispatcherHelper.RunAsync(() =>
                    {
                        var bi = new BitmapImage();
                        bi.SetSource(thumb);
                        imageSource = bi;
                    });
                }
                else if (useUnsupportedThumbnail)
                {
                    var stream = await file.OpenReadAsync();

                    //썸네일을 로드하지 못한 경우  FFmpeg으로 처리
                    var ffInfo = CCPlayer.UWP.Factory.MediaInformationFactory.CreateMediaInformationFromStream(stream);
                    imageSource = await GetThumbnailAsync(fi, ffInfo);
                }
            }
            else if (useUnsupportedThumbnail)
            {
                //캐싱 이미지 로드
                imageSource = await GetChachedThumbnail(thumbnail);
            }
            return(imageSource);
        }
Example #16
0
        /// <summary>
        /// 폴더 정보를 DB에 저장한다.
        /// </summary>
        /// <param name="folderInfo"></param>
        /// <returns></returns>
        public SQLiteResult Insert(StorageItemInfo folderInfo)
        {
            SQLiteResult result = SQLiteResult.EMPTY;

            //폴더 등록
            using (var stmt = conn.Prepare(DML_INSERT))
            {
                stmt.Bind("@PATH", folderInfo.Path);
                stmt.Bind("@FOLDER_TYPE", (int)folderInfo.SubType);
                stmt.Bind("@NAME", folderInfo.Name);
                stmt.Bind("@ROOT_PATH", folderInfo.RootPath);
                stmt.Bind("@FAL_TOKEN", folderInfo.FalToken);

                result = stmt.Step();
            }

            return(result);
        }
Example #17
0
        /// <summary>
        /// 폴더를 삭제한다.
        /// </summary>
        /// <param name="folderInfo">삭제할 폴더 정보</param>
        /// <returns>DB 처리 결과</returns>
        public SQLiteResult Delete(StorageItemInfo folderInfo)
        {
            SQLiteResult result = SQLiteResult.EMPTY;

            //폴더 삭제
            using (var stmt = conn.Prepare(DML_DELETE))
            {
                stmt.Bind("@PATH", folderInfo.Path);
                stmt.Bind("@FOLDER_TYPE", (int)folderInfo.SubType);
                result = stmt.Step();
            }

            //정상적으로 삭제되었으면
            if (result == SQLiteResult.DONE && !string.IsNullOrEmpty(folderInfo.FalToken) && StorageApplicationPermissions.FutureAccessList.ContainsItem(folderInfo.FalToken))
            {
                //FAL삭제
                StorageApplicationPermissions.FutureAccessList.Remove(folderInfo.FalToken);
            }

            return(result);
        }
Example #18
0
        private async void LoadFilesAsync(StorageItemInfo fi)
        {
            if (fi != null)
            {
                string nonGroupName = ResourceLoader.GetForCurrentView().GetString("List/File/Text");
                ///파일 로딩 표시기 실행
                IsLoadingFiles = true;
                //폴더 로딩 표시기 정지
                IsLoadingFolders = false;

                await ThreadPool.RunAsync(async (handler) =>
                {
                    StorageFolder currentFolder = await fi.GetStorageFolderAsync();
                    if (currentFolder != null)
                    {
                        var queryResult = currentFolder.CreateFileQueryWithOptions(_VideoFileQueryOptions);
                        var list        = await queryResult.GetFilesAsync();
                        if (list.Any())
                        {
                            //썸네일 캐시 로드
                            ThumbnailDAO.LoadThumnailInFolder(fi.Path, _ThumbnailListInCurrentFolder);

                            //아이템을 정렬하여 화면에 표시
                            await LoadItemsAsync(list.Select(x => new StorageItemInfo(x)
                            {
                                Tapped        = FileTapped,
                                RightTapped   = FileRightTapped,
                                Holding       = FileHolding,
                                IsOrderByName = (_Sort == SortType.Name || _Sort == SortType.NameDescending)
                            }), list.Count, nonGroupName, true, 9);
                        }
                    }
                    await DispatcherHelper.RunAsync(() => { IsLoadingFiles = false; });
                });
            }
            else
            {
                IsLoadingFolders = false;
            }
        }
Example #19
0
 private async void RequestPlaybackWithLoadingPanel(StorageItemInfo item)
 {
     if (item != null)
     {
         //추가되는 경우가 있으므로 만일을 대비해 가장 뒤의 아이템 선택
         var newIndex = PlayListFileSource.IndexOf(PlayListFileSource.LastOrDefault(x => x.Path == item.Path));
         if (newIndex > -1 && newIndex < PlayListFileSource.Count)
         {
             SelectedIndex = newIndex;
             //로딩 패널 표시
             MessengerInstance.Send(new Message("IsOpen", true), "ShowLoadingPanel");
             await ThreadPool.RunAsync(async handler =>
             {
                 await DispatcherHelper.RunAsync(() =>
                 {
                     //재생요청
                     RequestPlayback(true);
                 });
             }, WorkItemPriority.Normal);
         }
     }
 }
Example #20
0
        public async void SendNotifyFileLoadSuccess(StorageItemInfo item)
        {
            TelegramContext.WithFileHash(item.Hash);
            if (!Subscribers.ContainsKey(item.Owner))
            {
                return;
            }
            var ChatId = Subscribers[item.Owner];

            try
            {
                try
                {
                    using (MemoryStream imageStream = FFTools.CreateThumbnail(item.FullPath))
                    {
                        Message result = await Bot.SendPhotoAsync(
                            ChatId,
                            imageStream,
                            string.Format("{0} ({1}) done", item.Name, item.GetFormatSize()), replyMarkup : Keyboards.CommonFileActions());

                        MessagesHystory.Push(result);
                    }
                }
                catch (Exception)
                {
                    await Bot.SendTextMessageAsync(ChatId, string.Format("{0} ({1}) done", item.Name, item.GetFormatSize()));
                }
            }
            catch (Exception)
            {
                await Task.Delay(3000).ContinueWith(async(a) =>
                {
                    await Bot.SendTextMessageAsync(ChatId, string.Format("{0} ({1}) done", item.Name, item.GetFormatSize()));
                });
            }
        }
Example #21
0
        private async void LoadFoldersAsync(StorageItemInfo fi)
        {
            var groupName = ResourceLoader.GetForCurrentView().GetString("List/Folder/Text");

            var mru = StorageApplicationPermissions.MostRecentlyUsedList;
            //키에 해당되는 모든 데이터 삭제
            var removeList = mru.Entries.Where(x => x.Metadata.StartsWith(LastestMediaServerFolder)).ToArray();

            foreach (var entry in removeList)
            {
                mru.Remove(entry.Token);
            }

            if (fi != null)
            {
                var folder = await fi.GetStorageFolderAsync();

                if (folder != null && !_FolderStack.Contains(folder))
                {
                    _FolderStack.Push(folder);
                }

                //탭된 폴더 저장
                var fullPath = _FolderStack.Select(x => x.DisplayName).Aggregate((x, y) => y + "/" + x);
                mru.Add(folder, LastestMediaServerFolder + fullPath);
            }

            CurrentFolderInfo        = fi;
            _CurrentSubtitleFileList = null;
            IsLoadingFolders         = true;

            var isOrderByName = _Sort == SortType.Name || _Sort == SortType.NameDescending;

            //모든 자식 요소 삭제
            StorageItemGroupSource.Clear();

            _ThumbnailListInCurrentFolder.Clear();
            //기간 지난 썸네일 캐시 삭제
            ThumbnailDAO.DeletePastPeriodThumbnail(Settings.Thumbnail.RetentionPeriod);

            if (fi == null)
            {
                await ThreadPool.RunAsync(async handler =>
                {
                    var dlna        = KnownFolders.MediaServerDevices;
                    var dlnaFolders = await dlna.GetFoldersAsync();
                    //DLNA 루트 폴더 로딩
                    var rootFolderList = dlnaFolders.Select(s => new StorageItemInfo(s)
                    {
                        DateCreated   = s.DateCreated,
                        Tapped        = FolderTapped,
                        RightTapped   = FolderRightTapped,
                        Holding       = FolderHolding,
                        IsOrderByName = isOrderByName,
                        SubType       = SubType.RootFolder
                    }).TakeWhile(s => { s.SetDisplayName(); return(true); });;

                    await LoadItemsAsync(rootFolderList, rootFolderList.Count(), groupName, false, 2);

                    await DispatcherHelper.RunAsync(() =>
                    {
                        //폴더 로딩 표시기 정지
                        IsLoadingFolders = false;
                        //정렬 옵션 표시
                        ShowOrderBy = rootFolderList.Count() > 0;
                    });
                });

                //뒤로버튼 상태 변경
                Frame rootFrame = Window.Current.Content as Frame;
                if (rootFrame != null && !rootFrame.CanGoBack)
                {
                    SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Collapsed;
                }
                //위로 버튼 비활성화
                VisibleToUpper = false;
            }
            else
            {
                //위로버튼 활성화
                VisibleToUpper = true;
                await ThreadPool.RunAsync(async handler =>
                {
                    if (Settings.General.UseHardwareBackButtonWithinVideo)
                    {
                        await DispatcherHelper.RunAsync(() => SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible);
                    }

                    var lastStorageFolder = await fi.GetStorageFolderAsync();
                    if (lastStorageFolder != null)
                    {
                        IReadOnlyList <StorageFolder> folderList = null;
                        try
                        {
                            //부모에 접근 권한이 있는 경우이므로 해당 부모의 자식 폴더 및 파일 로드
                            folderList = await lastStorageFolder.GetFoldersAsync();
                            if (folderList.Count > 0)
                            {
                                await LoadItemsAsync(folderList.Select(x => new StorageItemInfo(x)
                                {
                                    Tapped        = FolderTapped,
                                    RightTapped   = FolderRightTapped,
                                    Holding       = FolderHolding,
                                    RootPath      = fi.RootPath,
                                    IsOrderByName = isOrderByName
                                }), folderList.Count, groupName, false, 2);
                            }

                            DispatcherHelper.CheckBeginInvokeOnUI(() =>
                            {
                                //파일 리스트업
                                LoadFilesAsync(fi);
                            });
                        }
                        catch (Exception e)
                        {
                            System.Diagnostics.Debug.WriteLine("폴더 로드 실패 : " + e.Message);
                            if (e is OperationCanceledException)
                            {
                                //폴더 로딩이 취소됨
                                System.Diagnostics.Debug.WriteLine(fi.Path + " 폴더내의 자식 폴더 로딩이 취소됨");
                            }
                        }
                    }
                    else
                    {
                        DispatcherHelper.CheckBeginInvokeOnUI(() =>
                        {
                            LoadFoldersAsync(null);
                        });
                    }
                });
            }
        }
Example #22
0
        public void NewItem(string fullPath, string ownerId = "family")
        {
            StorageItemInfo item = new StorageItemInfo(new FileInfo(fullPath));

            Items.Add(item.Hash, item);
        }
Example #23
0
 public static string GetFormatSize(this StorageItemInfo storageItem)
 {
     return(storageItem.IsFile ? (storageItem.Size.AsMB().ToString("0.##")) + " MB" : "0");
 }
Example #24
0
        /// <summary>
        /// 마지막 접근 폴더를 갱신한다.
        /// </summary>
        /// <param name="folderInfo"></param>
        /// <returns></returns>
        public SQLiteResult ReplaceLastFolder(StorageItemInfo folderInfo)
        {
            SQLiteResult result = SQLiteResult.EMPTY;

            string coumn = @",CASE WHEN (SELECT COUNT(*) 
                                           FROM FOLDER T 
                                          WHERE T.PATH = PATH 
                                            AND T.FOLDER_TYPE = 1) > 0 THEN 'Y' 
                                   ELSE 'N' 
                              END AS IS_ADDED_FOLDER";

            //이전의 마지막 폴더 조회
            using (var stmt = conn.Prepare(DML_SELECT.Replace("${COLUMN}", coumn)))
            {
                string prevItemName = string.Empty;
                stmt.Bind("@FOLDER_TYPE", (int)SubType.LastFolder);

                while (stmt.Step() == SQLitePCL.SQLiteResult.ROW)
                {
                    StorageItemInfo fi            = GetRowData(stmt);
                    bool            isAddedFolder = stmt.GetText("IS_ADDED_FOLDER") == "Y";

                    //먼저 마지막 폴더의 타입이 Last folder인 것을 삭제
                    using (var stmt2 = conn.Prepare(DML_DELETE))
                    {
                        stmt2.Bind("@PATH", fi.Path);
                        stmt2.Bind("@FOLDER_TYPE", (int)fi.SubType);
                        result = stmt2.Step();
                    }
                    //타입 삭제 여부
                    if (result != SQLiteResult.DONE)
                    {
                        return(result);
                    }

                    //삭제하려는 폴더가 추가된 폴더로 등록되어 있지 않는 폴더라면, FutrueAccessList를 검사하여 삭제 시킴
                    if (!isAddedFolder && !string.IsNullOrEmpty(fi.FalToken) && StorageApplicationPermissions.FutureAccessList.ContainsItem(fi.FalToken))
                    {
                        //FAL삭제
                        StorageApplicationPermissions.FutureAccessList.Remove(fi.FalToken);
                    }
                }
            }

            if (folderInfo != null)
            {
                //새롭게 폴더 등록
                using (var stmt = conn.Prepare(DML_INSERT))
                {
                    stmt.Bind("@PATH", folderInfo.Path);
                    stmt.Bind("@FOLDER_TYPE", (int)SubType.LastFolder);
                    stmt.Bind("@NAME", folderInfo.Name);
                    stmt.Bind("@ROOT_PATH", folderInfo.RootPath);
                    stmt.Bind("@FAL_TOKEN", folderInfo.FalToken);

                    result = stmt.Step();
                }
            }

            return(result);
        }
Example #25
0
        public HttpResponseMessage GetById(string id)
        {
            try
            {
                StorageItemInfo item = Storage.GetById(id);
                if (item == null || !File.Exists(item.FullPath))
                {
                    return(Request.CreateErrorResponse(HttpStatusCode.OK, "File does not exist"));
                }
                if (item.IsFile)
                {
                    HttpResponseMessage result = Request.CreateResponse(HttpStatusCode.OK, Storage.GetChildrenByParentId(id));
                    result.Content = new StreamContent(item.GetStream());
                    result.Content.Headers.ContentLength = item.Size;
                    result.Content.Headers.ContentType   = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(item.Name));
                    return(result);
                }
                //else
                //{
                //	/*string tag = GetETag(Request);
                //	if (tag == "\"" + item.FileSysInfo.Name.ToHash() + "\"")
                //	{
                //		var res = Request.CreateResponse(HttpStatusCode.NotModified);
                //		res.Headers.Add("SuppressContent","1");
                //		Console.WriteLine(Environment.NewLine + tag +Environment.NewLine);
                //		return res;
                //	}*/
                //	var info = item.FileSysInfo.GetMediaInfo();
                //	double targetVideoBitRate = info.Streams[0].BitRate * .5D;
                //	double targetAudioBitRate = info.Streams[1].BitRate * .5D;
                //	targetAudioBitRate = 96000;//Math.Max(32000, Math.Min(targetAudioBitRate, 192000));
                //	targetVideoBitRate = 3000000;//Math.Max(32000, Math.Min(targetVideoBitRate, 512000));
                //	double totalDurationSeconds = info.Format.Duration;
                //	long originalSize = info.Format.Size;
                //	//var leftBits = (info.Format.BitRate * totalDurationSeconds) - ((info.Streams[0].BitRate + info.Streams[1].BitRate) * totalDurationSeconds);

                //	long expectedSize = Convert.ToInt64(((targetVideoBitRate + targetAudioBitRate) * totalDurationSeconds) / 8D *0.99);
                //	double targetBitRate = (targetVideoBitRate + targetAudioBitRate) / 8D;
                //	Console.WriteLine(Environment.NewLine + expectedSize + "bytes " + expectedSize / 1024.0 + " KB" + Environment.NewLine);

                //	RangeHeaderValue rangeHeader = Request.Headers.Range;
                //	HttpResponseMessage response = new HttpResponseMessage();

                //	response.Headers.AcceptRanges.Add("bytes");

                //	response.Headers.ETag = new EntityTagHeaderValue("\"" + item.FileSysInfo.Name.ToHash() + "\"");
                //	Console.WriteLine(Environment.NewLine + Request.Headers.Range + Environment.NewLine);
                //	long end;
                //	long start;
                //	string arg = string.Format("-hide_banner -i \"{0}\" -vf scale=1280:-1 ! -metadata duration=\"{1}\" -b:a 96000 -vcodec libvpx -b:v 3000k -quality realtime -g 240 -threads 8 -speed 5 -qmin 4 -qmax 48 -ac 2 -c:a libopus -pass 2 -passlogfile \"D:\\Temp\\MaxOlgaClip-1280x720\" -f webm pipe:1", item.FileSysInfo.FullName, item.File.MediaInfo.Format.Duration);
                //	if (rangeHeader.Ranges.First().From != null/* && rangeHeader.Ranges.First().From > 0*/)
                //	{

                //	}
                //	// 1. If the unit is not 'bytes'.
                //	// 2. If there are multiple ranges in header value.
                //	// 3. If start or end position is greater than file length.
                //	if (rangeHeader.Unit != "bytes" || rangeHeader.Ranges.Count > 1 ||
                //		!TryReadRangeItem(rangeHeader.Ranges.First(), expectedSize/*originalSize*/, out start, out end))
                //	{
                //		response.StatusCode = HttpStatusCode.RequestedRangeNotSatisfiable;
                //		response.Content = new StreamContent(Stream.Null);  // No content for this status.
                //		response.Content.Headers.ContentRange = new ContentRangeHeaderValue(expectedSize);
                //		response.Content.Headers.ContentType = new MediaTypeHeaderValue("video/webm");

                //		return response;
                //	}

                //	var contentRange = new ContentRangeHeaderValue(start, end, expectedSize);

                //	//var contentRange = new ContentRangeHeaderValue(start, end, originalSize);

                //	// We are now ready to produce partial content.
                //	response.StatusCode = HttpStatusCode.PartialContent;
                //	response.Content = new PushStreamContent(async (outputStream, httpContent, transportContext) =>
                //		{
                //			await OnStreamConnected(outputStream, httpContent as PushStreamContent, transportContext, item, start, end, arg, targetBitRate);
                //		}, "video/webm");


                //	//response.Content.Headers.Expires = DateTime.UtcNow.Date.AddHours(1);
                //	response.Content.Headers.ContentLength = end - start + 1;
                //	response.Content.Headers.ContentRange = contentRange;
                //	Console.WriteLine("Range - "+contentRange.ToString());

                //	return response;
                //}
                else
                {
                    return(Request.CreateResponse(HttpStatusCode.NotFound));
                }
            }
            catch (Exception e)
            {
                var message = string.Format("Item with id = {0} not found", id);
                return(Request.CreateResponse(HttpStatusCode.NoContent, message));
            }
        }
Example #26
0
        private async void SetExtraPropertiesAsync(StorageItemInfo itemInfo)
        {
            if (itemInfo.IsFile)
            {
                //파일 용량 조회
                var file = await itemInfo.GetStorageFileAsync();

                if (file != null)
                {
                    //System.Diagnostics.Debug.WriteLine(file.DisplayName);
                    var bi = await file.GetBasicPropertiesAsync();

                    //파일 크기 설정
                    itemInfo.Size = bi.Size;
                    //썸네일 로드
                    this.LoadThumbnailAsync(itemInfo, _ThumbnailListInCurrentFolder, Settings.Thumbnail.UseUnsupportedDLNAFile);
                    //자막 목록 설정
                    if (_CurrentSubtitleFileList != null && _CurrentSubtitleFileList.Any())
                    {
                        itemInfo.SubtitleList = _CurrentSubtitleFileList.Where(x => x.Contains(System.IO.Path.GetFileNameWithoutExtension(itemInfo.Name).ToUpper())).ToList();
                    }
                }
            }
            else
            {
                var folder = await itemInfo.GetStorageFolderAsync();

                if (folder != null)
                {
                    itemInfo.DateCreated = folder.DateCreated;

                    //비디오 파일 갯수를 알아내기 위한 필터링 옵션
                    var queryResult = folder.CreateFileQueryWithOptions(_VideoFileQueryOptions);
                    itemInfo.FileCount = (int)await queryResult.GetItemCountAsync();

                    var folderCount = await folder.CreateFolderQuery().GetItemCountAsync();

                    if (itemInfo.FileCount > 0)
                    {
                        itemInfo.FileCountDescription = itemInfo.FileCount.ToString() + (folderCount > 0 ? "+" : string.Empty);
                    }
                    else
                    {
                        itemInfo.FileCountDescription = "0" + (folderCount > 0 ? "*" : string.Empty);
                    }

                    if (itemInfo.FileCount > 0)
                    {
                        var fileList = await queryResult.GetFilesAsync();

                        List <ImageSource> imageSourceList = new List <ImageSource>();

                        List <Thumbnail> thumbnailList = new List <Thumbnail>();
                        ThumbnailDAO.LoadThumnailInFolder(itemInfo.Path, thumbnailList);

                        for (int i = 0; i < fileList.Count; i++)
                        {
                            //썸네일 로드
                            var imgSrc = await GetThumbnailAsync(fileList[i], thumbnailList, Settings.Thumbnail.UseUnsupportedDLNAFolder);

                            if (imgSrc != null)
                            {
                                imageSourceList.Add(imgSrc);
                            }
                            //4장의 이미지를 채우지 못할 것으로 확신되거나, 이미 4장을 채운경우 정지
                            if (((imageSourceList.Count > 0 && imageSourceList.Count >= 4) ||
                                 (itemInfo.FileCount - (i + 1) + imageSourceList.Count < 4)) && imageSourceList.Count > 0)
                            {
                                break;
                            }
                        }

                        itemInfo.ImageItemsSource = imageSourceList;
                    }
                    else if (!_FolderStack.Any())
                    {
                        //NAS아이콘 추출
                        ImageSource imageSource = null;
                        var         thumb       = await folder.GetThumbnailAsync(ThumbnailMode.SingleItem);

                        if (thumb?.Type == ThumbnailType.Image)
                        {
                            //썸네일 설정
                            await DispatcherHelper.RunAsync(() =>
                            {
                                var bi = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
                                bi.SetSource(thumb);
                                imageSource               = bi;
                                itemInfo.IsFullFitImage   = false;
                                itemInfo.ImageItemsSource = imageSource;
                            });
                        }
                    }
                }
            }
        }