{"id":21981977,"url":"https://github.com/DamiaV/ImagesLibrary","last_synced_at":"2025-07-22T20:32:34.652Z","repository":{"id":232014480,"uuid":"782636574","full_name":"DamiaV/ImagesLibrary","owner":"DamiaV","description":"A JavaFX application to manage images with a tag system.","archived":false,"fork":false,"pushed_at":"2025-07-17T15:58:33.000Z","size":1142,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-17T18:12:16.347Z","etag":null,"topics":["image","image-management","java","java17","javafx","management-system","tag","tagging"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DamiaV.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-04-05T17:45:21.000Z","updated_at":"2025-01-30T19:44:30.000Z","dependencies_parsed_at":"2024-07-21T09:49:06.219Z","dependency_job_id":"08e3b27b-0dd1-45d8-a54e-21420903f266","html_url":"https://github.com/DamiaV/ImagesLibrary","commit_stats":null,"previous_names":["darmo117/imageslibrary","damiav/imageslibrary"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/DamiaV/ImagesLibrary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DamiaV%2FImagesLibrary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DamiaV%2FImagesLibrary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DamiaV%2FImagesLibrary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DamiaV%2FImagesLibrary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DamiaV","download_url":"https://codeload.github.com/DamiaV/ImagesLibrary/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DamiaV%2FImagesLibrary/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266567466,"owners_count":23949357,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["image","image-management","java","java17","javafx","management-system","tag","tagging"],"created_at":"2024-11-29T17:20:41.457Z","updated_at":"2025-07-22T20:32:34.636Z","avatar_url":"https://github.com/DamiaV.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Image Library\n\n**Image Library** lets you manage images and videos by associating tags to them.\nThis is a full re-implementation of my [Python-based application](https://github.com/DamiaV/ImageDatabase).\n\nMain features:\n\n- Image and video file tagging:\n    - Supported image formats: BMP, GIF, JPEG, PNG, WEBP\n    - Supported video formats: AVI, MOV, MP4, OGV, WEBM\n- Tagged files searching with a simple querying language\n- Replace/move files while keeping all associated tags\n- Manage tags (create, remove, organize with types)\n- Tag completion in queries and tags editor\n- Apply pattern-based transformations to file paths and tags\n- List similar images (hash-based); not available for video files\n- Custom-built video player for video files (only supports MP4 for now, other formats only show the first frame)\n- Fully translated interface, available in English, French, and Esperanto\n\n# Installation\n\nSimply drop the `.jar` file where you want the application to run from.\n\n# Updating\n\nReplace the old `.jar` file by the new one. The database will be updated automatically the next time the app is\nlaunched.\n\n# Usage\n\n**Note:** video files are not playable from the application itself, only their first frame is displayed.\n\n## Adding files\n\nGo through the *File* menu and click on *Add Files* to add files or *Add Directory* to import all valid files from a\ndirectory; or you can simply drag-and-drop files and directories into the main window.\n\nYou should see a dialog window with a preview of an image and a text area. This text area is where you have to type\nthe tags for the displayed image. Once you’re done, click on *Next* to go to the next file or *Finish* to finish. You\ncan click on *Skip* to skip the current file and go directly to the next one.\n\nWhile editing tags, you can choose where to move the current file by clicking on *Move to…*; the path is then displayed\nbelow the button.\n\nIf the application found similar images already registered, a button labelled *Show similar images…* will be available\nabove the text area. It will show a list of similar images, ordered by decreasing estimated similarity. You can select\none of these images and copy its tags by clicking on the button above the tags list (**Warning**: it will replace all\ntags in the text box).\n\n## Searching for registered files\n\nYou can search for files by typing queries in the search field.\n\n### Basic syntax\n\nTag names can contain any Unicode letters and digits, as well as underscores `_`.\n\n- `a` will match files with tag `a`\n- `a b` will match files with both tags `a` *and* `b`\n- `a + b` will match files with tags `a` *or* `b` or *both*\n- `-a` will match files *without* tag `a`\n- Parentheses `(` and `)` can be used to group query elements\n\n### Flags\n\nFlags are special tags that represent a specific file property.\n\n#### Syntax\n\n```\n#\u003cname\u003e\n```\n\nWhere `\u003cname\u003e` is the flag’s name.\n\n#### Available flags\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eName\u003c/th\u003e\n        \u003cth\u003eDescription\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eno_tags\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eMatch files that have no attached tags\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eno_file\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eMatch entries whose file is missing\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eno_hash\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eMatch images whose hash could not be computed\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003evideo\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eMatch files that are videos based on their extension\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n#### Examples\n\n```\n#no_file a b\n```\n\nThis will match all entries whose file is missing that have both tags `a` and `b`.\n\n```\n#no_file #no_tags\n```\n\nThis will match all images whose file is missing and that have no tags.\n\n### Pseudo-tags\n\n#### Syntax\n\nThere exist special tags called *pseudo-tags*. Their syntax is as follows:\n\n```\n\u003cname\u003e=\u003cflags\u003e\u003cvalue\u003e\n```\n\nWhere `\u003cname\u003e` is the pseudo-tag’s name, `\u003cvalue\u003e` is its value, and `\u003cflags\u003e` are optional flags that modify how the\nvalue is interpreted.\n\nThis value may be one of two types:\n\n- A string, delimited by double quotes `\"` (e.g.: `\"this is text\"`), to specify a plain text value. String values may\n  support some special placeholder tags: `?` to match 0 or 1 character, `*` to match 0 or more characters. For instance,\n  `\"a*b\"` will match any text starting with an `a` and ending with a `b` with any character in-between.\n  You can disable them by putting a `\\ ` before (e.g.: `\\*` will match the character `*`\n  literally). You also have to escape all single `\\ ` by doubling them: `\\\\`.\n  Double quotes must be escaped as well.\n- A RegEx, delimited by slashes `/` (e.g.: `/this is a RegEx/`). RegExs use the Java Pattern syntax.\n  Note that you have to escape all `/` too, as this is the delimiter.\n\nBoth types support flags. Flags are specified before the value, without any spaces in-between (e.g. `i/regex/`\nand `i\"text\"`).\n\nAvailable flags are:\n\n- `s` to force case-sensitive matching\n- `i` to force case-insensitive matching\n\nThe default case-sensitivity depends on the app’s configuration.\n\nFull syntax examples:\n\n- `ext=i\"jp?g\"` matches all files whose extension is either `jpg` or `jpeg`, regardless of case.\n- `name=s/illustration_\\d+/` matches all files whose name contains the string `illustration_` followed by a one or more\n  digits (e.g.: `illustration_1` or `illustration_22_background`).\n- `ext=\"png\"` matches all files whose extension is `png`, using the application’s default case-sensitivity.\n\n#### Available pseudo-tags\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eName\u003c/th\u003e\n        \u003cth\u003eSupports string placeholders\u003c/th\u003e\n        \u003cth\u003eSupports RegEx values\u003c/th\u003e\n        \u003cth\u003eDescription\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eext\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eYes\u003c/td\u003e\n        \u003ctd\u003eYes\u003c/td\u003e\n        \u003ctd\u003eMatch files based on their extension (without the dot)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eYes\u003c/td\u003e\n        \u003ctd\u003eYes\u003c/td\u003e\n        \u003ctd\u003eMatch files based on their name, including extension\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003epath\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eYes\u003c/td\u003e\n        \u003ctd\u003eYes\u003c/td\u003e\n        \u003ctd\u003eMatch files based on their full path\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003esimilar_to\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eNo\u003c/td\u003e\n        \u003ctd\u003eNo\u003c/td\u003e\n        \u003ctd\u003eMatch images that are similar to the specified one\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n#### Examples\n\n```\npath=\"/home/user/images/summer?.png\n```\n\nThis will match images with *paths* like `/home/user/images/summer.png`, `/home/user/images/summer1.png`,\n`/home/user/images/summers.png`, etc.\n\n```\nsimilar_to=\"/home/user/images/house.png\"\n```\n\nThis will match all images that are similar to `/home/user/images/house.png` (if it is registered in the database).\n\n```\na (b + c) + -(d + e) ext=i\"jp?g\"\n```\n\nHere’s how to interpret it:\n\n- `a (b + c)` returns the set of files with both tags `a` and `b` and/or both tags `a` and `c`.\n- `-(d + e) ext=i\"jp?g\"` = `-d -e ext=i\"jp?g\"` returns the set of JPG images without tags `d` nor `e`; note the `?` to\n  match both `jpg` and `jpeg` extensions, and the `i` flag to disregard case.\n\nThe result is the union of both file sets.\n\n### Tag definitions\n\nThe application supports tag definitions, i.e. tags defined from tag queries (e.g.: tag `animal` could be defined\nas `cat + dog + bird`). You cannot tag files directly with tags that have a definition, they exist only for querying\npurposes.\n\n# Configuration file\n\nThe following configurations can be modified in the `settings.ini` file. If the file does not exist, launch the\napplication at least once to create it.\n\n- Section `[App]`:\n    - `database_file`: path to database file; can be absolute, or relative to the app’s root directory\n    - `language`: language code of app’s interface; can be either `en` for English, `fr` for French, or `eo` for\n      Esperanto\n    - `theme`: the theme to apply; can be either `light` or `dark`\n- Section `[Queries]`:\n    - `case_sensitive_by_default` (boolean): specifies whether pseudo-tags matches should be case sensitive by default\n    - `syntax_highlighting` (boolean): specifies whether tag queries syntax highlighting should be activated\n- Section `[Slideshow]`:\n    - `delay` (integer): the delay in seconds between each slideshow image\n    - `shuffle` (boolean): specifies whether slideshow images should be shuffled\n\n# Found a bug?\n\nIf you encounter a bug or the app crashed, check the error log located in the `logs` directory where you put the\napplication’s JAR file and see if there’s an error.\nYou can send me a message or open an issue with the error and a description of how you got this error, that would be\nreally appreciated!\n\n# Documentation\n\nSoon…\n\n# Requirements\n\n- [Java 17 or later](https://www.oracle.com/java/technologies/downloads/) (untested on Java 18+)\n\n# Author\n\n- Damia Vergnet [@DamiaV](https://github.com/DamiaV)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDamiaV%2FImagesLibrary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FDamiaV%2FImagesLibrary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDamiaV%2FImagesLibrary/lists"}