@@ -165,14 +161,6 @@
// Todo - save an image to local storage
}
- async Task AddSelectedToBasket()
- {
- var selected = selectionService.Selection.ToList();
- await basketService.SetBasketState(selected, true);
-
- statusService.StatusText = $"{selected.Count()} images added to the basket";
- }
-
async Task AddGroupToBasket(ImageGrouping grouping)
{
await basketService.SetBasketState(grouping.Images, true);
@@ -302,12 +290,7 @@
{
get
{
- if (searchService.Folder != null)
- {
- return $"No images were found in folder '{searchService.Folder.Name}' that match the current filter.";
- }
-
- return "No images were found that match the current filter.";
+ return $"No images were found that match the filter:\n{searchService.SearchBreadcrumbs}";
}
}
@@ -322,6 +305,8 @@
gridImages.Clear();
endOfImages = false;
+ _ = InvokeAsync( StateHasChanged );
+
_ = LoadData(imagesPerPage);
}
diff --git a/Damselfly.Web/Shared/Images/ImageProperties.razor b/Damselfly.Web/Shared/Images/ImageProperties.razor
index b838edc2..43aeeb4b 100644
--- a/Damselfly.Web/Shared/Images/ImageProperties.razor
+++ b/Damselfly.Web/Shared/Images/ImageProperties.razor
@@ -23,10 +23,13 @@
else
{
An error occurred. Please check the Damselfly logs and reload the page.
+
+
@code{
}
diff --git a/Damselfly.Web/Shared/SearchBar.razor b/Damselfly.Web/Shared/SearchBar.razor
index 03752625..0dfe0836 100644
--- a/Damselfly.Web/Shared/SearchBar.razor
+++ b/Damselfly.Web/Shared/SearchBar.razor
@@ -38,7 +38,10 @@
public void OnRangeSelect(BlazorDateRangePicker.DateRange range)
{
- searchService.SetDateRange(range.Start.Date, range.End.Date);
+ if( range != null )
+ searchService.SetDateRange(range.Start.Date, range.End.Date);
+ else
+ searchService.SetDateRange(null, null);
}
private void KeyChangedMinSize(string newText)
diff --git a/Damselfly.Web/_Imports.razor b/Damselfly.Web/_Imports.razor
index d9f59a3f..fcbfa924 100644
--- a/Damselfly.Web/_Imports.razor
+++ b/Damselfly.Web/_Imports.razor
@@ -20,6 +20,7 @@
@using Damselfly.Core.DbModels;
@using Damselfly.Web
@using Damselfly.Web.Data
+@using Damselfly.Web.Extensions
@using Damselfly.Web.Shared
@using Damselfly.Web.Components
@using Damselfly.Web.Shared.Images
diff --git a/Damselfly.Web/wwwroot/css/site.css b/Damselfly.Web/wwwroot/css/site.css
index 613c9dd2..5c1fe4a6 100644
--- a/Damselfly.Web/wwwroot/css/site.css
+++ b/Damselfly.Web/wwwroot/css/site.css
@@ -674,6 +674,14 @@ f
align-items: center;
}
+.damselfly-searchhint {
+ flex: 1 1 200px;
+ margin: 3px;
+ display: flex;
+ flex-flow: row;
+ align-items: center;
+}
+
.damselfly-browsetoollabel {
margin: 2px;
}
@@ -1210,11 +1218,13 @@ padding: 0.4em 0.65em;
flex: 1 1 auto;
display: flex;
flex-direction: column;
+ padding: 3px;
}
.damselfly-configsetting {
display: flex;
flex-direction: row;
+ padding: 3px;
}
.damselfly-configfield {
diff --git a/Directory.Build.props b/Directory.Build.props
index eac64816..98cf4899 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,6 +1,7 @@
- true
- net6.0
+ true
+ net6.0
+ CA1416
\ No newline at end of file
diff --git a/README.md b/README.md
index d158e374..8e2a40ee 100644
--- a/README.md
+++ b/README.md
@@ -36,6 +36,7 @@ editing etc.
* Baskets can be user-specific, or shared with other users
* Server-based deployment, with a web-based front-end UI, so the image library can be accessed via multiple
devices without having to copy catalogues or other DBs to local device storage.
+* Exclude images from Damselfly scanning by adding a `.nomedia` file in any folder.
* Themes
* Completely automated background indexing of images, so that the collection is automatically and quickly updated
when new images are added or updated
@@ -76,7 +77,7 @@ be appreciated!
* Synchronisation of local images back to the server
* If you have ideas for other features - let me know by [raising an issue](https://github.com/Webreaper/Damselfly/issues)!
-# How should we I Damselfly? What's the workflow?
+# How should I use Damselfly? What's the workflow?
The photos live in the library on the server, but whenever you want to work on a picture (e.g., in Photoshop, Digikam or your editing tool of
choice) you use the Damselfly Deskop app to add the images to the basket, and choose Download => Save Locally, to sync the pictures across
diff --git a/VERSION b/VERSION
index ccbccc3d..c043eea7 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.2.0
+2.2.1
diff --git a/docs/Technical.md b/docs/Technical.md
index 6f019f3f..b84408a4 100644
--- a/docs/Technical.md
+++ b/docs/Technical.md
@@ -35,25 +35,30 @@ etc - these will be coming.
At startup, Damselfly will run a full index on the folder of images passed in as the only mandatory parameter (or the volume mapped to /pictures
if you're running in Docker). The process runs as follows:
-1. Damselfly will scan the entire folder tree for any images (currently JPEG, PNG, etc; HEIC and others will be added when Google's image processing
-library Skia supports them). This process is normally very quick - on my Synology NAS, around half a million images can be scanned in an hour or two).
-During this process, a filesystem iNotify watcher will be set up for each folder in the tree to watch for changes.
+1. Damselfly will scan the entire folder tree for any images (currently JPG, PNG, HEIC, TIFF, Webp, BMP and DNG/CR2 RAW). This process is normally
+very quick - on my Synology NAS, around half a million images can be scanned in an hour or two). During this process, a filesystem iNotify watcher
+will be set up for each folder in the tree to watch for changes.
2. Next, Damselfly will then go back through all of the images, in newest (by file-modified-date) order first, and run the metadata scan. This is
more time-consuming, but will pull in all of the metadata such as the resolution, keyword tags, other EXIF data, when the photo was taken, etc.
3. Lastly, the thumbnail generation process will run - generating the small previews used when browsing. This process is CPU-intensive, and can take
some time; for my 4TB+ collection of half a million photos, it'll take 5+ days to run on my Synology NAS - processing around 100 images per minute.
It'll also hammer the CPU while it runs, so be aware of that.
-4. Image/object/face detection will run on the thumbnails after they've been generated. Thumbnails are used (rather than original images) because
-image recognition models usually work faster with lower-res images.
+4. Image/object/face detection will run on the thumbnails after they've been generated. Thumbnails are used (rather than original
+images) because image recognition models usually work faster with lower-res images. Note that AI processing can be extremely CPU-intensive;
+for this reason you may want to configure the time-range for processing so that AI processing will only happen during a period when your
+NAS isn't being used for much else.
Once step #2 finishes, the first full-index is complete. From that point onwards, changes to the image library should be picked up almost instantly
and processed quickly; adding a new folder of photos after a day out should only take a few seconds to be indexed, and a couple of minutes for the
thumbnails to be generated.
+Note that if you want to exclude any folders from Damselfly's indexing process, just create a file named `.nomedia` in the folder, and it will
+be skipped.
+
## How does Damselfly's Image/Object/Face Recognition Work?
-The latest version of Damselfly includes machine-learning functionality to find objects and faces in your images, and tag
-them. If you're interested in the technical design/implementation of this feature, there's an article about it
+The latest version of Damselfly includes machine-learning functionality to find objects and faces in your images, and tag them.
+If you're interested in the technical design/implementation of this feature, there's an article about it
[here](https://damselfly.info/face-recognition-in-net-the-good-the-bad-and-the-ugly/).
Faces and objects that are recognised will be displayed as special tags, alongside normal keyword-tags, when browsing the