Skip to main content

switch to actions for flagged

ID
2c52306
date
2023-05-13 13:29:24+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
19c8508
message
switch to actions for flagged
changed files
4 files, 53 additions, 109 deletions

Changed files

actions/run_action.swift (1951) → actions/run_action.swift (2382)

diff --git a/actions/run_action.swift b/actions/run_action.swift
index 9efb986..4a9a4e2 100644
--- a/actions/run_action.swift
+++ b/actions/run_action.swift
@@ -36,6 +36,22 @@ func getPhotoWith(uuid: String) -> PHAsset {
   }
 }
 
+func isPhotoInAlbum(photo: PHAsset, collection: PHAssetCollection) -> Bool {
+  let collections = PHAssetCollection.fetchAssetCollectionsContaining(
+    photo, with: .album, options: nil
+  )
+
+  var result = false
+
+  collections.enumerateObjects({ (album, index, stop) in
+    if (album == collection) {
+      result = true
+    }
+  })
+
+  return result
+}
+
 let arguments = CommandLine.arguments
 
 guard arguments.count == 3 else {
@@ -52,25 +68,29 @@ let needsAction = getAlbumWith(name: "Needs Action")
 let photo = getPhotoWith(uuid: arguments[1])
 
 try PHPhotoLibrary.shared().performChangesAndWait {
+  let changeAsset = PHAssetChangeRequest(for: photo)
+
+  let changeFlagged =
+    PHAssetCollectionChangeRequest(for: flagged)!
+  let changeRejected =
+    PHAssetCollectionChangeRequest(for: rejected)!
+  let changeNeedsAction =
+    PHAssetCollectionChangeRequest(for: needsAction)!
 
+  let assets = [photo] as NSFastEnumeration
 
   if action == "toggle-favorite" {
-    let request = PHAssetChangeRequest(for: photo)
-    request.isFavorite = !photo.isFavorite
+    changeAsset.isFavorite = !photo.isFavorite
   }
-}
 
-// try PHPhotoLibrary.shared().performChangesAndWait {
-//   let changeFlagged =
-//     PHAssetCollectionChangeRequest(for: flagged)!
-//   let changeRejected =
-//     PHAssetCollectionChangeRequest(for: rejected)!
-//   let changeNeedsAction =
-//     PHAssetCollectionChangeRequest(for: needsAction)!
-//
-//   let assets = [photo] as NSFastEnumeration
-//
-//   changeFlagged.addAssets(assets)
-//   changeRejected.removeAssets(assets)
-//   changeNeedsAction.removeAssets(assets)
-// }
+  if action == "toggle-flagged" {
+    changeRejected.removeAssets(assets)
+    changeNeedsAction.removeAssets(assets)
+
+    if (isPhotoInAlbum(photo: photo, collection: flagged)) {
+      changeFlagged.addAssets(assets)
+    } else {
+      changeFlagged.removeAssets(assets)
+    }
+  }
+}

scripts/flag.swift (1687) → scripts/flag.swift (0)

diff --git a/scripts/flag.swift b/scripts/flag.swift
deleted file mode 100644
index 147317a..0000000
--- a/scripts/flag.swift
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/env swift
-
-import Photos
-
-func getAlbumWith(name: String) -> PHAssetCollection {
-  let collections =
-    PHAssetCollection
-    .fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)
-
-  var thisAssetCollection: PHAssetCollection? = nil
-
-  collections.enumerateObjects({ (album, index, stop) in
-    let assetCollection = album
-
-    if assetCollection.localizedTitle == Optional(name) {
-      thisAssetCollection = assetCollection
-    }
-  })
-
-  if thisAssetCollection != nil {
-    return thisAssetCollection!
-  } else {
-    fputs("Unable to find album with name: \(name).\n", stderr)
-    exit(1)
-  }
-}
-
-func getPhotoWith(uuid: String) -> PHAsset {
-  let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [uuid], options: nil)
-
-  if fetchResult.count == 1 {
-    return fetchResult.firstObject!
-  } else {
-    fputs("Unable to find photo with ID: \(uuid).\n", stderr)
-    exit(1)
-  }
-}
-
-let arguments = CommandLine.arguments
-
-guard arguments.count == 2 else {
-  fputs("Usage: \(arguments[0]) PHOTO_ID\n", stderr)
-  exit(1)
-}
-
-let flagged = getAlbumWith(name: "Flagged")
-let rejected = getAlbumWith(name: "Rejected")
-let needsAction = getAlbumWith(name: "Needs Action")
-
-let photo = getPhotoWith(uuid: arguments[1])
-
-try PHPhotoLibrary.shared().performChangesAndWait {
-  let changeFlagged =
-    PHAssetCollectionChangeRequest(for: flagged)!
-  let changeRejected =
-    PHAssetCollectionChangeRequest(for: rejected)!
-  let changeNeedsAction =
-    PHAssetCollectionChangeRequest(for: needsAction)!
-
-  let assets = [photo] as NSFastEnumeration
-
-  changeFlagged.addAssets(assets)
-  changeRejected.removeAssets(assets)
-  changeNeedsAction.removeAssets(assets)
-}

server.py (6136) → server.py (6064)

diff --git a/server.py b/server.py
index c40995d..c035354 100755
--- a/server.py
+++ b/server.py
@@ -64,25 +64,14 @@ class PhotosData:
 
         if action == 'toggle-favorite':
             this_asset['isFavorite'] = not this_asset['isFavorite']
+        elif action == 'toggle-flagged':
+            this_asset['albums'].discard('Rejected')
+            this_asset['albums'].discard('Needs Action')
 
-        self.get_response.cache_clear()
-
-    def flag(self, local_identifier):
-        subprocess.check_call(['swift', 'scripts/flag.swift', local_identifier])
-
-        this_asset = self.all_assets[self.all_positions[local_identifier]]
-
-        try:
-            this_asset['albums'].remove('Rejected')
-        except KeyError:
-            pass
-
-        try:
-            this_asset['albums'].remove('Needs Action')
-        except KeyError:
-            pass
-
-        this_asset['albums'].add('Flagged')
+            try:
+                this_asset['albums'].remove('Flagged')
+            except KeyError:
+                this_asset['albums'].add('Flagged')
 
         this_asset['state'] = get_asset_state(this_asset)
 
@@ -178,11 +167,6 @@ def _perform_action(request, callback):
     return redirect(url_for('index', localIdentifier=redirect_to))
 
 
-@app.route('/actions/flag')
-def flag():
-    return _perform_action(request, photos_data.flag)
-
-
 @app.route('/actions/reject')
 def reject():
     return _perform_action(request, photos_data.reject)
@@ -202,7 +186,10 @@ def run_action():
 
     if action == 'toggle-favorite':
         return redirect(url_for('index', localIdentifier=local_identifier))
-
+    else:
+        position = photos_data.all_positions[local_identifier]
+        redirect_to = photos_data.all_assets[position - 1]['localIdentifier']
+        return redirect(url_for('index', localIdentifier=redirect_to))
 
 @app.route('/image')
 def image():

templates/index.html (8152) → templates/index.html (8173)

diff --git a/templates/index.html b/templates/index.html
index 895d4ca..bb2e54e 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -202,14 +202,16 @@ document.onkeydown = function(e) {
     {% if next_five %}
       window.location = "/?localIdentifier={{ next_five[0]['localIdentifier'] }}";
     {% endif %}
-  } else if (e.key === "1") {
-    window.location = "/actions/flag?localIdentifier={{ this_asset['localIdentifier'] }}";
+  } else
+  if (e.key === "1") {
+    window.location = "/actions?localIdentifier={{ this_asset['localIdentifier'] }}&action=toggle-flagged";
   } else if (e.key === "2") {
     window.location = "/actions/reject?localIdentifier={{ this_asset['localIdentifier'] }}";
   } else if (e.key === "3") {
     window.location = "/actions/needs_action?localIdentifier={{ this_asset['localIdentifier'] }}";
   }
-  else if (e.key === "f") {
+  else
+  if (e.key === "f") {
      window.location = "/actions?localIdentifier={{ this_asset['localIdentifier'] }}&action=toggle-favorite";
    }
 }