feat: Audiobookshelf integration — browse, stream, chapters, sleep timer
- src/abs.js: full ABS API client + player engine - Login/token auth, library browsing, search - Playback session API (multi-file book support via startOffset) - Progress sync to ABS every 30s and on pause - Chapter navigation (prev/next/seek-to), ±10s / ±30s skip - Speed control (0.75–2×), sleep timer with countdown - index.html: sidebar nav, audiobooks/detail pages, full-screen player overlay, ABS settings section (URL + credentials + library picker) - state.js: abs + absPlayer state objects - views.js: navigate() handles 'audiobooks' and 'abs-book-detail' - styles.css: book grid, detail page, player overlay, pickers Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
719d4d9afd
commit
c17b7ea11a
7 files changed
+948
No files matched your search
+25
@@ -18,6 +18,14 @@ import {
|
||||
loadRandom,
|
||||
} from './views.js';
|
||||
import { loadSpotifyImporter, resolveSpotifyLink, clearSpotifyPreview, spotifyDlAll } from './spotify.js';
|
||||
import {
|
||||
absInitFromStorage, absOpenSettings, absConnectSettings, absSetLibrary, absDisconnect,
|
||||
absPlayItem, absTogglePlay, absSeek, absSkipSecs, absNextChapter, absPrevChapter,
|
||||
absSetSpeed, absSleepIn, absOpenPlayer, absClosePlayer, absToggleChapters,
|
||||
absToggleSpeedPicker, absToggleSleepPicker, absSeekToChapter, absProgDown, absProgMove,
|
||||
absProgUp, loadAbsBooks, absOpenBook, loadAbsBookDetail, absPlayChapter,
|
||||
absLoadSettingsLibraries,
|
||||
} from './abs.js';
|
||||
import {
|
||||
openNowPlaying, closeNowPlaying, switchNpTab, npGoArtist, npGoAlbum,
|
||||
openNpMenu, closeNpMenu,
|
||||
@@ -74,6 +82,11 @@ function disconnect() {
|
||||
async function startApp() {
|
||||
document.getElementById('setup-screen').style.display='none';
|
||||
document.getElementById('app').style.display='flex';
|
||||
absInitFromStorage();
|
||||
if (S.abs.token) {
|
||||
document.getElementById('nav-abs-section').style.display = '';
|
||||
absLoadSettingsLibraries();
|
||||
}
|
||||
if(_navLoad() && S._navCursor >= 0 && S._navStack[S._navCursor]) {
|
||||
const last = S._navStack[S._navCursor];
|
||||
S._navJumping = true;
|
||||
@@ -250,4 +263,16 @@ Object.assign(window, {
|
||||
toggleNotifPanel, deleteNotif, clearNotifs, _notifNavigate, _pickTheme,
|
||||
// App
|
||||
doConnect, disconnect,
|
||||
// Audiobookshelf
|
||||
absPlayItem, absTogglePlay, absSeek, absSkipSecs, absNextChapter, absPrevChapter,
|
||||
absSetSpeed, absSleepIn, absOpenPlayer, absClosePlayer, absToggleChapters,
|
||||
absToggleSpeedPicker, absToggleSleepPicker, absSeekToChapter,
|
||||
absProgDown, absProgMove, absProgUp,
|
||||
absOpenBook, absPlayChapter, absConnectSettings, absSetLibrary, absDisconnect,
|
||||
absOnSearch: (val) => {
|
||||
clearTimeout(window._absSearchTimer);
|
||||
window._absSearchTimer = setTimeout(() => {
|
||||
if (S.abs.currentLibraryId) loadAbsBooks(S.abs.currentLibraryId, val.trim());
|
||||
}, 350);
|
||||
},
|
||||
});
|
||||
Reference in new issue
Block a user