public static async Task GetVideosFromCameraRoll(VideoRepository videoRepo) { try { if (await KnownFolders.PicturesLibrary.ContainsFolderAsync("Camera Roll")) { var cameraRoll = await KnownFolders.PicturesLibrary.GetFolderAsync("Camera Roll"); var videos = await GetMediaFromFolder(cameraRoll); await AddVideo(videoRepo, videos, true); } } catch (FileNotFoundException fileNotFoundException) { LogHelper.Log("Failed to get videos from Camera Roll. Aborting. " + fileNotFoundException.ToString()); } }
private static async Task AddVideo(VideoRepository videoRepo, IReadOnlyList<StorageFile> files, bool isCameraRoll) { try { foreach (StorageFile storageFile in files) { MediaProperties videoProperties = null; if (!isCameraRoll) { var media = Locator.VLCService.GetMediaFromPath(storageFile.Path); videoProperties = Locator.VLCService.GetVideoProperties(media); if(videoProperties == null) { TitleDecrapifier.tvShowEpisodeInfoFromString(storageFile.DisplayName); } } bool isTvShow = !string.IsNullOrEmpty(videoProperties?.ShowTitle) && videoProperties?.Season >= 0 && videoProperties?.Episode >= 0; // Check if we know the file: //FIXME: We need to check if the files in DB still exist on disk var mediaVM = await videoRepo.GetFromPath(storageFile.Path).ConfigureAwait(false); if (mediaVM != null) { Debug.Assert(isTvShow == mediaVM.IsTvShow); mediaVM.File = storageFile; if (isTvShow) await AddTvShow(videoProperties.ShowTitle, mediaVM); } else { // Analyse to see if it's a tv show // if the file is from a tv show, we push it to this tvshow item mediaVM = !isTvShow ? new VideoItem() : new VideoItem(videoProperties.Season, videoProperties.Episode); await mediaVM.Initialize(storageFile); mediaVM.IsCameraRoll = isCameraRoll; if (string.IsNullOrEmpty(mediaVM.Name)) continue; VideoItem searchVideo = Locator.VideoLibraryVM.ViewedVideos.FirstOrDefault(x => x.Name == mediaVM.Name); if (searchVideo != null) { mediaVM.TimeWatched = searchVideo.TimeWatched; } if (isTvShow) await AddTvShow(videoProperties.ShowTitle, mediaVM); await videoRepo.Insert(mediaVM); } // Get back to UI thread await DispatchHelper.InvokeAsync(() => { if (mediaVM.IsCameraRoll) { // TODO: Find a more efficient way to know if it's already in the list or not if (Locator.VideoLibraryVM.CameraRoll.FirstOrDefault(x => x.Id == mediaVM.Id) == null) Locator.VideoLibraryVM.CameraRoll.Add(mediaVM); } else if (!mediaVM.IsTvShow) { if (Locator.VideoLibraryVM.Videos.FirstOrDefault(x => x.Id == mediaVM.Id) == null) Locator.VideoLibraryVM.Videos.Add(mediaVM); } if (Locator.VideoLibraryVM.ViewedVideos.Count < 6 && Locator.VideoLibraryVM.ViewedVideos.FirstOrDefault( x => x.Path == mediaVM.Path && x.TimeWatched == TimeSpan.Zero) == null) { if (Locator.VideoLibraryVM.ViewedVideos.FirstOrDefault(x => x.Id == mediaVM.Id) == null) Locator.VideoLibraryVM.ViewedVideos.Add(mediaVM); } }); } } catch (Exception e) { ExceptionHelper.CreateMemorizedException("VideoLibraryManagement.AddVideo", e); } }
public static async Task GetVideos(VideoRepository videoRepo) { #if WINDOWS_APP StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos); foreach (StorageFolder storageFolder in videoLibrary.Folders) #else StorageFolder storageFolder = KnownFolders.VideosLibrary; #endif { try { IReadOnlyList<StorageFile> files = await GetMediaFromFolder(storageFolder); await AddVideo(videoRepo, files, false); } catch { LogHelper.Log("An error occured while indexing a video folder"); } } if (Locator.VideoLibraryVM.Videos.Count > 0) { await DispatchHelper.InvokeAsync(() => Locator.VideoLibraryVM.HasNoMedia = false); } else { await DispatchHelper.InvokeAsync(() => Locator.VideoLibraryVM.HasNoMedia = true); } await App.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () => { Locator.VideoLibraryVM.LoadingState = LoadingState.Loaded; }); }