{"id":13562338,"url":"https://github.com/NotCompsky/tagem","last_synced_at":"2025-04-03T18:33:25.702Z","repository":{"id":65517453,"uuid":"223421808","full_name":"NotCompsky/tagem","owner":"NotCompsky","description":"A broad family of utilities for organising files based on hierarchical tagging, from web server to a computer vision dataset creation pipeline.","archived":false,"fork":false,"pushed_at":"2021-02-07T15:55:51.000Z","size":3823,"stargazers_count":95,"open_issues_count":4,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-04T14:44:55.243Z","etag":null,"topics":["cpp","ffmpeg","file-manager","file-server","filemanager","heirarchical-tags","mysql","qt5","server","sql","tagging","wangle"],"latest_commit_sha":null,"homepage":"","language":"C++","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/NotCompsky.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-11-22T14:35:31.000Z","updated_at":"2024-04-28T20:46:42.000Z","dependencies_parsed_at":"2023-01-26T23:30:59.049Z","dependency_job_id":null,"html_url":"https://github.com/NotCompsky/tagem","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotCompsky%2Ftagem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotCompsky%2Ftagem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotCompsky%2Ftagem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotCompsky%2Ftagem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NotCompsky","download_url":"https://codeload.github.com/NotCompsky/tagem/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247057020,"owners_count":20876495,"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","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":["cpp","ffmpeg","file-manager","file-server","filemanager","heirarchical-tags","mysql","qt5","server","sql","tagging","wangle"],"created_at":"2024-08-01T13:01:07.410Z","updated_at":"2025-04-03T18:33:20.688Z","avatar_url":"https://github.com/NotCompsky.png","language":"C++","readme":"\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"https://user-images.githubusercontent.com/30552567/88488637-77c22180-cf86-11ea-955a-484d6ca08b27.png\"/\u003e\n\t\u003ch1 align=\"center\"\u003etagem\u003c/h1\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/NotCompsky/tagem\"/\u003e\u003c/a\u003e\n\t\u003ca href=\"https://github.com/notcompsky/tagem/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/NotCompsky/tagem\"/\u003e\u003c/a\u003e\n\t\u003ca href=\"https://hub.docker.com/repository/docker/notcompsky/tagem/tags\"\u003e\u003cimg src=\"https://img.shields.io/docker/image-size/notcompsky/tagem?label=Docker%20image\"/\u003e\u003c/a\u003e\n\t\u003ca href=\"https://github.com/notcompsky/tagem/graphs/commit-activity\"\u003e\u003cimg src=\"https://img.shields.io/github/commit-activity/w/NotCompsky/tagem\"/\u003e\n\t\u003ca href=\"https://github.com/notcompsky/tagem/graphs/contributors\"\u003e\u003cimg src=\"https://img.shields.io/github/contributors/NotCompsky/tagem\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://discord.gg/DnD7RJA\"\u003e\u003cimg src=\"https://img.shields.io/discord/736649679575580814?label=Discord\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n![screenshot](https://user-images.githubusercontent.com/30552567/88522680-a1af2e80-cfee-11ea-8301-0148374a2ddd.jpg)\n\n## Description\n\nA single page application, with associated command-line utilities, for the rapid categorising and accessing of files, based on assignable attributes such as (heirarchical) tags, named variables, file sizes, hashes, and audio duration.\n\n## Features\n\n* **Supports most common file formats**\n* **Hashing** of local files.\n  * Hashes include MD5, SHA256, and DCT (visual hashing of images and video).\n  * These hashes can be used in `qry` to facilitate fast manual de-duplication.\n  * Hashing of remote files is planned.\n* **Text editor**\n  * More of a text *creator* atm, as editing existing files is currently restricted.\n* Ordering, filtering etc. of results in the tables on the page.\n* **qry**: A simple query language that allows for short and human-friendly queries that automatically translate to complex SQL queries\n  * Combine ANDs and ORs (intersections and unions) of many different filters (for attributes like size, views, likes, tags; hashes in common with other files; etc).\n  * It can search for all types of things, not just files but also the [tags themselves](https://user-images.githubusercontent.com/30552567/86843555-a000e380-c09e-11ea-9a0d-5a5e4ae38261.png).\n  * See [the full documentation](https://notcompsky.github.io/tagem-eg/#?foobar).\n* **Heirarchical tags**\n  * Any tag can have any number of parent tags and any number of child tags.\n* **Everything can be tagged**\n  * Eras, files, directories, devices, and even tags themselves (as parent tags)\n  * For instance, the directory `https://www.youtube.com/watch?v-` could be tagged `Video`, and that tag will be applied to all files within.\n* **Support for remote files**\n  * Remote files are as accessible as local files (except for some sites that tell the browser not to display them within iframes - though there's a relatively simple workaround for that).\n  * You can add files from the server's attached storage devices, and also from remote websites (including an option for downloading with youtube-dl). Local copies of remote files are treated as backups, and are listed on the remote file's page.\n  * With the `view filesystem` option, this means that - provided the server has access to a script written for the specific website - a website's contents could be easily viewable in the table view.\n* **Eras**\n  * Tagged time intervals of audio and video files.\n  * These can be searched for, and used in playlists interchangeably with files themselves.\n  * Eras can be downloaded (from a local file or remote URL) into their own file.\n    * NOTE: This currently requires `ffmpeg` to be installed alongside this server. However, it will eventually be combined into the server itself.\n* **Playlists**\n  * Playlists can be created on the fly out of any selection of files and/or eras (in any combination).\n* **Support for other databases**\n  * Files can be associated with *posts* from other databases, so long as those databases follow a strict structure.\n  * For instance, a Reddit post could be scraped, and associated with the URL of the linked article, as [here](https://notcompsky.github.io/tagem-eg/#f1726349)\n  * Each external database can, if it includes the necessary tables, display a lot more information than just the comments under a post, even listing all the posts (translated to our files) that a single user has commented on.\n  * [An example script for scraping Reddit posts](scripts/record-reddit-post) is included in this project\n* **Tag thumbnails**\n  * These thumbnails are inherited from their parents, unless the child has a thumbnail of its own.\n* **file2 values**\n  * Files can be assigned arbitrary values, currently integers and datetimes.\n  * For instance, you could have a `Score` attribute for each user to assign to files.\n* **Permissions system**\n  * Different users can be assigned different blocklists of tags, and will not be able to view any era/file/directory/device with such a tag, or a descendant of such a tag.\n  * Different users can have different allowed actions, such as viewing files, editing tags, creating eras, assigning tags, and adding files.\n  * A big caveat here is that **the login system is currently only a placeholder** - it does not yet even ask for a password.\n* **Low footprint**\n  * Almost all executed JavaScript was written by hand - only one 3rd party library is loaded\n  * On Firefox, each page consumes 10-15MB - comparable to a Google search results page\n  * The CSS is designed to avoid unnecessarily moving parts\n\n## Demonstration\n\nA neutered version of this app is hosted [here](https://notcompsky.github.io/tagem-eg/). GitHub does not allow it to be interactive, so most features are disabled - it is basically just a demonstration of the front-end.\n\nA sample of features in the demo:\n* The ability to create and view playlists of 'eras' - [e.g.](https://notcompsky.github.io/tagem-eg/#F27240@61.156-71.18095,27240@142.25289-152.22987,27240@179.79853-181.03303,27240@9.92681-40.53999) and [e.g.](https://notcompsky.github.io/tagem-eg/#F1716907@40.18624-62.19732,1716907@508.84786-590.06463,1716905@1413.42456-1479.68176,1717041@24.01881-36.59333,1716865@18.66585-26.29306,1716865@562.62463-709.87243,1705870@4725.33544-4805.94384,1705547@1313.98913-1397.71997,1705815@3253.74096-3333.7163,1716874@579.61828-648.75299,1706072@2119.89111-2256.44628,1705917@2001.07617-2067.96728,1717395@1440.27014-1589.06665,1716948@57.99343-70.49639,1716948@640.38897-730.95611,1716910@1710.13073-1827.7821) and [e.g.](https://notcompsky.github.io/tagem-eg/#F1705345@0-7.34816,1705345@1491.77014-1552.95642,1705351@5.31989-11.7427,1705347@1012.92541-1068.25573,1705347@3019.88085-3087.77734,1705347@3966.50854-3998.92333,1705866@1107.79541-1176.36669,1705866@1745.14575-1813.09997,1705866@2472.19604-2549.5144,1705870@24.32478-92.60926,1705870@2585.84594-2641.48193,1705870@4725.33544-4805.94384,1705547@1313.98913-1397.71997,1705547@2585.45458-2663.77319,1705547@4101.60791-4173.92968,1705470@1943.51049-2002.19677,1705823@24.97947-90.0026,1705832@1375.32324-1536.51953,1705832@3034.65454-3097.44873,1705832@4545.26953-4602.98974,1705846@20.1248-78.50012,1705846@2446.10449-2511.80273,1705846@4625.38525-4694.35742,1705815@1692.83166-1756.73364,1705815@3253.74096-3333.7163,1705815@4719.40087-4822.58154,1705809@1806.38195-1874.09887,1705809@3264.85498-3320.38647,1705809@4831.96435-4884.958,1705860@1758.8861-1822.54785,1705860@3275.333-3332.60791,1705860@4593.94824-4676.33837,1705860@4594.28173-4689.40722,1705878@27.21296-95.50437,1705878@4268.15527-4356.72509,1705891@1689.41638-1758.81506,1705891@3263.03686-3336.74682,1705891@4415.93408-4477.18701,1705412@15.94564-24.24893,1705412@839.64813-896.78051,1705412@1535.432-1619.69934,1705412@2463.92456-2523.91943,1705424@701.73681-764.88629,1705424@1401.32873-1483.94763,1705424@2895.98388-2960.04321,1705398@1012.56713-1095.80151,1705398@1935.06652-1999.94238,1716874@579.61828-648.75299,1705640@1415.02917-1468.69812,1705640@2956.57495-3030.27978,1705640@4385.35888-4456.58007,1706072@2119.89111-2256.44628,1705815@4719.3999-4822.29638,1719652@1322.78466-1372.9884,1719652@1479.03601-1519.01354,1719652@2198.69848-2210.94311,1719652@70.03448-89.14099,1705897@12.64718-73.04966,1705897@1742.54699-1805.734,1705897@4166.44873-4255.32226,1705917@2001.07617-2067.96728,1705917@3655.1582-3757.28491,1705914@895.75866-977.6336,1705909@10.68156-80.87898,1705909@2731.58203-2794.85644,1716818@0-6.82277,1716817@0-10.37127,1716817@3627.72338-3703.10571,1716812@0-8.23822,1716811@0-9.47052,1716810@0-7.93049,1716810@17.89222-25.24168,1716810@711.82012-807.62402,1716809@0-6.8232,1705355@0-7.51299,1705358@0-7.25687,1725941@0-8.27504,1725941@1807.9176-1851.80444,1716822@0-10.66821,1716822@1091.70922-1173.36694,1716822@2665.48144-2738.7622,1716813@0-9.80866,1716813@953.33502-1086.00659,1716813@1917.53857-2075.53613,1716808@0-10.2472,1716808@1188.61364-1275.64941,1716808@2528.53149-2604.33496,1716808@3245.61108-3349.78881,1716804@0-8.31033,1716804@1464.35217-1539.05932,1716804@2456.20385-2520.13916,1716799@0-7.24102,1717382@79.9637-84.10654,1717395@26.19703-36.92356,1717395@1440.27014-1589.06665,1717395@2501.8811-2583.22387,1717395@3628.19555-3716.23193,1717438@1311.00561-1371.21911,1717438@2860.66748-2938.08032,1726344@0-8.90829)\n* If you \"log in\", you can view an example administrator dashboard.\n\nSee the user guide (linked below) for some examples of features.\n\n## User Guide\n\nFor those using the web app\n\nSee [USER_GUIDE.md](USER_GUIDE.md)\n\n## Server Admin Guide\n\nFor those running the server\n\nSee [ADMIN_GUIDE.md](ADMIN_GUIDE.md)\n\nSee [ADMIN_ADVANCED_USAGE.md](ADVANCED_USAGE.md) for more complex features and use cases.\n\n## Installation\n\n### Server\n\nSee [INSTALL.md](INSTALL.md).\n\n### Scripts\n\nYou'll probably want to add the [scripts](scripts/) directory to your `PATH` environmental variable, or perhaps just copy the scripts to `/usr/local/bin`.\n\nThe [Reddit userscript](server/client/userscripts/reddit.js) can be added the usual way you add userscripts.\n\n## Roadmap\n\nSee [the list of officially planned features](https://github.com/NotCompsky/tagem/issues/2).\n\n## Contributing\n\nI'm very happy to consider pull requests. Particularly - but definitely not limited to - front-end development.\n\nTranslations of documentation is also of course welcome, alongside bug reports, and general feedback.\n\n### Back End\n\nSee [COMPILING.md](COMPILING.md), [CONTRIBUTING.md](CONTRIBUTING.md), and [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md).\n\n### Front End\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md), and [FRONTEND.md](FRONTEND.md).\n\n### Stats\n\nSee [STATS.md](STATS.md) for some Git contribution graphs.\n\n## Background\n\nIf you feel like there aren't enough blogs on the internet, [here's another](https://gist.github.com/NotCompsky/f1ab63fa2f191b156b9187b111449d20). It's a look at how this project evolved from some unlikely decisions, as I'm personally interested in how [the Butterfly Effect](https://en.wikipedia.org/wiki/Butterfly_effect) occurs in software development.\n\n## FAQ\n\n### What files does it support?\n\nObviously it should support the viewing of any kind of file that your browser does. Practically, detecting the file type can be a bit of an issue - it is fully accurate for files it downloads, it's pretty good for videos and audio, but if you rename a PNG file to a JPEG there's no current way it will be able to tell it's actually a PNG.\n\n## Similar Projects\n\n* [Etiquette](https://github.com/voussoir/etiquette)\n  * The most similar project, as it also features heirarchical tagging\n  * Flask + SQLite app written in Python\n* [Video Hub App](https://github.com/whyboris/Video-Hub-App)\n  * For managing video files\n  * Electron app written in Typescript\n\n## License\n\nThis code is licensed only under [the GPL-3 license](LICENSE).\n","funding_links":[],"categories":["C++"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNotCompsky%2Ftagem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNotCompsky%2Ftagem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNotCompsky%2Ftagem/lists"}