public SinglePhotoPackage(PHAsset photo)
 {
     Photo = new PLAsset {
         Asset = photo
     };
     Photo.PopulateProperties();
 }
        static private IEnumerable <PLAsset> GetPhotosToBeBackedUp()
        {
            if (PHPhotoLibrary.AuthorizationStatus != PHAuthorizationStatus.Authorized)
            {
                yield break;
                //return null;
            }

            var collections = PHAssetCollection.FetchAssetCollections(PHAssetCollectionType.SmartAlbum, PHAssetCollectionSubtype.SmartAlbumUserLibrary, null);
            var photos      = collections.OfType <PHAssetCollection>().SelectMany(x => PHAsset.FetchAssets(x, null).OfType <PHAsset>().Select(x => {
                var asset = new PLAsset {
                    Asset = x,
                    Id    = x.LocalIdentifier
                };
                return(asset);
            })).ToList();

            foreach (var asset in Globals.Database.Table <PLAsset>())
            {
                if (photos.Contains(asset))
                {
                    photos.Remove(asset);
                }
            }
            foreach (var item in photos)
            {
                item.PopulateProperties();
                yield return(item);
            }
            //return photos.AsReadOnly();
        }
 public SinglePhotoPackage(PHAsset photo)
 {
     Photo = new PLAsset {
         Asset = photo
     };
     Photo.Refresh();
 }
Beispiel #4
0
        public void Update(PLAsset photo)
        {
            IconImage.Image       = null;
            IconImage.ContentMode = UIViewContentMode.ScaleAspectFill;
            NameLabel.Text        = photo.FileName;
            var type = photo.Type.ToLocalizedString();
            var tags = photo.Tags.Unpack().ToLocalizedString();

            if (!string.IsNullOrEmpty(tags))
            {
                TypeLabel.Text = tags;
            }
            else
            {
                TypeLabel.Text = type;
            }
            SizeLabel.Text = null;

            PHImageManager.DefaultManager.RequestImageForAsset(photo.Asset, IconImage.Frame.Size, PHImageContentMode.AspectFill, null, (result, info) => {
                var error = info.ObjectForKey(PHImageKeys.Error);
                if (error == null)
                {
                    InvokeOnMainThread(() => IconImage.Image = result);
                }
            });
            SizeLabel.Text = photo.Size.Bytes().Humanize("0.00", CultureInfo.InvariantCulture);
        }
        public async Task <bool> CopyToDestination(PLAsset photo, string destPath, IFileSystem fileSystem, DateTime filetime)
        {
            try
            {
                if (!photo.IsAvailable)
                {
                    throw new InvalidOperationException("This photo is no longer available.");
                }

                var options = new PHAssetResourceRequestOptions {
                    NetworkAccessAllowed = true
                };

                NSError lastError = null;
                var     original  = photo.Resources.FirstOrDefault(x => x.ResourceType == PHAssetResourceType.FullSizeVideo ||
                                                                   x.ResourceType == PHAssetResourceType.FullSizePhoto ||
                                                                   x.ResourceType == PHAssetResourceType.Photo ||
                                                                   x.ResourceType == PHAssetResourceType.Video ||
                                                                   x.ResourceType == PHAssetResourceType.Audio);

                if (original == null)
                {
                    throw new InvalidOperationException("Backup failed for this photo.");
                }

                var destTmpFile = destPath + ".temp";

                var  tcs         = new TaskCompletionSource <int>();
                long datawritten = 0;
                PHAssetResourceManager.DefaultManager.RequestData(original, options, data => {
                    var bytes = data.ToArray();
                    WriteToDest(bytes, datawritten, bytes.Length, destTmpFile, fileSystem).Wait();
                    datawritten += bytes.Length;
                }, error => {
                    if (error != null)
                    {
                        tcs.SetException(new InvalidOperationException(lastError.LocalizedDescription));
                    }
                    tcs.SetResult(0);
                });
                await tcs.Task.ConfigureAwait(false);


                return(await RenameDestinationFile(fileSystem, destTmpFile, destPath, filetime).ConfigureAwait(false));
            }
            catch (Exception)
            {
                return(false);
            }
        }
        private async Task <bool> BackupOneImage(PLAsset photo, string remotePath, IFileSystem fileSystem, bool background)//or video
        {
            try
            {
                logger.LogTrace($"Backing up item: {photo.FileName}");

                var zipFile = Path.Combine(Paths.Temporary, photo.FileName + ".zip");
                File.Delete(zipFile);

                FileStream         zipStream = null;
                SinglePhotoPackage package   = null;

                var ft = photo.CreationDate;

                package = new SinglePhotoPackage(photo);

                if (photo.Resources.Count > 1)
                {
                    zipStream = new FileStream(zipFile, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
                }


                try
                {
                    if (zipStream != null)
                    {
                        package.WriteArchive(zipStream);

                        zipStream.Seek(0, SeekOrigin.Begin);
                        var destZipFile = Path.Combine(remotePath, Path.GetFileNameWithoutExtension(photo.FileName) + ".PLAsset");
                        if (!await CopyToDestination(zipStream, destZipFile, fileSystem, ft).ConfigureAwait(false))
                        {
                            return(false);
                        }
                    }


                    var destOriginalFile = Path.Combine(remotePath, photo.FileName);
                    if (background && (photo.Size > 30L * 1024 * 1024))
                    {
                        if (!await CopyToDestination(photo.Asset, destOriginalFile, fileSystem, ft).ConfigureAwait(false))
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        if (!await CopyToDestination(photo, destOriginalFile, fileSystem, ft).ConfigureAwait(false))
                        {
                            return(false);
                        }
                    }

                    Globals.Database.Insert(photo);
                }
                catch (Exception exception)
                {
                    logger.LogError(exception, $"Backup failed for item: {photo.FileName}");
                }
                finally
                {
                    zipStream?.Dispose();
                }

                try
                {
                    File.Delete(zipFile);
                }
                catch
                {// Ignored.
                }
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
 public SinglePhotoPackage(PLAsset photo)
 {
     Photo = photo;
 }