public static Task ApplyThumbnails(int imageSize, StorageFile mediaFile, MediaData data)
        {
            //
            // Apply bitmap source depending on file type.
            //

            /*switch (mediaFile.FileType)
             * {
             *  case ".gif":
             *      using (var gifStream = await mediaFile.OpenReadAsync())
             *      {
             *          // Can't use thumbnail for gifs since they are animated, so use a data stream instead.
             *          //await data.Thumbnail.SetSourceAsync(gifStream);
             *      }
             *      break;
             *  default:
             *      // Get the thumbnail of this file from windows (is fast since windows caches them).
             *      var thumbnail = await mediaFile.GetThumbnailAsync(ThumbnailMode.SingleItem, (uint)imageSize, ThumbnailOptions.ResizeThumbnail);
             *
             *      // Thumbnails for everything but gifs do not need to be animated so a static thumbnail is fine.
             *      //await data.Thumbnail.SetSourceAsync(thumbnail);
             *      break;
             * }*/
            return(Task.CompletedTask);
        }
        /// <summary>
        /// Gets a <see cref="MediaData"/> from <see cref="MediaDatas"/> using the path of the media file
        /// as the identifying feature.
        /// </summary>
        /// <param name="mediaFilePath">The path of the file of the media data to retrieve.</param>
        /// <returns></returns>
        public MediaData GetMediaDataFromPath(string mediaFilePath, IEnumerable <MediaData> mediaDatasToLookIn)
        {
            MediaData mediaDataToRemove = null;

            foreach (var mediaData in mediaDatasToLookIn)
            {
                if (mediaData.Meta.MediaFilePath.Equals(mediaFilePath))
                {
                    mediaDataToRemove = mediaData;
                    break;
                }
            }

            return(mediaDataToRemove);
        }
Esempio n. 3
0
 public DuplicateMediaEntry(MediaData mediaData)
 {
     MediaData = mediaData;
 }
        private async Task ProcessFileChange(StorageLibraryChange change)
        {
            // Temp variable used for instantiating StorageFiles for sorting if needed later
            //StorageFile newFile = null;
            var extension = Path.GetExtension(change.Path);

            switch (change.ChangeType)
            {
            // New File in the Library
            case StorageLibraryChangeType.Created:
            case StorageLibraryChangeType.MovedIntoLibrary:
                if (FileTypes.Extensions.Contains(extension, StringComparer.InvariantCultureIgnoreCase))
                {
                    try
                    {
                        // Don't add file to gallery if it already exists.
                        if (MediaDatas.Any(data => data.MediaFile.Path == change.Path))
                        {
                            return;
                        }

                        var mediaFile = (StorageFile)(await change.GetStorageItemAsync());

                        if (mediaFile == null)
                        {
                            return;
                        }

                        await AddFileAsync(ImageSize, mediaFile);
                    }
                    catch (Exception e)
                    {
                        // Log Exception.
                        LifecycleLog.Exception(e);
                    }
                }
                break;

            // Renamed file
            case StorageLibraryChangeType.MovedOrRenamed:
                if (FileTypes.Extensions.Contains(extension, StringComparer.InvariantCultureIgnoreCase))
                {
                    try
                    {
                        var mediaData = GetMediaDataFromPath(change.PreviousPath, MediaDatas);
                        var newName   = Path.GetFileName(change.Path);

                        // If no MediaData could be found in Gallery for this renamed item AND there is an entry for it in App.MediaDatas (lostMediaData)
                        // that probably means it has been renamed while the application was off, so update its path and add it to the gallery.
                        var lostMediaFile = GetMediaFileFromPath(change.Path, _lostMediaFiles);
                        if (mediaData == null && lostMediaFile != null)
                        {
                            var lostMetaData = GetMediaMetaDataFromPath(change.PreviousPath, App.DatabaseMetaDatas);
                            // Update path on metadata.
                            lostMetaData.MediaFilePath = change.Path;
                            // Get current MediaData associated with metadata.
                            var lostMediaData = await MediaData.CreateFromMediaMetadataAsync(lostMetaData);

                            // If file can still not be found then return.
                            if (lostMediaData == null)
                            {
                                return;
                            }
                            // Add file to gallery, including the lost media data.
                            await AddFileAsync(ImageSize, lostMediaFile, false, lostMediaData);
                        }
                        else if (mediaData == null)
                        {
                            return;
                        }

                        // Don't rename file in gallery if it is already renamed
                        if (MediaDatas.Any(data => data.Title == newName))
                        {
                            return;
                        }

                        var mediaFile = (StorageFile)(await change.GetStorageItemAsync());
                        // Run on UI thread.
                        await App.Current.NavigationService.Frame.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                        {
                            // Update MediaFile of mediaData.
                            mediaData.MediaFile = mediaFile;
                        });

                        await mediaData.UpdateFileNameValuesAsync(newName);
                    }
                    catch (Exception e)
                    {
                        // Log Exception.
                        LifecycleLog.Exception(e);
                    }
                }
                break;

            // File Removed From Library
            case StorageLibraryChangeType.Deleted:
            case StorageLibraryChangeType.MovedOutOfLibrary:
                if (FileTypes.Extensions.Contains(extension, StringComparer.InvariantCultureIgnoreCase))
                {
                    try
                    {
                        // Only remove file from gallery if it exists in gallery.
                        if (MediaDatas.Any(data => data.MediaFile.Path == change.Path))
                        {
                            RemoveFile(change.Path);
                        }
                    }
                    catch (Exception e)
                    {
                        // Log Exception.
                        LifecycleLog.Exception(e);
                    }
                }
                break;

            // Modified Contents
            case StorageLibraryChangeType.ContentsChanged:
                if (FileTypes.Extensions.Contains(extension, StringComparer.InvariantCultureIgnoreCase))
                {
                    /*newFile = (StorageFile)(await change.GetStorageItemAsync());
                     * var imageProps = await newFile.Properties.GetImagePropertiesAsync();
                     * var dateTaken = imageProps.DateTaken;
                     * var dateModified = newFile.DateCreated;
                     * if (DateTimeOffset.Compare(dateTaken.AddSeconds(70), dateModified) > 0)
                     * {
                     *  // File was modified by the user
                     * }*/
                }
                break;

            // Ignored Cases
            case StorageLibraryChangeType.EncryptionChanged:
            case StorageLibraryChangeType.ContentsReplaced:
            case StorageLibraryChangeType.IndexingStatusChanged:
            default:
                // These are safe to ignore in this application
                break;
            }
        }
        /// <summary>
        /// Adds a new <see cref="StorageFile"/> to this gallery.
        /// </summary>
        /// <param name="imageSize">The size of the pregenerated thumbnail.</param>
        /// <param name="mediaFile">The file to add.</param>
        /// <param name="mediaData">Optional, the data of the file to add.</param>
        /// <returns></returns>
        public async Task AddFileAsync(int imageSize, StorageFile mediaFile, bool evaluate = true, MediaData data = null)
        {
            if (data == null)
            {
                data = MediaData.CreateFromStorageFile(mediaFile);
            }

            if (data is GifData)
            {
                GifCount++;
            }
            if (data is VideoData)
            {
                VideoCount++;
            }
            if (data is ImageData)
            {
                ImageCount++;
            }

            var imageProp = await mediaFile.Properties.GetImagePropertiesAsync();

            data.Meta.Height     = (int)imageProp.Height;
            data.Meta.Width      = (int)imageProp.Width;
            data.BasicProperties = await mediaFile.GetBasicPropertiesAsync();

            var properties = await mediaFile.Properties.RetrievePropertiesAsync
                             (
                new string[] { "System.DateModified" }
                             );

            var lastModified = properties["System.DateModified"];

            if (lastModified is DateTime lastModifiedDateTime)
            {
                data.Meta.LastModified = lastModifiedDateTime;
            }
            MediaDatas.Add(data);

            if (!App.Files.ContainsKey(mediaFile.Name))
            {
                App.Files.Add(mediaFile.Name, mediaFile);
            }

            await ApplyThumbnails(imageSize, mediaFile, data);

            if (evaluate)
            {
                // Make sure local model is in memory.
                await LoadLocalModel();

                // Evaluate locally.
                await data.EvaluateLocalAsync(_memeClassifier);

                // Scan for duplicates before evaluating online.
                var duplicateSets = new Dictionary <MediaData, List <MediaData> >();
                ScanForDuplicate(duplicateSets, data);
                // For each set of duplicates found...
                foreach (var duplicates in duplicateSets.Values)
                {
                    // ...have the user handle the duplicates.
                    DuplicateModal.DuplicateQueue.Enqueue(duplicates);
                }
                // Process enqeued duplicates.
                await DuplicateModal.ProcessQueueAsync();

                // If data or mediafile was removed during duplication handling, then don't try to evaluate online.
                var fileName = Path.GetFileName(data?.MediaFile?.Path);
                var exists   = await _folder.TryGetItemAsync(fileName);

                if (exists == null)
                {
                    return;
                }

                // Sign into firebase.
                if (await FirebaseClient.Client.SignInPromptUserIfNecessary())
                {
                    // Evaluate online.
                    await data.EvaluateOnlineAsync(FirebaseClient.accessToken);
                }
            }
        }
        public void ScanForDuplicate(Dictionary <MediaData, List <MediaData> > duplicates, MediaData mediaData)
        {
            foreach (var otherMediaData in MediaDatas)
            {
                // Skip mediaData since it will be added anyways if there are any duplicates.
                if (otherMediaData == mediaData)
                {
                    continue;
                }

                if (otherMediaData.IsDuplicateOf(mediaData))
                {
                    // If otherMediaData is already located in duplicates, continue.
                    if (duplicates.Any(pair => pair.Value.Any(data => data == otherMediaData)))
                    {
                        continue;
                    }

                    if (duplicates.ContainsKey(mediaData))
                    {
                        // Add otherMediaData to duplicate collection of mediaData.
                        duplicates[mediaData].Add(otherMediaData);
                    }
                    else
                    {
                        // Create new duplicates list for mediaData and add otherMediaData and mediaData to it.
                        duplicates.Add(mediaData, new List <MediaData> {
                            otherMediaData, mediaData
                        });
                    }
                }
            }
        }