From 98d3f8557913766c8ea1e4430931f0d15e89e0ba Mon Sep 17 00:00:00 2001 From: radiorambo Date: Mon, 15 Dec 2025 15:28:05 +0530 Subject: [PATCH 01/18] install vitepress and configure --- .vitepress/config.js | 95 +++ package-lock.json | 1595 ++++++++++++++++++++++++++++++++++++++++++ package.json | 15 + 3 files changed, 1705 insertions(+) create mode 100644 .vitepress/config.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.vitepress/config.js b/.vitepress/config.js new file mode 100644 index 00000000..3d585788 --- /dev/null +++ b/.vitepress/config.js @@ -0,0 +1,95 @@ +import { defineConfig } from "vitepress"; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "Libation", + description: "Libation: Liberate your Library - A free application for downloading your Audible audiobooks", + head: [["link", { rel: "icon", href: "/.vitepress/public/favicon.ico" }]], + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + logo: { + light: "/.vitepress/public/libation_logo_light.svg", + dark: "/.vitepress/public/libation_logo_dark.svg", + }, + + footer: { + message: "Released under the GPLv3 License", + }, + + editLink: { + pattern: "https://github.com/rmcrackan/Libation/edit/main/:path", + }, + + lastUpdated: true, + + nav: [ + { text: "Home", link: "/index.md" }, + { text: "Documentation", link: "/docs/index" }, + { text: "FAQ", link: "/docs/frequently-asked-questions" }, + { text: "Donate", link: "https://www.paypal.com/paypalme/mcrackan" }, + ], + sidebar: [ + { + items: [ + { text: "Getting Started", link: "/docs/index" }, + { text: "FAQ", link: "/docs/frequently-asked-questions" }, + { + text: "Report Issues", + link: "https://github.com/rmcrackan/Libation/issues", + }, + { text: "Donate", link: "https://www.paypal.com/paypalme/mcrackan" }, + ], + }, + { + text: "Installation", + collapsed: false, + + items: [ + { + text: "Install on Linux", + link: "/docs/installation/install-on-linux", + }, + { text: "Install on Mac", link: "/docs/installation/install-on-mac" }, + { text: "Docker", link: "/docs/installation/docker" }, + ], + }, + { + text: "Features", + collapsed: false, + + items: [ + { + text: "Audio File Formats", + link: "/docs/features/audio-file-formats", + }, + { text: "Naming Templates", link: "/docs/features/naming-templates" }, + { + text: "Searching & Filtering", + link: "/docs/features/searching-and-filtering", + }, + ], + }, + { + text: "Advanced", + collapsed: false, + items: [ + { text: "Advanced Topics", link: "/docs/advanced/advanced" }, + { + text: "Linux Development Setup", + link: "/docs/advanced/linux-development-setup-using-nix", + }, + ], + }, + ], + + outline: { + level: "deep", + }, + + socialLinks: [{ icon: "github", link: "https://github.com/rmcrackan/Libation" }], + + search: { + provider: "local", + }, + }, +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..bddf0797 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1595 @@ +{ + "name": "libation", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "libation", + "version": "1.0.0", + "devDependencies": { + "prettier": "^3.7.4", + "vitepress": "^1.6.4" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.62", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.25", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.25", + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/shared": "3.5.25" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.25", + "@vue/runtime-core": "3.5.25", + "@vue/shared": "3.5.25", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "vue": "3.5.25" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.25", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.12.0", + "@algolia/client-abtesting": "5.46.0", + "@algolia/client-analytics": "5.46.0", + "@algolia/client-common": "5.46.0", + "@algolia/client-insights": "5.46.0", + "@algolia/client-personalization": "5.46.0", + "@algolia/client-query-suggestions": "5.46.0", + "@algolia/client-search": "5.46.0", + "@algolia/ingestion": "1.46.0", + "@algolia/monitoring": "1.46.0", + "@algolia/recommend": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/focus-trap": { + "version": "7.6.6", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.3.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.6", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.28.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.53.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/shiki": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.25", + "@vue/compiler-sfc": "3.5.25", + "@vue/runtime-dom": "3.5.25", + "@vue/server-renderer": "3.5.25", + "@vue/shared": "3.5.25" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..f7497dde --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "libation", + "module": "index.ts", + "version": "1.0.0", + "type": "module", + "private": true, + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.6.4" + } +} From b70f9739943f5abdffbc1d044512ab61c0d64e97 Mon Sep 17 00:00:00 2001 From: radiorambo Date: Mon, 15 Dec 2025 15:34:37 +0530 Subject: [PATCH 02/18] update .gitignore for vitepress --- .gitignore | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 41375dd9..697d2aa5 100644 --- a/.gitignore +++ b/.gitignore @@ -376,4 +376,9 @@ FodyWeavers.xsd .DS_Store # JetBrains Rider Settings -**/.idea/ \ No newline at end of file +**/.idea/ + +# VitePress +node_modules +.vitepress/cache +.vitepress/dist \ No newline at end of file From 01fc7f3fb9ea3ecdf76cc8a5c059f4a79e12ac04 Mon Sep 17 00:00:00 2001 From: radiorambo Date: Mon, 15 Dec 2025 15:37:07 +0530 Subject: [PATCH 03/18] rename documentation files for simple routing paths and reorganise for better navigation --- Documentation/FrequentlyAskedQuestions.md | 56 -------- README.md | 81 ++++-------- .../Advanced.md => docs/advanced/advanced.md | 124 +++++++++++------- .../linux-development-setup-using-nix.md | 2 +- .../features/audio-file-formats.md | 2 +- .../features/naming-templates.md | 18 --- .../features/searching-and-filtering.md | 39 ++---- docs/frequently-asked-questions.md | 52 ++++++++ .../images/AudioFormatSettings.png | Bin {Documentation => docs}/images/Export.png | Bin .../images/FilterOptionsButton.png | Bin .../images/FiltersDefault.png | Bin {Documentation => docs}/images/Import1.png | Bin {Documentation => docs}/images/Import2.png | Bin {Documentation => docs}/images/Import3.png | Bin .../images/LiberateBook1.png | Bin .../images/LiberateBook2.png | Bin .../images/LiberateBook3.png | Bin .../images/LiberateBook4.png | Bin .../images/LiberateBook5.png | Bin .../images/PdfDownload2.png | Bin .../images/PdfDownload3.png | Bin .../images/PostDownload.png | Bin .../images/SearchExampleAutoBio.png | Bin .../images/SearchExampleBio.png | Bin .../SearchExampleGaimanAuthorNarrated.png | Bin .../images/SearchExampleHarryPotter.png | Bin .../images/SearchExamplePotter.png | Bin .../images/SearchExamplePotterNotHarry.png | Bin .../images/SearchExamplePotterNotHarry2.png | Bin .../images/StartingDebuggingInVSCode.png | Bin {Documentation => docs}/images/Tags1.png | Bin {Documentation => docs}/images/Tags2.png | Bin {Documentation => docs}/images/Tags3.png | Bin {Documentation => docs}/images/alt-login1.png | Bin {Documentation => docs}/images/alt-login2.png | Bin {Documentation => docs}/images/alt-login3.png | Bin {Documentation => docs}/images/alt-login4.png | Bin docs/images/libation-logo.png | Bin 0 -> 7045 bytes docs/images/libation_glass.svg | 50 +++++++ .../images/macOS-drag-drop-install.png | Bin .../images/macOS-libation-first-run.png | Bin .../images/v40_accounts.png | Bin {Documentation => docs}/images/v40_import.png | Bin .../images/v40_locales.png | Bin .../GettingStarted.md => docs/index.md | 70 ++++------ .../Docker.md => docs/installation/docker.md | 40 +++--- .../installation/install-on-linux.md | 6 +- .../installation/install-on-mac.md | 12 +- index.md | 47 +++++++ 50 files changed, 318 insertions(+), 281 deletions(-) delete mode 100644 Documentation/FrequentlyAskedQuestions.md rename Documentation/Advanced.md => docs/advanced/advanced.md (68%) rename Documentation/LinuxDevelopmentSetupUsingNix.md => docs/advanced/linux-development-setup-using-nix.md (97%) rename Documentation/AudioFileFormats.md => docs/features/audio-file-formats.md (99%) rename Documentation/NamingTemplates.md => docs/features/naming-templates.md (92%) rename Documentation/SearchingAndFiltering.md => docs/features/searching-and-filtering.md (67%) create mode 100644 docs/frequently-asked-questions.md rename {Documentation => docs}/images/AudioFormatSettings.png (100%) rename {Documentation => docs}/images/Export.png (100%) rename {Documentation => docs}/images/FilterOptionsButton.png (100%) rename {Documentation => docs}/images/FiltersDefault.png (100%) rename {Documentation => docs}/images/Import1.png (100%) rename {Documentation => docs}/images/Import2.png (100%) rename {Documentation => docs}/images/Import3.png (100%) rename {Documentation => docs}/images/LiberateBook1.png (100%) rename {Documentation => docs}/images/LiberateBook2.png (100%) rename {Documentation => docs}/images/LiberateBook3.png (100%) rename {Documentation => docs}/images/LiberateBook4.png (100%) rename {Documentation => docs}/images/LiberateBook5.png (100%) rename {Documentation => docs}/images/PdfDownload2.png (100%) rename {Documentation => docs}/images/PdfDownload3.png (100%) rename {Documentation => docs}/images/PostDownload.png (100%) rename {Documentation => docs}/images/SearchExampleAutoBio.png (100%) rename {Documentation => docs}/images/SearchExampleBio.png (100%) rename {Documentation => docs}/images/SearchExampleGaimanAuthorNarrated.png (100%) rename {Documentation => docs}/images/SearchExampleHarryPotter.png (100%) rename {Documentation => docs}/images/SearchExamplePotter.png (100%) rename {Documentation => docs}/images/SearchExamplePotterNotHarry.png (100%) rename {Documentation => docs}/images/SearchExamplePotterNotHarry2.png (100%) rename {Documentation => docs}/images/StartingDebuggingInVSCode.png (100%) rename {Documentation => docs}/images/Tags1.png (100%) rename {Documentation => docs}/images/Tags2.png (100%) rename {Documentation => docs}/images/Tags3.png (100%) rename {Documentation => docs}/images/alt-login1.png (100%) rename {Documentation => docs}/images/alt-login2.png (100%) rename {Documentation => docs}/images/alt-login3.png (100%) rename {Documentation => docs}/images/alt-login4.png (100%) create mode 100644 docs/images/libation-logo.png create mode 100644 docs/images/libation_glass.svg rename {Documentation => docs}/images/macOS-drag-drop-install.png (100%) rename {Documentation => docs}/images/macOS-libation-first-run.png (100%) rename {Documentation => docs}/images/v40_accounts.png (100%) rename {Documentation => docs}/images/v40_import.png (100%) rename {Documentation => docs}/images/v40_locales.png (100%) rename Documentation/GettingStarted.md => docs/index.md (73%) rename Documentation/Docker.md => docs/installation/docker.md (75%) rename Documentation/InstallOnLinux.md => docs/installation/install-on-linux.md (88%) rename Documentation/InstallOnMac.md => docs/installation/install-on-mac.md (75%) create mode 100644 index.md diff --git a/Documentation/FrequentlyAskedQuestions.md b/Documentation/FrequentlyAskedQuestions.md deleted file mode 100644 index 1bd24050..00000000 --- a/Documentation/FrequentlyAskedQuestions.md +++ /dev/null @@ -1,56 +0,0 @@ -## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) - -### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) -...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. - - - -# Frequently Asked Questions - -## Q: Where can I get help for my specific problem? - -**A:** [You can open an issue here](https://github.com/rmcrackan/Libation/issues) for bug reports, feature requests, or specialized help. - -## Q: What's the difference between 'Classic' and 'Chardonnay'? - -**A:** First and most importantly: Classic and Chardonnay have the exact same features. - -* **Classic** is Windows only. Its older 'grey boxes' look has a compact design which allows for more information on the screen. Notably, Classic was written using an older, more mature technology which has built-in support for screenreaders. - -* **Chardonnay** is available for Windows, Mac, and Linux. Its modern design has a more open look and feel. - -## Q: Now that I've downloaded my books, how can I listen to them? - -**A:** You can use any app which plays m4b files (or mp3 files if you used that setting). Here are just a few ideas. Disclaimer: I have no affiliation with any of these companies: - -* iOS: [BookPlayer](https://apps.apple.com/us/app/bookplayer/id1138219998) -* iOS: [Bound](https://apps.apple.com/us/app/bound-audiobook-player/id1041727137) -* Android: [Smart AudioBook Player](https://play.google.com/store/apps/details?id=ak.alizandro.smartaudiobookplayer&hl=en_US&gl=US) -* Android: [Listen](https://play.google.com/store/apps/details?id=ru.litres.android.audio&hl=en_US&gl=US) -* Desktop: [VLC](https://www.videolan.org/) -* Windows Desktop: [Audibly](https://github.com/rstewa/Audibly) -- a desktop player build specifically for audiobooks - -Self-hosting online: - -* [audiobookshelf](https://www.audiobookshelf.org). On [reddit](https://www.reddit.com/r/audiobookshelf/) -* [plex](https://www.plex.tv/). Listen with [Prologue](https://prologue.audio/) (iOS) - -## Q: I'm having trouble playing my non-spatial audiobook, how can I fix this? - -**A:** If you enabled the [Request xHE-AAC Codec](AudioFileFormats.md#request-xhe-aac-codec) option in settings, then the audiobook is being downloaded in the [xHE-AAC codec](AudioFileFormats.md#xhe-aac) which isn't widely supported. You have two options: -1. Use a media player which supports the xHE-AAC codec. [See an incomplete list of media players which support xHE-AAC](AudioFileFormats.md#supported-media-players). -2. Disable the [Request xHE-AAC Codec](AudioFileFormats.md#request-xhe-aac-codec) option in settings and re-download the audiobook. This will cause Libation to download audiobooks in the [AAC-LC codec](AudioFileFormats.md#aac-lc), which enjoys near-universal media player support. - -## Q: I'm having trouble playing my book with 4D, spatial audio, or Dolby Atmos, how can I fix this? - -**A:** Spatial audiobooks are delivered in two formats: [E-AC-3](AudioFileFormats.md#e-ac-3) and [AC-4](AudioFileFormats.md#ac-4). [See an incomplete list of media players which support those codecs](AudioFileFormats.md#supported-media-players). - -## Q: I'm having trouble loggin into my Brazil account. - -**A:** For reasons known only to Jeff Bezos and God, amazon and audible brazil handle logins slightly differently. The external browser login option is not possible for Brazil. [See this ticket for more details.](https://github.com/rmcrackan/Libation/issues/1103) - -## Q: How do I use Libation with a South Africa account? - -**A:** Like many countries, amazon gives South Africa it's own amazon site. [Unlike many other regions](https://www.audible.com/ep/country-selector) there is not South Africa specific audible site. Use `US` for your region -- ie: audible.com. - -(Not exactly a *frequently* asked question but it's come up more than once) diff --git a/README.md b/README.md index 150166d5..4519cb37 100644 --- a/README.md +++ b/README.md @@ -7,69 +7,44 @@ -# Table of Contents +## Development +### Documentation -- [Audible audiobook manager](#audible-audiobook-manager) - - [The good](#the-good) - - [The bad](#the-bad) - - [The ugly](#the-ugly) -- [Getting started](Documentation/GettingStarted.md) - - [Download Libation](Documentation/GettingStarted.md#download-libation-1) - - [Installation](Documentation/GettingStarted.md#installation) - - [Create Accounts](Documentation/GettingStarted.md#create-accounts) - - [Import your library](Documentation/GettingStarted.md#import-your-library) - - [Download your books -- DRM-free!](Documentation/GettingStarted.md#download-your-books----drm-free) - - [Download PDF attachments](Documentation/GettingStarted.md#download-pdf-attachments) - - [Details of downloaded files](Documentation/GettingStarted.md#details-of-downloaded-files) - - [Export your library](Documentation/GettingStarted.md#export-your-library) - - If you still need help, [you can open an issue here](https://github.com/rmcrackan/Libation/issues) for bug reports, feature requests, or specialized help. -- [Searching and filtering](Documentation/SearchingAndFiltering.md) - - [Tags](Documentation/SearchingAndFiltering.md#tags) - - [Searches](Documentation/SearchingAndFiltering.md#searches) - - [Search examples](Documentation/SearchingAndFiltering.md#search-examples) - - [Filters](Documentation/SearchingAndFiltering.md#filters) -- [Advanced](Documentation/Advanced.md) - - [Files and folders](Documentation/Advanced.md#files-and-folders) - - [Settings](Documentation/Advanced.md#settings) - - [Custom File Naming](Documentation/NamingTemplates.md) - - [Command Line Interface](Documentation/Advanced.md#command-line-interface) - - [Custom Theme Colors](Documentation/Advanced.md#custom-theme-colors) (Chardonnay Only) - - [Audio Formats (Dolby Atmos, Widevine, Spacial Audio)](Documentation/AudioFileFormats.md) -- [Docker](Documentation/Docker.md) -- [Frequently Asked Questions](Documentation/FrequentlyAskedQuestions.md) +The documentation is built with [VitePress](https://vitepress.dev/). For more information, see the [VitePress documentation](https://vuejs.github.io/vitepress/v1/guide/getting-started). -## Getting started +### Prerequisites -* [Download](https://github.com/rmcrackan/Libation/releases/latest) -* [Step-by-step walk-through](Documentation/GettingStarted.md) +- [Node.js](https://nodejs.org/) version 18 or higher -## Audible audiobook manager +### Setup -### The good +Install dependencies: +```bash +npm install +``` -* Import library from audible, including cover art -* Download and remove DRM from all books -* Download accompanying PDFs -* Add tags to books for better organization -* Powerful advanced search built on the Lucene search engine -* Customizable saved filters for common searches -* Open source -* Supports most regions: US, UK, Canada, Germany, France, Australia, Japan, India, and Spain -* Fully supported in Windows, Mac, and Linux +### Development - +Start the local dev server with hot reload: +```bash +npm run docs:dev +``` -### The bad +The site will be available at `http://localhost:5173`. -* Large file size -* Made by a programmer, not a designer so the goals are function rather than beauty. And it shows +### Build -### The ugly +Build the static site for production: +```bash +npm run docs:build +``` -* Documentation? Yer lookin' at it -* This is a single-developer personal passion project. Support, response, updates, enhancements, bug fixes etc are as my free time allows -* I have a full-time job, a life, and a finite attention span. Therefore a lot of time can potentially go by with no improvements of any kind +Preview the production build locally: +```bash +npm run docs:preview +``` -Disclaimer: I've made every good-faith effort to include nothing insecure, malicious, anti-privacy, or destructive. That said: use at your own risk. +### Deployment + +The built site is output to `Documentation/.vitepress/dist`. Deploy this directory to any static hosting service (GitHub Pages, Cloudflare Pages, Vercel, Netlify, etc.). -I made this for myself and I want to share it with the great programming and audible/audiobook communities which have been so generous with their time and help. diff --git a/Documentation/Advanced.md b/docs/advanced/advanced.md similarity index 68% rename from Documentation/Advanced.md rename to docs/advanced/advanced.md index 7a7b9ec7..f959a83c 100644 --- a/Documentation/Advanced.md +++ b/docs/advanced/advanced.md @@ -1,47 +1,34 @@ -## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) +# Advanced -### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) -...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. - - - -# Advanced: Table of Contents - -- [Files and folders](#files-and-folders) -- [Settings](#settings) -- [Custom File Naming](NamingTemplates.md) -- [Custom Theme Colors](#custom-theme-colors) (Chardonnay Only) -- [Command Line Interface](#command-line-interface) -- [Audio Formats (Dolby Atmos, Widevine, Spacial Audio)](AudioFileFormats.md) - -### Files and folders +## Files and folders To make upgrades and reinstalls easier, Libation separates all of its responsibilities to a few different folders. If you don't want to mess with this stuff: ignore it. Read on if you like a little more control over your files. -* In Libation's initial folder are the files that make up the program. Since nothing else is here, just copy new files here to upgrade the program. Delete this folder to delete Libation. +- In Libation's initial folder are the files that make up the program. Since nothing else is here, just copy new files here to upgrade the program. Delete this folder to delete Libation. -* In a separate folder, Libation keeps track of all of the files it creates like settings and downloaded images. After an upgrade, Libation might think that's its being run for the first time. Just click ADVANCED SETUP and point to this folder. Libation will reload your library and settings. +- In a separate folder, Libation keeps track of all of the files it creates like settings and downloaded images. After an upgrade, Libation might think that's its being run for the first time. Just click ADVANCED SETUP and point to this folder. Libation will reload your library and settings. -* The last important folder is the "books location." This is where Libation looks for your downloaded and decrypted books. This is how it knows which books still need to be downloaded. The Audible id must be somewhere in the book's file or folder name for Libation to detect your downloaded book. +- The last important folder is the "books location." This is where Libation looks for your downloaded and decrypted books. This is how it knows which books still need to be downloaded. The Audible id must be somewhere in the book's file or folder name for Libation to detect your downloaded book. -### Settings +## Settings -* Allow Libation to fix up audiobook metadata. After decrypting a title, Libation attempts to fix details like chapters and cover art. Some power users and/or control freaks prefer to manage this themselves. By unchecking this setting, Libation will only decrypt the book and will leave metadata as-is, warts and all. +- Allow Libation to fix up audiobook metadata. After decrypting a title, Libation attempts to fix details like chapters and cover art. Some power users and/or control freaks prefer to manage this themselves. By unchecking this setting, Libation will only decrypt the book and will leave metadata as-is, warts and all. In addition to the options that are enabled if you allow Libation to "fix up" the audiobook, it does the following: -* Adds the `TCOM` (`@wrt` in M4B files) metadata tag for the narrators. -* Sets the `©gen` metadata tag for the genres. -* Unescapes the copyright symbol (replace `©` with `©`) -* Replaces the recording copyright `(P)` string with `℗` -* Replaces the chapter markers embedded in the aax file with the chapter markers retrieved from Audible's API. -* Sets the embedded cover art image with the 500x500 px cover art retrieved from Audible +- Adds the `TCOM` (`@wrt` in M4B files) metadata tag for the narrators. +- Sets the `©gen` metadata tag for the genres. +- Unescapes the copyright symbol (replace `©` with `©`) +- Replaces the recording copyright `(P)` string with `℗` +- Replaces the chapter markers embedded in the aax file with the chapter markers retrieved from Audible's API. +- Sets the embedded cover art image with the 500x500 px cover art retrieved from Audible -### Custom Theme Colors +## Custom Theme Colors In Libation Chardonnay (not Classic), you may adjust the app colors using the built-in theme editor. Open the Settings window (from the menu bar: Settings > Settings). On the "Important" settings tab, click "Edit Theme Colors". -#### Theme Editor Window + +### Theme Editor Window The theme editor has a list of style names and their currently assigned colors. To change a style color, click on the color swatch in the left-hand column to open the color editor for that style. Observe the color changes in real-time on the built-in preview panel on the right-hand side of the theme editor. @@ -51,78 +38,107 @@ You may import or export themes using the buttons at the bottom-left of the them "Defaults" will restore the application default colors for the active theme ("Light" or "Dark") "Save" will save the theme colors to the ChardonnayTheme.json file and close the editor. -Note: you may only edit the currently applied theme ("Light" or "Dark"). +::: info +Note: you may only edit the currently applied theme ("Light" or +"Dark"). +::: + +### Video Walkthrough -#### Video Walkthrough The below video demonstrates using the theme editor to make changes to the Dark theme color pallet. [](https://github.com/user-attachments/assets/05c0cb7f-578f-4465-9691-77d694111349) -### Command Line Interface +## Command Line Interface Libationcli.exe allows limited access to Libation's functionalities as a CLI. Warnings about relying solely on on the CLI: -* CLI will not perform any upgrades. -* It will show that there is an upgrade, but that will likely scroll by too fast to notice. -* It will not perform all post-upgrade migrations. Some migrations are only be possible by launching GUI. +- CLI will not perform any upgrades. +- It will show that there is an upgrade, but that will likely scroll by too fast to notice. +- It will not perform all post-upgrade migrations. Some migrations are only be possible by launching GUI. + +### Help -#### Help ```console libationcli --help ``` -#### Verb-Specific Help + +### Verb-Specific Help + ```console libationcli scan --help ``` -#### Scan All Libraries + +### Scan All Libraries + ```console libationcli scan ``` -#### Scan Only Libraries for Specific Accounts + +### Scan Only Libraries for Specific Accounts + ```console libationcli scan nickname1 nickname2 ``` -#### Convert All m4b Files to mp3 + +### Convert All m4b Files to mp3 + ```console libationcli convert ``` -#### Liberate All Books and Pdfs + +### Liberate All Books and Pdfs + ```console libationcli liberate ``` -#### Liberate Pdfs Only + +### Liberate Pdfs Only + ```console libationcli liberate --pdf libationcli liberate -p ``` -#### Force Book(s) to Re-Liberate + +### Force Book(s) to Re-Liberate + ```console libationcli liberate --force libationcli liberate -f ``` -#### Liberate using a license file from the `get-license` command + +### Liberate using a license file from the `get-license` command + ```console libationcli liberate --license /path/to/license.lic libationcli liberate --license - < /path/to/license.lic ``` -#### List Libation Settings + +### List Libation Settings + ```console libationcli get-setting libationcli get-setting -b libationcli get-setting FileDownloadQuality ``` -#### Override Libation Settings for the Command + +### Override Libation Settings for the Command + ```console libationcli liberate B017V4IM1G -override FileDownloadQuality=Normal libationcli liberate B017V4IM1G -o FileDownloadQuality=normal -o UseWidevine=true Request_xHE_AAC=true -f ``` -#### Copy the Local SQLite Database to Postgres + +### Copy the Local SQLite Database to Postgres + ```console libationcli copydb --connectionString "my postgres connection string" libationcli copydb -c "my postgres connection string" ``` -#### Export Library to File + +### Export Library to File + ```console libationcli export --path "C:\foo\bar\my.json" --json libationcli export -p "C:\foo\bar\my.json" -j @@ -131,7 +147,9 @@ libationcli export -p "C:\foo\bar\my.csv" -c libationcli export -p "C:\foo\bar\my.xlsx" --xlsx libationcli export -p "C:\foo\bar\my.xlsx" -x ``` -#### Set Download Status + +### Set Download Status + Set download statuses throughout library based on whether each book's audio file can be found. Must include at least one flag: --downloaded , --not-downloaded. Downloaded: If the audio file can be found, set download status to 'Downloaded'. @@ -144,11 +162,15 @@ libationcli set-status -d libationcli set-status -n libationcli set-status -d -n ``` -#### Get a Content License Without Downloading + +### Get a Content License Without Downloading + ```console libationcli get-license B017V4IM1G ``` -#### Example Powershell Script to Download Four Differenf Versions f the Same Book + +### Example Powershell Script to Download Four Differenf Versions f the Same Book + ```powershell $asin="B017V4IM1G" diff --git a/Documentation/LinuxDevelopmentSetupUsingNix.md b/docs/advanced/linux-development-setup-using-nix.md similarity index 97% rename from Documentation/LinuxDevelopmentSetupUsingNix.md rename to docs/advanced/linux-development-setup-using-nix.md index aab90db2..b81acee1 100644 --- a/Documentation/LinuxDevelopmentSetupUsingNix.md +++ b/docs/advanced/linux-development-setup-using-nix.md @@ -41,7 +41,7 @@ nix develop code . # Run or Debug using VSCode and VSCodium using the linux Launch configuration. ``` -![Debug using VSCode and VSCodium](./images/StartingDebuggingInVSCode.png) +![Debug using VSCode and VSCodium](../images/StartingDebuggingInVSCode.png) You can also Build and run your application inside the shell. ``` diff --git a/Documentation/AudioFileFormats.md b/docs/features/audio-file-formats.md similarity index 99% rename from Documentation/AudioFileFormats.md rename to docs/features/audio-file-formats.md index 76bed0fa..93afbe12 100644 --- a/Documentation/AudioFileFormats.md +++ b/docs/features/audio-file-formats.md @@ -6,7 +6,7 @@ Notes: - Audiobook file extensions are either `.m4b` or `.mp3`. Libation uses the `.m4b` file extension for all non-MP3 files, regardless of the audio codec contained therein. Some media players don't recognize the `.m4b` file extension and may require the extension be changed to `.m4a` or `.mp4`. - Most (but not all) podcasts are delivered by Audible as native MP3 files. None of the following audio formats and settings discussions pertain to those podcasts because MP3s have no DRM, and those episodes are copied directly to their output folders. -![Audio format settings menu](images/AudioFormatSettings.png) +![Audio format settings menu](../images/AudioFormatSettings.png) ## Settings Summary ### Audio quality to request from Audible diff --git a/Documentation/NamingTemplates.md b/docs/features/naming-templates.md similarity index 92% rename from Documentation/NamingTemplates.md rename to docs/features/naming-templates.md index 33ade2a4..bd4576a0 100644 --- a/Documentation/NamingTemplates.md +++ b/docs/features/naming-templates.md @@ -1,7 +1,3 @@ -## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) - -### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) -...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. @@ -10,20 +6,6 @@ File and Folder names can be customized using Libation's built-in tag template n These templates apply to both GUI and CLI. -# Table of Contents - -- [Template Tags](#template-tags) - - [Property Tags](#property-tags) - - [Conditional Tags](#conditional-tags) -- [Tag Formatters](#tag-formatters) - - [Text Formatters](#text-formatters) - - [Series Formatters](#series-formatters) - - [Series List Formatters](#series-list-formatters) - - [Name Formatters](#name-formatters) - - [Name List Formatters](#name-list-formatters) - - [Number Formatters](#number-formatters) - - [Date Formatters](#date-formatters) - # Template Tags diff --git a/Documentation/SearchingAndFiltering.md b/docs/features/searching-and-filtering.md similarity index 67% rename from Documentation/SearchingAndFiltering.md rename to docs/features/searching-and-filtering.md index 85157abf..66587754 100644 --- a/Documentation/SearchingAndFiltering.md +++ b/docs/features/searching-and-filtering.md @@ -1,32 +1,19 @@ -## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) - -### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) -...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. - - - -# Searching and filtering: Table of Contents - -- [Tags](#tags) -- [Searches](#searches) -- [Search examples](#search-examples) -- [Filters](#filters) - +# Searching and filtering ### Tags To add tags to a title, click the tags button -![Tags step 1](images/Tags1.png) +![Tags step 1](../images/Tags1.png) Add as many tags as you'd like. Tags are separated by a space. Each tag can contain letters, numbers, and underscores -![Tags step 2](images/Tags2.png) +![Tags step 2](../images/Tags2.png) Tags are saved non-case specific for easy search. There is one special tag "hidden" which will also grey-out the book -![Tags step 3](images/Tags3.png) +![Tags step 3](../images/Tags3.png) To edit tags, just click the button again. @@ -40,7 +27,7 @@ Libation's advanced searching is built on the powerful Lucene search engine. Sim * Full official guide: https://lucene.apache.org/core/2_9_4/queryparsersyntax.html * Tons of search fields, specific to audiobooks * Synonyms so you don't have to memorize magic words. Eg: author and author**s** will both work -* Click [?] button for a full list of search fields and synonyms ![Filter options](images/FilterOptionsButton.png) +* Click [?] button for a full list of search fields and synonyms ![Filter options](../images/FilterOptionsButton.png) * Search by tag like \[this\] * When tags have an underscore you can use part of the tag. This is useful for quick categories. The below examples make this more clear. @@ -48,25 +35,25 @@ Libation's advanced searching is built on the powerful Lucene search engine. Sim Search for anything with the word potter -![Search example: potter](images/SearchExamplePotter.png) +![Search example: potter](../images/SearchExamplePotter.png) If you only want to see Harry Potter -![Search example: "harry potter"](images/SearchExampleHarryPotter.png) +![Search example: "harry potter"](../images/SearchExampleHarryPotter.png) If you only want to see potter except for Harry Potter. You can also use "-" instead of "NOT" -![Search example: "potter NOT harry"](images/SearchExamplePotterNotHarry.png) -![Search example: "potter -harry"](images/SearchExamplePotterNotHarry2.png) +![Search example: "potter NOT harry"](../images/SearchExamplePotterNotHarry.png) +![Search example: "potter -harry"](../images/SearchExamplePotterNotHarry2.png) To see only books written by Neil Gaiman where he also narrates his own book. (If you don't include AND, you'll see everything written by Neil Gaiman and also all books in your library which are self-narrated.) -![Search example: author:gaiman AND authornarrated](images/SearchExampleGaimanAuthorNarrated.png) +![Search example: author:gaiman AND authornarrated](../images/SearchExampleGaimanAuthorNarrated.png) I tagged autobiographies as auto_bio and biographies written by someone else as bio. I can get only autobiographies with \[auto_bio\] or get both by searching \[bio\] -![Search example: \[bio\]](images/SearchExampleBio.png) -![Search example: \[auto_bio\]](images/SearchExampleAutoBio.png) +![Search example: \[bio\]](../images/SearchExampleBio.png) +![Search example: \[auto_bio\]](../images/SearchExampleAutoBio.png) ### Filters @@ -76,4 +63,4 @@ To edit this list go to Quick Filters > Edit quick filters. Here you can re-orde Check "Quick Filters > Start Libation with 1st filter Default" to have your top filter automatically applied when Libation starts. In this top example, I want to always start without these: at books I've tagged hidden, books I've tagged as free_audible_originals, and books which I have rated. -![default filters](images/FiltersDefault.png) +![default filters](../images/FiltersDefault.png) diff --git a/docs/frequently-asked-questions.md b/docs/frequently-asked-questions.md new file mode 100644 index 00000000..f3831171 --- /dev/null +++ b/docs/frequently-asked-questions.md @@ -0,0 +1,52 @@ +# Frequently Asked Questions + +## Where can I get help for my specific problem? + +You can open an issue here for bug reports, feature requests, or specialized help. + +## What's the difference between 'Classic' and 'Chardonnay'? + +First and most importantly: Classic and Chardonnay have the exact same features. + +- **Classic** is Windows only. Its older 'grey boxes' look has a compact design which allows for more information on the screen. Notably, Classic was written using an older, more mature technology which has built-in support for screenreaders. + +- **Chardonnay** is available for Windows, Mac, and Linux. Its modern design has a more open look and feel. + +## Now that I've downloaded my books, how can I listen to them? + +You can use any app which plays m4b files (or mp3 files if you used that setting). Here are just a few ideas. Disclaimer: I have no affiliation with any of these companies: + +- iOS: [BookPlayer](https://apps.apple.com/us/app/bookplayer/id1138219998) +- iOS: [Bound](https://apps.apple.com/us/app/bound-audiobook-player/id1041727137) +- Android: [Smart AudioBook Player](https://play.google.com/store/apps/details?id=ak.alizandro.smartaudiobookplayer&hl=en_US&gl=US) +- Android: [Listen](https://play.google.com/store/apps/details?id=ru.litres.android.audio&hl=en_US&gl=US) +- Desktop: [VLC](https://www.videolan.org/) +- Windows Desktop: [Audibly](https://github.com/rstewa/Audibly) -- a desktop player build specifically for audiobooks + +Self-hosting online: + +- [audiobookshelf](https://www.audiobookshelf.org). On [reddit](https://www.reddit.com/r/audiobookshelf/) +- [plex](https://www.plex.tv/). Listen with [Prologue](https://prologue.audio/) (iOS) + +## I'm having trouble playing my non-spatial audiobook, how can I fix this? + +If you enabled the [Request xHE-AAC Codec](./features/audio-file-formats.md#request-xhe-aac-codec) option in settings, then the audiobook is being downloaded in the [xHE-AAC codec](./features/audio-file-formats.md#xhe-aac) which isn't widely supported. You have two options: + +1. Use a media player which supports the xHE-AAC codec. [See an incomplete list of media players which support xHE-AAC](./features/audio-file-formats.md#supported-media-players). +2. Disable the [Request xHE-AAC Codec](./features/audio-file-formats.md#request-xhe-aac-codec) option in settings and re-download the audiobook. This will cause Libation to download audiobooks in the [AAC-LC codec](./features/audio-file-formats.md#aac-lc), which enjoys near-universal media player support. + +## I'm having trouble playing my book with 4D, spatial audio, or Dolby Atmos, how can I fix this? + +Spatial audiobooks are delivered in two formats: [E-AC-3](./features/audio-file-formats.md#e-ac-3) and [AC-4](./features/audio-file-formats.md#ac-4). [See an incomplete list of media players which support those codecs](./features/audio-file-formats.md#supported-media-players). + +## I'm having trouble loggin into my Brazil account. + +For reasons known only to Jeff Bezos and God, amazon and audible brazil handle logins slightly differently. The external browser login option is not possible for Brazil. [See this ticket for more details.](https://github.com/rmcrackan/Libation/issues/1103) + +## How do I use Libation with a South Africa account? + +Like many countries, amazon gives South Africa it's own amazon site. [Unlike many other regions](https://www.audible.com/ep/country-selector) there is not South Africa specific audible site. Use `US` for your region -- ie: audible.com. + +::: info +(Not exactly a _frequently_ asked question but it's come up more than once) +::: diff --git a/Documentation/images/AudioFormatSettings.png b/docs/images/AudioFormatSettings.png similarity index 100% rename from Documentation/images/AudioFormatSettings.png rename to docs/images/AudioFormatSettings.png diff --git a/Documentation/images/Export.png b/docs/images/Export.png similarity index 100% rename from Documentation/images/Export.png rename to docs/images/Export.png diff --git a/Documentation/images/FilterOptionsButton.png b/docs/images/FilterOptionsButton.png similarity index 100% rename from Documentation/images/FilterOptionsButton.png rename to docs/images/FilterOptionsButton.png diff --git a/Documentation/images/FiltersDefault.png b/docs/images/FiltersDefault.png similarity index 100% rename from Documentation/images/FiltersDefault.png rename to docs/images/FiltersDefault.png diff --git a/Documentation/images/Import1.png b/docs/images/Import1.png similarity index 100% rename from Documentation/images/Import1.png rename to docs/images/Import1.png diff --git a/Documentation/images/Import2.png b/docs/images/Import2.png similarity index 100% rename from Documentation/images/Import2.png rename to docs/images/Import2.png diff --git a/Documentation/images/Import3.png b/docs/images/Import3.png similarity index 100% rename from Documentation/images/Import3.png rename to docs/images/Import3.png diff --git a/Documentation/images/LiberateBook1.png b/docs/images/LiberateBook1.png similarity index 100% rename from Documentation/images/LiberateBook1.png rename to docs/images/LiberateBook1.png diff --git a/Documentation/images/LiberateBook2.png b/docs/images/LiberateBook2.png similarity index 100% rename from Documentation/images/LiberateBook2.png rename to docs/images/LiberateBook2.png diff --git a/Documentation/images/LiberateBook3.png b/docs/images/LiberateBook3.png similarity index 100% rename from Documentation/images/LiberateBook3.png rename to docs/images/LiberateBook3.png diff --git a/Documentation/images/LiberateBook4.png b/docs/images/LiberateBook4.png similarity index 100% rename from Documentation/images/LiberateBook4.png rename to docs/images/LiberateBook4.png diff --git a/Documentation/images/LiberateBook5.png b/docs/images/LiberateBook5.png similarity index 100% rename from Documentation/images/LiberateBook5.png rename to docs/images/LiberateBook5.png diff --git a/Documentation/images/PdfDownload2.png b/docs/images/PdfDownload2.png similarity index 100% rename from Documentation/images/PdfDownload2.png rename to docs/images/PdfDownload2.png diff --git a/Documentation/images/PdfDownload3.png b/docs/images/PdfDownload3.png similarity index 100% rename from Documentation/images/PdfDownload3.png rename to docs/images/PdfDownload3.png diff --git a/Documentation/images/PostDownload.png b/docs/images/PostDownload.png similarity index 100% rename from Documentation/images/PostDownload.png rename to docs/images/PostDownload.png diff --git a/Documentation/images/SearchExampleAutoBio.png b/docs/images/SearchExampleAutoBio.png similarity index 100% rename from Documentation/images/SearchExampleAutoBio.png rename to docs/images/SearchExampleAutoBio.png diff --git a/Documentation/images/SearchExampleBio.png b/docs/images/SearchExampleBio.png similarity index 100% rename from Documentation/images/SearchExampleBio.png rename to docs/images/SearchExampleBio.png diff --git a/Documentation/images/SearchExampleGaimanAuthorNarrated.png b/docs/images/SearchExampleGaimanAuthorNarrated.png similarity index 100% rename from Documentation/images/SearchExampleGaimanAuthorNarrated.png rename to docs/images/SearchExampleGaimanAuthorNarrated.png diff --git a/Documentation/images/SearchExampleHarryPotter.png b/docs/images/SearchExampleHarryPotter.png similarity index 100% rename from Documentation/images/SearchExampleHarryPotter.png rename to docs/images/SearchExampleHarryPotter.png diff --git a/Documentation/images/SearchExamplePotter.png b/docs/images/SearchExamplePotter.png similarity index 100% rename from Documentation/images/SearchExamplePotter.png rename to docs/images/SearchExamplePotter.png diff --git a/Documentation/images/SearchExamplePotterNotHarry.png b/docs/images/SearchExamplePotterNotHarry.png similarity index 100% rename from Documentation/images/SearchExamplePotterNotHarry.png rename to docs/images/SearchExamplePotterNotHarry.png diff --git a/Documentation/images/SearchExamplePotterNotHarry2.png b/docs/images/SearchExamplePotterNotHarry2.png similarity index 100% rename from Documentation/images/SearchExamplePotterNotHarry2.png rename to docs/images/SearchExamplePotterNotHarry2.png diff --git a/Documentation/images/StartingDebuggingInVSCode.png b/docs/images/StartingDebuggingInVSCode.png similarity index 100% rename from Documentation/images/StartingDebuggingInVSCode.png rename to docs/images/StartingDebuggingInVSCode.png diff --git a/Documentation/images/Tags1.png b/docs/images/Tags1.png similarity index 100% rename from Documentation/images/Tags1.png rename to docs/images/Tags1.png diff --git a/Documentation/images/Tags2.png b/docs/images/Tags2.png similarity index 100% rename from Documentation/images/Tags2.png rename to docs/images/Tags2.png diff --git a/Documentation/images/Tags3.png b/docs/images/Tags3.png similarity index 100% rename from Documentation/images/Tags3.png rename to docs/images/Tags3.png diff --git a/Documentation/images/alt-login1.png b/docs/images/alt-login1.png similarity index 100% rename from Documentation/images/alt-login1.png rename to docs/images/alt-login1.png diff --git a/Documentation/images/alt-login2.png b/docs/images/alt-login2.png similarity index 100% rename from Documentation/images/alt-login2.png rename to docs/images/alt-login2.png diff --git a/Documentation/images/alt-login3.png b/docs/images/alt-login3.png similarity index 100% rename from Documentation/images/alt-login3.png rename to docs/images/alt-login3.png diff --git a/Documentation/images/alt-login4.png b/docs/images/alt-login4.png similarity index 100% rename from Documentation/images/alt-login4.png rename to docs/images/alt-login4.png diff --git a/docs/images/libation-logo.png b/docs/images/libation-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0d71754d50d3a002e3d6181e59623d6e9ebe5e GIT binary patch literal 7045 zcmeHM_dgrl+qT6XHL5C&y?0TH8i_rEpwuiujq+HnC^buiTCuA#jEL2SXwX*isEQRc zr32Lxt3#t&N?+f<<9*IA_qosK{Bm9Qb&vBo_n}VKeB9@_nV6XPY;C}!}%PlzYv@#L5J9fI&{(|JHvD{QqR&@87?j4`!-Q!JovtI=L}1v#_$Ub8rHuA!-=t)qKUPv78@q0wby6VoeZ z<`$MW1G&bRz z2`#N{?H!Mw5Ieg_-A~Cqy?xJ~zvzECFgWz@@T-y6qm;4niODJI^vvws`~vOG;?mo9 z?>{WBtbSbk^m%=QzPYu%v-{=ix9@vD82djDe*Hc?`g45Zci!FilnLhR_SWFP4V-(! zOibd+wqSGES&7{NuG^w>RU9i{gR{YA89RCIYI&*vC-!FUjM-^#cIL|(*)FZ_9x`BnckJV#G| zD5(4si16y!>wxhIGgPE8s}7e-iFCPik61CzSt8T*A0YPc#=n|pE3pr9PZVykXZ}bO z!~Wg3=Li$V_V=QsiJ5}OkUq_`^&b~e&fObC8VnKJuEr0E2x z>In7z!@J}Q@HvR(h+4i6s7}gDPv$f4OCLD0W^3Ko;OM{`4(inig@Uf8oXHQH0;9)c zt?vF5V@Y7g_5T89ppLY0{clj&g6{|D9XBCq+%JL|p2LnpkGS$rLX0zJZ(eYVxjgfs z*1`OSeO8E$n-=Hhlv*&i0!XXv=X7*LoDwyb^VqINR_#iI|9ld3_3IgiWFGo_Urp*6 z%)e_4RYMNxp3>BsSPb}Ngdur9?V?7bC-%bJS#ZB|oZy4EbORpbpXyWtnX?iXrnkoy zp!I7&M3fd_xPj3pM0n@a&m)9fp5A`Xi!a#+KKBEIdgbV)mv|@-?K=o-Lichu_l4(@ z%KZK!L7!4=>nIw~jd=SyDMP>jiBZj;eNy1(31S zo%>i}HuSD4er}a1MZxTO>-9s2Y}cuojZTNK1F1t;Eug{4k-Bjw?7%o>-Mr0{uFFc1 z>Z~vgHE;W|+1aNZ-&buKZSmw5U00;{_<`vV`VHW4JTp8>W%Ik2n8=uN<4C#~b;sk- z7%&gSOp&NN?g&^yT6nFxNh;59HEK498FkH}@HmMYp_HPL5o@^_$HhQY1K;Xkd?uX` z4%yybef00Tc!O-=kOu_{vmZEGHhSVWWn;v4{Z}*mdDrGwN$nM8Iup0u8LII zX$j^_1*THy*#gGZ2cTBm2!PHwZ}P=L@JrK(13uWa$vTv6l@}42ZTEijiBS5lEMP5W z+6LiZ0eXZUnV^ONO(r3r7nX(MXy_{qik*&7?mJfsl8>=zTX@$}E7h{l4LudbAPWzW ztAGZUb&Du@Z|SqObZwr)JK#kG+ovFkzFF;>Fv`)~>=AZcKT}_PI!KEpR@6izOS z!XsGJ%^-6wJ+oR2XM@YadC>XFm`I%roigGS#z7px3xT#bj(n$nK4M$~ns3?_N>e{e zQ@Ul<8ncL}r*O);tX7B1Pnr1NS;PynS_05+F2Y4es6JDAPbHD?iux&%LZ}95sc%l7 zseWg(sK6Gg3iq@u9Ysw*V#Hkag{svsk>@jh2*NweN~e_j&JXld6D^cxP(VfLOHD52 zVZ0`j=*Vb}jM9`e;umTV0In*C-beZJnw(@4n}pE*Zi$x}w@ZlA0P1auf@L91NfOEA zYq@Aae^Nz!1c3UVqAwWdrc{H>+LTqt(!`e0k%}2GJFn!he}M2Y!Fm#EKU-|MX(x$o z(*Whmul@zSqX?LpQkLXWS8z!@lW`GAth315Q0fDipR-$Z2zydV1Oi+yP{hph_E98o z(SxQ)(XKZTmmc$?SYeUfG~pgDB)1U$I+CD+u~ejdFh_g1EpQk;v|Y3Z%&DSkxurOu z`h4k#a$+hqPz!#=5)EwF>7%Y9C||75uUryEAfYyWXuo_ zwQr3+NhjJ;1I6H>Am}nS(kTA+eWDWpCQey5%aKP(<(QG0cJ%1q^x;VW7&AQDJV#VS zo|k1lmk6f@szcy_vL_;K8T>U$OW6UtxG2G!B$PBC0?m+w=RkHQvAaAm?&JB zYW%MZEGZ_T!CP@~pBZu)ZK({2SlMzSIb}r1Li{aqVv!z02`ckj+_WQ+-Aw*+Y+1}c z+FNmm^a#sJ#UM}JT3eD+W`qgkGZmA86^*HdkPt6P<=A5?CLjAbrq+>!7}y6wPI37m zKV-LP&TsM2&LI;mbKZ-nXSNv38?m;}i=?niy}*Wv`ZT$GZ0-b3yV(;L)4Nr?Z;`I2zGoNZNPw|S1E zNZH_ge)#7hQXTdHGh~P4e>q$VBC2RwFfRtAvj{i~wk7 zp@>=J^q>+lB6!LUncB}N9qGm2t|rc|ctaY>hvrL(P3WOD)PCkRp9<-0`w!(BUMU4= zqP9-CaE_!h-ctZ!D)Z$gyW&qag$CcGEQK#~`F|Ps}dX?(!-H7pdEIyMp*2 zrme{?V%4aacndwOirT*yq3wPsKt6EcVfwnt__N-ho~%0-d(`zR9@lbg6mQ=j+EP*1X$>rYm?b}rE|243b?dt7y@hD9d& z^nD`5hr9r-osZEYqDVQw5KXw^kY3G}u>kD`YF8T?tOu_cN)VWrV5P-SJS<8LQ3cuC z$*>J!@|UKaWy~lmY9gmabp8fA&4ThJN5RvzThx}j*+IG_vT5gt`pE&&l@-BXR>k9a z4Z+A#7`aN}7)%f^>yd1~iymLMEGs}2q;J24tsDO@jw$p#7I@qWrKMiQedMKH9dVHg zzX-no8cl}5O-e*u6UF0uiilulAGc--FL{X?1d6|5UTD91&dL2msC^YBUu{_xg>uYj zanC@?c@OQMg=bSknBiYRqX?Bf(~>{;iNC2K#&FT37)OkZ^UL{qB=H|=h?dD@c7&3s z1V4=laYtaO%kDI0?JV|skv!yAZsnKww@zC^i_IQz{%VfgU)x1a>c$NU<=oJ|;Cv;M zr=JAe*}SfXt_^56g{_?@pZ1(>jI#m4AwxBYvrLJSwk^(}v!skWQ5Ha>4l3F_whJyE zk!UIlML24;H{Xu;UJI+qx+Sh}^B+E+q$B*`3uAISZlsnPc39Tg642fUSm*iFQhFOIgdrX4Y89)nA%ej%o(=a)CVP*faO={9TGWK?F!%~t(vlpP&nRC2eq zqepUVbkc4_GnL%2DGa0%vKy>5$vWLS6HyasE#f8wZuEi+fHJpMCc23rk%xdw=U1l{q&JbN;f^mTwBmUpq_$D`l=dVfo#WO z5j&K7vCh;`wUSR?gT0rk3gr%_H*CWWZZQ@g704avsK3vVTYS6uLp?0iw0=rZ?#7Ay zEY*|UCe|>;^dj`@2*WF=C|GWmx@&WNfw}>t(_SD=#iec6jT&ncylnP-4`C#0Cb8KK zDY?G18=;^Qb=;J2*2+0VZDDX;Wr&|Sk(trUA^lpjVd}cvw#Pu1>oni!NuFuLZ@{1~ zW2+$8tRP{Kp_FL&G?%-%Y0HceHBR+y* zqORn#0!Nn#d&YJqTCH(e5H_1&AW80Uve3)ie99ImVbec&2NuUC+5N8|tn@F}F^9BP zf77xo{)=@a^@MBQ#G?NS=wb!611nCbdCjrI45PJVq%K>=l+Q-nyTJ_Z^DTg3w0NFl z50G(YRYoYZwu-_L-fN!VtjlgG_$a@?VL%X8p;yB<^H2?TOTz83@)_pdd&){T3b%BC zL97fg2O+|9P$b_hSI0w_y(1LEaiH*qns3RcQ=!Ekp(9vt?l6qQk4}_DLRF$6j;RAM zpIo!&O&@q4vb&Dx}^7^h}(!p=8?LU46W5r@O=Oi=TiuR~v&9;^y#g z?SKg_y%?(rPhI&nLE;~a#$a37IsErCTtN5xijp|1g5?0aZeS*Q-&spOPZAT7Li?e# zL>1Q?^QX-HF<~*tX|5{0U#<5DI*O~0y&g2D7Rv0VD~^fyA?l{vFT{@>(E*B%C4U6% z`NP9sgy*gJPKl^T-_Ps`<|!nrSF8khw*@0_ngy3@K_oA)2E9(oVRHeUC(J`by~Xr#YX&OO=jYYe9`oqxyGsgeYSO&T$C-b&?i z(-WKi`}$61GvOCAo8pApTA-)tc8%aW?*Z8Js{3?J@7(}Oh(QK=6K?_Z$i`J$6#Wo! z^O!p~?eF_)?%0#ZCbq-()lkS{LQj#1TF4fM>|xEQgYWn3qJ;CluZPeve+;CLoV48z z&SL-0-j;InG+Z((*JT*MTRo4~`Np!<;(X-Yo?^65Uz&5rt=XQ}2Af9RH7hzF?WC^m z8UKpET}px`8p({fw-)SXuF!V&Hm@bU)^`S?c=`k7TMHrt<*QyU**HWaVe$PzCr%5C z;{DHYJg(ER8WC_|Y_No8r$;xx1+w=&WBi`Vg6sUf(CDq3Mb(($*0N=|454uov0!%{ zpkzViG*Q2?tSgNd{mSBeke?Q%%7U^I>>k%%XpG_DZ|LrgVK9ju$U&YV7oc>b`7wp zL&{IsQ_Xxm<`De;eC2zA9RGFsJhkn0aSj)i)G#mW8tV%=LtBz(kXNk}<**{Yo};}> zy2n15LvkA>hMZSD%M3tvi)pS4zN1~K9QzvEB|S%8w;IGjgzV^wZ_w7BuMU|ARMLkj zo+Kr^7X^3^qt=g@MZJS^eY|+oO)qj`PKY}vm<0P~B;Y=LA$8_d)V8>jE5C=Bfdm?l z;Jo)ww^mMgbbdcxbgTX|72+FAAKOdrMDF8aKG4mjTzI57AEZ7h+Q)4ipmQ|jr*BS)PR9?#wICtsst&YFi zF)QfRrw^(w1$~%l6K##Qe=BRmR<))+TPam{pHAgHs=l$kjmhQr+J-o|<$22zI748D zv(Vp4nfTO)z2!GTcbjv!97`p*8q5C8SIFIRTmE0=J_Hd$7jXhwj;O*(E7;#j@3F4O zjRx2unIN#XD!s-@p&ySVeAlL1NuzI@%Vka(+O(mY-yAvsdBu=;sn0wlhRB=NMs8nXIkA@^LC-|WwCfVaAB;@Eq* zVf?{uwze0~nOs=o{@@$9fXs=Tc&FTR^`%yt&fgx}sr7Ax!F*Tq0%uJ(0*NV0k6FNc zeu;l=zj`g`_8|t7ymDtCe*M#V2dCNSZ`|t-#Ky;sX9tPjnY8RWetN(^ZjI_T;!UN` zTP#36mO=#l7J$Vpj+4DNKaOqNRbgimcoh8J9-ReKL>SL@_$k6TjcuT z-qp885g#7?bS)zubqdW}^;La_;UX8l=Z3fZ&JC>)ch{b97kz#-K0iSXI5w~!bx%-3 SuKWM*BgGct1a7wo$oM~|FRl{+ literal 0 HcmV?d00001 diff --git a/docs/images/libation_glass.svg b/docs/images/libation_glass.svg new file mode 100644 index 00000000..5d9fde19 --- /dev/null +++ b/docs/images/libation_glass.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + diff --git a/Documentation/images/macOS-drag-drop-install.png b/docs/images/macOS-drag-drop-install.png similarity index 100% rename from Documentation/images/macOS-drag-drop-install.png rename to docs/images/macOS-drag-drop-install.png diff --git a/Documentation/images/macOS-libation-first-run.png b/docs/images/macOS-libation-first-run.png similarity index 100% rename from Documentation/images/macOS-libation-first-run.png rename to docs/images/macOS-libation-first-run.png diff --git a/Documentation/images/v40_accounts.png b/docs/images/v40_accounts.png similarity index 100% rename from Documentation/images/v40_accounts.png rename to docs/images/v40_accounts.png diff --git a/Documentation/images/v40_import.png b/docs/images/v40_import.png similarity index 100% rename from Documentation/images/v40_import.png rename to docs/images/v40_import.png diff --git a/Documentation/images/v40_locales.png b/docs/images/v40_locales.png similarity index 100% rename from Documentation/images/v40_locales.png rename to docs/images/v40_locales.png diff --git a/Documentation/GettingStarted.md b/docs/index.md similarity index 73% rename from Documentation/GettingStarted.md rename to docs/index.md index a2cd8395..45af1903 100644 --- a/Documentation/GettingStarted.md +++ b/docs/index.md @@ -1,43 +1,27 @@ -## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) +# Getting started -### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) -...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. +## Installation +Download the [latest version of Libation](https://github.com/rmcrackan/Libation/releases) - -# Getting started: Table of Contents - -- [Download Libation](#download-libation-1) -- [Installation](#installation) -- [Create Accounts](#create-accounts) -- [Import your library](#import-your-library) -- [Download your books -- DRM-free!](#download-your-books----drm-free) -- [Download PDF attachments](#download-pdf-attachments) -- [Details of downloaded files](#details-of-downloaded-files) -- [Export your library](#export-your-library) -- [I still need help](#i-still-need-help) - - - -### [Download Libation](https://github.com/rmcrackan/Libation/releases) - -##### Which version? Chardonnay vs Classic +### Which version? Chardonnay vs Classic Nearly 100% of the difference is look and feel -- it's a matter of preference. -Chardonnay has an updated look and will work and look the same on Windows, Mac, and Linux. -Classic is Windows only. It has an older look because it's built with older, duller, and more mature technology. This tech has built into it better support for things like accessibility for screen readers. +**Chardonnay** has an updated look and will work and look the same on Windows, Mac, and Linux. -### Installation +**Classic** is Windows only. It has an older look because it's built with older, duller, and more mature technology. This tech has built into it better support for things like accessibility for screen readers. -* Windows +### Platform-specific instructions + +- Windows Extract the zip file to a folder and then run `Libation.exe` from inside of that folder. Do not put it in Program Files. The inability to edit files from there causes problems with configuration and updating. -* [Linux](InstallOnLinux.md) -* [MacOS](InstallOnMac.md) +- [Linux](./installation/install-on-linux.md) +- [MacOS](./installation/install-on-mac.md) -### Create Accounts +## Create Accounts Create your account(s): @@ -47,7 +31,7 @@ New locale options include many more regions including old audible accounts whic ![Choose your account locales](images/v40_locales.png) -### Import your library +## Import your library Be default, Libation will periodically scan the accounts you added above with a checkbox next to them. Nothing for you to do. You can also scan manually. @@ -63,11 +47,11 @@ If this is a new installation, or you're scanning an account you haven't scanned ![Login password](images/alt-login1.png) -Enter the password and click Submit. Audible will prompt you with a CAPTCHA image. +Enter the password and click Submit. Audible will prompt you with a CAPTCHA image. ![Login captcha](images/alt-login2.png) -Enter the CAPTCHA answer characters and click Submit. If all has gone well, Libation will start scanning the account. +Enter the CAPTCHA answer characters and click Submit. If all has gone well, Libation will start scanning the account. In rare instances, the Captcha image/response will fail in an endless loop. If this happens, delete the problem account, and then click Save. Re-add the account and click Save again. Now try to scan the account again. This time, instead of typing your password, click the link that says "Or click here". This will open the Audible External Login dialog shown below. @@ -87,17 +71,17 @@ Success! We see how many new titles are imported: ![Import step 3](images/Import3.png) -### Download your books -- DRM-free! +## Download your books -- DRM-free! Automatically download some or all of your audible books. This shows you how much of your library is not yet downloaded and decrypted: The stoplights will tell you a title's status: -* Green: downloaded and decrypted -* Yellow: downloaded but still encrypted with DRM -* Red: not downloaded -* PDF icon without arrow: downloaded -* PDF with arrow: not downloaded +- Green: downloaded and decrypted +- Yellow: downloaded but still encrypted with DRM +- Red: not downloaded +- PDF icon without arrow: downloaded +- PDF with arrow: not downloaded Or hover over the button to see the status. @@ -123,7 +107,7 @@ And voila! If you have multiple books not yet liberated, Libation will automatic The Audible id must be somewhere in the book's file or folder name for Libation to detect your downloaded book. -### Download PDF attachments +## Download PDF attachments For books which include PDF downloads, Libation can download these for you as well and will attempt to store them with the book. "Book backup" will already download an available PDF. This additional option is useful when Audible adds a PDF to your book after you've already backed it up. @@ -135,21 +119,21 @@ The downloads work just like with books, only with no additional decryption need ![PDF download step 3](images/PdfDownload3.png) -### Details of downloaded files +## Details of downloaded files ![Post download](images/PostDownload.png) When you set up Libation, you'll specify a Books directory. Libation looks inside that directory and all subdirectories to look for files or folders with each library book's audible id. This way, organization is completely up to you. When you download + decrypt a book, you get several files -* .m4b: your audiobook in m4b format. This is the most pure version of your audiobook and retains the highest quality. Now that it's decrypted, you can play it on any audio player and put it on any device. If you'd like, you can also use 3rd party tools to turn it into an mp3. The freedom to do what you want with your files was the original inspiration for Libation. -* .cue: this is a file which logs where chapter breaks occur. Many tools are able to use this if you want to split your book into files along chapter lines. +- .m4b: your audiobook in m4b format. This is the most pure version of your audiobook and retains the highest quality. Now that it's decrypted, you can play it on any audio player and put it on any device. If you'd like, you can also use 3rd party tools to turn it into an mp3. The freedom to do what you want with your files was the original inspiration for Libation. +- .cue: this is a file which logs where chapter breaks occur. Many tools are able to use this if you want to split your book into files along chapter lines. -### Export your library +## Export your library ![Export](images/Export.png) Export your library to Excel, CSV, or JSON -### I still need help +## I still need help [You can open an issue here](https://github.com/rmcrackan/Libation/issues) for bug reports, feature requests, or specialized help. diff --git a/Documentation/Docker.md b/docs/installation/docker.md similarity index 75% rename from Documentation/Docker.md rename to docs/installation/docker.md index 8b34a55b..266f6372 100644 --- a/Documentation/Docker.md +++ b/docs/installation/docker.md @@ -1,22 +1,22 @@ -## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) +# Docker Support -### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) -...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. - -> [!WARNING] -> ## Breaking Changes -> * The docker image now runs as user 1001 and group 1001. Make sure that the permissions on your volumes allow user 1001 to read and write to them or see the User section below for other options, or if you're not sure. -> * `SLEEP_TIME` is now set to `-1` by default. This means the image will run once and exit. If you were relying on the previous default, you'll need to explicitly set the `SLEEP_TIME` environment variable to `30m` to replicate the previous behavior. -> * The docker image now ignores the values in `Settings.json` for `Books` and `InProgress`. You can now change the folder that books are saved to by using the `LIBATION_BOOKS_DIR` environment variable. +> [!WARNING] Breaking Changes +> - The docker image now runs as user 1001 and group 1001. Make sure that the permissions on your volumes allow user 1001 to read and write to them or see the User section below for other options, or if you're not sure. +> - `SLEEP_TIME` is now set to `-1` by default. This means the image will run once and exit. If you were relying on the previous default, you'll need to explicitly set the `SLEEP_TIME` environment variable to `30m` to replicate the previous behavior. +> - The docker image now ignores the values in `Settings.json` for `Books` and `InProgress`. You can now change the folder that books are saved to by using the `LIBATION_BOOKS_DIR` environment variable. # Disclaimer + The docker image is provided as-is. We hope it can be useful to you but it is not officially supported. ### Configuration + Configuration in Libation is handled by two files, `AccountsSettings.json` and `Settings.json`. These files can usually be found in the Libation folder in your user's home directory. The easiest way to configure these is to run the desktop version of Libation and then copy them into a folder, such as `/opt/libation/config`, that you'll volume mount into the image. `Settings.json` is technically optional, and, if not provided, Libation will run using the default settings. Additionally, the `Books` and `InProgress` settings in `Settings.json` will be ignored and the image will instead substitute it's own values. ### Running + Once the configuration files are copied, the docker image can be run with the following command. + ``` sudo docker run -d \ -v /opt/libation/config:/config \ @@ -39,16 +39,18 @@ sudo docker run -d \ ``` ### Environment Variables -| Env Var | Default | Description | -| -------- | ------- | ----------- | -| SLEEP_TIME | -1 | Length of time to sleep before doing another scan/download. Set to -1 to run one. | -| LIBATION_BOOKS_DIR | /data | Folder where books will be saved | -| LIBATION_CONFIG_DIR | /config | Folder to read configuration from. | -| LIBATION_DB_DIR | /db | Optional folder to load database from. If not mounted, will load database from `LIBATION_CONFIG_DIR`. | -| LIBATION_DB_FILE | | Name of database file to load. By default it will look for all `.db` files and load one if there is only one present. | -| LIBATION_CREATE_DB | true | Whether or not the image should create a database file if none are found. | + +| Env Var | Default | Description | +| ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------- | +| SLEEP_TIME | -1 | Length of time to sleep before doing another scan/download. Set to -1 to run one. | +| LIBATION_BOOKS_DIR | /data | Folder where books will be saved | +| LIBATION_CONFIG_DIR | /config | Folder to read configuration from. | +| LIBATION_DB_DIR | /db | Optional folder to load database from. If not mounted, will load database from `LIBATION_CONFIG_DIR`. | +| LIBATION_DB_FILE | | Name of database file to load. By default it will look for all `.db` files and load one if there is only one present. | +| LIBATION_CREATE_DB | true | Whether or not the image should create a database file if none are found. | ### User + This docker image runs as user `1001`. In order for the image to function properly, user `1001` must be able to read and write the volumes that are mounted in. If they are not, you will see errors, including [sqlite error](#1060), [Microsoft.Data.Sqlite.SqliteException](#1110), [unable to open database file](#1113), [Microsoft.EntityFrameworkCore.DbUpdateException](#1049) If you're not sure what your user number is, check the output of the `id` command. Docker should normally run with the number of the user who configured and ran it. @@ -68,9 +70,11 @@ sudo docker run -d \ If the user it's running as is correct, and it still cannot write, be sure to check whether the files and/or folders might be owned by the wrong user. You can use the `chown` command to change the owner of the file to the correct user and group number, for example: `chown -R 1001:1001 /mnt/audiobooks /mnt/libation-config` ### Advanced Database Options + The docker image supports an optional database mount location defined by `LIBATION_DB_DIR`. This allows the database to be mounted as read/write, while allowing the rest of the configuration files to be mounted as read only. This is specifically useful if running in Kubernetes where you can use Configmaps and Secrets to define the configuration. If the `LIBATION_DB_DIR` is mounted, it will be used, otherwise it will look for the database in `LIBATION_CONFIG_DIR`. If it does not find the database in the expected location, it will attempt to make an empty database there. ### Getting help + As mentioned above: docker is not officially supported. I'm adding this at the bottom of the page for anyone serious enough to have read this far. If you've tried everything above and would still like help, you can open an [issue](https://github.com/rmcrackan/Libation/issues). Please include `[docker]` in the title. There are also some docker folks who have offered occasional assistance who you can tag within your issue: `@ducamagnifico` , `@wtanksleyjr` , `@CLHatch`. -**Reminder** that these are just friendly users who are sometimes around. They're *not* our customer support. +**Reminder** that these are just friendly users who are sometimes around. They're _not_ our customer support. diff --git a/Documentation/InstallOnLinux.md b/docs/installation/install-on-linux.md similarity index 88% rename from Documentation/InstallOnLinux.md rename to docs/installation/install-on-linux.md index f4b537b7..52c95cc4 100644 --- a/Documentation/InstallOnLinux.md +++ b/docs/installation/install-on-linux.md @@ -1,8 +1,4 @@ -## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) - -### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) -...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. - +# Install on Linux ## Packaging status diff --git a/Documentation/InstallOnMac.md b/docs/installation/install-on-mac.md similarity index 75% rename from Documentation/InstallOnMac.md rename to docs/installation/install-on-mac.md index 7f9ad57a..581f71f2 100644 --- a/Documentation/InstallOnMac.md +++ b/docs/installation/install-on-mac.md @@ -1,11 +1,5 @@ -## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) + # Install on MacOS -### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) -...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. - - - -# Run Libation on MacOS This walkthrough should get you up and running with Libation on your Mac. ## Supports macOS 13 (Ventura) and above @@ -17,10 +11,10 @@ This walkthrough should get you up and running with Libation on your Mac. - Intel: `Libation.x.x.x-macOS-chardonnay-`**x64**`.dmg` - Mount the dmg and open the disk folder (should open automatically). Drag-drop the Libation app into your Applications folder. - ![macOS-drag-drop-install](images/macOS-drag-drop-install.png) + ![macOS-drag-drop-install](../images/macOS-drag-drop-install.png) - Go to your applications folder and double-click Libation to start it. The first time you run Libation, you'll be asked if you want to run this program downloaded from the internet. Click "Open". - ![macOS-libation-first-run](images/macOS-libation-first-run.png) + ![macOS-libation-first-run](../images/macOS-libation-first-run.png) ## Running Hangover diff --git a/index.md b/index.md new file mode 100644 index 00000000..311e1c63 --- /dev/null +++ b/index.md @@ -0,0 +1,47 @@ +--- +layout: home + +hero: + name: "Libation" + text: "Liberate your Library" + tagline: A free, open-source application for downloading and managing your Audible audiobooks + actions: + - theme: brand + text: Documentation + link: /docs/index + - theme: alt + text: View on GitHub + link: https://github.com/rmcrackan/Libation + +features: +- title: Region Support + details: Supports most regions US, UK, Canada, Germany, France, Australia, Japan, India, and Spain +- title: Cross-Platform + details: Fully supported on Windows, Mac, and Linux +- title: PDF Download + details: Download accompanying PDFs +- title: Import Library + details: Import your library from Audible, including cover art +- title: DRM Removal + details: Download and remove DRM from all books +- title: PDFs + details: Download accompanying PDFs +- title: Organization + details: Add tags to books for better organization +- title: Search + details: Powerful advanced search built on the Lucene search engine +- title: Filters + details: Customizable saved filters for common searches +--- + + +::: info Be aware of +- **File Size**: The application has a large file size. +- **Design**: Made by a programmer, not a designer. The goals are function rather than beauty. +- **Support**: This is a single-developer personal passion project. Support, response, updates, enhancements, bug fixes, etc., are as my free time allows. +- **Updates**: I have a full-time job, a life, and a finite attention span. Therefore, a lot of time can potentially go by with no improvements of any kind. +::: + +::: tip Disclaimer +I've made every good-faith effort to include nothing insecure, malicious, anti-privacy, or destructive. That said: **use at your own risk**. I made this for myself and I want to share it with the great programming and audible/audiobook communities which have been so generous with their time and help. +::: \ No newline at end of file From 7944154ea6d198425b4ad67b5bc358056f07b4fb Mon Sep 17 00:00:00 2001 From: radiorambo Date: Mon, 15 Dec 2025 15:37:19 +0530 Subject: [PATCH 04/18] add icons --- .vitepress/public/favicon.ico | Bin 0 -> 15086 bytes .vitepress/public/favicon.svg | 39 ++++++++++++++++++++ .vitepress/public/libation_logo_dark.svg | 41 ++++++++++++++++++++++ .vitepress/public/libation_logo_light.svg | 41 ++++++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 .vitepress/public/favicon.ico create mode 100644 .vitepress/public/favicon.svg create mode 100644 .vitepress/public/libation_logo_dark.svg create mode 100644 .vitepress/public/libation_logo_light.svg diff --git a/.vitepress/public/favicon.ico b/.vitepress/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..23002dc1439f14ab822419b77a2971750e54cd31 GIT binary patch literal 15086 zcmeHOy>1*w4BmqSq;;dt0Zv7LGzMIyGa$W)BzLKzE&@_Ws#3<4+q=?v3F!nFevMl{ zMC#k{BZo7b-<_4uaFYQ>!y!L@_zEQ&mc)(=~;GD&9N$3ANR{V_Vo`C7x9GZRhnO*y93uX{#|?y_ZSwauTSf z7nrqLS&oO)e>EL5f1h3)&a3BzKF3i1JpVq1`Am+5kbL5-LjJ?E>c1$rIP?P7x?`08 zek|nbWU*KP%J)90PJ5!miVdA3uX1xTnO$${%B&(Bit^RqL0 zc6(&~IF9U#CQIjz^Hl=qHvLaujrca-lL z?-|q^Iy8*>T!b||uO-PO(;BCTIRQE9Ucvhp^0&uAZ93{2fz$ULaB%bFwdkbp!Suk0 z2ghD>y`>zGht4%$JIb|G-d}JGfQKD=a2==B7MSZbKK2M&D|fpN$iP}3a4l^YE)jy7& zc2AkM;trdi=k^u<&^tpxQ^#|MdlW0tX0o_a9Vxt*|rM42Qy7} z&*yPcO`B8m2WPvrd5XRb7d;=hn{CmxN7=OxJy9(g(bufrJrVTYiT&#tdPodL-x{yhPW(f8M$CjonXLwJTu zgRN;o&iq>lI;IyS&;EYkxVhEXYWip`{`UiP-QY%6tf71yBG<;GD|ExZWb&L|K#u13 z8@d9zk%Zq9$T{s@$YSMuN}6xiTxdO4qulgx+(2I4~#OrDvB6ya93bu;cyOlBOr6a=& z$2+2lCU_pk^DXy{8+Go+{WwNGQ8Z^^UC97@O;3jCnUJ;)whwJ?|5*{{z+@a%&M4LX ziQ~gNPVHSEkh!q^_8bWfzIVvu=UBh6f~lbLa1~-qnDP40&lKjyV7CUVwQ|5f8!SNz zh*ZLNGWq&bR5B-G%WdTZ>8FCpk%)ax>xV_VcWMfOtLf)qUSL+8as4TWxT!VP%B*E8 z;ZvRSrvXwqe(FQ>O4y3JKp-l;M&q3d@25D|>DI^cxE~qhIUz(7HuwGUet?I`ehi3_+_Ksz1uW>@3^0u(nhPAFw*VCs@ zpEw6xYf*b0kr!;x0h_lxGHY_RxEejyia1y|xN*(b*wEXKdlTmHX*S1i!c^h9*EA0s zFO~7R9cqEkup(|diDCyskX$Nm!^=LC?`(^o+fzL>55z?;AA@*_5|5sOG*eb&Sui(h zz_r(Uo0u9KBVq#!x!&>^9;+rD$pEg~yIbbfTGU3w$M>!p->=OFSSrYK2YC5#n7nFC zz+w-STS7q7L}T0}`%|}{jG^H}*X8r{zF3NoS0+r-eJ=6;YtWy;sv}X>nL1#Qh6Hom_65c!8jeOy*6iu*#bZmk-Hr@g0{Zk{P zj!vJd3%oT*QWo{ZJMRhI%Lb|(<#3=nxMM*EJ_Cu+bLIl0l&m^>KZiK*`zGEy`ThI; zJANvI*!Y}+{>5xqQ(y645(Y>%vCP zdt+r!{R1Ry!7h@{x7*FMAr8j4*lcqE#aRaB#_zN6T|4f%78hh7G1Gj5WgN%p)vKST z>+9dA%gal?#_k?>aBy6N6<5}AVMUtukO3vSqvw(Lf4}D(kOw;M(>H&RKV6&E)BAZrGLd7xmGy~= z{~|9u)1xIWcKK|V`;0@m0XlGmMwK8Nn@Pavp!BTvj`prREAaCa)lOqGN`XT5zyru! qW64i##i0~~Gn4P(Ey;8qg&YEcBnM=ACnF5a>HMAE7A^^kRQ~~~D!lpt literal 0 HcmV?d00001 diff --git a/.vitepress/public/favicon.svg b/.vitepress/public/favicon.svg new file mode 100644 index 00000000..a521a562 --- /dev/null +++ b/.vitepress/public/favicon.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.vitepress/public/libation_logo_dark.svg b/.vitepress/public/libation_logo_dark.svg new file mode 100644 index 00000000..1d3850d4 --- /dev/null +++ b/.vitepress/public/libation_logo_dark.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + diff --git a/.vitepress/public/libation_logo_light.svg b/.vitepress/public/libation_logo_light.svg new file mode 100644 index 00000000..9e2d6e37 --- /dev/null +++ b/.vitepress/public/libation_logo_light.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + From 90bb4d91768e66fbf11242b1887893ac224e2987 Mon Sep 17 00:00:00 2001 From: radiorambo Date: Mon, 15 Dec 2025 16:05:02 +0530 Subject: [PATCH 05/18] fix favicon and logo not visible --- .vitepress/config.js | 6 +++--- {.vitepress/public => public}/favicon.ico | Bin {.vitepress/public => public}/favicon.svg | 0 .../public => public}/libation_logo_dark.svg | 0 .../public => public}/libation_logo_light.svg | 0 5 files changed, 3 insertions(+), 3 deletions(-) rename {.vitepress/public => public}/favicon.ico (100%) rename {.vitepress/public => public}/favicon.svg (100%) rename {.vitepress/public => public}/libation_logo_dark.svg (100%) rename {.vitepress/public => public}/libation_logo_light.svg (100%) diff --git a/.vitepress/config.js b/.vitepress/config.js index 3d585788..3c269fb5 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -4,12 +4,12 @@ import { defineConfig } from "vitepress"; export default defineConfig({ title: "Libation", description: "Libation: Liberate your Library - A free application for downloading your Audible audiobooks", - head: [["link", { rel: "icon", href: "/.vitepress/public/favicon.ico" }]], + head: [["link", { rel: "icon", href: "/favicon.ico" }]], themeConfig: { // https://vitepress.dev/reference/default-theme-config logo: { - light: "/.vitepress/public/libation_logo_light.svg", - dark: "/.vitepress/public/libation_logo_dark.svg", + light: "/libation_logo_light.svg", + dark: "/libation_logo_dark.svg", }, footer: { diff --git a/.vitepress/public/favicon.ico b/public/favicon.ico similarity index 100% rename from .vitepress/public/favicon.ico rename to public/favicon.ico diff --git a/.vitepress/public/favicon.svg b/public/favicon.svg similarity index 100% rename from .vitepress/public/favicon.svg rename to public/favicon.svg diff --git a/.vitepress/public/libation_logo_dark.svg b/public/libation_logo_dark.svg similarity index 100% rename from .vitepress/public/libation_logo_dark.svg rename to public/libation_logo_dark.svg diff --git a/.vitepress/public/libation_logo_light.svg b/public/libation_logo_light.svg similarity index 100% rename from .vitepress/public/libation_logo_light.svg rename to public/libation_logo_light.svg From 348ec2246547b54a8aa45cc78d09ec1c18496144 Mon Sep 17 00:00:00 2001 From: radiorambo Date: Mon, 15 Dec 2025 17:43:46 +0530 Subject: [PATCH 06/18] update package-lock.json --- package-lock.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index bddf0797..0566a841 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,6 @@ "name": "libation", "version": "1.0.0", "devDependencies": { - "prettier": "^3.7.4", "vitepress": "^1.6.4" } }, From b567c38a98052c19750ebb4f3fed9fbe0245cb82 Mon Sep 17 00:00:00 2001 From: radiorambo Date: Mon, 15 Dec 2025 17:45:34 +0530 Subject: [PATCH 07/18] update syntax, adjust heading levels, reformat tables, and apply minor text and capitalization fixes across documentation. --- docs/advanced/advanced.md | 13 +- .../linux-development-setup-using-nix.md | 46 ++-- docs/features/audio-file-formats.md | 85 +++++--- docs/features/naming-templates.md | 196 +++++++++--------- docs/features/searching-and-filtering.md | 33 ++- docs/frequently-asked-questions.md | 19 +- docs/index.md | 12 +- docs/installation/docker.md | 21 +- docs/installation/install-on-linux.md | 103 +++++---- docs/installation/install-on-mac.md | 11 +- 10 files changed, 298 insertions(+), 241 deletions(-) diff --git a/docs/advanced/advanced.md b/docs/advanced/advanced.md index f959a83c..6c4616ef 100644 --- a/docs/advanced/advanced.md +++ b/docs/advanced/advanced.md @@ -1,6 +1,6 @@ # Advanced -## Files and folders +## Files and Folders To make upgrades and reinstalls easier, Libation separates all of its responsibilities to a few different folders. If you don't want to mess with this stuff: ignore it. Read on if you like a little more control over your files. @@ -27,7 +27,6 @@ In addition to the options that are enabled if you allow Libation to "fix up" th In Libation Chardonnay (not Classic), you may adjust the app colors using the built-in theme editor. Open the Settings window (from the menu bar: Settings > Settings). On the "Important" settings tab, click "Edit Theme Colors". - ### Theme Editor Window The theme editor has a list of style names and their currently assigned colors. To change a style color, click on the color swatch in the left-hand column to open the color editor for that style. Observe the color changes in real-time on the built-in preview panel on the right-hand side of the theme editor. @@ -38,10 +37,9 @@ You may import or export themes using the buttons at the bottom-left of the them "Defaults" will restore the application default colors for the active theme ("Light" or "Dark") "Save" will save the theme colors to the ChardonnayTheme.json file and close the editor. -::: info -Note: you may only edit the currently applied theme ("Light" or -"Dark"). -::: +> [!NOTE] +> You may only edit the currently applied theme ("Light" or +> "Dark"). ### Video Walkthrough @@ -54,6 +52,7 @@ The below video demonstrates using the theme editor to make changes to the Dark Libationcli.exe allows limited access to Libation's functionalities as a CLI. Warnings about relying solely on on the CLI: + - CLI will not perform any upgrades. - It will show that there is an upgrade, but that will likely scroll by too fast to notice. - It will not perform all post-upgrade migrations. Some migrations are only be possible by launching GUI. @@ -150,7 +149,7 @@ libationcli export -p "C:\foo\bar\my.xlsx" -x ### Set Download Status -Set download statuses throughout library based on whether each book's audio file can be found. +Set download statuses throughout library based on whether each book's audio file can be found. Must include at least one flag: --downloaded , --not-downloaded. Downloaded: If the audio file can be found, set download status to 'Downloaded'. Not Downloaded: If the audio file cannot be found, set download status to 'Not Downloaded' diff --git a/docs/advanced/linux-development-setup-using-nix.md b/docs/advanced/linux-development-setup-using-nix.md index b81acee1..ff7a21fd 100644 --- a/docs/advanced/linux-development-setup-using-nix.md +++ b/docs/advanced/linux-development-setup-using-nix.md @@ -1,62 +1,78 @@ # Development Environment Setup using Nix or Nix Flakes on Linux x86_64 + [Nix flakes](https://nixos.wiki/wiki/Flakes) can be used to provide version controlled reproducible and cross-platform development environments. The key files are: + - `flake.nix`: Defines the flake inputs and outputs, including development shells. - `shell.nix`: This file defines the dependencies and additionally adds support for the Impure `nix-shell` method. This is used by the flake to create the dev environment. - `flake.lock`: Locks the versions of inputs for reproducibility. ---- + ## Prerequisites + - [Nix](https://nixos.org/download.html) the package manager or NixOs installed on Linux (x86_64-linux) -- Optional: flakes support enabled. ---- +- Optional: flakes support enabled. + ## Using the Development Shell + You have two primary ways to enter the development shell with Nix: + ### 1. Using `nix develop` (flake-native command) + This is the recommended way if you have Nix with flakes support. Flake guarantee the versions of the dependencies and can be controlled through `flake.nix` and `flake.lock`. -``` + +```bash nix develop ``` + This will open a shell with all dependencies and environment configured as per the `flake.nix` for (`x86_64-linux`) systems only at this time. ---- ### 2. Using `nix-shell` (that's why shell.nix is a separate file) + If you want to use traditional `nix-shell` tooling which uses the nixpkgs version of your system: -``` + +```bash nix-shell ``` + This will drop you into the shell environment defined in `shell.nix`. Note that this is not flake-native method and does not use the locked nixpkgs in `flake.lock` so exact versions of the dependancies is not guaranteed. ---- -## What’s inside the dev shell? +## What’s Inside the Dev Shell? + - The environment variables and packages configured in `shell.nix` will be available. - The package set (`pkgs`) used aligns with the versions locked in `flake.lock` to ensure reproducibility. ---- -## Example Workflow using flakes -``` +## Example Workflow Using Flakes + +```bash # Navigate to the project root folder which contains the flake.nix, flake.lock and shell.nix files. + cd /home/user/dev/Libation + # Enter the flake development shell (Linux x86_64) + nix develop + # run VSCode or VSCodium from the current shell environment + code . + # Run or Debug using VSCode and VSCodium using the linux Launch configuration. ``` + ![Debug using VSCode and VSCodium](../images/StartingDebuggingInVSCode.png) You can also Build and run your application inside the shell. -``` + +```bash dotnet build ./Source/LibationAvalonia/LibationAvalonia.csproj -p:TargetFrameworks=net9.0 -p:TargetFramework=net9.0 -p:RuntimeIdentifier=linux-x64 ``` ---- - ## Notes + - Leaving the current shell environemnt will drop all added dependancies and you will not be able to run or debug the program unless your system has those dependancies defined globally. - To exit the shell environment voluntarily use `exit` inside the shell. - Ensure you have no conflicting `nix.conf` or `global.json` that might affect SDK versions or runtime identifiers. - Keep your `flake.lock` file committed to ensure builds are reproducible for all collaborators. ---- ## References - [Nix Flakes - NixOS Wiki](https://nixos.wiki/wiki/Flakes) diff --git a/docs/features/audio-file-formats.md b/docs/features/audio-file-formats.md index 93afbe12..26de5e56 100644 --- a/docs/features/audio-file-formats.md +++ b/docs/features/audio-file-formats.md @@ -2,85 +2,105 @@ Libation will download audio in a number of different audio formats, depending on the settings you choose within Libation and the per-title availability of audio formats from Audible. The Libation settings which affect the format downloaded by Libation are shown in the Settings menu screenshot below. -Notes: -- Audiobook file extensions are either `.m4b` or `.mp3`. Libation uses the `.m4b` file extension for all non-MP3 files, regardless of the audio codec contained therein. Some media players don't recognize the `.m4b` file extension and may require the extension be changed to `.m4a` or `.mp4`. -- Most (but not all) podcasts are delivered by Audible as native MP3 files. None of the following audio formats and settings discussions pertain to those podcasts because MP3s have no DRM, and those episodes are copied directly to their output folders. +> [!NOTE] +> +> - Audiobook file extensions are either `.m4b` or `.mp3`. Libation uses the `.m4b` file extension for all non-MP3 files, regardless of the audio codec contained therein. Some media players don't recognize the `.m4b` file extension and may require the extension be changed to `.m4a` or `.mp4`. +> - Most (but not all) podcasts are delivered by Audible as native MP3 files. None of the following audio formats and settings discussions pertain to those podcasts because MP3s have no DRM, and those episodes are copied directly to their output folders. ![Audio format settings menu](../images/AudioFormatSettings.png) ## Settings Summary -### Audio quality to request from Audible + +### Audio Quality to Request From Audible + Audiobooks can be requested from Audible as "Normal" quality or "High" quality, matching the settings in the Audible mobile apps. This setting affects the audio bitrate and, sometimes, the number of audio channels. This setting has no effect on the _audio codec_. ### Use Widevine DRM + When this setting is disabled, all audiobooks will be downloaded using Audible's in-house DRM (AAX(C)) in the [AAC-LC](#aac-lc) format. When this setting is enabled, Libation will request audio files protected by Google's Widevine Digital Rights Managements scheme, and two additional settings will be unlocked: [Request xHE-AAC Codec](#request-xhe-aac-codec) and [Request Spatial Audio](#request-spatial-audio) (explained further below). If you don't enable either of those additional options, then enabling 'Use Widevine DRM' will have no pratcical effect in nearly all circumstances. Audiobooks will be downloaded in the same [AAC-LC](#aac-lc) format with the same bitrate and the same number of audio channels. On rare occasions, enabling 'Use Widevine DRM' without the other two options will result in audio files with a different bitrate. ### Request xHE-AAC Codec + Enable this setting to request audiobooks in the [xHE-AAC](#xhe-aac) format. This codec is generally better quality than the [AAC-LC](#aac-lc) codec at the same bitrate, but it isn't as commonly supported by media players, so you may have some difficulty playing these audiobooks. The highest bitrate version of some audiobooks is only available as [xHE-AAC](#xhe-aac). ### Request Spatial Audio + Enable this setting to request audiobooks in a "spatial" ([Dolby Atmos](#dolby-atmos)) audio format. If an audiobook is not available in a spatial format, it will instead be downloaded in the [xHE-AAC codec](#xhe-aac). -### Spatial audio codec +### Spatial Audio Codec + Choose whether spatial audiobooks are downloaded in the [E-AC-3](#e-ac-3) or [AC-4](#ac-4) format. -### Download my books in the original audio format (Lossless) +### Download My Books in the Original Audio Format (Lossless) + If selected, Audiobooks will be downloaded and saved in the format delivered by audible (which depends on the settings explained above). Libation will not change the audio. -### Download my books as .MP3 files (transcode if necessary). +### Download My Books as .MP3 Files (Transcode if Necessary) + If selected, Libation will decode [AAC-LC](#aac-lc), [xHE-AAC](#xhe-aac), and [E-AC-3](#e-ac-3) audiobooks and re-encode them as MP3s using the MP3 encoder settings ([read about LAME MP3 encoder settings](https://lame.sourceforge.io/lame_ui_example.php)). Note that Libation cannot convert [AC-4](#ac-4) audio to MP3. -# Audio Formats +## Audio Formats -## Traditional Mono and Stereo Formats +### Traditional Mono and Stereo Formats -### AAC-LC -#### _Full Name_ -Advanced Audio Coding - Low Complexity -#### _Description_ -This is the base profile for AAC audio and has existed since AAC's initial release in 1997. It enjoys wide support on nearly every conceivable platform capable of playing digital audio, as ubiquitous as MP3. +#### AAC-LC + +**Full Name:** Advanced Audio Coding - Low Complexity + +**Description:** This is the base profile for AAC audio and has existed since AAC's initial release in 1997. It enjoys wide support on nearly every conceivable platform capable of playing digital audio, as ubiquitous as MP3. If Widevine support is not enabled, or if the book is not available in the more high-definition formats, Libation will download audiobooks in this format. -### MP3 -#### _Full Name_ -MPEG-1 Audio Layer III or MPEG-2 Audio Layer III -#### _Description_ +#### MP3 + +**Full Name:** MPEG-1 Audio Layer III or MPEG-2 Audio Layer III + +**Description:** + An older (released in 1991) but still nearly universally supported audio codec. Its audio quality is generally worse than AAC-LC at similar bitrates. Audible delivers some podcasts in MP3 format, but no audiobooks are natively availble as MP3. Libation supports converting Audiobooks delivered in other audio formats to MP3. Note that the MP3 format supports a maximum of two audio channels, so multichannel E-AC-3 audio will be downsampled to stereo or mono (depending on the Libation's settings). [AC-4](#ac-4) cannot be converted to MP3. -### xHE-AAC -#### _Full Name_ -Extended High-Efficiency Advanced Audio Coding -#### _Description_ +#### xHE-AAC + +**Full Name:** Extended High-Efficiency Advanced Audio Coding + +**Description:** + This is a proprietary codec created by the [Fraunhofer Institute for Integrated Circuits IIS](https://www.iis.fraunhofer.de/en/ff/amm/broadcast-streaming/xheaac.html). It combines features of the HE-AAC v2 and the baseline USAC (Unified Speech and Audio Coding) profiles with the parts of the MPEG-D DRC Loudness Control Profile or Dynamic Range Control Profile. Therefore, USAC and xHE-AAC are not synonymous and should not be used interchangeably. A player capable of decoding USAC will not necessarily be able to decode xHE-AAC. xHE-AAC boasts significantly higher quality audio at low bitrates. Though it has existed since at least 2016, playback support is still quite limited. FFmpeg has recently added partial decoder support for the USAC profiles, but it is insufficient to decode the xHE-AAC audio files acquired from Audible (due to FFmpeg's lack of support for MPEG Surround for Mono to Stereo Upmixing; ISO 23003-3:2012 §7.11) Note that the xHE-AAC files authored by Audible have some USAC conformance errors including: + - Number of samples per frame not matching the UsacConfig coreCoderFrameLength value. - Disagreement between stts and UsacFrame usacIndependencyFlag value. - Stts indicating a frame is an immediate play-out frame, but USAC AudioPreRoll is absent. -## Dolby Atmos +### Dolby Atmos + Atmos is a surround sound technology that expands on existing surround sound systems by adding height channels as well as free-moving sound objects. Audible delivers Dolby Atmos in two formats: E-AC-3 and AC-4. Your device's ability to play audio from these formats does not necessarily mean that the audio you are hearing is Atmos (spatial). For instance, downloading the AC-4 codec for Windows ([links in the [Supported media Players](#supported-media-players) section) will enable you to play AC-4 audiobooks, but you'll still need to download [Dolby Access](https://apps.microsoft.com/detail/9n0866fs04w8?hl=en-US&gl=US) and pay $15 to enable _Dolby Atmos For Headphones_. Please refer to [this comment](https://github.com/rmcrackan/Libation/pull/1331#discussion_r2268660524) for additional context. -### E-AC-3 -#### _Full Name_ -Dolby Digital Plus (a.k.a Enhanced AC-3, DDP, DD+, and EC-3) -#### _Description_ +#### E-AC-3 + +**Full Name:** Dolby Digital Plus (a.k.a Enhanced AC-3, DDP, DD+, and EC-3) + +**Description:** + A proprietary digital audio compression scheme developed by Dolby Digital for the transport and storage of multichannel audio. This format can be extended to add support for Atmos, making the codec _Dolby Digital Plus Atmos_. _Dolby Digital Plus Atmos_ is backwards compatible with Dolby Digital Plus, so any media player capable of playing Dolby Digital Plus can play _Dolby Digital Plus Atmos_. Audible spatial audiobooks downloaded in the E-AC-3 format are _Dolby Digital Plus Atmos_. If they are played by a media player that supports Atmos, they will play as Atmos audio. If they are played by a media player that does not support Atmos, they will be played as traditional 5.1 surround audio. -### AC-4 -#### _Full Name_ -Dolby AC-4 -#### _Description_ +#### AC-4 + +**Full Name:** Dolby AC-4 + +**Description:** + A proprietary audio compression technology developed by Dolby Digital for the transport and storage of audio channels and/or audio objects. Audible spatial audiobooks downloaded in the AC-4 format are 2-channel AC-4 Immersive Stereo (AC4-IMS) audio, intended for playback in headphones or earbuds (though apparently [not supported on Apple devices](https://github.com/rmcrackan/Libation/issues/996#issuecomment-3169574514)). -# Supported Media Players +## Supported Media Players + Below is an incomplete matrix of codec support across various media players and platforms. | Player | [AAC-LC](#aac-lc) | [xHE-AAC](#xhe-aac) | [E-AC-3](#e-ac-3) | [AC-4](#ac-4) | | :--- | :---: | :---: | :---: | :---: | @@ -101,4 +121,3 @@ Below is an incomplete matrix of codec support across various media players and 6. requires FFmpeg to be [built with fdk-aac](https://trac.ffmpeg.org/wiki/Encode/AAC#fdk_aac). You will almost certainly not find pre-build binaries in the wild due to licensing restrictions. 7. Requires the [fdk-aac plugin](https://www.foobar2000.org/components/view/foo_pd_aac) (Windows only) 8. Requires audio file extensions to be `.m4a` or `.mp4`. Libation sets the file extensions to `.m4b`, so you must manually change it to `.m4a` by renaming the audio file. - diff --git a/docs/features/naming-templates.md b/docs/features/naming-templates.md index bd4576a0..ccbf2d5a 100644 --- a/docs/features/naming-templates.md +++ b/docs/features/naming-templates.md @@ -1,52 +1,50 @@ - - - # Naming Templates + File and Folder names can be customized using Libation's built-in tag template naming engine. To edit how folder and file names are created, go to Settings \> Download/Decrypt and edit the naming templates. If you're splitting your audiobook into multiple files by chapter, you can also use a custom template to set each chapter's title metadata tag by editing the template in Settings \> Audio File Options. These templates apply to both GUI and CLI. - -# Template Tags +## Template Tags These are the naming template tags currently supported by Libation. -## Property Tags +### Property Tags + These tags will be replaced in the template with the audiobook's values. -|Tag|Description|Type| -|-|-|-| -|\ **†**|Audible book ID (ASIN)|Text| -|\|Full title with subtitle|[Text](#text-formatters)| -|\|Title. Stop at first colon|[Text](#text-formatters)| -|\<audible title\>|Audible's title (does not include subtitle)|[Text](#text-formatters)| -|\<audible subtitle\>|Audible's subtitle|[Text](#text-formatters)| -|\<author\>|Author(s)|[Name List](#name-list-formatters)| -|\<first author\>|First author|[Name](#name-formatters)| -|\<narrator\>|Narrator(s)|[Name List](#name-list-formatters)| -|\<first narrator\>|First narrator|[Name](#name-formatters)| -|\<series\>|All series to which the book belongs (if any)|[Series List](#series-list-formatters)| -|\<first series\>|First series|[Series](#series-formatters)| -|\<series#\>|Number order in series (alias for \<first series[{#}]\>|[Number](#number-formatters)| -|\<bitrate\>|Bitrate (kbps) of the last downloaded audiobook|[Number](#number-formatters)| -|\<samplerate\>|Sample rate (Hz) of the last downloaded audiobook|[Number](#number-formatters)| -|\<channels\>|Number of audio channels in the last downloaded audiobook|[Number](#number-formatters)| -|\<codec\>|Audio codec of the last downloaded audiobook|[Text](#text-formatters)| -|\<file version\>|Audible's file version number of the last downloaded audiobook|[Text](#text-formatters)| -|\<libation version\>|Libation version used during last download of the audiobook|[Text](#text-formatters)| -|\<account\>|Audible account of this book|[Text](#text-formatters)| -|\<account nickname\>|Audible account nickname of this book|[Text](#text-formatters)| -|\<locale\>|Region/country|[Text](#text-formatters)| -|\<year\>|Year published|[Number](#number-formatters)| -|\<language\>|Book's language|[Text](#text-formatters)| -|\<language short\> **†**|Book's language abbreviated. Eg: ENG|Text| -|\<file date\>|File creation date/time.|[DateTime](#date-formatters)| -|\<pub date\>|Audiobook publication date|[DateTime](#date-formatters)| -|\<date added\>|Date the book added to your Audible account|[DateTime](#date-formatters)| -|\<ch count\> **‡**|Number of chapters|[Number](#number-formatters)| -|\<ch title\> **‡**|Chapter title|[Text](#text-formatters)| -|\<ch#\> **‡**|Chapter number|[Number](#number-formatters)| -|\<ch# 0\> **‡**|Chapter number with leading zeros|[Number](#number-formatters)| +| Tag | Description | Type | +| ------------------------ | -------------------------------------------------------------- | -------------------------------------- | +| \<id\> **†** | Audible book ID (ASIN) | Text | +| \<title\> | Full title with subtitle | [Text](#text-formatters) | +| \<title short\> | Title. Stop at first colon | [Text](#text-formatters) | +| \<audible title\> | Audible's title (does not include subtitle) | [Text](#text-formatters) | +| \<audible subtitle\> | Audible's subtitle | [Text](#text-formatters) | +| \<author\> | Author(s) | [Name List](#name-list-formatters) | +| \<first author\> | First author | [Name](#name-formatters) | +| \<narrator\> | Narrator(s) | [Name List](#name-list-formatters) | +| \<first narrator\> | First narrator | [Name](#name-formatters) | +| \<series\> | All series to which the book belongs (if any) | [Series List](#series-list-formatters) | +| \<first series\> | First series | [Series](#series-formatters) | +| \<series#\> | Number order in series (alias for \<first series[{#}]\> | [Number](#number-formatters) | +| \<bitrate\> | Bitrate (kbps) of the last downloaded audiobook | [Number](#number-formatters) | +| \<samplerate\> | Sample rate (Hz) of the last downloaded audiobook | [Number](#number-formatters) | +| \<channels\> | Number of audio channels in the last downloaded audiobook | [Number](#number-formatters) | +| \<codec\> | Audio codec of the last downloaded audiobook | [Text](#text-formatters) | +| \<file version\> | Audible's file version number of the last downloaded audiobook | [Text](#text-formatters) | +| \<libation version\> | Libation version used during last download of the audiobook | [Text](#text-formatters) | +| \<account\> | Audible account of this book | [Text](#text-formatters) | +| \<account nickname\> | Audible account nickname of this book | [Text](#text-formatters) | +| \<locale\> | Region/country | [Text](#text-formatters) | +| \<year\> | Year published | [Number](#number-formatters) | +| \<language\> | Book's language | [Text](#text-formatters) | +| \<language short\> **†** | Book's language abbreviated. Eg: ENG | Text | +| \<file date\> | File creation date/time. | [DateTime](#date-formatters) | +| \<pub date\> | Audiobook publication date | [DateTime](#date-formatters) | +| \<date added\> | Date the book added to your Audible account | [DateTime](#date-formatters) | +| \<ch count\> **‡** | Number of chapters | [Number](#number-formatters) | +| \<ch title\> **‡** | Chapter title | [Text](#text-formatters) | +| \<ch#\> **‡** | Chapter number | [Number](#number-formatters) | +| \<ch# 0\> **‡** | Chapter number with leading zeros | [Number](#number-formatters) | **†** Does not support custom formatting @@ -54,30 +52,31 @@ These tags will be replaced in the template with the audiobook's values. To change how these properties are displayed, [read about custom formatters](#tag-formatters) -## Conditional Tags -Anything between the opening tag (`<tagname->`) and closing tag (`<-tagname>`) will only appear in the name if the condition evaluates to true. +### Conditional Tags -|Tag|Description|Type| -|-|-|-| -|\<if series-\>...\<-if series\>|Only include if part of a book series or podcast|Conditional| -|\<if podcast-\>...\<-if podcast\>|Only include if part of a podcast|Conditional| -|\<if bookseries-\>...\<-if bookseries\>|Only include if part of a book series|Conditional| -|\<if podcastparent-\>...\<-if podcastparent\>**†**|Only include if item is a podcast series parent|Conditional| -|\<has PROPERTY-\>...\<-has\>|Only include if the PROPERTY has a value (i.e. not null or empty)|Conditional| +Anything between the opening tag (`<tagname->`) and closing tag (`<-tagname>`) will only appear in the name if the condition evaluates to true. + +| Tag | Description | Type | +| -------------------------------------------------- | ----------------------------------------------------------------- | ----------- | +| \<if series-\>...\<-if series\> | Only include if part of a book series or podcast | Conditional | +| \<if podcast-\>...\<-if podcast\> | Only include if part of a podcast | Conditional | +| \<if bookseries-\>...\<-if bookseries\> | Only include if part of a book series | Conditional | +| \<if podcastparent-\>...\<-if podcastparent\>**†** | Only include if item is a podcast series parent | Conditional | +| \<has PROPERTY-\>...\<-has\> | Only include if the PROPERTY has a value (i.e. not null or empty) | Conditional | **†** Only affects the podcast series folder naming if "Save all podcast episodes to the series parent folder" option is checked. For example, `<if podcast-><series><-if podcast>` will evaluate to the podcast's series name if the file is a podcast. For audiobooks that are not podcasts, that tag will be blank. -You can invert the condition (instead of displaying the text when the condition is true, display the text when it is false) by playing a `!` symbol before the opening tag name. +You can invert the condition (instead of displaying the text when the condition is true, display the text when it is false) by playing a `!` symbol before the opening tag name. -|Inverted Tag|Description|Type| -|-|-|-| -|\<!if series-\>...\<-if series\>|Only include if *not* part of a book series or podcast|Conditional| -|\<!if podcast-\>...\<-if podcast\>|Only include if *not* part of a podcast|Conditional| -|\<!if bookseries-\>...\<-if bookseries\>|Only include if *not* part of a book series|Conditional| -|\<!if podcastparent-\>...\<-if podcastparent\>**†**|Only include if item is *not* a podcast series parent|Conditional| -|\<!has PROPERTY-\>...\<-has\>|Only include if the PROPERTY *does not* have a value (i.e. is null or empty)|Conditional| +| Inverted Tag | Description | Type | +| --------------------------------------------------- | ---------------------------------------------------------------------------- | ----------- | +| \<!if series-\>...\<-if series\> | Only include if _not_ part of a book series or podcast | Conditional | +| \<!if podcast-\>...\<-if podcast\> | Only include if _not_ part of a podcast | Conditional | +| \<!if bookseries-\>...\<-if bookseries\> | Only include if _not_ part of a book series | Conditional | +| \<!if podcastparent-\>...\<-if podcastparent\>**†** | Only include if item is _not_ a podcast series parent | Conditional | +| \<!has PROPERTY-\>...\<-has\> | Only include if the PROPERTY _does not_ have a value (i.e. is null or empty) | Conditional | **†** Only affects the podcast series folder naming if "Save all podcast episodes to the series parent folder" option is checked. @@ -97,41 +96,48 @@ And this example will customize the title based on whether the book has a subtit `<audible title><has audible subtitle->-<audible subtitle><-has>` -# Tag Formatters +## Tag Formatters + **Text**, **Name List**, **Number**, and **DateTime** tags can be optionally formatted using format text in square brackets after the tag name. Below is a list of supported formatters for each tag type. -## Text Formatters -|Formatter|Description|Example Usage|Example Result| -|-|-|-|-| -|L|Converts text to lowercase|\<title[L]\>|a study in scarlet꞉ a sherlock holmes novel| -|U|Converts text to uppercase|\<title short[U]\>|A STUDY IN SCARLET| +### Text Formatters -## Series Formatters -|Formatter|Description|Example Usage|Example Result| -|-|-|-|-| -|\{N \| # \| ID\}|Formats the series using<br>the series part tags.<br>\{N\} = Series Name<br>\{#\} = Number order in series<br>\{#:[Number_Formatter](#number-formatters)\} = Number order in series, formatted<br>\{ID\} = Audible Series ID<br><br>Default is \{N\}|`<first series>`<hr>`<first series[{N}]>`<hr>`<first series[{N}, {#}, {ID}]>`<hr>`<first series[{N}, {ID}, {#:00.0}]>`|Sherlock Holmes<hr>Sherlock Holmes<hr>Sherlock Holmes, 1-6, B08376S3R2<hr>Sherlock Holmes, B08376S3R2, 01.0-06.0| +| Formatter | Description | Example Usage | Example Result | +| --------- | -------------------------- | ------------------ | ------------------------------------------- | +| L | Converts text to lowercase | \<title[L]\> | a study in scarlet꞉ a sherlock holmes novel | +| U | Converts text to uppercase | \<title short[U]\> | A STUDY IN SCARLET | -## Series List Formatters -|Formatter|Description|Example Usage|Example Result| -|-|-|-|-| -|separator()|Speficy the text used to join<br>multiple series names.<br><br>Default is ", "|`<series[separator(; )]>`|Sherlock Holmes; Some Other Series| -|format(\{N \| # \| ID\})|Formats the series properties<br>using the name series tags.<br>See [Series Formatter Usage](#series-formatters) above.|`<series[format({N}, {#})`<br>`separator(; )]>`<hr>`<series[format({ID}-{N}, {#:00.0})]>`|Sherlock Holmes, 1-6; Book Collection, 1<hr>B08376S3R2-Sherlock Holmes, 01.0-06.0, B000000000-Book Collection, 01.0| -|max(#)|Only use the first # of series<br><br>Default is all series|`<series[max(1)]>`|Sherlock Holmes| +### Series Formatters -## Name Formatters -|Formatter|Description|Example Usage|Example Result| -|-|-|-|-| -|\{T \| F \| M \| L \| S \| ID\}|Formats the human name using<br>the name part tags.<br>\{T\} = Title (e.g. "Dr.")<br>\{F\} = First name<br>\{M\} = Middle name<br>\{L\} = Last Name<br>\{S\} = Suffix (e.g. "PhD")<br>\{ID\} = Audible Contributor ID<br><br>Default is \{P\} \{F\} \{M\} \{L\} \{S\}|`<first narrator[{L}, {F}]>`<hr>`<first author[{L}, {F} _{ID}_]>`|Fry, Stephen<hr>Doyle, Arthur \_B000AQ43GQ\_;<br>Fry, Stephen \_B000APAGVS\_| +| Formatter | Description | Example Usage | Example Result | +| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| \{N \| # \| ID\} | Formats the series using<br>the series part tags.<br>\{N\} = Series Name<br>\{#\} = Number order in series<br>\{#:[Number_Formatter](#number-formatters)\} = Number order in series, formatted<br>\{ID\} = Audible Series ID<br><br>Default is \{N\} | `<first series>`<hr>`<first series[{N}]>`<hr>`<first series[{N}, {#}, {ID}]>`<hr>`<first series[{N}, {ID}, {#:00.0}]>` | Sherlock Holmes<hr>Sherlock Holmes<hr>Sherlock Holmes, 1-6, B08376S3R2<hr>Sherlock Holmes, B08376S3R2, 01.0-06.0 | -## Name List Formatters -|Formatter|Description|Example Usage|Example Result| -|-|-|-|-| -|separator()|Speficy the text used to join<br>multiple people's names.<br><br>Default is ", "|`<author[separator(; )]>`|Arthur Conan Doyle; Stephen Fry| -|format(\{T \| F \| M \| L \| S \| ID\})|Formats the human name using<br>the name part tags.<br>See [Name Formatter Usage](#name-formatters) above.|`<author[format({L}, {F})`<br>`separator(; )]>`<hr>`<author[format({L}, {F}`<br>`_{ID}_) separator(; )]>`|Doyle, Arthur; Fry, Stephen<hr>Doyle, Arthur \_B000AQ43GQ\_;<br>Fry, Stephen \_B000APAGVS\_| -|sort(F \| M \| L)|Sorts the names by first, middle,<br>or last name<br><br>Default is unsorted|`<author[sort(M)]>`|Stephen Fry, Arthur Conan Doyle| -|max(#)|Only use the first # of names<br><br>Default is all names|`<author[max(1)]>`|Arthur Conan Doyle| +### Series List Formatters + +| Formatter | Description | Example Usage | Example Result | +| ------------------------ | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| separator() | Speficy the text used to join<br>multiple series names.<br><br>Default is ", " | `<series[separator(; )]>` | Sherlock Holmes; Some Other Series | +| format(\{N \| # \| ID\}) | Formats the series properties<br>using the name series tags.<br>See [Series Formatter Usage](#series-formatters) above. | `<series[format({N}, {#})`<br>`separator(; )]>`<hr>`<series[format({ID}-{N}, {#:00.0})]>` | Sherlock Holmes, 1-6; Book Collection, 1<hr>B08376S3R2-Sherlock Holmes, 01.0-06.0, B000000000-Book Collection, 01.0 | +| max(#) | Only use the first # of series<br><br>Default is all series | `<series[max(1)]>` | Sherlock Holmes | + +### Name Formatters + +| Formatter | Description | Example Usage | Example Result | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| \{T \| F \| M \| L \| S \| ID\} | Formats the human name using<br>the name part tags.<br>\{T\} = Title (e.g. "Dr.")<br>\{F\} = First name<br>\{M\} = Middle name<br>\{L\} = Last Name<br>\{S\} = Suffix (e.g. "PhD")<br>\{ID\} = Audible Contributor ID<br><br>Default is \{P\} \{F\} \{M\} \{L\} \{S\} | `<first narrator[{L}, {F}]>`<hr>`<first author[{L}, {F} _{ID}_]>` | Fry, Stephen<hr>Doyle, Arthur \_B000AQ43GQ\_;<br>Fry, Stephen \_B000APAGVS\_ | + +### Name List Formatters + +| Formatter | Description | Example Usage | Example Result | +| --------------------------------------- | ---------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | +| separator() | Speficy the text used to join<br>multiple people's names.<br><br>Default is ", " | `<author[separator(; )]>` | Arthur Conan Doyle; Stephen Fry | +| format(\{T \| F \| M \| L \| S \| ID\}) | Formats the human name using<br>the name part tags.<br>See [Name Formatter Usage](#name-formatters) above. | `<author[format({L}, {F})`<br>`separator(; )]>`<hr>`<author[format({L}, {F}`<br>`_{ID}_) separator(; )]>` | Doyle, Arthur; Fry, Stephen<hr>Doyle, Arthur \_B000AQ43GQ\_;<br>Fry, Stephen \_B000APAGVS\_ | +| sort(F \| M \| L) | Sorts the names by first, middle,<br>or last name<br><br>Default is unsorted | `<author[sort(M)]>` | Stephen Fry, Arthur Conan Doyle | +| max(#) | Only use the first # of names<br><br>Default is all names | `<author[max(1)]>` | Arthur Conan Doyle | + +### Number Formatters -## Number Formatters For more custom formatters and examples, [see this guide from Microsoft](https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings). |Formatter|Description|Example Usage|Example Result| |-|-|-|-| @@ -139,15 +145,19 @@ For more custom formatters and examples, [see this guide from Microsoft](https:/ |0|Replaces the zero with the corresponding digit if one<br>is present; otherwise, zero appears in the result string.|\<series#\[000.0\]\>|001.0| |#|Replaces the "#" symbol with the corresponding digit if one<br> is present; otherwise, no digit appears in the result string|\<series#\[00.##\]\>|01| -## Date Formatters -Form more standard formatters, [see this guide from Microsoft](https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings). -### Standard DateTime Formatters -|Formatter|Description|Example Usage|Example Result| -|-|-|-|-| -|s|Sortable date/time pattern.|\<file date[s]\>|2023-02-14T13:45:30| -|Y|Year month pattern.|\<file date[Y]\>|February 2023| +### Date Formatters + +Form more standard formatters, [see this guide from Microsoft](https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings). + +#### Standard DateTime Formatters + +| Formatter | Description | Example Usage | Example Result | +| --------- | --------------------------- | ---------------- | ------------------- | +| s | Sortable date/time pattern. | \<file date[s]\> | 2023-02-14T13:45:30 | +| Y | Year month pattern. | \<file date[Y]\> | February 2023 | + +#### Custom DateTime Formatters -### Custom DateTime Formatters You can use custom formatters to construct customized DateTime string. For more custom formatters and examples, [see this guide from Microsoft](https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings). |Formatter|Description|Example Usage|Example Result| |-|-|-|-| @@ -156,5 +166,3 @@ You can use custom formatters to construct customized DateTime string. For more |MM|2-digit month|\<file date[MM]\>|02| |dd|2-digit day of the month|\<file date[yyyy-MM-dd]\>|2023-02-14| |HH<br>mm|The hour, using a 24-hour clock from 00 to 23<br>The minute, from 00 through 59.|\<file date[HH:mm]\>|14:45| - - diff --git a/docs/features/searching-and-filtering.md b/docs/features/searching-and-filtering.md index 66587754..1b909673 100644 --- a/docs/features/searching-and-filtering.md +++ b/docs/features/searching-and-filtering.md @@ -1,7 +1,6 @@ +# Searching and Filtering -# Searching and filtering - -### Tags +## Tags To add tags to a title, click the tags button @@ -17,21 +16,21 @@ Tags are saved non-case specific for easy search. There is one special tag "hidd To edit tags, just click the button again. -### Searches +## Searches Libation's advanced searching is built on the powerful Lucene search engine. Simple searches are effortless and powerful searches are simple. To search, just type and click Filter or press enter -* Type anything in the search box to search common fields: title, authors, narrators, and the book's audible id -* Use Lucene's "Query Parser Syntax" for advanced searching. - * Easy tutorial: http://www.lucenetutorial.com/lucene-query-syntax.html - * Full official guide: https://lucene.apache.org/core/2_9_4/queryparsersyntax.html -* Tons of search fields, specific to audiobooks -* Synonyms so you don't have to memorize magic words. Eg: author and author**s** will both work -* Click [?] button for a full list of search fields and synonyms ![Filter options](../images/FilterOptionsButton.png) -* Search by tag like \[this\] -* When tags have an underscore you can use part of the tag. This is useful for quick categories. The below examples make this more clear. +- Type anything in the search box to search common fields: title, authors, narrators, and the book's audible id +- Use Lucene's "Query Parser Syntax" for advanced searching. + - Easy tutorial: http://www.lucenetutorial.com/lucene-query-syntax.html + - Full official guide: https://lucene.apache.org/core/2_9_4/queryparsersyntax.html +- Tons of search fields, specific to audiobooks +- Synonyms so you don't have to memorize magic words. Eg: author and author**s** will both work +- Click [?] button for a full list of search fields and synonyms ![Filter options](../images/FilterOptionsButton.png) +- Search by tag like \[this\] +- When tags have an underscore you can use part of the tag. This is useful for quick categories. The below examples make this more clear. -### Search examples +## Search Examples Search for anything with the word potter @@ -52,10 +51,10 @@ To see only books written by Neil Gaiman where he also narrates his own book. (I I tagged autobiographies as auto_bio and biographies written by someone else as bio. I can get only autobiographies with \[auto_bio\] or get both by searching \[bio\] -![Search example: \[bio\]](../images/SearchExampleBio.png) -![Search example: \[auto_bio\]](../images/SearchExampleAutoBio.png) +![Search example: [bio]](../images/SearchExampleBio.png) +![Search example: [auto_bio]](../images/SearchExampleAutoBio.png) -### Filters +## Filters If you have a search you want to save, click Add To Quick Filters to save it in your Quick Filters list. To use it again, select it from the Quick Filters list. diff --git a/docs/frequently-asked-questions.md b/docs/frequently-asked-questions.md index f3831171..2fce6cd4 100644 --- a/docs/frequently-asked-questions.md +++ b/docs/frequently-asked-questions.md @@ -1,10 +1,10 @@ # Frequently Asked Questions -## Where can I get help for my specific problem? +## Where Can I Get Help For My Specific Problem? You can open an issue here for bug reports, feature requests, or specialized help. -## What's the difference between 'Classic' and 'Chardonnay'? +## What's the Difference Between 'Classic' and 'Chardonnay'? First and most importantly: Classic and Chardonnay have the exact same features. @@ -12,7 +12,7 @@ First and most importantly: Classic and Chardonnay have the exact same features. - **Chardonnay** is available for Windows, Mac, and Linux. Its modern design has a more open look and feel. -## Now that I've downloaded my books, how can I listen to them? +## Now That I've Downloaded My Books, How Can I Listen to Them? You can use any app which plays m4b files (or mp3 files if you used that setting). Here are just a few ideas. Disclaimer: I have no affiliation with any of these companies: @@ -28,25 +28,24 @@ Self-hosting online: - [audiobookshelf](https://www.audiobookshelf.org). On [reddit](https://www.reddit.com/r/audiobookshelf/) - [plex](https://www.plex.tv/). Listen with [Prologue](https://prologue.audio/) (iOS) -## I'm having trouble playing my non-spatial audiobook, how can I fix this? +## I'm Having Trouble Playing My Non-Spatial Audiobook, How Can I Fix This? If you enabled the [Request xHE-AAC Codec](./features/audio-file-formats.md#request-xhe-aac-codec) option in settings, then the audiobook is being downloaded in the [xHE-AAC codec](./features/audio-file-formats.md#xhe-aac) which isn't widely supported. You have two options: 1. Use a media player which supports the xHE-AAC codec. [See an incomplete list of media players which support xHE-AAC](./features/audio-file-formats.md#supported-media-players). 2. Disable the [Request xHE-AAC Codec](./features/audio-file-formats.md#request-xhe-aac-codec) option in settings and re-download the audiobook. This will cause Libation to download audiobooks in the [AAC-LC codec](./features/audio-file-formats.md#aac-lc), which enjoys near-universal media player support. -## I'm having trouble playing my book with 4D, spatial audio, or Dolby Atmos, how can I fix this? +## I'm Having Trouble Playing My Book with 4D, Spatial Audio, or Dolby Atmos, How Can I Fix This? Spatial audiobooks are delivered in two formats: [E-AC-3](./features/audio-file-formats.md#e-ac-3) and [AC-4](./features/audio-file-formats.md#ac-4). [See an incomplete list of media players which support those codecs](./features/audio-file-formats.md#supported-media-players). -## I'm having trouble loggin into my Brazil account. +## I'm Having Trouble Logging Into My Brazil Account For reasons known only to Jeff Bezos and God, amazon and audible brazil handle logins slightly differently. The external browser login option is not possible for Brazil. [See this ticket for more details.](https://github.com/rmcrackan/Libation/issues/1103) -## How do I use Libation with a South Africa account? +## How Do I Use Libation With a South Africa Account? Like many countries, amazon gives South Africa it's own amazon site. [Unlike many other regions](https://www.audible.com/ep/country-selector) there is not South Africa specific audible site. Use `US` for your region -- ie: audible.com. -::: info -(Not exactly a _frequently_ asked question but it's come up more than once) -::: +> [!NOTE] +> (Not exactly a _frequently_ asked question but it's come up more than once) diff --git a/docs/index.md b/docs/index.md index 45af1903..6146c8d7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -31,7 +31,7 @@ New locale options include many more regions including old audible accounts whic ![Choose your account locales](images/v40_locales.png) -## Import your library +## Import Your Library Be default, Libation will periodically scan the accounts you added above with a checkbox next to them. Nothing for you to do. You can also scan manually. @@ -71,7 +71,7 @@ Success! We see how many new titles are imported: ![Import step 3](images/Import3.png) -## Download your books -- DRM-free! +## Download Your Books — DRM-free! Automatically download some or all of your audible books. This shows you how much of your library is not yet downloaded and decrypted: @@ -107,7 +107,7 @@ And voila! If you have multiple books not yet liberated, Libation will automatic The Audible id must be somewhere in the book's file or folder name for Libation to detect your downloaded book. -## Download PDF attachments +## Download PDF Attachments For books which include PDF downloads, Libation can download these for you as well and will attempt to store them with the book. "Book backup" will already download an available PDF. This additional option is useful when Audible adds a PDF to your book after you've already backed it up. @@ -119,7 +119,7 @@ The downloads work just like with books, only with no additional decryption need ![PDF download step 3](images/PdfDownload3.png) -## Details of downloaded files +## Details of Downloaded Files ![Post download](images/PostDownload.png) @@ -128,12 +128,12 @@ When you set up Libation, you'll specify a Books directory. Libation looks insid - .m4b: your audiobook in m4b format. This is the most pure version of your audiobook and retains the highest quality. Now that it's decrypted, you can play it on any audio player and put it on any device. If you'd like, you can also use 3rd party tools to turn it into an mp3. The freedom to do what you want with your files was the original inspiration for Libation. - .cue: this is a file which logs where chapter breaks occur. Many tools are able to use this if you want to split your book into files along chapter lines. -## Export your library +## Export Your Library ![Export](images/Export.png) Export your library to Excel, CSV, or JSON -## I still need help +## I Still Need Help [You can open an issue here](https://github.com/rmcrackan/Libation/issues) for bug reports, feature requests, or specialized help. diff --git a/docs/installation/docker.md b/docs/installation/docker.md index 266f6372..60338148 100644 --- a/docs/installation/docker.md +++ b/docs/installation/docker.md @@ -1,23 +1,24 @@ # Docker Support > [!WARNING] Breaking Changes +> > - The docker image now runs as user 1001 and group 1001. Make sure that the permissions on your volumes allow user 1001 to read and write to them or see the User section below for other options, or if you're not sure. > - `SLEEP_TIME` is now set to `-1` by default. This means the image will run once and exit. If you were relying on the previous default, you'll need to explicitly set the `SLEEP_TIME` environment variable to `30m` to replicate the previous behavior. > - The docker image now ignores the values in `Settings.json` for `Books` and `InProgress`. You can now change the folder that books are saved to by using the `LIBATION_BOOKS_DIR` environment variable. -# Disclaimer +## Disclaimer The docker image is provided as-is. We hope it can be useful to you but it is not officially supported. -### Configuration +## Configuration Configuration in Libation is handled by two files, `AccountsSettings.json` and `Settings.json`. These files can usually be found in the Libation folder in your user's home directory. The easiest way to configure these is to run the desktop version of Libation and then copy them into a folder, such as `/opt/libation/config`, that you'll volume mount into the image. `Settings.json` is technically optional, and, if not provided, Libation will run using the default settings. Additionally, the `Books` and `InProgress` settings in `Settings.json` will be ignored and the image will instead substitute it's own values. -### Running +## Running Once the configuration files are copied, the docker image can be run with the following command. -``` +```bash sudo docker run -d \ -v /opt/libation/config:/config \ -v /opt/libation/books:/data \ @@ -28,7 +29,7 @@ sudo docker run -d \ By default the container will scan for new books once and download any new ones. This is configurable by passing in a value for the `SLEEP_TIME` environment variable. For example, if you pass in `10m` it will keep running, scan for new books, and download them every 10 minutes. -``` +```bash sudo docker run -d \ -v /opt/libation/config:/config \ -v /opt/libation/books:/data \ @@ -38,7 +39,7 @@ sudo docker run -d \ rmcrackan/libation:latest ``` -### Environment Variables +## Environment Variables | Env Var | Default | Description | | ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------- | @@ -49,7 +50,7 @@ sudo docker run -d \ | LIBATION_DB_FILE | | Name of database file to load. By default it will look for all `.db` files and load one if there is only one present. | | LIBATION_CREATE_DB | true | Whether or not the image should create a database file if none are found. | -### User +## User This docker image runs as user `1001`. In order for the image to function properly, user `1001` must be able to read and write the volumes that are mounted in. If they are not, you will see errors, including [sqlite error](#1060), [Microsoft.Data.Sqlite.SqliteException](#1110), [unable to open database file](#1113), [Microsoft.EntityFrameworkCore.DbUpdateException](#1049) @@ -57,7 +58,7 @@ If you're not sure what your user number is, check the output of the `id` comman If you want to change the user the image runs as, you can specify `-u <uid>:<gid>`. For example, to run it as user `2000` and group `3000`, you could do the following: -``` +```bash sudo docker run -d \ -u 2000:3000 \ -v /opt/libation/config:/config \ @@ -69,11 +70,11 @@ sudo docker run -d \ If the user it's running as is correct, and it still cannot write, be sure to check whether the files and/or folders might be owned by the wrong user. You can use the `chown` command to change the owner of the file to the correct user and group number, for example: `chown -R 1001:1001 /mnt/audiobooks /mnt/libation-config` -### Advanced Database Options +## Advanced Database Options The docker image supports an optional database mount location defined by `LIBATION_DB_DIR`. This allows the database to be mounted as read/write, while allowing the rest of the configuration files to be mounted as read only. This is specifically useful if running in Kubernetes where you can use Configmaps and Secrets to define the configuration. If the `LIBATION_DB_DIR` is mounted, it will be used, otherwise it will look for the database in `LIBATION_CONFIG_DIR`. If it does not find the database in the expected location, it will attempt to make an empty database there. -### Getting help +## Getting Help As mentioned above: docker is not officially supported. I'm adding this at the bottom of the page for anyone serious enough to have read this far. If you've tried everything above and would still like help, you can open an [issue](https://github.com/rmcrackan/Libation/issues). Please include `[docker]` in the title. There are also some docker folks who have offered occasional assistance who you can tag within your issue: `@ducamagnifico` , `@wtanksleyjr` , `@CLHatch`. diff --git a/docs/installation/install-on-linux.md b/docs/installation/install-on-linux.md index 52c95cc4..4933f0eb 100644 --- a/docs/installation/install-on-linux.md +++ b/docs/installation/install-on-linux.md @@ -9,52 +9,65 @@ New Libation releases are automatically packed into `.deb` and `.rpm` package an Run these commands in your terminal to download and install Libation. **Make sure you replace** `X.X.X` with the latest Libation version and `ARCH` with your CPU's architechture (either `amd64` or `arm64`). ### Debian - ```Console - wget -O libation.deb https://github.com/rmcrackan/Libation/releases/download/vX.X.X/Libation.X.X.X-linux-chardonnay-ARCH.deb - sudo apt install ./libation.deb - ``` -### Redhat and CentOS - ```Console - wget -O libation.rpm https://github.com/rmcrackan/Libation/releases/download/vX.X.X/Libation.X.X.X-linux-chardonnay-ARCH.rpm - sudo yum install ./libation.rpm - ``` -### Fedora - ```Console - wget -O libation.rpm https://github.com/rmcrackan/Libation/releases/download/vX.X.X/Libation.X.X.X-linux-chardonnay-ARCH.rpm - sudo dnf5 install ./libation.rpm - ``` ---- -### Arch Linux - ```Console - yay -S libation - ``` - This package is available on [Arch User Repository](https://aur.archlinux.org/packages/libation), install via your choice of [AUR helpers](https://wiki.archlinux.org/title/AUR_helpers). - - Thanks to [mhdi](https://aur.archlinux.org/account/mhdi) for taking care of AUR package maintenance. -### NixOS - - Install via `nix-shell` - ```Console - nix-shell -p libation - ``` - A `nix-shell` will temporarily modify your $PATH environment variable. This can be used to try a piece of software before deciding to permanently install it. - - Install via NixOS configuration - ```Console - environment.systemPackages = [ - pkgs.libation - ]; - ``` - Add the following Nix code to your NixOS Configuration, usually located in `/etc/nixos/configuration.nix` - - On NixOS via via `nix-env` - ```Console - nix-env -iA nixos.libation - ``` - - On Non NixOS via `nix-env` - ```Console - nix-env -iA nixpkgs.libation - ``` - Warning: Using `nix-env` permanently modifies a local profile of installed packages. This must be updated and maintained by the user in the same way as with a traditional package manager. - Thanks to [TomaSajt](https://github.com/tomasajt) for taking care of Nix package maintenance. +```bash +wget -O libation.deb https://github.com/rmcrackan/Libation/releases/download/vX.X.X/Libation.X.X.X-linux-chardonnay-ARCH.deb +sudo apt install ./libation.deb +``` + +### Redhat and CentOS + +```bash +wget -O libation.rpm https://github.com/rmcrackan/Libation/releases/download/vX.X.X/Libation.X.X.X-linux-chardonnay-ARCH.rpm +sudo yum install ./libation.rpm +``` + +### Fedora + +```bash +wget -O libation.rpm https://github.com/rmcrackan/Libation/releases/download/vX.X.X/Libation.X.X.X-linux-chardonnay-ARCH.rpm +sudo dnf5 install ./libation.rpm +``` + +--- + +### Arch Linux + +```bash +yay -S libation +``` + +This package is available on [Arch User Repository](https://aur.archlinux.org/packages/libation), install via your choice of [AUR helpers](https://wiki.archlinux.org/title/AUR_helpers). + +Thanks to [mhdi](https://aur.archlinux.org/account/mhdi) for taking care of AUR package maintenance. + +### NixOS + +- Install via `nix-shell` + ```bash + nix-shell -p libation + ``` + A `nix-shell` will temporarily modify your $PATH environment variable. This can be used to try a piece of software before deciding to permanently install it. +- Install via NixOS configuration + ```nix + environment.systemPackages = [ + pkgs.libation + ]; + ``` + Add the following Nix code to your NixOS Configuration, usually located in `/etc/nixos/configuration.nix` +- On NixOS via via `nix-env` + ```bash + nix-env -iA nixos.libation + ``` +- On Non NixOS via `nix-env` + + ```Console + nix-env -iA nixpkgs.libation + ``` + + Warning: Using `nix-env` permanently modifies a local profile of installed packages. This must be updated and maintained by the user in the same way as with a traditional package manager. + + Thanks to [TomaSajt](https://github.com/tomasajt) for taking care of Nix package maintenance. If your desktop uses gtk, you should now see Libation among your applications. diff --git a/docs/installation/install-on-mac.md b/docs/installation/install-on-mac.md index 581f71f2..037b3ce5 100644 --- a/docs/installation/install-on-mac.md +++ b/docs/installation/install-on-mac.md @@ -1,4 +1,4 @@ - # Install on MacOS +# Install on MacOS This walkthrough should get you up and running with Libation on your Mac. @@ -12,28 +12,31 @@ This walkthrough should get you up and running with Libation on your Mac. - Mount the dmg and open the disk folder (should open automatically). Drag-drop the Libation app into your Applications folder. ![macOS-drag-drop-install](../images/macOS-drag-drop-install.png) + - Go to your applications folder and double-click Libation to start it. The first time you run Libation, you'll be asked if you want to run this program downloaded from the internet. Click "Open". ![macOS-libation-first-run](../images/macOS-libation-first-run.png) - ## Running Hangover Libation comes with a recovery app called Hangover. You can start it by running this command: -```Console + +```bash open /Applications/Libation.app --args hangover ``` ## Running LibationCli Libation comes with a command-line interface. Unfortunately, due to the way apps are sandboxed on mac, its use is somewhat limited. To open a new sandboxed terminal in LibationCli's directory, run the following command: + ```Console open /Applications/Libation.app --args cli ``` + To use LibationCli from an unsandboxed terminal, you must disable gatekeeper again and run the program directly at `/Applications/Libation.app/Contents/MacOS/LibationCli` Then use `./LibationCli` to execute a command. -## Get Libation running on Mac +## Get Libation Running on Mac [Run Libation on MacOS](https://user-images.githubusercontent.com/37587114/219271379-a922e4e1-48a0-48e4-bd81-48aa1226a4f5.mp4) From c1bd1d983b71147325091916e2054bba078d5bb2 Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Mon, 15 Dec 2025 17:50:39 +0530 Subject: [PATCH 08/18] make documentation development section in readme concise --- README.md | 39 ++++++++++----------------------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 4519cb37..58f04f06 100644 --- a/README.md +++ b/README.md @@ -3,48 +3,29 @@ ## [Download Libation](https://github.com/rmcrackan/Libation/releases/latest) ### If you found this useful, tell a friend. If you found this REALLY useful, you can click here to [PayPal.me](https://paypal.me/mcrackan?locale.x=en_us) + ...or just tell more friends. As long as I'm maintaining this software, it will remain **free** and **open source**. - - ## Development + ### Documentation -The documentation is built with [VitePress](https://vitepress.dev/). For more information, see the [VitePress documentation](https://vuejs.github.io/vitepress/v1/guide/getting-started). +The documentation is built with [VitePress](https://vitepress.dev/) and located in the `docs` directory. For more information like [markdown syntax](https://vitepress.dev/guide/markdown#advanced-configuration) and [routing](https://vitepress.dev/guide/routing) or other features, refer [VitePress documentation](https://vitepress.dev/guide). -### Prerequisites +**Prerequisites**: Node.js 18+ -- [Node.js](https://nodejs.org/) version 18 or higher +**Commands**: -### Setup - -Install dependencies: ```bash +# Install dependencies npm install -``` -### Development - -Start the local dev server with hot reload: -```bash +# Start local dev server (http://localhost:5173) npm run docs:dev -``` -The site will be available at `http://localhost:5173`. - -### Build - -Build the static site for production: -```bash +# Build for production (output: docs/.vitepress/dist) npm run docs:build -``` -Preview the production build locally: -```bash +# Preview production build npm run docs:preview -``` - -### Deployment - -The built site is output to `Documentation/.vitepress/dist`. Deploy this directory to any static hosting service (GitHub Pages, Cloudflare Pages, Vercel, Netlify, etc.). - +``` \ No newline at end of file From e1d4533887f48cda16ec09ba2045390ffeff0a52 Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Mon, 15 Dec 2025 18:27:37 +0530 Subject: [PATCH 09/18] use github syntax for admonitions in homepage --- index.md | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/index.md b/index.md index 311e1c63..bd2d11ad 100644 --- a/index.md +++ b/index.md @@ -14,34 +14,32 @@ hero: link: https://github.com/rmcrackan/Libation features: -- title: Region Support + - title: Region Support details: Supports most regions US, UK, Canada, Germany, France, Australia, Japan, India, and Spain -- title: Cross-Platform + - title: Cross-Platform details: Fully supported on Windows, Mac, and Linux -- title: PDF Download + - title: PDF Download details: Download accompanying PDFs -- title: Import Library + - title: Import Library details: Import your library from Audible, including cover art -- title: DRM Removal + - title: DRM Removal details: Download and remove DRM from all books -- title: PDFs + - title: PDFs details: Download accompanying PDFs -- title: Organization + - title: Organization details: Add tags to books for better organization -- title: Search + - title: Search details: Powerful advanced search built on the Lucene search engine -- title: Filters + - title: Filters details: Customizable saved filters for common searches --- +> [!NOTE] Be aware of +> +> - **File Size**: The application has a large file size. +> - **Design**: Made by a programmer, not a designer. The goals are function rather than beauty. +> - **Support**: This is a single-developer personal passion project. Support, response, updates, enhancements, bug fixes, etc., are as my free time allows. +> - **Updates**: I have a full-time job, a life, and a finite attention span. Therefore, a lot of time can potentially go by with no improvements of any kind. -::: info Be aware of -- **File Size**: The application has a large file size. -- **Design**: Made by a programmer, not a designer. The goals are function rather than beauty. -- **Support**: This is a single-developer personal passion project. Support, response, updates, enhancements, bug fixes, etc., are as my free time allows. -- **Updates**: I have a full-time job, a life, and a finite attention span. Therefore, a lot of time can potentially go by with no improvements of any kind. -::: - -::: tip Disclaimer -I've made every good-faith effort to include nothing insecure, malicious, anti-privacy, or destructive. That said: **use at your own risk**. I made this for myself and I want to share it with the great programming and audible/audiobook communities which have been so generous with their time and help. -::: \ No newline at end of file +> [!WARNING] Disclaimer +> I've made every good-faith effort to include nothing insecure, malicious, anti-privacy, or destructive. That said: **use at your own risk**. I made this for myself and I want to share it with the great programming and audible/audiobook communities which have been so generous with their time and help. From 3df8a974631600a4b5ca3d37f74aad46ec458c5b Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Mon, 15 Dec 2025 21:36:39 +0530 Subject: [PATCH 10/18] configure config for clean urls --- .vitepress/config.js | 1 + package-lock.json | 1025 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 953 insertions(+), 73 deletions(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 3c269fb5..b05d12e2 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -5,6 +5,7 @@ export default defineConfig({ title: "Libation", description: "Libation: Liberate your Library - A free application for downloading your Audible audiobooks", head: [["link", { rel: "icon", href: "/favicon.ico" }]], + cleanUrls: true, themeConfig: { // https://vitepress.dev/reference/default-theme-config logo: { diff --git a/package-lock.json b/package-lock.json index 0566a841..5ef3aa4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,8 @@ }, "node_modules/@algolia/abtesting": { "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.0.tgz", + "integrity": "sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -27,6 +29,8 @@ }, "node_modules/@algolia/autocomplete-core": { "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -36,6 +40,8 @@ }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", "dev": true, "license": "MIT", "dependencies": { @@ -47,6 +53,8 @@ }, "node_modules/@algolia/autocomplete-preset-algolia": { "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", "dev": true, "license": "MIT", "dependencies": { @@ -59,6 +67,8 @@ }, "node_modules/@algolia/autocomplete-shared": { "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -68,6 +78,8 @@ }, "node_modules/@algolia/client-abtesting": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.0.tgz", + "integrity": "sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==", "dev": true, "license": "MIT", "dependencies": { @@ -82,6 +94,8 @@ }, "node_modules/@algolia/client-analytics": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.0.tgz", + "integrity": "sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==", "dev": true, "license": "MIT", "dependencies": { @@ -96,6 +110,8 @@ }, "node_modules/@algolia/client-common": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.0.tgz", + "integrity": "sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==", "dev": true, "license": "MIT", "engines": { @@ -104,6 +120,8 @@ }, "node_modules/@algolia/client-insights": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.0.tgz", + "integrity": "sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==", "dev": true, "license": "MIT", "dependencies": { @@ -118,6 +136,8 @@ }, "node_modules/@algolia/client-personalization": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.0.tgz", + "integrity": "sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -132,6 +152,8 @@ }, "node_modules/@algolia/client-query-suggestions": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.0.tgz", + "integrity": "sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==", "dev": true, "license": "MIT", "dependencies": { @@ -146,8 +168,11 @@ }, "node_modules/@algolia/client-search": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", + "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -160,6 +185,8 @@ }, "node_modules/@algolia/ingestion": { "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.0.tgz", + "integrity": "sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==", "dev": true, "license": "MIT", "dependencies": { @@ -174,6 +201,8 @@ }, "node_modules/@algolia/monitoring": { "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.0.tgz", + "integrity": "sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -188,6 +217,8 @@ }, "node_modules/@algolia/recommend": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.0.tgz", + "integrity": "sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==", "dev": true, "license": "MIT", "dependencies": { @@ -202,6 +233,8 @@ }, "node_modules/@algolia/requester-browser-xhr": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.0.tgz", + "integrity": "sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==", "dev": true, "license": "MIT", "dependencies": { @@ -213,6 +246,8 @@ }, "node_modules/@algolia/requester-fetch": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.0.tgz", + "integrity": "sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==", "dev": true, "license": "MIT", "dependencies": { @@ -224,6 +259,8 @@ }, "node_modules/@algolia/requester-node-http": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.0.tgz", + "integrity": "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -235,6 +272,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -243,6 +282,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -251,6 +292,8 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -265,6 +308,8 @@ }, "node_modules/@babel/types": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { @@ -277,11 +322,15 @@ }, "node_modules/@docsearch/css": { "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", "dev": true, "license": "MIT" }, "node_modules/@docsearch/js": { "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -291,6 +340,8 @@ }, "node_modules/@docsearch/react": { "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", "dev": true, "license": "MIT", "dependencies": { @@ -320,8 +371,282 @@ } } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-x64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -335,8 +660,112 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.62", + "version": "1.2.63", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.63.tgz", + "integrity": "sha512-xZl2UWCwE58VlqZ+pDPmaUhE2tq8MVSTJRr4/9nzzHlDdjJ0Ud1VxNXPrwTSgESKY29iCQw3S0r2nJTSNNngHw==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -345,16 +774,232 @@ }, "node_modules/@iconify/types": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.4.tgz", + "integrity": "sha512-PWU3Y92H4DD0bOqorEPp1Y0tbzwAurFmIYpjcObv5axGVOtcTlB0b2UKMd2echo08MgN7jO8WQZSSysvfisFSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.4.tgz", + "integrity": "sha512-Gw0/DuVm3rGsqhMGYkSOXXIx20cC3kTlivZeuaGt4gEgILivykNyBWxeUV5Cf2tDA2nPLah26vq3emlRrWVbng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.4.tgz", + "integrity": "sha512-+w06QvXsgzKwdVg5qRLZpTHh1bigHZIqoIUPtiqh05ZiJVUQ6ymOxaPkXTvRPRLH88575ZCRSRM3PwIoNma01Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.4.tgz", + "integrity": "sha512-EB4Na9G2GsrRNRNFPuxfwvDRDUwQEzJPpiK1vo2zMVhEeufZ1k7J1bKnT0JYDfnPC7RNZ2H5YNQhW6/p2QKATw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.4.tgz", + "integrity": "sha512-bldA8XEqPcs6OYdknoTMaGhjytnwQ0NClSPpWpmufOuGPN5dDmvIa32FygC2gneKK4A1oSx86V1l55hyUWUYFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.4.tgz", + "integrity": "sha512-3T8GPjH6mixCd0YPn0bXtcuSXi1Lj+15Ujw2CEb7dd24j9thcKscCf88IV7n76WaAdorOzAgSSbuVRg4C8V8Qw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.4.tgz", + "integrity": "sha512-UPMMNeC4LXW7ZSHxeP3Edv09aLsFUMaD1TSVW6n1CWMECnUIJMFFB7+XC2lZTdPtvB36tYC0cJWc86mzSsaviw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.4.tgz", + "integrity": "sha512-H8uwlV0otHs5Q7WAMSoyvjV9DJPiy5nJ/xnHolY0QptLPjaSsuX7tw+SPIfiYH6cnVx3fe4EWFafo6gH6ekZKA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.4.tgz", + "integrity": "sha512-BLRwSRwICXz0TXkbIbqJ1ibK+/dSBpTJqDClF61GWIrxTXZWQE78ROeIhgl5MjVs4B4gSLPCFeD4xML9vbzvCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.4.tgz", + "integrity": "sha512-6bySEjOTbmVcPJAywjpGLckK793A0TJWSbIa0sVwtVGfe/Nz6gOWHOwkshUIAp9j7wg2WKcA4Snu7Y1nUZyQew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.4.tgz", + "integrity": "sha512-U0ow3bXYJZ5MIbchVusxEycBw7bO6C2u5UvD31i5IMTrnt2p4Fh4ZbHSdc/31TScIJQYHwxbj05BpevB3201ug==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.4.tgz", + "integrity": "sha512-iujDk07ZNwGLVn0YIWM80SFN039bHZHCdCCuX9nyx3Jsa2d9V/0Y32F+YadzwbvDxhSeVo9zefkoPnXEImnM5w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.4.tgz", + "integrity": "sha512-MUtAktiOUSu+AXBpx1fkuG/Bi5rhlorGs3lw5QeJ2X3ziEGAq7vFNdWVde6XGaVqi0LGSvugwjoxSNJfHFTC0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.4.tgz", + "integrity": "sha512-btm35eAbDfPtcFEgaXCI5l3c2WXyzwiE8pArhd66SDtoLWmgK5/M7CUxmUglkwtniPzwvWioBKKl6IXLbPf2sQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.4.tgz", + "integrity": "sha512-uJlhKE9ccUTCUlK+HUz/80cVtx2RayadC5ldDrrDUFaJK0SNb8/cCmC9RhBhIWuZ71Nqj4Uoa9+xljKWRogdhA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.4.tgz", + "integrity": "sha512-jjEMkzvASQBbzzlzf4os7nzSBd/cvPrpqXCUOqoeCh1dQ4BP3RZCJk8XBeik4MUln3m+8LeTJcY54C/u8wb3DQ==", "cpu": [ "x64" ], @@ -366,7 +1011,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.4.tgz", + "integrity": "sha512-lu90KG06NNH19shC5rBPkrh6mrTpq5kviFylPBXQVpdEu0yzb0mDgyxLr6XdcGdBIQTH/UAhDJnL+APZTBu1aQ==", "cpu": [ "x64" ], @@ -377,8 +1024,80 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.4.tgz", + "integrity": "sha512-dFDcmLwsUzhAm/dn0+dMOQZoONVYBtgik0VuY/d5IJUUb787L3Ko/ibvTvddqhb3RaB7vFEozYevHN4ox22R/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.4.tgz", + "integrity": "sha512-WvUpUAWmUxZKtRnQWpRKnLW2DEO8HB/l8z6oFFMNuHndMzFTJEXzaYJ5ZAmzNw0L21QQJZsUQFt2oPf3ykAD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.4.tgz", + "integrity": "sha512-JGbeF2/FDU0x2OLySw/jgvkwWUo05BSiJK0dtuI4LyuXbz3wKiC1xHhLB1Tqm5VU6ZZDmAorj45r/IgWNWku5g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.4.tgz", + "integrity": "sha512-zuuC7AyxLWLubP+mlUwEyR8M1ixW1ERNPHJfXm8x7eQNP4Pzkd7hS3qBuKBR70VRiQ04Kw8FNfRMF5TNxuZq2g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.4.tgz", + "integrity": "sha512-Sbx45u/Lbb5RyptSbX7/3deP+/lzEmZ0BTSHxwxN/IMOZDZf8S0AGo0hJD5n/LQssxb5Z3B4og4P2X6Dd8acCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@shikijs/core": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", "dev": true, "license": "MIT", "dependencies": { @@ -392,6 +1111,8 @@ }, "node_modules/@shikijs/engine-javascript": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", "dev": true, "license": "MIT", "dependencies": { @@ -402,6 +1123,8 @@ }, "node_modules/@shikijs/engine-oniguruma": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", "dev": true, "license": "MIT", "dependencies": { @@ -411,6 +1134,8 @@ }, "node_modules/@shikijs/langs": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", "dev": true, "license": "MIT", "dependencies": { @@ -419,6 +1144,8 @@ }, "node_modules/@shikijs/themes": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", "dev": true, "license": "MIT", "dependencies": { @@ -427,6 +1154,8 @@ }, "node_modules/@shikijs/transformers": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", "dev": true, "license": "MIT", "dependencies": { @@ -436,6 +1165,8 @@ }, "node_modules/@shikijs/types": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", "dev": true, "license": "MIT", "dependencies": { @@ -445,16 +1176,22 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -463,11 +1200,15 @@ }, "node_modules/@types/linkify-it": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true, "license": "MIT" }, "node_modules/@types/markdown-it": { "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, "license": "MIT", "dependencies": { @@ -477,6 +1218,8 @@ }, "node_modules/@types/mdast": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "license": "MIT", "dependencies": { @@ -485,36 +1228,36 @@ }, "node_modules/@types/mdurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true, "license": "MIT" }, - "node_modules/@types/node": { - "version": "25.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~7.16.0" - } - }, "node_modules/@types/unist": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/web-bluetooth": { "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "dev": true, "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, "license": "MIT", "engines": { @@ -527,6 +1270,8 @@ }, "node_modules/@vue/compiler-core": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", + "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -539,6 +1284,8 @@ }, "node_modules/@vue/compiler-dom": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz", + "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -548,6 +1295,8 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", + "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", "dev": true, "license": "MIT", "dependencies": { @@ -564,6 +1313,8 @@ }, "node_modules/@vue/compiler-ssr": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz", + "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==", "dev": true, "license": "MIT", "dependencies": { @@ -573,6 +1324,8 @@ }, "node_modules/@vue/devtools-api": { "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", "dev": true, "license": "MIT", "dependencies": { @@ -581,6 +1334,8 @@ }, "node_modules/@vue/devtools-kit": { "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", "dev": true, "license": "MIT", "dependencies": { @@ -595,6 +1350,8 @@ }, "node_modules/@vue/devtools-shared": { "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", "dev": true, "license": "MIT", "dependencies": { @@ -603,6 +1360,8 @@ }, "node_modules/@vue/reactivity": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz", + "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==", "dev": true, "license": "MIT", "dependencies": { @@ -611,6 +1370,8 @@ }, "node_modules/@vue/runtime-core": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz", + "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==", "dev": true, "license": "MIT", "dependencies": { @@ -620,6 +1381,8 @@ }, "node_modules/@vue/runtime-dom": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz", + "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==", "dev": true, "license": "MIT", "dependencies": { @@ -631,6 +1394,8 @@ }, "node_modules/@vue/server-renderer": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz", + "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==", "dev": true, "license": "MIT", "dependencies": { @@ -643,11 +1408,15 @@ }, "node_modules/@vue/shared": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz", + "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==", "dev": true, "license": "MIT" }, "node_modules/@vueuse/core": { "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -662,6 +1431,8 @@ }, "node_modules/@vueuse/integrations": { "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", "dev": true, "license": "MIT", "dependencies": { @@ -727,6 +1498,8 @@ }, "node_modules/@vueuse/metadata": { "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", "dev": true, "license": "MIT", "funding": { @@ -735,6 +1508,8 @@ }, "node_modules/@vueuse/shared": { "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", "dev": true, "license": "MIT", "dependencies": { @@ -746,8 +1521,11 @@ }, "node_modules/algoliasearch": { "version": "5.46.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", + "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -770,6 +1548,8 @@ }, "node_modules/birpc": { "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", "dev": true, "license": "MIT", "funding": { @@ -778,6 +1558,8 @@ }, "node_modules/ccount": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, "license": "MIT", "funding": { @@ -787,6 +1569,8 @@ }, "node_modules/character-entities-html4": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, "license": "MIT", "funding": { @@ -796,6 +1580,8 @@ }, "node_modules/character-entities-legacy": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true, "license": "MIT", "funding": { @@ -805,6 +1591,8 @@ }, "node_modules/comma-separated-tokens": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true, "license": "MIT", "funding": { @@ -814,6 +1602,8 @@ }, "node_modules/copy-anything": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", "dev": true, "license": "MIT", "dependencies": { @@ -828,11 +1618,15 @@ }, "node_modules/csstype": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "dev": true, "license": "MIT" }, "node_modules/dequal": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { @@ -841,6 +1635,8 @@ }, "node_modules/devlop": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, "license": "MIT", "dependencies": { @@ -853,11 +1649,15 @@ }, "node_modules/emoji-regex-xs": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", "dev": true, "license": "MIT" }, "node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -869,6 +1669,8 @@ }, "node_modules/esbuild": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -906,19 +1708,41 @@ }, "node_modules/estree-walker": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, "node_modules/focus-trap": { "version": "7.6.6", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.6.tgz", + "integrity": "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "tabbable": "^6.3.0" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/hast-util-to-html": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "dev": true, "license": "MIT", "dependencies": { @@ -941,6 +1765,8 @@ }, "node_modules/hast-util-whitespace": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, "license": "MIT", "dependencies": { @@ -953,11 +1779,15 @@ }, "node_modules/hookable": { "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", "dev": true, "license": "MIT" }, "node_modules/html-void-elements": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "dev": true, "license": "MIT", "funding": { @@ -967,6 +1797,8 @@ }, "node_modules/is-what": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", "dev": true, "license": "MIT", "engines": { @@ -978,6 +1810,8 @@ }, "node_modules/magic-string": { "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -986,11 +1820,15 @@ }, "node_modules/mark.js": { "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", "dev": true, "license": "MIT" }, "node_modules/mdast-util-to-hast": { "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "dev": true, "license": "MIT", "dependencies": { @@ -1011,6 +1849,8 @@ }, "node_modules/micromark-util-character": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "funding": [ { @@ -1030,6 +1870,8 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true, "funding": [ { @@ -1045,6 +1887,8 @@ }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, "funding": [ { @@ -1065,6 +1909,8 @@ }, "node_modules/micromark-util-symbol": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, "funding": [ { @@ -1080,6 +1926,8 @@ }, "node_modules/micromark-util-types": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true, "funding": [ { @@ -1095,16 +1943,22 @@ }, "node_modules/minisearch": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", "dev": true, "license": "MIT" }, "node_modules/mitt": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true, "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -1122,6 +1976,8 @@ }, "node_modules/oniguruma-to-es": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1132,16 +1988,22 @@ }, "node_modules/perfect-debounce": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/postcss": { "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -1169,6 +2031,8 @@ }, "node_modules/preact": { "version": "10.28.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.0.tgz", + "integrity": "sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==", "dev": true, "license": "MIT", "funding": { @@ -1176,24 +2040,10 @@ "url": "https://opencollective.com/preact" } }, - "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/property-information": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "dev": true, "license": "MIT", "funding": { @@ -1203,6 +2053,8 @@ }, "node_modules/regex": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", "dev": true, "license": "MIT", "dependencies": { @@ -1211,6 +2063,8 @@ }, "node_modules/regex-recursion": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", "dev": true, "license": "MIT", "dependencies": { @@ -1219,16 +2073,22 @@ }, "node_modules/regex-utilities": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "dev": true, "license": "MIT" }, "node_modules/rfdc": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { - "version": "4.53.3", + "version": "4.53.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.4.tgz", + "integrity": "sha512-YpXaaArg0MvrnJpvduEDYIp7uGOqKXbH9NsHGQ6SxKCOsNAjZF018MmxefFUulVP2KLtiGw1UvZbr+/ekjvlDg==", "dev": true, "license": "MIT", "dependencies": { @@ -1242,39 +2102,43 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", + "@rollup/rollup-android-arm-eabi": "4.53.4", + "@rollup/rollup-android-arm64": "4.53.4", + "@rollup/rollup-darwin-arm64": "4.53.4", + "@rollup/rollup-darwin-x64": "4.53.4", + "@rollup/rollup-freebsd-arm64": "4.53.4", + "@rollup/rollup-freebsd-x64": "4.53.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.4", + "@rollup/rollup-linux-arm-musleabihf": "4.53.4", + "@rollup/rollup-linux-arm64-gnu": "4.53.4", + "@rollup/rollup-linux-arm64-musl": "4.53.4", + "@rollup/rollup-linux-loong64-gnu": "4.53.4", + "@rollup/rollup-linux-ppc64-gnu": "4.53.4", + "@rollup/rollup-linux-riscv64-gnu": "4.53.4", + "@rollup/rollup-linux-riscv64-musl": "4.53.4", + "@rollup/rollup-linux-s390x-gnu": "4.53.4", + "@rollup/rollup-linux-x64-gnu": "4.53.4", + "@rollup/rollup-linux-x64-musl": "4.53.4", + "@rollup/rollup-openharmony-arm64": "4.53.4", + "@rollup/rollup-win32-arm64-msvc": "4.53.4", + "@rollup/rollup-win32-ia32-msvc": "4.53.4", + "@rollup/rollup-win32-x64-gnu": "4.53.4", + "@rollup/rollup-win32-x64-msvc": "4.53.4", "fsevents": "~2.3.2" } }, "node_modules/search-insights": { "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "dev": true, "license": "MIT", "peer": true }, "node_modules/shiki": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1290,6 +2154,8 @@ }, "node_modules/source-map-js": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -1298,6 +2164,8 @@ }, "node_modules/space-separated-tokens": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, "license": "MIT", "funding": { @@ -1307,6 +2175,8 @@ }, "node_modules/speakingurl": { "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -1315,6 +2185,8 @@ }, "node_modules/stringify-entities": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dev": true, "license": "MIT", "dependencies": { @@ -1328,6 +2200,8 @@ }, "node_modules/superjson": { "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", "dev": true, "license": "MIT", "dependencies": { @@ -1339,11 +2213,15 @@ }, "node_modules/tabbable": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", + "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", "dev": true, "license": "MIT" }, "node_modules/trim-lines": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "dev": true, "license": "MIT", "funding": { @@ -1351,29 +2229,10 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/typescript": { - "version": "5.9.3", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/unist-util-is": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "dev": true, "license": "MIT", "dependencies": { @@ -1386,6 +2245,8 @@ }, "node_modules/unist-util-position": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, "license": "MIT", "dependencies": { @@ -1398,6 +2259,8 @@ }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1410,6 +2273,8 @@ }, "node_modules/unist-util-visit": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dev": true, "license": "MIT", "dependencies": { @@ -1424,6 +2289,8 @@ }, "node_modules/unist-util-visit-parents": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1437,6 +2304,8 @@ }, "node_modules/vfile": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1450,6 +2319,8 @@ }, "node_modules/vfile-message": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "dev": true, "license": "MIT", "dependencies": { @@ -1463,8 +2334,11 @@ }, "node_modules/vite": { "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -1563,8 +2437,11 @@ }, "node_modules/vue": { "version": "3.5.25", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", + "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/compiler-sfc": "3.5.25", @@ -1583,6 +2460,8 @@ }, "node_modules/zwitch": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true, "license": "MIT", "funding": { From 6fa69b603ea09bfa3375429cfaba9fd2cdf34c38 Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Mon, 15 Dec 2025 22:07:41 +0530 Subject: [PATCH 11/18] rename files --- .vitepress/config.js | 4 ++-- docs/installation/{install-on-linux.md => linux.md} | 0 docs/installation/{install-on-mac.md => mac.md} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename docs/installation/{install-on-linux.md => linux.md} (100%) rename docs/installation/{install-on-mac.md => mac.md} (100%) diff --git a/.vitepress/config.js b/.vitepress/config.js index b05d12e2..aa8e6dfa 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -48,9 +48,9 @@ export default defineConfig({ items: [ { text: "Install on Linux", - link: "/docs/installation/install-on-linux", + link: "/docs/installation/linux", }, - { text: "Install on Mac", link: "/docs/installation/install-on-mac" }, + { text: "Install on Mac", link: "/docs/installation/mac" }, { text: "Docker", link: "/docs/installation/docker" }, ], }, diff --git a/docs/installation/install-on-linux.md b/docs/installation/linux.md similarity index 100% rename from docs/installation/install-on-linux.md rename to docs/installation/linux.md diff --git a/docs/installation/install-on-mac.md b/docs/installation/mac.md similarity index 100% rename from docs/installation/install-on-mac.md rename to docs/installation/mac.md From 1c55c8533a7d9cc804beb3ad06f5c0c186da6305 Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Tue, 16 Dec 2025 13:06:44 +0530 Subject: [PATCH 12/18] improve docs --- README.md | 4 +++- docs/advanced/advanced.md | 2 +- docs/installation/mac.md | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 58f04f06..ef59da2d 100644 --- a/README.md +++ b/README.md @@ -28,4 +28,6 @@ npm run docs:build # Preview production build npm run docs:preview -``` \ No newline at end of file +``` + +**Note**: New pages are automatically routed based on their folder structure (e.g., `docs/docs/index.md` maps to `/docs/index`). To add them to the sidebar, update the `sidebar` configuration in `.vitepress/config.js`. \ No newline at end of file diff --git a/docs/advanced/advanced.md b/docs/advanced/advanced.md index 6c4616ef..fa7182f6 100644 --- a/docs/advanced/advanced.md +++ b/docs/advanced/advanced.md @@ -45,7 +45,7 @@ You may import or export themes using the buttons at the bottom-left of the them The below video demonstrates using the theme editor to make changes to the Dark theme color pallet. -[](https://github.com/user-attachments/assets/05c0cb7f-578f-4465-9691-77d694111349) +<video src="https://github.com/user-attachments/assets/05c0cb7f-578f-4465-9691-77d694111349" controls></video> ## Command Line Interface diff --git a/docs/installation/mac.md b/docs/installation/mac.md index 037b3ce5..5ffd8ed2 100644 --- a/docs/installation/mac.md +++ b/docs/installation/mac.md @@ -2,9 +2,9 @@ This walkthrough should get you up and running with Libation on your Mac. -## Supports macOS 13 (Ventura) and above +> [!WARNING] Supports macOS 13 (Ventura) and above -## Install Libation +### Install Libation - Download the file from the latest release and extract it. - Apple Silicon (M1, M2, ...): `Libation.x.x.x-macOS-chardonnay-`**arm64**`.dmg` @@ -39,4 +39,4 @@ Then use `./LibationCli` to execute a command. ## Get Libation Running on Mac -[Run Libation on MacOS](https://user-images.githubusercontent.com/37587114/219271379-a922e4e1-48a0-48e4-bd81-48aa1226a4f5.mp4) +<video src="https://user-images.githubusercontent.com/37587114/219271379-a922e4e1-48a0-48e4-bd81-48aa1226a4f5.mp4" controls></video> From d60ec0702c4f06c37316cc1cf209644a725ad76f Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Tue, 16 Dec 2025 13:07:55 +0530 Subject: [PATCH 13/18] update nav and homepage buttons --- .vitepress/config.js | 9 ++++++--- index.md | 40 ++++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index aa8e6dfa..4160d73a 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -6,6 +6,9 @@ export default defineConfig({ description: "Libation: Liberate your Library - A free application for downloading your Audible audiobooks", head: [["link", { rel: "icon", href: "/favicon.ico" }]], cleanUrls: true, + rewrites: { + "docs/index.md": "docs/getting-started.md", + }, themeConfig: { // https://vitepress.dev/reference/default-theme-config logo: { @@ -24,9 +27,9 @@ export default defineConfig({ lastUpdated: true, nav: [ - { text: "Home", link: "/index.md" }, - { text: "Documentation", link: "/docs/index" }, - { text: "FAQ", link: "/docs/frequently-asked-questions" }, + { text: "Getting Started", link: "/docs/getting-started" }, + { text: "Download", link: "https://github.com/rmcrackan/Libation/releases/latest" }, + { text: "Report Issues", link: "https://github.com/rmcrackan/Libation/issues" }, { text: "Donate", link: "https://www.paypal.com/paypalme/mcrackan" }, ], sidebar: [ diff --git a/index.md b/index.md index bd2d11ad..92c4500e 100644 --- a/index.md +++ b/index.md @@ -7,31 +7,36 @@ hero: tagline: A free, open-source application for downloading and managing your Audible audiobooks actions: - theme: brand - text: Documentation - link: /docs/index + text: Getting Started + link: /docs/getting-started - theme: alt - text: View on GitHub - link: https://github.com/rmcrackan/Libation + text: Download + link: https://github.com/rmcrackan/Libation/releases/latest + - theme: alt + text: Report Issues + link: https://github.com/rmcrackan/Libation/issues features: + - title: Powered by AAXClean + details: Now uses the lightweight AAXClean for decryption, replacing the ffmpeg. + - title: Region Support details: Supports most regions US, UK, Canada, Germany, France, Australia, Japan, India, and Spain - - title: Cross-Platform - details: Fully supported on Windows, Mac, and Linux - - title: PDF Download - details: Download accompanying PDFs - - title: Import Library - details: Import your library from Audible, including cover art - - title: DRM Removal - details: Download and remove DRM from all books - - title: PDFs - details: Download accompanying PDFs - - title: Organization - details: Add tags to books for better organization - title: Search details: Powerful advanced search built on the Lucene search engine - title: Filters details: Customizable saved filters for common searches + - title: Import Library + details: Import your library from Audible, including cover art + - title: Cross-Platform + details: Fully supported on Windows, Mac, and Linux + - title: PDF Download + details: Download accompanying PDFs + + - title: DRM Removal + details: Download and remove DRM from all books + - title: Organization + details: Add tags to books for better organization --- > [!NOTE] Be aware of @@ -43,3 +48,6 @@ features: > [!WARNING] Disclaimer > I've made every good-faith effort to include nothing insecure, malicious, anti-privacy, or destructive. That said: **use at your own risk**. I made this for myself and I want to share it with the great programming and audible/audiobook communities which have been so generous with their time and help. + +> [!TIP] Alternatives +> Is Libation just not right for you? Similar apps are on [AudiobookHub](https://github.com/rmcrackan/AudiobookHub), nearly all of which are also free. \ No newline at end of file From 68846a90e5482cad4931286f68a3fcc8aa3df877 Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Tue, 16 Dec 2025 13:11:56 +0530 Subject: [PATCH 14/18] fix dead links --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 6146c8d7..1a35d0b8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,8 +18,8 @@ Nearly 100% of the difference is look and feel -- it's a matter of preference. Extract the zip file to a folder and then run `Libation.exe` from inside of that folder. Do not put it in Program Files. The inability to edit files from there causes problems with configuration and updating. -- [Linux](./installation/install-on-linux.md) -- [MacOS](./installation/install-on-mac.md) +- [Linux](./installation/linux.md) +- [MacOS](./installation/mac.md) ## Create Accounts From 6961bd72fa080f83f3fd418278bca1aa77cbbadc Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Tue, 16 Dec 2025 13:22:56 +0530 Subject: [PATCH 15/18] rename 'report issues' button to 'issues & requests' and simple installation routes --- .vitepress/config.js | 20 ++++++-------------- index.md | 2 +- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 4160d73a..b79623b1 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -29,16 +29,16 @@ export default defineConfig({ nav: [ { text: "Getting Started", link: "/docs/getting-started" }, { text: "Download", link: "https://github.com/rmcrackan/Libation/releases/latest" }, - { text: "Report Issues", link: "https://github.com/rmcrackan/Libation/issues" }, + { text: "Issues & Requests", link: "https://github.com/rmcrackan/Libation/issues" }, { text: "Donate", link: "https://www.paypal.com/paypalme/mcrackan" }, ], sidebar: [ { items: [ - { text: "Getting Started", link: "/docs/index" }, + { text: "Getting Started", link: "/docs/getting-started" }, { text: "FAQ", link: "/docs/frequently-asked-questions" }, { - text: "Report Issues", + text: "Issues & Requests", link: "https://github.com/rmcrackan/Libation/issues", }, { text: "Donate", link: "https://www.paypal.com/paypalme/mcrackan" }, @@ -47,25 +47,17 @@ export default defineConfig({ { text: "Installation", collapsed: false, - items: [ - { - text: "Install on Linux", - link: "/docs/installation/linux", - }, - { text: "Install on Mac", link: "/docs/installation/mac" }, + { text: "Linux", link: "/docs/installation/linux" }, + { text: "Mac", link: "/docs/installation/mac" }, { text: "Docker", link: "/docs/installation/docker" }, ], }, { text: "Features", collapsed: false, - items: [ - { - text: "Audio File Formats", - link: "/docs/features/audio-file-formats", - }, + { text: "Audio File Formats", link: "/docs/features/audio-file-formats" }, { text: "Naming Templates", link: "/docs/features/naming-templates" }, { text: "Searching & Filtering", diff --git a/index.md b/index.md index 92c4500e..55603318 100644 --- a/index.md +++ b/index.md @@ -13,7 +13,7 @@ hero: text: Download link: https://github.com/rmcrackan/Libation/releases/latest - theme: alt - text: Report Issues + text: Issues & Requests link: https://github.com/rmcrackan/Libation/issues features: From 2b6b5d082e829697cfd79c214e1470a2d49a8272 Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Thu, 18 Dec 2025 14:27:17 +0530 Subject: [PATCH 16/18] fix nav link increase website width in tablet view --- .vitepress/theme/custom.css | 15 +++++++++++++++ .vitepress/theme/index.js | 4 ++++ 2 files changed, 19 insertions(+) create mode 100644 .vitepress/theme/custom.css create mode 100644 .vitepress/theme/index.js diff --git a/.vitepress/theme/custom.css b/.vitepress/theme/custom.css new file mode 100644 index 00000000..07afccf0 --- /dev/null +++ b/.vitepress/theme/custom.css @@ -0,0 +1,15 @@ +/* Custom styles for Libation documentation */ + +/* Hide certain nav items on tablet devices to prevent horizontal scroll */ +@media (min-width: 640px) and (max-width: 959px) { + /* Target specific nav items by their position */ + /* Hide "Issues & Requests" and "Donate" links on tablet */ + .VPNav .VPNavBar .nav .VPNavBarMenu .VPMenu:nth-child(3) { + display: none; + } + + /* Alternative: Use a more specific selector if needed */ + .VPNavBarMenuLink[href*="issues"] { + display: none; + } +} diff --git a/.vitepress/theme/index.js b/.vitepress/theme/index.js new file mode 100644 index 00000000..42fe9a93 --- /dev/null +++ b/.vitepress/theme/index.js @@ -0,0 +1,4 @@ +import DefaultTheme from 'vitepress/theme' +import './custom.css' + +export default DefaultTheme From f620234e7da4a10a77e0f0492ebbe7b3a074ca33 Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Thu, 18 Dec 2025 14:28:46 +0530 Subject: [PATCH 17/18] add docs overview in homepage and in nav bar links --- .vitepress/config.js | 5 +- docs/getting-started.md | 139 ++++++++++++++++++++++++++++++++++++ docs/index.md | 151 +++++++--------------------------------- index.md | 40 ++++++++++- 4 files changed, 204 insertions(+), 131 deletions(-) create mode 100644 docs/getting-started.md diff --git a/.vitepress/config.js b/.vitepress/config.js index b79623b1..3bde9415 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -6,9 +6,6 @@ export default defineConfig({ description: "Libation: Liberate your Library - A free application for downloading your Audible audiobooks", head: [["link", { rel: "icon", href: "/favicon.ico" }]], cleanUrls: true, - rewrites: { - "docs/index.md": "docs/getting-started.md", - }, themeConfig: { // https://vitepress.dev/reference/default-theme-config logo: { @@ -28,6 +25,7 @@ export default defineConfig({ nav: [ { text: "Getting Started", link: "/docs/getting-started" }, + { text: "Docs", link: "/docs/index" }, { text: "Download", link: "https://github.com/rmcrackan/Libation/releases/latest" }, { text: "Issues & Requests", link: "https://github.com/rmcrackan/Libation/issues" }, { text: "Donate", link: "https://www.paypal.com/paypalme/mcrackan" }, @@ -35,6 +33,7 @@ export default defineConfig({ sidebar: [ { items: [ + { text: "Overview", link: "/docs/index"}, { text: "Getting Started", link: "/docs/getting-started" }, { text: "FAQ", link: "/docs/frequently-asked-questions" }, { diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 00000000..1a35d0b8 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,139 @@ +# Getting started + +## Installation + +Download the [latest version of Libation](https://github.com/rmcrackan/Libation/releases) + +### Which version? Chardonnay vs Classic + +Nearly 100% of the difference is look and feel -- it's a matter of preference. + +**Chardonnay** has an updated look and will work and look the same on Windows, Mac, and Linux. + +**Classic** is Windows only. It has an older look because it's built with older, duller, and more mature technology. This tech has built into it better support for things like accessibility for screen readers. + +### Platform-specific instructions + +- Windows + +Extract the zip file to a folder and then run `Libation.exe` from inside of that folder. Do not put it in Program Files. The inability to edit files from there causes problems with configuration and updating. + +- [Linux](./installation/linux.md) +- [MacOS](./installation/mac.md) + +## Create Accounts + +Create your account(s): + +![Create your accounts, menu](images/v40_accounts.png) + +New locale options include many more regions including old audible accounts which pre-date the amazon acquisition + +![Choose your account locales](images/v40_locales.png) + +## Import Your Library + +Be default, Libation will periodically scan the accounts you added above with a checkbox next to them. Nothing for you to do. You can also scan manually. + +Select Import > Scan Library: + +![Import step 1](images/Import1.png) + +Or if you have multiple accounts, you'll get to choose whether to scan all accounts or just the ones you select: + +![Import which accounts](images/v40_import.png) + +If this is a new installation, or you're scanning an account you haven't scanned before, you'll be prompted to enter your password for the Audible account. + +![Login password](images/alt-login1.png) + +Enter the password and click Submit. Audible will prompt you with a CAPTCHA image. + +![Login captcha](images/alt-login2.png) + +Enter the CAPTCHA answer characters and click Submit. If all has gone well, Libation will start scanning the account. + +In rare instances, the Captcha image/response will fail in an endless loop. If this happens, delete the problem account, and then click Save. Re-add the account and click Save again. Now try to scan the account again. This time, instead of typing your password, click the link that says "Or click here". This will open the Audible External Login dialog shown below. + +![Login alternative setup](images/alt-login3.png) + +You can either copy the URL shown and paste it into your browser or launch the browser directly by clicking Launch in Browser. Audible will display its standard login page. Login, including answering the CAPTCHA on the next page. In some cases, you might have to approve the login from the email account associated with that login, but once the login is successful, you'll see an error message. + +![Login alternative login result](images/alt-login4.png) + +This actually means you've successfully logged in. Copy the entire URL shown in your browser and return to Libation. Paste that URL into the text box at the bottom of the Audible External Login window and click Submit. + +You'll see this window while it's scanning: + +![Import step 2](images/Import2.png) + +Success! We see how many new titles are imported: + +![Import step 3](images/Import3.png) + +## Download Your Books — DRM-free! + +Automatically download some or all of your audible books. This shows you how much of your library is not yet downloaded and decrypted: + +The stoplights will tell you a title's status: + +- Green: downloaded and decrypted +- Yellow: downloaded but still encrypted with DRM +- Red: not downloaded +- PDF icon without arrow: downloaded +- PDF with arrow: not downloaded + +Or hover over the button to see the status. + +![Liberate book step 1](images/LiberateBook1.png) + +Select Liberate > Begin Book Backups + +You can also click on the stop light to download only that title and its PDF + +![Liberate book step 2](images/LiberateBook2.png) + +First the original book with DRM is downloaded + +![Liberate book step 3](images/LiberateBook3.png) + +Then it's decrypted so you can use it on any device you choose. The very first time you decrypt a book, this step will take a while. Every other book will go much faster. The first time, Libation has to figure out the special decryption key which allows your personal books to be unlocked. + +![Liberate book step 4](images/LiberateBook4.png) + +And voila! If you have multiple books not yet liberated, Libation will automatically move on to the next. + +![Liberate book step 5](images/LiberateBook5.png) + +The Audible id must be somewhere in the book's file or folder name for Libation to detect your downloaded book. + +## Download PDF Attachments + +For books which include PDF downloads, Libation can download these for you as well and will attempt to store them with the book. "Book backup" will already download an available PDF. This additional option is useful when Audible adds a PDF to your book after you've already backed it up. + +Select Liberate > Begin PDF Backups + +![PDF download step 2](images/PdfDownload2.png) + +The downloads work just like with books, only with no additional decryption needed. + +![PDF download step 3](images/PdfDownload3.png) + +## Details of Downloaded Files + +![Post download](images/PostDownload.png) + +When you set up Libation, you'll specify a Books directory. Libation looks inside that directory and all subdirectories to look for files or folders with each library book's audible id. This way, organization is completely up to you. When you download + decrypt a book, you get several files + +- .m4b: your audiobook in m4b format. This is the most pure version of your audiobook and retains the highest quality. Now that it's decrypted, you can play it on any audio player and put it on any device. If you'd like, you can also use 3rd party tools to turn it into an mp3. The freedom to do what you want with your files was the original inspiration for Libation. +- .cue: this is a file which logs where chapter breaks occur. Many tools are able to use this if you want to split your book into files along chapter lines. + +## Export Your Library + +![Export](images/Export.png) + +Export your library to Excel, CSV, or JSON + +## I Still Need Help + +[You can open an issue here](https://github.com/rmcrackan/Libation/issues) for bug reports, feature requests, or specialized help. diff --git a/docs/index.md b/docs/index.md index 1a35d0b8..32d80beb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,139 +1,36 @@ -# Getting started +# Documentation Overview + +Welcome to the Libation documentation! Here you'll find everything you need to get started and make the most of Libation. + +## Getting Started + +- **[Getting Started](/docs/getting-started)** - Your first steps with Libation +- **[FAQ](/docs/frequently-asked-questions)** - Frequently asked questions and answers ## Installation -Download the [latest version of Libation](https://github.com/rmcrackan/Libation/releases) +Platform-specific installation guides: -### Which version? Chardonnay vs Classic +- **[Linux Installation](/docs/installation/linux)** - Install Libation on Linux +- **[Mac Installation](/docs/installation/mac)** - Install Libation on macOS +- **[Docker Installation](/docs/installation/docker)** - Run Libation in a Docker container -Nearly 100% of the difference is look and feel -- it's a matter of preference. +## Features -**Chardonnay** has an updated look and will work and look the same on Windows, Mac, and Linux. +Learn about Libation's powerful features: -**Classic** is Windows only. It has an older look because it's built with older, duller, and more mature technology. This tech has built into it better support for things like accessibility for screen readers. +- **[Audio File Formats](/docs/features/audio-file-formats)** - Supported audio formats and conversion options +- **[Naming Templates](/docs/features/naming-templates)** - Customize how your audiobook files are named +- **[Searching & Filtering](/docs/features/searching-and-filtering)** - Find and organize your audiobooks -### Platform-specific instructions +## Advanced -- Windows +Advanced topics for power users and developers: -Extract the zip file to a folder and then run `Libation.exe` from inside of that folder. Do not put it in Program Files. The inability to edit files from there causes problems with configuration and updating. +- **[Advanced Topics](/docs/advanced/advanced)** - Advanced configuration and usage +- **[Linux Development Setup](/docs/advanced/linux-development-setup-using-nix)** - Set up a development environment on Linux using Nix -- [Linux](./installation/linux.md) -- [MacOS](./installation/mac.md) +## Support & Community -## Create Accounts - -Create your account(s): - -![Create your accounts, menu](images/v40_accounts.png) - -New locale options include many more regions including old audible accounts which pre-date the amazon acquisition - -![Choose your account locales](images/v40_locales.png) - -## Import Your Library - -Be default, Libation will periodically scan the accounts you added above with a checkbox next to them. Nothing for you to do. You can also scan manually. - -Select Import > Scan Library: - -![Import step 1](images/Import1.png) - -Or if you have multiple accounts, you'll get to choose whether to scan all accounts or just the ones you select: - -![Import which accounts](images/v40_import.png) - -If this is a new installation, or you're scanning an account you haven't scanned before, you'll be prompted to enter your password for the Audible account. - -![Login password](images/alt-login1.png) - -Enter the password and click Submit. Audible will prompt you with a CAPTCHA image. - -![Login captcha](images/alt-login2.png) - -Enter the CAPTCHA answer characters and click Submit. If all has gone well, Libation will start scanning the account. - -In rare instances, the Captcha image/response will fail in an endless loop. If this happens, delete the problem account, and then click Save. Re-add the account and click Save again. Now try to scan the account again. This time, instead of typing your password, click the link that says "Or click here". This will open the Audible External Login dialog shown below. - -![Login alternative setup](images/alt-login3.png) - -You can either copy the URL shown and paste it into your browser or launch the browser directly by clicking Launch in Browser. Audible will display its standard login page. Login, including answering the CAPTCHA on the next page. In some cases, you might have to approve the login from the email account associated with that login, but once the login is successful, you'll see an error message. - -![Login alternative login result](images/alt-login4.png) - -This actually means you've successfully logged in. Copy the entire URL shown in your browser and return to Libation. Paste that URL into the text box at the bottom of the Audible External Login window and click Submit. - -You'll see this window while it's scanning: - -![Import step 2](images/Import2.png) - -Success! We see how many new titles are imported: - -![Import step 3](images/Import3.png) - -## Download Your Books — DRM-free! - -Automatically download some or all of your audible books. This shows you how much of your library is not yet downloaded and decrypted: - -The stoplights will tell you a title's status: - -- Green: downloaded and decrypted -- Yellow: downloaded but still encrypted with DRM -- Red: not downloaded -- PDF icon without arrow: downloaded -- PDF with arrow: not downloaded - -Or hover over the button to see the status. - -![Liberate book step 1](images/LiberateBook1.png) - -Select Liberate > Begin Book Backups - -You can also click on the stop light to download only that title and its PDF - -![Liberate book step 2](images/LiberateBook2.png) - -First the original book with DRM is downloaded - -![Liberate book step 3](images/LiberateBook3.png) - -Then it's decrypted so you can use it on any device you choose. The very first time you decrypt a book, this step will take a while. Every other book will go much faster. The first time, Libation has to figure out the special decryption key which allows your personal books to be unlocked. - -![Liberate book step 4](images/LiberateBook4.png) - -And voila! If you have multiple books not yet liberated, Libation will automatically move on to the next. - -![Liberate book step 5](images/LiberateBook5.png) - -The Audible id must be somewhere in the book's file or folder name for Libation to detect your downloaded book. - -## Download PDF Attachments - -For books which include PDF downloads, Libation can download these for you as well and will attempt to store them with the book. "Book backup" will already download an available PDF. This additional option is useful when Audible adds a PDF to your book after you've already backed it up. - -Select Liberate > Begin PDF Backups - -![PDF download step 2](images/PdfDownload2.png) - -The downloads work just like with books, only with no additional decryption needed. - -![PDF download step 3](images/PdfDownload3.png) - -## Details of Downloaded Files - -![Post download](images/PostDownload.png) - -When you set up Libation, you'll specify a Books directory. Libation looks inside that directory and all subdirectories to look for files or folders with each library book's audible id. This way, organization is completely up to you. When you download + decrypt a book, you get several files - -- .m4b: your audiobook in m4b format. This is the most pure version of your audiobook and retains the highest quality. Now that it's decrypted, you can play it on any audio player and put it on any device. If you'd like, you can also use 3rd party tools to turn it into an mp3. The freedom to do what you want with your files was the original inspiration for Libation. -- .cue: this is a file which logs where chapter breaks occur. Many tools are able to use this if you want to split your book into files along chapter lines. - -## Export Your Library - -![Export](images/Export.png) - -Export your library to Excel, CSV, or JSON - -## I Still Need Help - -[You can open an issue here](https://github.com/rmcrackan/Libation/issues) for bug reports, feature requests, or specialized help. +- **[Issues & Requests](https://github.com/rmcrackan/Libation/issues)** - Report bugs or request features +- **[Donate](https://www.paypal.com/paypalme/mcrackan)** - Support the development of Libation diff --git a/index.md b/index.md index 55603318..2006f11b 100644 --- a/index.md +++ b/index.md @@ -9,6 +9,9 @@ hero: - theme: brand text: Getting Started link: /docs/getting-started + - theme: alt + text: Docs + link: /docs/index - theme: alt text: Download link: https://github.com/rmcrackan/Libation/releases/latest @@ -50,4 +53,39 @@ features: > I've made every good-faith effort to include nothing insecure, malicious, anti-privacy, or destructive. That said: **use at your own risk**. I made this for myself and I want to share it with the great programming and audible/audiobook communities which have been so generous with their time and help. > [!TIP] Alternatives -> Is Libation just not right for you? Similar apps are on [AudiobookHub](https://github.com/rmcrackan/AudiobookHub), nearly all of which are also free. \ No newline at end of file +> Is Libation just not right for you? Similar apps are on [AudiobookHub](https://github.com/rmcrackan/AudiobookHub), nearly all of which are also free. + +## Documentation + +### Getting Started + +- **[Getting Started](/docs/getting-started)** - Your first steps with Libation +- **[FAQ](/docs/frequently-asked-questions)** - Frequently asked questions and answers + +### Installation + +Platform-specific installation guides: + +- **[Linux Installation](/docs/installation/linux)** - Install Libation on Linux +- **[Mac Installation](/docs/installation/mac)** - Install Libation on macOS +- **[Docker Installation](/docs/installation/docker)** - Run Libation in a Docker container + +### Features + +Learn about Libation's powerful features: + +- **[Audio File Formats](/docs/features/audio-file-formats)** - Supported audio formats and conversion options +- **[Naming Templates](/docs/features/naming-templates)** - Customize how your audiobook files are named +- **[Searching & Filtering](/docs/features/searching-and-filtering)** - Find and organize your audiobooks + +### Advanced + +Advanced topics for power users and developers: + +- **[Advanced Topics](/docs/advanced/advanced)** - Advanced configuration and usage +- **[Linux Development Setup](/docs/advanced/linux-development-setup-using-nix)** - Set up a development environment on Linux using Nix + +### Support & Community + +- **[Issues & Requests](https://github.com/rmcrackan/Libation/issues)** - Report bugs or request features +- **[Donate](https://www.paypal.com/paypalme/mcrackan)** - Support the development of Libation From 770adf33f3d99207d0f05a8d0dc4c84f99da651a Mon Sep 17 00:00:00 2001 From: radiorambo <thisisumesh@proton.me> Date: Fri, 19 Dec 2025 14:09:21 +0530 Subject: [PATCH 18/18] add gitHub actions workflow for vitePress deployment to gitHub pages. --- .github/workflows/deploy.yml | 64 ++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..68b139cf --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,64 @@ +name: Deploy VitePress site to Pages + +on: + # Runs on pushes targeting the `main` branch. Change this to `master` if you're + # using the `master` branch as the default branch. + push: + branches: [master] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 0 # Not needed if lastUpdated is not enabled + # - uses: pnpm/action-setup@v4 # Uncomment this block if you're using pnpm + # with: + # version: 9 # Not needed if you've set "packageManager" in package.json + # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm # or pnpm / yarn + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Install dependencies + run: npm ci # or pnpm install / yarn install / bun install + - name: Build with VitePress + run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: .vitepress/dist + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file