{{ message }}
9 |{{ subtitle }}
8 |{{ title }}
5 |21 | {{ description }} 22 |
23 |{{ message }}
11 |4 | Warning: Make a backup before using these tools. I am not 5 | responsible for any data loss or issues that may occur by using these 6 | tools. Visit 7 | Backups 13 | to create a backup before proceeding. 14 |
15 |Please configure the server URL in the settings.
18 |{{ hint }}
19 |Select a tool to get started
8 |
13 |
14 |
15 |
Work in Progress
16 |
17 |
21 | Disclaimer: API scores and all content on this page 22 | reflect my personal opinion and do not represent the views of the ABS 23 | dev team or ABS as a whole. Creating an app takes significant effort, so 24 | publishing even one is already a big achievement. If you find any 25 | mistakes or believe something should be updated, feel free to contact me 26 | on 27 | Discord (@vito0912) 30 | or send me an email here. 31 |
32 | 33 |12 | {{ formatTime(last7) }} 13 |
14 |7 days
15 |18 | {{ formatTime(last30) }} 19 |
20 |30 days
21 |24 | {{ formatTime(last365) }} 25 |
26 |365 days
27 |30 | {{ formatTime(allTime) }} 31 |
32 |All time
33 |{{ hint }}
26 |Select a section to get started
8 |23 | {{ section.description }} 24 |
25 |24 | {{ device.name }} 25 |
26 |{{ device.os }}
27 |31 | {{ device.count }} 32 |
33 |sessions
34 |No devices found
48 |No data available
49 |33 | {{ project.description }} 34 |
35 | 36 |Most active day
46 |{{ peakDay }}
47 |38 | {{ book.title }} 39 |
40 |{{ book.author }}
41 |No data available
60 |{{ formatHour(hour - 1) }}
33 |34 | {{ formatTime(hourData[String(hour - 1)] ?? 0) }} 35 |
36 |Peak listening
58 |{{ formatHour(peakHour) }}
59 |11 | Note: All options you save are only stored locally and never leave 12 | your browser other than to contact the address you saved above. All 13 | requests are made client side and you can inspect them using your 14 | browser's developer tools. 15 |
16 | 17 |
19 | Note: You need to allow CORS for this website
20 | inside your Audiobookshelf server. Visit your Audiobookshelf
21 | server's settings page and add
22 |
23 | https://abstoolbox.vito0912.de
24 |
25 | as an allowed origin. Without this all request will fail with a CORS
26 | error.
27 |
31 | Alternatively, you can install a browser extension to temporarily 32 | disable CORS. However, please be aware that many of these extensions 33 | pose security risks. 34 |
35 |
43 | {{ client.language }}
33 |
52 | Why is this displayed?
54 | I personally test every app listed here. Apps built heavily
55 | with AI tend to change frequently, break more often, and
56 | require significantly more time to test and document.
57 | This badge doesn't reflect the app's quality directly, but
58 | indicates that the app was primarily written by AI rather than
59 | a human developer. This may result in potential security
60 | concerns, maintainability issues, or unexpected behavior.
61 | AI usage is completely fine to help. Heavy AI usage for me
62 | means that code was obviously generated (only or by a big
63 | margin) by AI.
64 |
{{ note.text }}
119 |${JSON.stringify(newSession, null, 2)}`);
302 | addLog(`Session ${newSession.id} updated`);
303 | }
304 |
305 | addLog("=== Adding Progress (This may take a while) ===");
306 |
307 | for (const userId of Object.values(userMapping)) {
308 | const userProgress = progressMapping[userId];
309 |
310 | const apiKeyResponse = (
311 | await post("/api/api-keys", {
312 | name: "Migration Script",
313 | expiresIn: expiresInSeconds,
314 | isActive: true,
315 | userId: userId,
316 | })
317 | ).data;
318 |
319 | const apiKey = apiKeyResponse.apiKey.apiKey;
320 | const apiKeyId = apiKeyResponse.apiKey.id;
321 |
322 | const sessions = newSessions.filter(
323 | (session: any) => session.userId === userId,
324 | );
325 |
326 | await axios.patch(
327 | `${baseDomain.value}api/me/progress/batch/update`,
328 | userProgress,
329 | {
330 | headers: {
331 | Authorization: `Bearer ${apiKey}`,
332 | },
333 | },
334 | );
335 |
336 | await axios.post(
337 | `${baseDomain.value}api/session/local-all`,
338 | {
339 | sessions: sessions,
340 | },
341 | {
342 | headers: {
343 | Authorization: `Bearer ${apiKey}`,
344 | },
345 | },
346 | );
347 | await del(`/api/api-keys/${apiKeyId}`);
348 |
349 | addLog(`Added sessions for user ${userId}`);
350 | }
351 |
352 | return {
353 | success: true,
354 | message: "Migration completed successfully. See logs for details.",
355 | timestamp: new Date().toISOString(),
356 | };
357 | }
358 |
--------------------------------------------------------------------------------