annotate src/library/library.cc @ 398:650a9159a0e7

filesystem: implement win32 watchers These are really nice :)
author Paper <paper@tflc.us>
date Fri, 07 Nov 2025 14:32:11 -0500
parents 963047512d34
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
222
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
1 #include "library/library.h"
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
2 #include "core/anime_db.h"
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 228
diff changeset
3 #include "core/session.h"
222
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
4 #include "core/strings.h"
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
5
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
6 #include "anitomy/anitomy.h"
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
7
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
8 #include <filesystem>
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 228
diff changeset
9 #include <string>
222
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
10 #include <unordered_map>
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
11
223
84e0a3c4737a library: implement menu bar buttons
Paper <mrpapersonic@gmail.com>
parents: 222
diff changeset
12 #include <iostream>
84e0a3c4737a library: implement menu bar buttons
Paper <mrpapersonic@gmail.com>
parents: 222
diff changeset
13
84e0a3c4737a library: implement menu bar buttons
Paper <mrpapersonic@gmail.com>
parents: 222
diff changeset
14 namespace Library {
84e0a3c4737a library: implement menu bar buttons
Paper <mrpapersonic@gmail.com>
parents: 222
diff changeset
15
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
16 Database::Database()
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
17 {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
18 /* Do this immediately :) */
398
650a9159a0e7 filesystem: implement win32 watchers
Paper <paper@tflc.us>
parents: 393
diff changeset
19 /* Nevermind, this causes an immediate segfault on Windows
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
20 UpdateWatchers();
398
650a9159a0e7 filesystem: implement win32 watchers
Paper <paper@tflc.us>
parents: 393
diff changeset
21 */
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
22 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
23
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
24 void Database::UpdateWatchers()
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
25 {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
26 /* TODO also need to remove unused watchers */
398
650a9159a0e7 filesystem: implement win32 watchers
Paper <paper@tflc.us>
parents: 393
diff changeset
27
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
28 for (const auto &p : session.config.library.paths) {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
29 if (watchers_.count(p))
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
30 continue;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
31
393
963047512d34 *: clang-format
Paper <paper@tflc.us>
parents: 383
diff changeset
32 watchers_[p].reset(
963047512d34 *: clang-format
Paper <paper@tflc.us>
parents: 383
diff changeset
33 Filesystem::GetRecursiveFilesystemWatcher(reinterpret_cast<void *>(this), p, Database::StaticEventHandler));
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
34 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
35 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
36
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
37 bool Database::GetPathAnimeAndEpisode(const std::string &basename, int *aid, int *ep)
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
38 {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
39 anitomy::Anitomy anitomy;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
40 anitomy.Parse(basename);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
41
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
42 const auto &elements = anitomy.elements();
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
43
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
44 const std::string title = Strings::ToUtf8String(elements.get(anitomy::kElementAnimeTitle));
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
45
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
46 const int id = Anime::db.LookupAnimeTitle(title);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
47 if (id <= 0 || (find_id_ && find_id_.value() != id))
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
48 return false;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
49
393
963047512d34 *: clang-format
Paper <paper@tflc.us>
parents: 383
diff changeset
50 const int episode = Strings::ToInt<int>(Strings::ToUtf8String(elements.get(anitomy::kElementEpisodeNumber)));
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
51
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
52 *aid = id;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
53 *ep = episode;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
54 return true;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
55 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
56
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
57 void Database::EventHandler(const std::filesystem::path &path, Filesystem::IWatcher::Event event)
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
58 {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
59 std::string bname = path.filename().u8string();
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
60 int aid, ep;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
61
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
62 if (!GetPathAnimeAndEpisode(bname, &aid, &ep))
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
63 return;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
64
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
65 switch (event) {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
66 case Filesystem::IWatcher::Created:
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
67 items[aid][ep] = path;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
68 break;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
69 case Filesystem::IWatcher::Deleted:
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
70 /* kill it off */
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
71 items[aid].erase(ep);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
72 if (items[aid].empty())
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
73 items.erase(aid);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
74 break;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
75 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
76 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
77
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
78 void Database::StaticEventHandler(void *opaque, const std::filesystem::path &path, Filesystem::IWatcher::Event event)
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
79 {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
80 /* Forward to class function */
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
81 reinterpret_cast<Database *>(opaque)->EventHandler(path, event);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
82 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
83
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
84 std::optional<std::filesystem::path> Database::GetAnimeFolder(int id)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
85 {
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
86 // this function sucks, but it's the most I can really do for now.
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
87 //
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
88 // in the future the Refresh() function should look for directories
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
89 // as well that fit the anime name and *also* have episodes in them.
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
90 // it should give each of these directories a rating by how many
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
91 // episodes are contained in them. whichever directory has more episodes
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
92 // wins, or the first found if there is an equal amount.
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
93
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
94 for (const auto &[anime_id, episodes] : items) {
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
95 if (id != anime_id)
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
96 continue;
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
97
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
98 for (const auto &[episode, path] : episodes)
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
99 return path.parent_path();
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
100
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
101 break;
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
102 }
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
103
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
104 return std::nullopt;
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
105 }
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
106
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
107 /* TODO shove this into a separate thread; currently it blocks */
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
108 void Database::Refresh(std::optional<int> find_id)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
109 {
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
110 find_id_ = find_id;
222
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
111
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
112 UpdateWatchers();
222
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
113
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
114 for (const auto &w : watchers_)
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
115 w.second->Process();
222
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
116 }
223
84e0a3c4737a library: implement menu bar buttons
Paper <mrpapersonic@gmail.com>
parents: 222
diff changeset
117
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
118 void Database::Refresh()
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
119 {
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
120 Refresh(std::nullopt);
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
121 }
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
122
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
123 void Database::Refresh(int id)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
124 {
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
125 Refresh(std::optional<int>(id));
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
126 }
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
127
383
27c462bc7815 make the "Now Playing" page actually work
Paper <paper@tflc.us>
parents: 382
diff changeset
128 // TODO export to JSON on exit
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
129
328
71396ecb6f7e library: convert to class + database
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
130 Database db;
71396ecb6f7e library: convert to class + database
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
131
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 228
diff changeset
132 } // namespace Library