annotate src/library/library.cc @ 383:27c462bc7815

make the "Now Playing" page actually work
author Paper <paper@tflc.us>
date Thu, 06 Nov 2025 07:10:58 -0500
parents 0265e125f680
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 :) */
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
19 UpdateWatchers();
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
20 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
21
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
22 void Database::UpdateWatchers()
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 /* TODO also need to remove unused watchers */
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
25 for (const auto &p : session.config.library.paths) {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
26 if (watchers_.count(p))
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
27 continue;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
28
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
29 watchers_[p].reset(Filesystem::GetRecursiveFilesystemWatcher(reinterpret_cast<void *>(this), p, Database::StaticEventHandler));
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
30 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
31 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
32
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
33 bool Database::GetPathAnimeAndEpisode(const std::string &basename, int *aid, int *ep)
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 anitomy::Anitomy anitomy;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
36 anitomy.Parse(basename);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
37
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
38 const auto &elements = anitomy.elements();
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
39
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
40 const std::string title = Strings::ToUtf8String(elements.get(anitomy::kElementAnimeTitle));
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 int id = Anime::db.LookupAnimeTitle(title);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
43 if (id <= 0 || (find_id_ && find_id_.value() != id))
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
44 return false;
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 episode =
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
47 Strings::ToInt<int>(Strings::ToUtf8String(elements.get(anitomy::kElementEpisodeNumber)));
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
48
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
49 *aid = id;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
50 *ep = episode;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
51 return true;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
52 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
53
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
54 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
55 {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
56 std::string bname = path.filename().u8string();
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
57 int aid, ep;
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 if (!GetPathAnimeAndEpisode(bname, &aid, &ep))
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
60 return;
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 switch (event) {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
63 case Filesystem::IWatcher::Created:
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
64 items[aid][ep] = path;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
65 break;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
66 case Filesystem::IWatcher::Deleted:
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
67 /* kill it off */
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
68 items[aid].erase(ep);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
69 if (items[aid].empty())
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
70 items.erase(aid);
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
71 break;
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
72 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
73 }
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
74
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
75 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
76 {
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
77 /* Forward to class function */
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
78 reinterpret_cast<Database *>(opaque)->EventHandler(path, 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
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
81 std::optional<std::filesystem::path> Database::GetAnimeFolder(int id)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
82 {
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
83 // 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
84 //
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
85 // 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
86 // 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
87 // 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
88 // 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
89 // 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
90
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
91 for (const auto &[anime_id, episodes] : items) {
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
92 if (id != anime_id)
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
93 continue;
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
94
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
95 for (const auto &[episode, path] : episodes)
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
96 return path.parent_path();
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
97
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
98 break;
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
99 }
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 return std::nullopt;
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
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
104 /* 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
105 void Database::Refresh(std::optional<int> find_id)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
106 {
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
107 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
108
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
109 UpdateWatchers();
222
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
110
382
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
111 for (const auto &w : watchers_)
0265e125f680 filesystem: implement filesystem watcher
Paper <paper@tflc.us>
parents: 369
diff changeset
112 w.second->Process();
222
b9f111d84d95 *: move to semver, remove old macos build, add library files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
113 }
223
84e0a3c4737a library: implement menu bar buttons
Paper <mrpapersonic@gmail.com>
parents: 222
diff changeset
114
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
115 void Database::Refresh()
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
116 {
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
117 Refresh(std::nullopt);
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
118 }
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
119
369
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
120 void Database::Refresh(int id)
47c9f8502269 *: clang-format all the things
Paper <paper@tflc.us>
parents: 366
diff changeset
121 {
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
122 Refresh(std::optional<int>(id));
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
123 }
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
124
383
27c462bc7815 make the "Now Playing" page actually work
Paper <paper@tflc.us>
parents: 382
diff changeset
125 // TODO export to JSON on exit
366
886f66775f31 animone: add preliminary AT-SPI stuff
Paper <paper@tflc.us>
parents: 347
diff changeset
126
328
71396ecb6f7e library: convert to class + database
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
127 Database db;
71396ecb6f7e library: convert to class + database
Paper <paper@paper.us.eu.org>
parents: 319
diff changeset
128
258
862d0d8619f6 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents: 228
diff changeset
129 } // namespace Library