From 15d2fd1af0169b03e03cc460846258d2aaf2d9ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 06:04:12 +0000 Subject: [PATCH] deploy: 385950bb71455018eed7e6b59b6edd17686f381e --- 404.html | 4 ++-- assets/js/01dfd4e6.a8e590b1.js | 1 - assets/js/01dfd4e6.fa934694.js | 1 + assets/js/03c48fcb.398d99ed.js | 1 + assets/js/03c48fcb.fc137b1e.js | 1 - assets/js/0480b142.51d7956d.js | 1 + assets/js/0480b142.d4474517.js | 1 - assets/js/0920ba86.8c9fee13.js | 1 - assets/js/0920ba86.9565384f.js | 1 + assets/js/0bf9748d.997264bd.js | 1 - assets/js/0bf9748d.f02fa22e.js | 1 + assets/js/0c5c2428.49c61fa9.js | 1 + assets/js/0c5c2428.8bc60d65.js | 1 - assets/js/1bb85636.08a6e4a2.js | 1 + assets/js/1bb85636.dc0c2eaa.js | 1 - assets/js/1ec3b236.39500d0f.js | 1 + assets/js/1ec3b236.8b842671.js | 1 - assets/js/206b31bb.0dcb7221.js | 1 - assets/js/206b31bb.d4b32252.js | 1 + assets/js/24227623.e14fce65.js | 1 + assets/js/24227623.f2dfb587.js | 1 - assets/js/2b8f2de1.98daf9f6.js | 1 - assets/js/2b8f2de1.fb3b48db.js | 1 + assets/js/33e67961.0b797d9a.js | 1 + assets/js/33e67961.9424bad8.js | 1 - assets/js/416fe654.9e357634.js | 1 - assets/js/416fe654.9e7de143.js | 1 + assets/js/49136dfa.951c184e.js | 1 + assets/js/49136dfa.cbfe11f0.js | 1 - assets/js/4c25ac78.0bc9e6c9.js | 1 - assets/js/4c25ac78.e8a08b11.js | 1 + assets/js/4cc4731f.1009512f.js | 1 + assets/js/4cc4731f.173de65f.js | 1 - assets/js/55519d27.6972ea0e.js | 1 + assets/js/55519d27.af79e886.js | 1 - assets/js/5592dbb1.5f4abf6a.js | 1 - assets/js/5592dbb1.b1b9efbf.js | 1 + assets/js/58903ab2.86bc1eb9.js | 1 - assets/js/58903ab2.b8a01bdc.js | 1 + assets/js/5ef0e9d6.86e97811.js | 1 - assets/js/5ef0e9d6.b0ab1590.js | 1 + assets/js/607df45e.7e062d2f.js | 1 - assets/js/607df45e.9481a27f.js | 1 + assets/js/674e178f.74a463ec.js | 1 + assets/js/674e178f.94915e06.js | 1 - assets/js/767395cb.661472fb.js | 1 - assets/js/767395cb.f386cd84.js | 1 + assets/js/7d6e8713.ca4021a3.js | 1 + assets/js/7d6e8713.d613beb7.js | 1 - assets/js/8badb5d4.9bea614d.js | 1 - assets/js/8badb5d4.b8a9618a.js | 1 + assets/js/97c4f258.2a365b24.js | 1 - assets/js/97c4f258.8e36b3d8.js | 1 + assets/js/98ce5054.5ec05dba.js | 1 + assets/js/98ce5054.8e34cd23.js | 1 - assets/js/a09c2993.25baf151.js | 1 + assets/js/a09c2993.6d0adad7.js | 1 - assets/js/a22ccb60.29576c43.js | 1 + assets/js/a22ccb60.8ca36230.js | 1 - assets/js/a624e12b.50bde33c.js | 1 + assets/js/a624e12b.ded498d7.js | 1 - assets/js/a981d65e.39e97a72.js | 1 - assets/js/a981d65e.aba281dd.js | 1 + assets/js/ac07380c.8fd8cd08.js | 1 - assets/js/ac07380c.fb84db6a.js | 1 + assets/js/b242fde9.202d6252.js | 1 + assets/js/b242fde9.2f41171d.js | 1 - assets/js/b94207ad.912dcf51.js | 1 + assets/js/b94207ad.eeab4cd3.js | 1 - assets/js/b94d24b4.5c9cd31e.js | 1 - assets/js/b94d24b4.c2d4866f.js | 1 + assets/js/c2d7cd96.6e2fce27.js | 1 + assets/js/c2d7cd96.99b10f2b.js | 1 - assets/js/c777247d.445ad470.js | 1 - assets/js/c777247d.b2256ed5.js | 1 + assets/js/ca683365.40c423da.js | 1 - assets/js/ca683365.9d8cb1e5.js | 1 + assets/js/d135d818.2c62488d.js | 1 + assets/js/d135d818.c00c16c2.js | 1 - assets/js/d6e0cd3c.1c7b5a76.js | 1 - assets/js/d6e0cd3c.5d23eee4.js | 1 + assets/js/d86518ca.42f54bcd.js | 1 - assets/js/d86518ca.81e2b5be.js | 1 + assets/js/df8142cd.59a69c90.js | 1 - assets/js/df8142cd.a8336367.js | 1 + assets/js/e41126ef.0a2e295e.js | 1 + assets/js/e41126ef.f7bd60c5.js | 1 - assets/js/ebc1cc14.426bb5b4.js | 1 + assets/js/ebc1cc14.a450d1e2.js | 1 - assets/js/{main.6baaae66.js => main.a7722e66.js} | 4 ++-- ...aaae66.js.LICENSE.txt => main.a7722e66.js.LICENSE.txt} | 0 ...{runtime~main.050a9d3a.js => runtime~main.9360218b.js} | 2 +- blog/archive/index.html | 4 ++-- blog/authors/index.html | 4 ++-- blog/ebook-drop2/index.html | 4 ++-- blog/ebook-support/index.html | 4 ++-- blog/index.html | 4 ++-- blog/prepare-v1/index.html | 4 ++-- blog/tags/breaking-change/index.html | 4 ++-- blog/tags/index.html | 4 ++-- blog/tags/komga/index.html | 4 ++-- blog/tags/upgrade/index.html | 4 ++-- docs/api/deprecation/index.html | 6 +++--- docs/api/rest/index.html | 6 +++--- docs/category/guides/index.html | 4 ++-- docs/category/installation/index.html | 4 ++-- docs/category/official-methods/index.html | 4 ++-- docs/category/readers/index.html | 4 ++-- docs/community/index.html | 6 +++--- docs/contribution/index.html | 6 +++--- docs/faq/index.html | 6 +++--- docs/guides/announcements/index.html | 6 +++--- docs/guides/cdisplayex/index.html | 6 +++--- docs/guides/chunky/index.html | 6 +++--- docs/guides/cli/index.html | 6 +++--- docs/guides/collections/index.html | 6 +++--- docs/guides/desktop/index.html | 6 +++--- docs/guides/duplicate-files/index.html | 6 +++--- docs/guides/duplicate-pages/index.html | 6 +++--- docs/guides/edit-metadata/index.html | 6 +++--- docs/guides/image-formats/index.html | 6 +++--- docs/guides/import-books/index.html | 6 +++--- docs/guides/kobo/index.html | 6 +++--- docs/guides/libraries/index.html | 6 +++--- docs/guides/local-artwork-assets/index.html | 6 +++--- docs/guides/mihon/index.html | 6 +++--- docs/guides/oneshots/index.html | 6 +++--- docs/guides/opds/index.html | 6 +++--- docs/guides/panels/index.html | 6 +++--- docs/guides/paperback/index.html | 6 +++--- docs/guides/read-progress/index.html | 6 +++--- docs/guides/readlists/index.html | 6 +++--- docs/guides/scan-analysis-refresh/index.html | 6 +++--- docs/guides/search/index.html | 6 +++--- docs/guides/server-settings/index.html | 6 +++--- docs/guides/theme/index.html | 6 +++--- docs/guides/trash/index.html | 6 +++--- docs/guides/user-accounts/index.html | 6 +++--- docs/guides/webreader/index.html | 6 +++--- docs/guides/webui/index.html | 6 +++--- docs/installation/configuration/index.html | 6 +++--- docs/installation/desktop/index.html | 6 +++--- docs/installation/docker/index.html | 6 +++--- docs/installation/gdrive/index.html | 6 +++--- docs/installation/https/index.html | 6 +++--- docs/installation/jar/index.html | 6 +++--- docs/installation/ms-store/index.html | 6 +++--- docs/installation/oauth2/index.html | 6 +++--- docs/installation/thirdparty/index.html | 6 +++--- docs/introduction/index.html | 8 ++++---- index.html | 4 ++-- 151 files changed, 212 insertions(+), 212 deletions(-) delete mode 100644 assets/js/01dfd4e6.a8e590b1.js create mode 100644 assets/js/01dfd4e6.fa934694.js create mode 100644 assets/js/03c48fcb.398d99ed.js delete mode 100644 assets/js/03c48fcb.fc137b1e.js create mode 100644 assets/js/0480b142.51d7956d.js delete mode 100644 assets/js/0480b142.d4474517.js delete mode 100644 assets/js/0920ba86.8c9fee13.js create mode 100644 assets/js/0920ba86.9565384f.js delete mode 100644 assets/js/0bf9748d.997264bd.js create mode 100644 assets/js/0bf9748d.f02fa22e.js create mode 100644 assets/js/0c5c2428.49c61fa9.js delete mode 100644 assets/js/0c5c2428.8bc60d65.js create mode 100644 assets/js/1bb85636.08a6e4a2.js delete mode 100644 assets/js/1bb85636.dc0c2eaa.js create mode 100644 assets/js/1ec3b236.39500d0f.js delete mode 100644 assets/js/1ec3b236.8b842671.js delete mode 100644 assets/js/206b31bb.0dcb7221.js create mode 100644 assets/js/206b31bb.d4b32252.js create mode 100644 assets/js/24227623.e14fce65.js delete mode 100644 assets/js/24227623.f2dfb587.js delete mode 100644 assets/js/2b8f2de1.98daf9f6.js create mode 100644 assets/js/2b8f2de1.fb3b48db.js create mode 100644 assets/js/33e67961.0b797d9a.js delete mode 100644 assets/js/33e67961.9424bad8.js delete mode 100644 assets/js/416fe654.9e357634.js create mode 100644 assets/js/416fe654.9e7de143.js create mode 100644 assets/js/49136dfa.951c184e.js delete mode 100644 assets/js/49136dfa.cbfe11f0.js delete mode 100644 assets/js/4c25ac78.0bc9e6c9.js create mode 100644 assets/js/4c25ac78.e8a08b11.js create mode 100644 assets/js/4cc4731f.1009512f.js delete mode 100644 assets/js/4cc4731f.173de65f.js create mode 100644 assets/js/55519d27.6972ea0e.js delete mode 100644 assets/js/55519d27.af79e886.js delete mode 100644 assets/js/5592dbb1.5f4abf6a.js create mode 100644 assets/js/5592dbb1.b1b9efbf.js delete mode 100644 assets/js/58903ab2.86bc1eb9.js create mode 100644 assets/js/58903ab2.b8a01bdc.js delete mode 100644 assets/js/5ef0e9d6.86e97811.js create mode 100644 assets/js/5ef0e9d6.b0ab1590.js delete mode 100644 assets/js/607df45e.7e062d2f.js create mode 100644 assets/js/607df45e.9481a27f.js create mode 100644 assets/js/674e178f.74a463ec.js delete mode 100644 assets/js/674e178f.94915e06.js delete mode 100644 assets/js/767395cb.661472fb.js create mode 100644 assets/js/767395cb.f386cd84.js create mode 100644 assets/js/7d6e8713.ca4021a3.js delete mode 100644 assets/js/7d6e8713.d613beb7.js delete mode 100644 assets/js/8badb5d4.9bea614d.js create mode 100644 assets/js/8badb5d4.b8a9618a.js delete mode 100644 assets/js/97c4f258.2a365b24.js create mode 100644 assets/js/97c4f258.8e36b3d8.js create mode 100644 assets/js/98ce5054.5ec05dba.js delete mode 100644 assets/js/98ce5054.8e34cd23.js create mode 100644 assets/js/a09c2993.25baf151.js delete mode 100644 assets/js/a09c2993.6d0adad7.js create mode 100644 assets/js/a22ccb60.29576c43.js delete mode 100644 assets/js/a22ccb60.8ca36230.js create mode 100644 assets/js/a624e12b.50bde33c.js delete mode 100644 assets/js/a624e12b.ded498d7.js delete mode 100644 assets/js/a981d65e.39e97a72.js create mode 100644 assets/js/a981d65e.aba281dd.js delete mode 100644 assets/js/ac07380c.8fd8cd08.js create mode 100644 assets/js/ac07380c.fb84db6a.js create mode 100644 assets/js/b242fde9.202d6252.js delete mode 100644 assets/js/b242fde9.2f41171d.js create mode 100644 assets/js/b94207ad.912dcf51.js delete mode 100644 assets/js/b94207ad.eeab4cd3.js delete mode 100644 assets/js/b94d24b4.5c9cd31e.js create mode 100644 assets/js/b94d24b4.c2d4866f.js create mode 100644 assets/js/c2d7cd96.6e2fce27.js delete mode 100644 assets/js/c2d7cd96.99b10f2b.js delete mode 100644 assets/js/c777247d.445ad470.js create mode 100644 assets/js/c777247d.b2256ed5.js delete mode 100644 assets/js/ca683365.40c423da.js create mode 100644 assets/js/ca683365.9d8cb1e5.js create mode 100644 assets/js/d135d818.2c62488d.js delete mode 100644 assets/js/d135d818.c00c16c2.js delete mode 100644 assets/js/d6e0cd3c.1c7b5a76.js create mode 100644 assets/js/d6e0cd3c.5d23eee4.js delete mode 100644 assets/js/d86518ca.42f54bcd.js create mode 100644 assets/js/d86518ca.81e2b5be.js delete mode 100644 assets/js/df8142cd.59a69c90.js create mode 100644 assets/js/df8142cd.a8336367.js create mode 100644 assets/js/e41126ef.0a2e295e.js delete mode 100644 assets/js/e41126ef.f7bd60c5.js create mode 100644 assets/js/ebc1cc14.426bb5b4.js delete mode 100644 assets/js/ebc1cc14.a450d1e2.js rename assets/js/{main.6baaae66.js => main.a7722e66.js} (75%) rename assets/js/{main.6baaae66.js.LICENSE.txt => main.a7722e66.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.050a9d3a.js => runtime~main.9360218b.js} (51%) diff --git a/404.html b/404.html index 079f2da7..e043149d 100644 --- a/404.html +++ b/404.html @@ -6,8 +6,8 @@ Page Not Found | Komga - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/01dfd4e6.a8e590b1.js b/assets/js/01dfd4e6.a8e590b1.js deleted file mode 100644 index 56968746..00000000 --- a/assets/js/01dfd4e6.a8e590b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[757],{6720:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=t(2540),n=t(3023);const i={},a="Server settings & management",o={id:"guides/server-settings",title:"Server settings & management",description:"The Server Settings > Server screen allows for more configuration of your server.",source:"@site/docs/guides/server-settings.md",sourceDirName:"guides",slug:"/guides/server-settings",permalink:"/docs/guides/server-settings",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/server-settings.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"User accounts",permalink:"/docs/guides/user-accounts"},next:{title:"Read progress",permalink:"/docs/guides/read-progress"}},d={},l=[{value:"Server Settings",id:"server-settings",level:2},{value:"Delete empty collections after scan",id:"delete-empty-collections-after-scan",level:4},{value:"Delete empty read lists after scan",id:"delete-empty-read-lists-after-scan",level:4},{value:"Task threads",id:"task-threads",level:4},{value:"Remember Me duration",id:"remember-me-duration",level:4},{value:"Regenerate the RememberMe key",id:"regenerate-the-rememberme-key",level:4},{value:"Server Port",id:"server-port",level:4},{value:"Base URL",id:"base-url",level:4},{value:"Server Management",id:"server-management",level:2}];function c(e){const r={code:"code",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"server-settings--management",children:"Server settings & management"})}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.em,{children:"Server Settings > Server"})," screen allows for more configuration of your server."]}),"\n",(0,s.jsx)(r.h2,{id:"server-settings",children:"Server Settings"}),"\n",(0,s.jsx)(r.p,{children:"This section allows to configure some server-wide options."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/server-settings/server-settings.png",style:{maxHeight:"600px"},alt:"Server Settings"}),"\n",(0,s.jsx)(r.h4,{id:"delete-empty-collections-after-scan",children:"Delete empty collections after scan"}),"\n",(0,s.jsx)(r.p,{children:"Indicate whether Komga should delete empty collections after a scan."}),"\n",(0,s.jsx)(r.h4,{id:"delete-empty-read-lists-after-scan",children:"Delete empty read lists after scan"}),"\n",(0,s.jsx)(r.p,{children:"Indicate whether Komga should delete empty read lists after a scan."}),"\n",(0,s.jsx)(r.h4,{id:"task-threads",children:"Task threads"}),"\n",(0,s.jsx)(r.p,{children:"The number of threads dedicated to the processing of background tasks."}),"\n",(0,s.jsx)(r.h4,{id:"remember-me-duration",children:"Remember Me duration"}),"\n",(0,s.jsx)(r.p,{children:"The duration (in days) of the remember-me cookie that will be saved in the browser, if the Remember Me checkbox is ticked upon login."}),"\n",(0,s.jsx)(r.h4,{id:"regenerate-the-rememberme-key",children:"Regenerate the RememberMe key"}),"\n",(0,s.jsx)(r.p,{children:"The RememberMe feature works with a secret key. If you want to invalidate all the remember-me cookies that have been issued, you can regenerate the key."}),"\n",(0,s.jsx)(r.h4,{id:"server-port",children:"Server Port"}),"\n",(0,s.jsx)(r.p,{children:"Port to listen to for the API and web interface."}),"\n",(0,s.jsxs)(r.p,{children:["This takes precedence over the ",(0,s.jsx)(r.code,{children:"server.port"})," configuration key."]}),"\n",(0,s.jsx)(r.h4,{id:"base-url",children:"Base URL"}),"\n",(0,s.jsx)(r.p,{children:"Base URL, useful if you need to reverse proxy with a subfolder."}),"\n",(0,s.jsxs)(r.p,{children:["This takes precedence over the ",(0,s.jsx)(r.code,{children:"server.servlet.context-path"})," configuration key."]}),"\n",(0,s.jsx)(r.h2,{id:"server-management",children:"Server Management"}),"\n",(0,s.jsx)(r.p,{children:"This sections allows some administrative actions for your server."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/server-settings/server-management.png",style:{maxHeight:"300px"},alt:"Server Management"})]})}function h(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,r,t)=>{t.d(r,{R:()=>a,x:()=>o});var s=t(3696);const n={},i=s.createContext(n);function a(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/01dfd4e6.fa934694.js b/assets/js/01dfd4e6.fa934694.js new file mode 100644 index 00000000..444eab21 --- /dev/null +++ b/assets/js/01dfd4e6.fa934694.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[757],{6720:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=t(2540),n=t(3023);const i={},a="Server settings & management",o={id:"guides/server-settings",title:"Server settings & management",description:"The Server Settings > Server screen allows for more configuration of your server.",source:"@site/docs/guides/server-settings.md",sourceDirName:"guides",slug:"/guides/server-settings",permalink:"/docs/guides/server-settings",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/server-settings.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"User accounts",permalink:"/docs/guides/user-accounts"},next:{title:"Read progress",permalink:"/docs/guides/read-progress"}},d={},l=[{value:"Server Settings",id:"server-settings",level:2},{value:"Delete empty collections after scan",id:"delete-empty-collections-after-scan",level:4},{value:"Delete empty read lists after scan",id:"delete-empty-read-lists-after-scan",level:4},{value:"Task threads",id:"task-threads",level:4},{value:"Remember Me duration",id:"remember-me-duration",level:4},{value:"Regenerate the RememberMe key",id:"regenerate-the-rememberme-key",level:4},{value:"Server Port",id:"server-port",level:4},{value:"Base URL",id:"base-url",level:4},{value:"Server Management",id:"server-management",level:2}];function c(e){const r={code:"code",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"server-settings--management",children:"Server settings & management"})}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.em,{children:"Server Settings > Server"})," screen allows for more configuration of your server."]}),"\n",(0,s.jsx)(r.h2,{id:"server-settings",children:"Server Settings"}),"\n",(0,s.jsx)(r.p,{children:"This section allows to configure some server-wide options."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/server-settings/server-settings.png",style:{maxHeight:"600px"},alt:"Server Settings"}),"\n",(0,s.jsx)(r.h4,{id:"delete-empty-collections-after-scan",children:"Delete empty collections after scan"}),"\n",(0,s.jsx)(r.p,{children:"Indicate whether Komga should delete empty collections after a scan."}),"\n",(0,s.jsx)(r.h4,{id:"delete-empty-read-lists-after-scan",children:"Delete empty read lists after scan"}),"\n",(0,s.jsx)(r.p,{children:"Indicate whether Komga should delete empty read lists after a scan."}),"\n",(0,s.jsx)(r.h4,{id:"task-threads",children:"Task threads"}),"\n",(0,s.jsx)(r.p,{children:"The number of threads dedicated to the processing of background tasks."}),"\n",(0,s.jsx)(r.h4,{id:"remember-me-duration",children:"Remember Me duration"}),"\n",(0,s.jsx)(r.p,{children:"The duration (in days) of the remember-me cookie that will be saved in the browser, if the Remember Me checkbox is ticked upon login."}),"\n",(0,s.jsx)(r.h4,{id:"regenerate-the-rememberme-key",children:"Regenerate the RememberMe key"}),"\n",(0,s.jsx)(r.p,{children:"The RememberMe feature works with a secret key. If you want to invalidate all the remember-me cookies that have been issued, you can regenerate the key."}),"\n",(0,s.jsx)(r.h4,{id:"server-port",children:"Server Port"}),"\n",(0,s.jsx)(r.p,{children:"Port to listen to for the API and web interface."}),"\n",(0,s.jsxs)(r.p,{children:["This takes precedence over the ",(0,s.jsx)(r.code,{children:"server.port"})," configuration key."]}),"\n",(0,s.jsx)(r.h4,{id:"base-url",children:"Base URL"}),"\n",(0,s.jsx)(r.p,{children:"Base URL, useful if you need to reverse proxy with a subfolder."}),"\n",(0,s.jsxs)(r.p,{children:["This takes precedence over the ",(0,s.jsx)(r.code,{children:"server.servlet.context-path"})," configuration key."]}),"\n",(0,s.jsx)(r.h2,{id:"server-management",children:"Server Management"}),"\n",(0,s.jsx)(r.p,{children:"This sections allows some administrative actions for your server."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/server-settings/server-management.png",style:{maxHeight:"300px"},alt:"Server Management"})]})}function h(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,r,t)=>{t.d(r,{R:()=>a,x:()=>o});var s=t(3696);const n={},i=s.createContext(n);function a(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03c48fcb.398d99ed.js b/assets/js/03c48fcb.398d99ed.js new file mode 100644 index 00000000..16512eca --- /dev/null +++ b/assets/js/03c48fcb.398d99ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9424],{9002:(e,i,l)=>{l.r(i),l.d(i,{assets:()=>r,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var n=l(2540),t=l(3023);const o={},s="Collections",c={id:"guides/collections",title:"Collections",description:'Collections let you gather related series together. For example, you might add all the Batman series together in a "Batman" collection.',source:"@site/docs/guides/collections.md",sourceDirName:"guides",slug:"/guides/collections",permalink:"/docs/guides/collections",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/collections.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read progress",permalink:"/docs/guides/read-progress"},next:{title:"Read lists",permalink:"/docs/guides/readlists"}},r={},d=[{value:"Adding series to a collection",id:"adding-series-to-a-collection",level:2},{value:"Finding the Collections",id:"finding-the-collections",level:2},{value:"Series details screen",id:"series-details-screen",level:3},{value:"Viewing the libraries "By Collection"",id:"viewing-the-libraries-by-collection",level:3},{value:"Collection details",id:"collection-details",level:2},{value:"Collection ordering",id:"collection-ordering",level:3},{value:"Edit collection elements",id:"edit-collection-elements",level:3},{value:"Deleting a collection",id:"deleting-a-collection",level:2}];function a(e){const i={em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"collections",children:"Collections"})}),"\n",(0,n.jsx)(i.p,{children:'Collections let you gather related series together. For example, you might add all the Batman series together in a "Batman" collection.'}),"\n",(0,n.jsx)(i.h2,{id:"adding-series-to-a-collection",children:"Adding series to a collection"}),"\n",(0,n.jsxs)(i.p,{children:["You can add a Series to a collection from the action menu icon ",(0,n.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.jsx)(i.em,{children:"Add to collection"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["You can also select multiple series, and click on ",(0,n.jsx)(i.em,{children:"Add to collection"}),"."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/multiselect-add-collection.png",style:{maxHeight:"80px"}}),"\n",(0,n.jsx)(i.p,{children:"A dialog will show up, where you can either add series to an existing collection, or create a new collection."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/add-collection-dialog.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.h2,{id:"finding-the-collections",children:"Finding the Collections"}),"\n",(0,n.jsx)(i.p,{children:"Collections can be discovered or viewed in three ways:"}),"\n",(0,n.jsxs)(i.ol,{children:["\n",(0,n.jsx)(i.li,{children:"Series details screen"}),"\n",(0,n.jsx)(i.li,{children:'Viewing the libraries "By Collection"'}),"\n",(0,n.jsx)(i.li,{children:"Searching in the search bar"}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"series-details-screen",children:"Series details screen"}),"\n",(0,n.jsx)(i.p,{children:"When viewing the details screen for a specific series that belongs to a collection, the collection will be displayed in a collapsible panel."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/series-collection-collapsed.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.p,{children:"Click on the panel to expand it and see the content of the collection."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/series-collection-expanded.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.h3,{id:"viewing-the-libraries-by-collection",children:'Viewing the libraries "By Collection"'}),"\n",(0,n.jsx)(i.p,{children:'Only show collections that exist in the library. Opening a collection goes to the "collection details" screen (see below).'}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/browse-collections.png",style:{maxHeight:"100px"}}),"\n",(0,n.jsx)(i.h2,{id:"collection-details",children:"Collection details"}),"\n",(0,n.jsx)(i.p,{children:"The collection details screen contains all the series that belong to the collection. It can include series from any library. By adding items in different libraries to collections, you can relate them to each other."}),"\n",(0,n.jsx)(i.h3,{id:"collection-ordering",children:"Collection ordering"}),"\n",(0,n.jsx)(i.p,{children:"By default collections will order series by alphabetical sort order. However, you can edit a collection and choose to manually sort series in a collection. You may want to do so if a collection has a specific reading order for example."}),"\n",(0,n.jsx)(i.p,{children:"Either click on the edit button on the collection card."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-card.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.p,{children:"Or click on the edit button from the collection details screen."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-button.png",style:{maxHeight:"60px"}}),"\n",(0,n.jsx)(i.p,{children:"A dialog will show up, where you can edit the collection's ordering."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-dialog.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.p,{children:"A manually ordered collection will be showing as such in the collection details screen."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-manual-ordering.png",style:{maxHeight:"50px"}}),"\n",(0,n.jsx)(i.h3,{id:"edit-collection-elements",children:"Edit collection elements"}),"\n",(0,n.jsx)(i.p,{children:"From the collection details screen you can edit the elements composing a collection. To do so, click on the corresponding button in the toolbar."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-elements-button.png",style:{maxHeight:"80px"}}),"\n",(0,n.jsx)(i.p,{children:"The series cards will show two extra elements:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"a delete button, to remove the series from the collection"}),"\n",(0,n.jsx)(i.li,{children:"a grip handle, which let you drag and drop series to reorder them (only available when the collection is manually ordered)"}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Once you are done with your changes, click the tick in the top bar. Click the cross to discard your changes."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-elements.png",style:{maxHeight:"400px"}}),"\n",(0,n.jsx)(i.h2,{id:"deleting-a-collection",children:"Deleting a collection"}),"\n",(0,n.jsxs)(i.p,{children:["To delete a collection, look for the action menu icon ",(0,n.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.jsx)(i.em,{children:"Delete"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"This will not delete the items in the collection, nor your media files."})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},3023:(e,i,l)=>{l.d(i,{R:()=>s,x:()=>c});var n=l(3696);const t={},o=n.createContext(t);function s(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03c48fcb.fc137b1e.js b/assets/js/03c48fcb.fc137b1e.js deleted file mode 100644 index 2f592efd..00000000 --- a/assets/js/03c48fcb.fc137b1e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9424],{9002:(e,i,l)=>{l.r(i),l.d(i,{assets:()=>r,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var n=l(2540),t=l(3023);const o={},s="Collections",c={id:"guides/collections",title:"Collections",description:'Collections let you gather related series together. For example, you might add all the Batman series together in a "Batman" collection.',source:"@site/docs/guides/collections.md",sourceDirName:"guides",slug:"/guides/collections",permalink:"/docs/guides/collections",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/collections.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read progress",permalink:"/docs/guides/read-progress"},next:{title:"Read lists",permalink:"/docs/guides/readlists"}},r={},d=[{value:"Adding series to a collection",id:"adding-series-to-a-collection",level:2},{value:"Finding the Collections",id:"finding-the-collections",level:2},{value:"Series details screen",id:"series-details-screen",level:3},{value:"Viewing the libraries "By Collection"",id:"viewing-the-libraries-by-collection",level:3},{value:"Collection details",id:"collection-details",level:2},{value:"Collection ordering",id:"collection-ordering",level:3},{value:"Edit collection elements",id:"edit-collection-elements",level:3},{value:"Deleting a collection",id:"deleting-a-collection",level:2}];function a(e){const i={em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"collections",children:"Collections"})}),"\n",(0,n.jsx)(i.p,{children:'Collections let you gather related series together. For example, you might add all the Batman series together in a "Batman" collection.'}),"\n",(0,n.jsx)(i.h2,{id:"adding-series-to-a-collection",children:"Adding series to a collection"}),"\n",(0,n.jsxs)(i.p,{children:["You can add a Series to a collection from the action menu icon ",(0,n.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.jsx)(i.em,{children:"Add to collection"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["You can also select multiple series, and click on ",(0,n.jsx)(i.em,{children:"Add to collection"}),"."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/multiselect-add-collection.png",style:{maxHeight:"80px"}}),"\n",(0,n.jsx)(i.p,{children:"A dialog will show up, where you can either add series to an existing collection, or create a new collection."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/add-collection-dialog.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.h2,{id:"finding-the-collections",children:"Finding the Collections"}),"\n",(0,n.jsx)(i.p,{children:"Collections can be discovered or viewed in three ways:"}),"\n",(0,n.jsxs)(i.ol,{children:["\n",(0,n.jsx)(i.li,{children:"Series details screen"}),"\n",(0,n.jsx)(i.li,{children:'Viewing the libraries "By Collection"'}),"\n",(0,n.jsx)(i.li,{children:"Searching in the search bar"}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"series-details-screen",children:"Series details screen"}),"\n",(0,n.jsx)(i.p,{children:"When viewing the details screen for a specific series that belongs to a collection, the collection will be displayed in a collapsible panel."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/series-collection-collapsed.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.p,{children:"Click on the panel to expand it and see the content of the collection."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/series-collection-expanded.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.h3,{id:"viewing-the-libraries-by-collection",children:'Viewing the libraries "By Collection"'}),"\n",(0,n.jsx)(i.p,{children:'Only show collections that exist in the library. Opening a collection goes to the "collection details" screen (see below).'}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/browse-collections.png",style:{maxHeight:"100px"}}),"\n",(0,n.jsx)(i.h2,{id:"collection-details",children:"Collection details"}),"\n",(0,n.jsx)(i.p,{children:"The collection details screen contains all the series that belong to the collection. It can include series from any library. By adding items in different libraries to collections, you can relate them to each other."}),"\n",(0,n.jsx)(i.h3,{id:"collection-ordering",children:"Collection ordering"}),"\n",(0,n.jsx)(i.p,{children:"By default collections will order series by alphabetical sort order. However, you can edit a collection and choose to manually sort series in a collection. You may want to do so if a collection has a specific reading order for example."}),"\n",(0,n.jsx)(i.p,{children:"Either click on the edit button on the collection card."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-card.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.p,{children:"Or click on the edit button from the collection details screen."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-button.png",style:{maxHeight:"60px"}}),"\n",(0,n.jsx)(i.p,{children:"A dialog will show up, where you can edit the collection's ordering."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-dialog.png",style:{maxHeight:"300px"}}),"\n",(0,n.jsx)(i.p,{children:"A manually ordered collection will be showing as such in the collection details screen."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-manual-ordering.png",style:{maxHeight:"50px"}}),"\n",(0,n.jsx)(i.h3,{id:"edit-collection-elements",children:"Edit collection elements"}),"\n",(0,n.jsx)(i.p,{children:"From the collection details screen you can edit the elements composing a collection. To do so, click on the corresponding button in the toolbar."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-elements-button.png",style:{maxHeight:"80px"}}),"\n",(0,n.jsx)(i.p,{children:"The series cards will show two extra elements:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"a delete button, to remove the series from the collection"}),"\n",(0,n.jsx)(i.li,{children:"a grip handle, which let you drag and drop series to reorder them (only available when the collection is manually ordered)"}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Once you are done with your changes, click the tick in the top bar. Click the cross to discard your changes."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/collections/collection-edit-elements.png",style:{maxHeight:"400px"}}),"\n",(0,n.jsx)(i.h2,{id:"deleting-a-collection",children:"Deleting a collection"}),"\n",(0,n.jsxs)(i.p,{children:["To delete a collection, look for the action menu icon ",(0,n.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.jsx)(i.em,{children:"Delete"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"This will not delete the items in the collection, nor your media files."})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}},3023:(e,i,l)=>{l.d(i,{R:()=>s,x:()=>c});var n=l(3696);const t={},o=n.createContext(t);function s(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0480b142.51d7956d.js b/assets/js/0480b142.51d7956d.js new file mode 100644 index 00000000..e16518b2 --- /dev/null +++ b/assets/js/0480b142.51d7956d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8070],{633:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=n(2540),r=n(3023);const i={},a="Frequently Asked Questions",l={id:"faq",title:"Frequently Asked Questions",description:"I forgot my password",source:"@site/docs/faq.md",sourceDirName:".",slug:"/faq",permalink:"/docs/faq",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/faq.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Community",permalink:"/docs/community"}},t={},d=[{value:"I forgot my password",id:"i-forgot-my-password",level:2},{value:"Where can I find the log files?",id:"where-can-i-find-the-log-files",level:2},{value:"How to enable DEBUG or TRACE logs?",id:"how-to-enable-debug-or-trace-logs",level:2},{value:"Via an application.yml",id:"via-an-applicationyml",level:3},{value:"Using the jar via the command line",id:"using-the-jar-via-the-command-line",level:3},{value:"Using Docker",id:"using-docker",level:3},{value:"Komga seems slow, how can I check what's going on?",id:"komga-seems-slow-how-can-i-check-whats-going-on",level:2},{value:"The memory consumption is huge",id:"the-memory-consumption-is-huge",level:2},{value:"How can I sync reading progress with tracker websites?",id:"how-can-i-sync-reading-progress-with-tracker-websites",level:2},{value:"Webreader double pages are not showing as single page",id:"webreader-double-pages-are-not-showing-as-single-page",level:2},{value:"Media type application/x-7z-compressed is not supported",id:"media-type-applicationx-7z-compressed-is-not-supported",level:2},{value:"My books/series show a different name than the files/folders",id:"my-booksseries-show-a-different-name-than-the-filesfolders",level:2},{value:"This server has already been claimed",id:"this-server-has-already-been-claimed",level:2},{value:"How can I move a library to a different folder?",id:"how-can-i-move-a-library-to-a-different-folder",level:2},{value:"Scan doesn't pick up new files under mergerfs",id:"scan-doesnt-pick-up-new-files-under-mergerfs",level:2},{value:"Docker on Raspberry PI arm32: No monotonic clock was available",id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available",level:2}];function c(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"frequently-asked-questions",children:"Frequently Asked Questions"})}),"\n",(0,o.jsx)(s.h2,{id:"i-forgot-my-password",children:"I forgot my password"}),"\n",(0,o.jsxs)(s.p,{children:["Either ask an admin to reset your password, or use the ",(0,o.jsx)(s.a,{href:"/docs/guides/cli#reset-password-for-a-user",children:"Command Line Interface"})," to reset it by yourself."]}),"\n",(0,o.jsx)(s.h2,{id:"where-can-i-find-the-log-files",children:"Where can I find the log files?"}),"\n",(0,o.jsx)(s.p,{children:"By default (if you haven't changed the configuration), log files are located:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["on the Windows app: ",(0,o.jsx)(s.code,{children:"%LOCALAPPDATA%/Komga/logs/komga.log"})]}),"\n",(0,o.jsxs)(s.li,{children:["on the macOS app: ",(0,o.jsx)(s.code,{children:"~/Library/Logs/Komga/komga.log"})]}),"\n",(0,o.jsxs)(s.li,{children:["on Windows: ",(0,o.jsx)(s.code,{children:"%USERPROFILE%/.komga/komga.log"})]}),"\n",(0,o.jsxs)(s.li,{children:["on macOS or Unix: ",(0,o.jsx)(s.code,{children:"~/.komga/komga.log"})]}),"\n",(0,o.jsxs)(s.li,{children:["on Docker: in the directory you mounted as ",(0,o.jsx)(s.code,{children:"/config"}),", in a subdirectory called ",(0,o.jsx)(s.code,{children:"logs"})]}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"how-to-enable-debug-or-trace-logs",children:"How to enable DEBUG or TRACE logs?"}),"\n",(0,o.jsxs)(s.h3,{id:"via-an-applicationyml",children:["Via an ",(0,o.jsx)(s.code,{children:"application.yml"})]}),"\n",(0,o.jsxs)(s.p,{children:["Add the following key in your ",(0,o.jsx)(s.code,{children:"application.yml"}),":"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-yaml",children:"logging.level.org.gotson.komga: DEBUG\n"})}),"\n",(0,o.jsx)(s.p,{children:"or"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-yaml",children:"logging.level.org.gotson.komga: TRACE\n"})}),"\n",(0,o.jsxs)(s.h3,{id:"using-the-jar-via-the-command-line",children:["Using the ",(0,o.jsx)(s.code,{children:"jar"})," via the command line"]}),"\n",(0,o.jsxs)(s.p,{children:["Start the ",(0,o.jsx)(s.code,{children:"jar"})," with the following option:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=DEBUG\n"})}),"\n",(0,o.jsx)(s.p,{children:"or"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=TRACE\n"})}),"\n",(0,o.jsx)(s.h3,{id:"using-docker",children:"Using Docker"}),"\n",(0,o.jsx)(s.p,{children:"Add the following environment variable:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",metastring:"script",children:"LOGGING_LEVEL_ORG_GOTSON_KOMGA=DEBUG\n"})}),"\n",(0,o.jsx)(s.p,{children:"or"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",metastring:"script",children:"LOGGING_LEVEL_ORG_GOTSON_KOMGA=TRACE\n"})}),"\n",(0,o.jsx)(s.h2,{id:"komga-seems-slow-how-can-i-check-whats-going-on",children:"Komga seems slow, how can I check what's going on?"}),"\n",(0,o.jsx)(s.p,{children:"If any activity is going on, an animated yellow bar will appear below the top-left logo. Hover your cursor over the bar to see the details of all pending tasks."}),"\n",(0,o.jsxs)("video",{controls:!0,width:"250",children:[(0,o.jsx)("source",{src:"/assets/media/faq/server-activity.webm",type:"video/webm"}),(0,o.jsx)(s.p,{children:"Sorry, your browser doesn't support embedded videos."})]}),"\n",(0,o.jsx)(s.h2,{id:"the-memory-consumption-is-huge",children:"The memory consumption is huge"}),"\n",(0,o.jsxs)(s.p,{children:["TL;DR: The operating system ",(0,o.jsx)(s.em,{children:"does not"})," report the real memory usage of the application, so don't look at those figures."]}),"\n",(0,o.jsxs)(s.p,{children:["Komga runs on the Java Virtual Machine (JVM). The JVM works differently than other native programs in regard to memory consumption.\nOn startup, the JVM will ",(0,o.jsx)(s.em,{children:"reserve"})," some memory from the OS, but that doesn't mean this memory is used by the application. If the OS needs to reclaim that memory, the JVM will try to release it."]}),"\n",(0,o.jsx)(s.p,{children:"By default, the JVM would reserve 1/4th of the physical memory (depends on the total memory and JVM version), for instance if you have 32 Gb of memory, the JVM would reserve 8 Gb."}),"\n",(0,o.jsxs)(s.p,{children:["To increase or limit the maximum memory, see ",(0,o.jsx)(s.a,{href:"/docs/installation/jar#increase-memory-limit",children:"here"})," (jar) and ",(0,o.jsx)(s.a,{href:"/docs/installation/docker#increase-memory-limit",children:"here"})," (Docker)."]}),"\n",(0,o.jsx)(s.h2,{id:"how-can-i-sync-reading-progress-with-tracker-websites",children:"How can I sync reading progress with tracker websites?"}),"\n",(0,o.jsx)(s.p,{children:"Komga does not support this outside the box."}),"\n",(0,o.jsxs)(s.p,{children:["You can try ",(0,o.jsx)(s.a,{href:"https://github.com/MALSync/MALSync",children:"MAL-Sync"})," which integrates with Komga and works with MyAnimeList, Kitsu, Anilist and others."]}),"\n",(0,o.jsx)(s.h2,{id:"webreader-double-pages-are-not-showing-as-single-page",children:"Webreader double pages are not showing as single page"}),"\n",(0,o.jsxs)(s.p,{children:["The double pages feature of the webreader requires image sizes to be available. This feature was added in v",(0,o.jsx)(s.code,{children:"0.51.0"}),". If your books have been analyzed before that version, you will need to re-analyze them in order for the double pages feature to work properly."]}),"\n",(0,o.jsx)(s.h2,{id:"media-type-applicationx-7z-compressed-is-not-supported",children:"Media type application/x-7z-compressed is not supported"}),"\n",(0,o.jsxs)(s.p,{children:["Your files are compressed using 7zip, which is not supported. Extract your archives and compress them again using the ",(0,o.jsx)(s.code,{children:"zip"})," format."]}),"\n",(0,o.jsx)(s.h2,{id:"my-booksseries-show-a-different-name-than-the-filesfolders",children:"My books/series show a different name than the files/folders"}),"\n",(0,o.jsxs)(s.p,{children:["Komga automatically import metadata from ",(0,o.jsx)(s.code,{children:"EPUB"})," files and from ",(0,o.jsx)(s.code,{children:"ComicInfo.xml"})," for ",(0,o.jsx)(s.code,{children:"cbz"}),"/",(0,o.jsx)(s.code,{children:"cbr"}),". The imported metadata will override the file/folder name."]}),"\n",(0,o.jsx)(s.h2,{id:"this-server-has-already-been-claimed",children:"This server has already been claimed"}),"\n",(0,o.jsxs)(s.p,{children:["The server cannot be claimed if a user already exists in the database. It can happen when you start Komga for the first time without the ",(0,o.jsx)(s.code,{children:"claim"})," profile as Komga will generate a default user."]}),"\n",(0,o.jsxs)(s.p,{children:["You can solve the issue by deleting the database. By default it is located in ",(0,o.jsx)(s.code,{children:"~/.komga/database.sqlite"}),". ",(0,o.jsx)(s.code,{children:"~"})," is your home directory on Unix, and your User profile on Windows."]}),"\n",(0,o.jsx)(s.h2,{id:"how-can-i-move-a-library-to-a-different-folder",children:"How can I move a library to a different folder?"}),"\n",(0,o.jsx)(s.p,{children:"You can follow those steps:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Make sure ",(0,o.jsx)(s.a,{href:"/docs/guides/libraries#compute-hash-for-files",children:"File Hashing"})," is enabled on the library."]}),"\n",(0,o.jsxs)(s.li,{children:["Disable ",(0,o.jsx)(s.a,{href:"/docs/guides/trash#automatically-empty-trash",children:"automatically emptying the trash"})," for the library."]}),"\n",(0,o.jsx)(s.li,{children:"Perform a scan on the library and let all tasks finish. This will ensure all files are hashed."}),"\n",(0,o.jsx)(s.li,{children:"Stop Komga."}),"\n",(0,o.jsx)(s.li,{children:"Move/copy the files to the new folder."}),"\n",(0,o.jsx)(s.li,{children:"Start Komga."}),"\n",(0,o.jsx)(s.li,{children:"Edit the library and choose the new folder as the library root directory."}),"\n",(0,o.jsx)(s.li,{children:"A scan will be triggered automatically after saving the library. The scan could take some time depending on the size of the library."}),"\n",(0,o.jsx)(s.li,{children:"Once the scan is finished, the series and books should have been matched with the files in the new folder."}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"scan-doesnt-pick-up-new-files-under-mergerfs",children:"Scan doesn't pick up new files under mergerfs"}),"\n",(0,o.jsxs)(s.p,{children:["Add ",(0,o.jsx)(s.code,{children:"func.getattr=newest"})," to the options in your ",(0,o.jsx)(s.code,{children:"/etc/fstab"})," entry for the mergerfs volume. By default, mergerfs doesn't update the modified times for everything for performance reasons. This forces it to. In most cases the performance impact is negligible."]}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",children:"/media/user/disk* /media/user/storage fuse.mergerfs defaults,nonempty,allow_other,use_ino,cache.files=off,moveonenospc=true,dropcacheonclose=true,minfreespace=50G,category.create=mfs,func.getattr=newest,fsname=mergerfs 0 0\n"})}),"\n",(0,o.jsx)(s.h2,{id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available",children:"Docker on Raspberry PI arm32: No monotonic clock was available"}),"\n",(0,o.jsx)(s.p,{children:"If you encounter the following message when starting the container:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-log",children:"OpenJDK Server VM warning: No monotonic clock was available - timed services may be adversely affected if the time-of-day clock changes\n"})}),"\n",(0,o.jsx)(s.p,{children:"Your host system needs to have installed:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["Docker version ",(0,o.jsx)(s.code,{children:"19.03.9"})," or newer"]}),"\n",(0,o.jsxs)(s.li,{children:["libseccomp version ",(0,o.jsx)(s.code,{children:"2.4.2"})," or newer"]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>l});var o=n(3696);const r={},i=o.createContext(r);function a(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0480b142.d4474517.js b/assets/js/0480b142.d4474517.js deleted file mode 100644 index 872c7786..00000000 --- a/assets/js/0480b142.d4474517.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8070],{633:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=n(2540),r=n(3023);const i={},a="Frequently Asked Questions",l={id:"faq",title:"Frequently Asked Questions",description:"I forgot my password",source:"@site/docs/faq.md",sourceDirName:".",slug:"/faq",permalink:"/docs/faq",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/faq.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Community",permalink:"/docs/community"}},t={},d=[{value:"I forgot my password",id:"i-forgot-my-password",level:2},{value:"Where can I find the log files?",id:"where-can-i-find-the-log-files",level:2},{value:"How to enable DEBUG or TRACE logs?",id:"how-to-enable-debug-or-trace-logs",level:2},{value:"Via an application.yml",id:"via-an-applicationyml",level:3},{value:"Using the jar via the command line",id:"using-the-jar-via-the-command-line",level:3},{value:"Using Docker",id:"using-docker",level:3},{value:"Komga seems slow, how can I check what's going on?",id:"komga-seems-slow-how-can-i-check-whats-going-on",level:2},{value:"The memory consumption is huge",id:"the-memory-consumption-is-huge",level:2},{value:"How can I sync reading progress with tracker websites?",id:"how-can-i-sync-reading-progress-with-tracker-websites",level:2},{value:"Webreader double pages are not showing as single page",id:"webreader-double-pages-are-not-showing-as-single-page",level:2},{value:"Media type application/x-7z-compressed is not supported",id:"media-type-applicationx-7z-compressed-is-not-supported",level:2},{value:"My books/series show a different name than the files/folders",id:"my-booksseries-show-a-different-name-than-the-filesfolders",level:2},{value:"This server has already been claimed",id:"this-server-has-already-been-claimed",level:2},{value:"How can I move a library to a different folder?",id:"how-can-i-move-a-library-to-a-different-folder",level:2},{value:"Scan doesn't pick up new files under mergerfs",id:"scan-doesnt-pick-up-new-files-under-mergerfs",level:2},{value:"Docker on Raspberry PI arm32: No monotonic clock was available",id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available",level:2}];function c(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"frequently-asked-questions",children:"Frequently Asked Questions"})}),"\n",(0,o.jsx)(s.h2,{id:"i-forgot-my-password",children:"I forgot my password"}),"\n",(0,o.jsxs)(s.p,{children:["Either ask an admin to reset your password, or use the ",(0,o.jsx)(s.a,{href:"/docs/guides/cli#reset-password-for-a-user",children:"Command Line Interface"})," to reset it by yourself."]}),"\n",(0,o.jsx)(s.h2,{id:"where-can-i-find-the-log-files",children:"Where can I find the log files?"}),"\n",(0,o.jsx)(s.p,{children:"By default (if you haven't changed the configuration), log files are located:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["on the Windows app: ",(0,o.jsx)(s.code,{children:"%LOCALAPPDATA%/Komga/logs/komga.log"})]}),"\n",(0,o.jsxs)(s.li,{children:["on the macOS app: ",(0,o.jsx)(s.code,{children:"~/Library/Logs/Komga/komga.log"})]}),"\n",(0,o.jsxs)(s.li,{children:["on Windows: ",(0,o.jsx)(s.code,{children:"%USERPROFILE%/.komga/komga.log"})]}),"\n",(0,o.jsxs)(s.li,{children:["on macOS or Unix: ",(0,o.jsx)(s.code,{children:"~/.komga/komga.log"})]}),"\n",(0,o.jsxs)(s.li,{children:["on Docker: in the directory you mounted as ",(0,o.jsx)(s.code,{children:"/config"}),", in a subdirectory called ",(0,o.jsx)(s.code,{children:"logs"})]}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"how-to-enable-debug-or-trace-logs",children:"How to enable DEBUG or TRACE logs?"}),"\n",(0,o.jsxs)(s.h3,{id:"via-an-applicationyml",children:["Via an ",(0,o.jsx)(s.code,{children:"application.yml"})]}),"\n",(0,o.jsxs)(s.p,{children:["Add the following key in your ",(0,o.jsx)(s.code,{children:"application.yml"}),":"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-yaml",children:"logging.level.org.gotson.komga: DEBUG\n"})}),"\n",(0,o.jsx)(s.p,{children:"or"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-yaml",children:"logging.level.org.gotson.komga: TRACE\n"})}),"\n",(0,o.jsxs)(s.h3,{id:"using-the-jar-via-the-command-line",children:["Using the ",(0,o.jsx)(s.code,{children:"jar"})," via the command line"]}),"\n",(0,o.jsxs)(s.p,{children:["Start the ",(0,o.jsx)(s.code,{children:"jar"})," with the following option:"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=DEBUG\n"})}),"\n",(0,o.jsx)(s.p,{children:"or"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=TRACE\n"})}),"\n",(0,o.jsx)(s.h3,{id:"using-docker",children:"Using Docker"}),"\n",(0,o.jsx)(s.p,{children:"Add the following environment variable:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",metastring:"script",children:"LOGGING_LEVEL_ORG_GOTSON_KOMGA=DEBUG\n"})}),"\n",(0,o.jsx)(s.p,{children:"or"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",metastring:"script",children:"LOGGING_LEVEL_ORG_GOTSON_KOMGA=TRACE\n"})}),"\n",(0,o.jsx)(s.h2,{id:"komga-seems-slow-how-can-i-check-whats-going-on",children:"Komga seems slow, how can I check what's going on?"}),"\n",(0,o.jsx)(s.p,{children:"If any activity is going on, an animated yellow bar will appear below the top-left logo. Hover your cursor over the bar to see the details of all pending tasks."}),"\n",(0,o.jsxs)("video",{controls:!0,width:"250",children:[(0,o.jsx)("source",{src:"/assets/media/faq/server-activity.webm",type:"video/webm"}),(0,o.jsx)(s.p,{children:"Sorry, your browser doesn't support embedded videos."})]}),"\n",(0,o.jsx)(s.h2,{id:"the-memory-consumption-is-huge",children:"The memory consumption is huge"}),"\n",(0,o.jsxs)(s.p,{children:["TL;DR: The operating system ",(0,o.jsx)(s.em,{children:"does not"})," report the real memory usage of the application, so don't look at those figures."]}),"\n",(0,o.jsxs)(s.p,{children:["Komga runs on the Java Virtual Machine (JVM). The JVM works differently than other native programs in regard to memory consumption.\nOn startup, the JVM will ",(0,o.jsx)(s.em,{children:"reserve"})," some memory from the OS, but that doesn't mean this memory is used by the application. If the OS needs to reclaim that memory, the JVM will try to release it."]}),"\n",(0,o.jsx)(s.p,{children:"By default, the JVM would reserve 1/4th of the physical memory (depends on the total memory and JVM version), for instance if you have 32 Gb of memory, the JVM would reserve 8 Gb."}),"\n",(0,o.jsxs)(s.p,{children:["To increase or limit the maximum memory, see ",(0,o.jsx)(s.a,{href:"/docs/installation/jar#increase-memory-limit",children:"here"})," (jar) and ",(0,o.jsx)(s.a,{href:"/docs/installation/docker#increase-memory-limit",children:"here"})," (Docker)."]}),"\n",(0,o.jsx)(s.h2,{id:"how-can-i-sync-reading-progress-with-tracker-websites",children:"How can I sync reading progress with tracker websites?"}),"\n",(0,o.jsx)(s.p,{children:"Komga does not support this outside the box."}),"\n",(0,o.jsxs)(s.p,{children:["You can try ",(0,o.jsx)(s.a,{href:"https://github.com/MALSync/MALSync",children:"MAL-Sync"})," which integrates with Komga and works with MyAnimeList, Kitsu, Anilist and others."]}),"\n",(0,o.jsx)(s.h2,{id:"webreader-double-pages-are-not-showing-as-single-page",children:"Webreader double pages are not showing as single page"}),"\n",(0,o.jsxs)(s.p,{children:["The double pages feature of the webreader requires image sizes to be available. This feature was added in v",(0,o.jsx)(s.code,{children:"0.51.0"}),". If your books have been analyzed before that version, you will need to re-analyze them in order for the double pages feature to work properly."]}),"\n",(0,o.jsx)(s.h2,{id:"media-type-applicationx-7z-compressed-is-not-supported",children:"Media type application/x-7z-compressed is not supported"}),"\n",(0,o.jsxs)(s.p,{children:["Your files are compressed using 7zip, which is not supported. Extract your archives and compress them again using the ",(0,o.jsx)(s.code,{children:"zip"})," format."]}),"\n",(0,o.jsx)(s.h2,{id:"my-booksseries-show-a-different-name-than-the-filesfolders",children:"My books/series show a different name than the files/folders"}),"\n",(0,o.jsxs)(s.p,{children:["Komga automatically import metadata from ",(0,o.jsx)(s.code,{children:"EPUB"})," files and from ",(0,o.jsx)(s.code,{children:"ComicInfo.xml"})," for ",(0,o.jsx)(s.code,{children:"cbz"}),"/",(0,o.jsx)(s.code,{children:"cbr"}),". The imported metadata will override the file/folder name."]}),"\n",(0,o.jsx)(s.h2,{id:"this-server-has-already-been-claimed",children:"This server has already been claimed"}),"\n",(0,o.jsxs)(s.p,{children:["The server cannot be claimed if a user already exists in the database. It can happen when you start Komga for the first time without the ",(0,o.jsx)(s.code,{children:"claim"})," profile as Komga will generate a default user."]}),"\n",(0,o.jsxs)(s.p,{children:["You can solve the issue by deleting the database. By default it is located in ",(0,o.jsx)(s.code,{children:"~/.komga/database.sqlite"}),". ",(0,o.jsx)(s.code,{children:"~"})," is your home directory on Unix, and your User profile on Windows."]}),"\n",(0,o.jsx)(s.h2,{id:"how-can-i-move-a-library-to-a-different-folder",children:"How can I move a library to a different folder?"}),"\n",(0,o.jsx)(s.p,{children:"You can follow those steps:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Make sure ",(0,o.jsx)(s.a,{href:"/docs/guides/libraries#compute-hash-for-files",children:"File Hashing"})," is enabled on the library."]}),"\n",(0,o.jsxs)(s.li,{children:["Disable ",(0,o.jsx)(s.a,{href:"/docs/guides/trash#automatically-empty-trash",children:"automatically emptying the trash"})," for the library."]}),"\n",(0,o.jsx)(s.li,{children:"Perform a scan on the library and let all tasks finish. This will ensure all files are hashed."}),"\n",(0,o.jsx)(s.li,{children:"Stop Komga."}),"\n",(0,o.jsx)(s.li,{children:"Move/copy the files to the new folder."}),"\n",(0,o.jsx)(s.li,{children:"Start Komga."}),"\n",(0,o.jsx)(s.li,{children:"Edit the library and choose the new folder as the library root directory."}),"\n",(0,o.jsx)(s.li,{children:"A scan will be triggered automatically after saving the library. The scan could take some time depending on the size of the library."}),"\n",(0,o.jsx)(s.li,{children:"Once the scan is finished, the series and books should have been matched with the files in the new folder."}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"scan-doesnt-pick-up-new-files-under-mergerfs",children:"Scan doesn't pick up new files under mergerfs"}),"\n",(0,o.jsxs)(s.p,{children:["Add ",(0,o.jsx)(s.code,{children:"func.getattr=newest"})," to the options in your ",(0,o.jsx)(s.code,{children:"/etc/fstab"})," entry for the mergerfs volume. By default, mergerfs doesn't update the modified times for everything for performance reasons. This forces it to. In most cases the performance impact is negligible."]}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",children:"/media/user/disk* /media/user/storage fuse.mergerfs defaults,nonempty,allow_other,use_ino,cache.files=off,moveonenospc=true,dropcacheonclose=true,minfreespace=50G,category.create=mfs,func.getattr=newest,fsname=mergerfs 0 0\n"})}),"\n",(0,o.jsx)(s.h2,{id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available",children:"Docker on Raspberry PI arm32: No monotonic clock was available"}),"\n",(0,o.jsx)(s.p,{children:"If you encounter the following message when starting the container:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-log",children:"OpenJDK Server VM warning: No monotonic clock was available - timed services may be adversely affected if the time-of-day clock changes\n"})}),"\n",(0,o.jsx)(s.p,{children:"Your host system needs to have installed:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["Docker version ",(0,o.jsx)(s.code,{children:"19.03.9"})," or newer"]}),"\n",(0,o.jsxs)(s.li,{children:["libseccomp version ",(0,o.jsx)(s.code,{children:"2.4.2"})," or newer"]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>l});var o=n(3696);const r={},i=o.createContext(r);function a(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0920ba86.8c9fee13.js b/assets/js/0920ba86.8c9fee13.js deleted file mode 100644 index 1b1e5711..00000000 --- a/assets/js/0920ba86.8c9fee13.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9225],{9325:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var t=i(2540),n=i(3023);const r={},a="User accounts",l={id:"guides/user-accounts",title:"User accounts",description:"The administrator of a Komga server has the ability to create other User Accounts for that server.",source:"@site/docs/guides/user-accounts.md",sourceDirName:"guides",slug:"/guides/user-accounts",permalink:"/docs/guides/user-accounts",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/user-accounts.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Local Artwork Assets",permalink:"/docs/guides/local-artwork-assets"},next:{title:"Server settings & management",permalink:"/docs/guides/server-settings"}},o={},d=[{value:"Creating Users",id:"creating-users",level:2},{value:"User Roles",id:"user-roles",level:2},{value:"Administrator",id:"administrator",level:3},{value:"Page Streaming",id:"page-streaming",level:3},{value:"File Download",id:"file-download",level:3},{value:"Shared Libraries",id:"shared-libraries",level:2},{value:"Content Restrictions",id:"content-restrictions",level:2},{value:"Age Rating",id:"age-rating",level:3},{value:"Labels",id:"labels",level:3},{value:"Multiple restrictions",id:"multiple-restrictions",level:3},{value:"Deleting Users",id:"deleting-users",level:2}];function c(e){const s={admonition:"admonition",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"user-accounts",children:"User accounts"})}),"\n",(0,t.jsx)(s.p,{children:"The administrator of a Komga server has the ability to create other User Accounts for that server."}),"\n",(0,t.jsxs)(s.p,{children:["You can manage Users in ",(0,t.jsx)(s.em,{children:"Server Settings > Users"}),"."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/users-management.png",style:{maxHeight:"300px"},alt:"Users management"}),"\n",(0,t.jsx)(s.h2,{id:"creating-users",children:"Creating Users"}),"\n",(0,t.jsxs)(s.p,{children:["You can add a user by clicking on the ",(0,t.jsx)(s.em,{children:"+"})," button."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/add-user.png",style:{maxHeight:"200px"},alt:"Add User"}),"\n",(0,t.jsxs)(s.p,{children:["A dialog will show up. Fill in all the required information, and press ",(0,t.jsx)(s.em,{children:"Add"}),"."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/add-user-dialog.png",style:{maxHeight:"400px"},alt:"Add User Dialog"}),"\n",(0,t.jsx)(s.h2,{id:"user-roles",children:"User Roles"}),"\n",(0,t.jsx)(s.p,{children:"Users can have different roles, giving them the ability to do certain things."}),"\n",(0,t.jsx)(s.h3,{id:"administrator",children:"Administrator"}),"\n",(0,t.jsx)(s.p,{children:"An administrator can perform all the management actions:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"add, edit, and delete libraries"}),"\n",(0,t.jsx)(s.li,{children:"add, edit, and delete users"}),"\n",(0,t.jsx)(s.li,{children:"add, edit, and delete collections"}),"\n",(0,t.jsx)(s.li,{children:"edit series and book metadata"}),"\n",(0,t.jsx)(s.li,{children:"manually scan, analyze and refresh metadata"}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"page-streaming",children:"Page Streaming"}),"\n",(0,t.jsx)(s.p,{children:"A user with this role will be able to stream individual pages, for example to read using the Webreader."}),"\n",(0,t.jsx)(s.h3,{id:"file-download",children:"File Download"}),"\n",(0,t.jsx)(s.p,{children:"A user with this role will be able to download the file of a book."}),"\n",(0,t.jsx)(s.h2,{id:"shared-libraries",children:"Shared Libraries"}),"\n",(0,t.jsxs)(s.p,{children:["An administrator can limit what libraries users can access. This is done via the ",(0,t.jsx)(s.em,{children:"Edit Restrictions"})," button."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/edit-libraries.png",style:{maxHeight:"50px"},alt:"Edit Restrictions"}),"\n",(0,t.jsxs)(s.p,{children:["Choose the libraries the user will be able to access, or select ",(0,t.jsx)(s.em,{children:"All libraries"})," for unrestricted access (default option)."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/edit-libraries-dialog.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),"\n",(0,t.jsx)(s.h2,{id:"content-restrictions",children:"Content Restrictions"}),"\n",(0,t.jsx)(s.p,{children:"Content restrictions lets you control more finely the content you share. You can select specific age rating as well as content that you\u2019ve set with a specific Label."}),"\n",(0,t.jsx)(s.p,{children:"Content restriction is performed at series level, and will also apply to books, collections and reading lists."}),"\n",(0,t.jsx)(s.h3,{id:"age-rating",children:"Age Rating"}),"\n",(0,t.jsx)(s.p,{children:"Select which age rating you wish to only allow or exclude. For instance, if you choose to only allow content under 10 as the restriction, then only content that has an age rating of 10 or under will be shared . If you choose to exclude content over 16 then those will be hidden."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/restriction-age-allow.png",style:{maxHeight:"400px"},alt:"Age Restriction Allow under"}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/restriction-age-exclude.png",style:{maxHeight:"400px"},alt:"Age Restriction Exclude over"}),"\n",(0,t.jsx)(s.h3,{id:"labels",children:"Labels"}),"\n",(0,t.jsx)(s.p,{children:"You can create arbitrary Labels when editing library content. When sharing, you can then choose to allow one or more Labels to have content matching those Labels shared. You can also exclude labels."}),"\n",(0,t.jsx)(s.p,{children:"Labels are defined on Series:"}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/series-sharing.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),"\n",(0,t.jsx)(s.h3,{id:"multiple-restrictions",children:"Multiple restrictions"}),"\n",(0,t.jsx)(s.p,{children:"When combining multiple restrictions, the following rules apply:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Exclusion rules have always priority over allow rules."}),"\n",(0,t.jsxs)(s.li,{children:["Allow rules apply with an ",(0,t.jsx)(s.em,{children:"OR"}),' condition: for example allowing a user to access content rated 10 or under, or labelled "kids", the user will be able to access content matching one or the other.']}),"\n"]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/restrictions-dialog.png",style:{maxHeight:"400px"},alt:"Edit Restrictions"}),"\n",(0,t.jsx)(s.h2,{id:"deleting-users",children:"Deleting Users"}),"\n",(0,t.jsxs)(s.admonition,{type:"danger",children:[(0,t.jsx)(s.p,{children:"Deleting a user will remove all read progress for this user."}),(0,t.jsx)(s.p,{children:"This cannot be undone."})]})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},3023:(e,s,i)=>{i.d(s,{R:()=>a,x:()=>l});var t=i(3696);const n={},r=t.createContext(n);function a(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0920ba86.9565384f.js b/assets/js/0920ba86.9565384f.js new file mode 100644 index 00000000..d05707fc --- /dev/null +++ b/assets/js/0920ba86.9565384f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9225],{9325:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var t=i(2540),n=i(3023);const r={},a="User accounts",l={id:"guides/user-accounts",title:"User accounts",description:"The administrator of a Komga server has the ability to create other User Accounts for that server.",source:"@site/docs/guides/user-accounts.md",sourceDirName:"guides",slug:"/guides/user-accounts",permalink:"/docs/guides/user-accounts",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/user-accounts.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Local Artwork Assets",permalink:"/docs/guides/local-artwork-assets"},next:{title:"Server settings & management",permalink:"/docs/guides/server-settings"}},o={},d=[{value:"Creating Users",id:"creating-users",level:2},{value:"User Roles",id:"user-roles",level:2},{value:"Administrator",id:"administrator",level:3},{value:"Page Streaming",id:"page-streaming",level:3},{value:"File Download",id:"file-download",level:3},{value:"Shared Libraries",id:"shared-libraries",level:2},{value:"Content Restrictions",id:"content-restrictions",level:2},{value:"Age Rating",id:"age-rating",level:3},{value:"Labels",id:"labels",level:3},{value:"Multiple restrictions",id:"multiple-restrictions",level:3},{value:"Deleting Users",id:"deleting-users",level:2}];function c(e){const s={admonition:"admonition",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"user-accounts",children:"User accounts"})}),"\n",(0,t.jsx)(s.p,{children:"The administrator of a Komga server has the ability to create other User Accounts for that server."}),"\n",(0,t.jsxs)(s.p,{children:["You can manage Users in ",(0,t.jsx)(s.em,{children:"Server Settings > Users"}),"."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/users-management.png",style:{maxHeight:"300px"},alt:"Users management"}),"\n",(0,t.jsx)(s.h2,{id:"creating-users",children:"Creating Users"}),"\n",(0,t.jsxs)(s.p,{children:["You can add a user by clicking on the ",(0,t.jsx)(s.em,{children:"+"})," button."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/add-user.png",style:{maxHeight:"200px"},alt:"Add User"}),"\n",(0,t.jsxs)(s.p,{children:["A dialog will show up. Fill in all the required information, and press ",(0,t.jsx)(s.em,{children:"Add"}),"."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/add-user-dialog.png",style:{maxHeight:"400px"},alt:"Add User Dialog"}),"\n",(0,t.jsx)(s.h2,{id:"user-roles",children:"User Roles"}),"\n",(0,t.jsx)(s.p,{children:"Users can have different roles, giving them the ability to do certain things."}),"\n",(0,t.jsx)(s.h3,{id:"administrator",children:"Administrator"}),"\n",(0,t.jsx)(s.p,{children:"An administrator can perform all the management actions:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"add, edit, and delete libraries"}),"\n",(0,t.jsx)(s.li,{children:"add, edit, and delete users"}),"\n",(0,t.jsx)(s.li,{children:"add, edit, and delete collections"}),"\n",(0,t.jsx)(s.li,{children:"edit series and book metadata"}),"\n",(0,t.jsx)(s.li,{children:"manually scan, analyze and refresh metadata"}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"page-streaming",children:"Page Streaming"}),"\n",(0,t.jsx)(s.p,{children:"A user with this role will be able to stream individual pages, for example to read using the Webreader."}),"\n",(0,t.jsx)(s.h3,{id:"file-download",children:"File Download"}),"\n",(0,t.jsx)(s.p,{children:"A user with this role will be able to download the file of a book."}),"\n",(0,t.jsx)(s.h2,{id:"shared-libraries",children:"Shared Libraries"}),"\n",(0,t.jsxs)(s.p,{children:["An administrator can limit what libraries users can access. This is done via the ",(0,t.jsx)(s.em,{children:"Edit Restrictions"})," button."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/edit-libraries.png",style:{maxHeight:"50px"},alt:"Edit Restrictions"}),"\n",(0,t.jsxs)(s.p,{children:["Choose the libraries the user will be able to access, or select ",(0,t.jsx)(s.em,{children:"All libraries"})," for unrestricted access (default option)."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/edit-libraries-dialog.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),"\n",(0,t.jsx)(s.h2,{id:"content-restrictions",children:"Content Restrictions"}),"\n",(0,t.jsx)(s.p,{children:"Content restrictions lets you control more finely the content you share. You can select specific age rating as well as content that you\u2019ve set with a specific Label."}),"\n",(0,t.jsx)(s.p,{children:"Content restriction is performed at series level, and will also apply to books, collections and reading lists."}),"\n",(0,t.jsx)(s.h3,{id:"age-rating",children:"Age Rating"}),"\n",(0,t.jsx)(s.p,{children:"Select which age rating you wish to only allow or exclude. For instance, if you choose to only allow content under 10 as the restriction, then only content that has an age rating of 10 or under will be shared . If you choose to exclude content over 16 then those will be hidden."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/restriction-age-allow.png",style:{maxHeight:"400px"},alt:"Age Restriction Allow under"}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/restriction-age-exclude.png",style:{maxHeight:"400px"},alt:"Age Restriction Exclude over"}),"\n",(0,t.jsx)(s.h3,{id:"labels",children:"Labels"}),"\n",(0,t.jsx)(s.p,{children:"You can create arbitrary Labels when editing library content. When sharing, you can then choose to allow one or more Labels to have content matching those Labels shared. You can also exclude labels."}),"\n",(0,t.jsx)(s.p,{children:"Labels are defined on Series:"}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/series-sharing.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),"\n",(0,t.jsx)(s.h3,{id:"multiple-restrictions",children:"Multiple restrictions"}),"\n",(0,t.jsx)(s.p,{children:"When combining multiple restrictions, the following rules apply:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Exclusion rules have always priority over allow rules."}),"\n",(0,t.jsxs)(s.li,{children:["Allow rules apply with an ",(0,t.jsx)(s.em,{children:"OR"}),' condition: for example allowing a user to access content rated 10 or under, or labelled "kids", the user will be able to access content matching one or the other.']}),"\n"]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/user-accounts/restrictions-dialog.png",style:{maxHeight:"400px"},alt:"Edit Restrictions"}),"\n",(0,t.jsx)(s.h2,{id:"deleting-users",children:"Deleting Users"}),"\n",(0,t.jsxs)(s.admonition,{type:"danger",children:[(0,t.jsx)(s.p,{children:"Deleting a user will remove all read progress for this user."}),(0,t.jsx)(s.p,{children:"This cannot be undone."})]})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},3023:(e,s,i)=>{i.d(s,{R:()=>a,x:()=>l});var t=i(3696);const n={},r=t.createContext(n);function a(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0bf9748d.997264bd.js b/assets/js/0bf9748d.997264bd.js deleted file mode 100644 index 624646a8..00000000 --- a/assets/js/0bf9748d.997264bd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2531],{2339:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});var s=n(2540),a=n(3023);const r={},l="Scanning, Analyzing and Refreshing Metadata",t={id:"guides/scan-analysis-refresh",title:"Scanning, Analyzing and Refreshing Metadata",description:"Once a library has been created, it is processed by Komga so all the files are matched to series and books, and metadata is gathered. As time goes on, you\u2019ll add and remove books to the libraries or make other changes that mean the library is no longer up-to-date. You can Scan libraries to bring them up-to-date. Scanning, Analyzing and Refreshing a library do different things.",source:"@site/docs/guides/scan-analysis-refresh.md",sourceDirName:"guides",slug:"/guides/scan-analysis-refresh",permalink:"/docs/guides/scan-analysis-refresh",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/scan-analysis-refresh.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Emptying Library Trash",permalink:"/docs/guides/trash"},next:{title:"Image Types",permalink:"/docs/guides/image-formats"}},o={},d=[{value:"Scan Library Files",id:"scan-library-files",level:2},{value:"Deep scan",id:"deep-scan",level:3},{value:"What happens during a Scan?",id:"what-happens-during-a-scan",level:2},{value:"Analyze books",id:"analyze-books",level:2},{value:"What happens during Analysis?",id:"what-happens-during-analysis",level:3},{value:"Gather media properties",id:"gather-media-properties",level:4},{value:"Generate default artwork",id:"generate-default-artwork",level:4},{value:"Analyze your content",id:"analyze-your-content",level:3},{value:"Media Analysis screen",id:"media-analysis-screen",level:3},{value:"Refresh metadata",id:"refresh-metadata",level:2},{value:"Import metadata for CBR/CBZ containing a ComicInfo.xml file",id:"import-metadata-for-cbrcbz-containing-a-comicinfoxml-file",level:3},{value:"Book metadata",id:"book-metadata",level:4},{value:"Series metadata",id:"series-metadata",level:4},{value:"Collections",id:"collections",level:4},{value:"Read lists",id:"read-lists",level:4},{value:"StoryArcNumber",id:"storyarcnumber",level:5},{value:"Import metadata from EPUB files",id:"import-metadata-from-epub-files",level:3},{value:"Book metadata",id:"book-metadata-1",level:4},{value:"Series metadata",id:"series-metadata-1",level:4},{value:"Import metadata generated by Mylar",id:"import-metadata-generated-by-mylar",level:3},{value:"Import local media assets",id:"import-local-media-assets",level:3},{value:"Local artwork",id:"local-artwork",level:4},{value:"Import ISBN within barcode",id:"import-isbn-within-barcode",level:3},{value:"ISBN barcode",id:"isbn-barcode",level:4}];function c(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"scanning-analyzing-and-refreshing-metadata",children:"Scanning, Analyzing and Refreshing Metadata"})}),"\n",(0,s.jsx)(i.p,{children:"Once a library has been created, it is processed by Komga so all the files are matched to series and books, and metadata is gathered. As time goes on, you\u2019ll add and remove books to the libraries or make other changes that mean the library is no longer up-to-date. You can Scan libraries to bring them up-to-date. Scanning, Analyzing and Refreshing a library do different things."}),"\n",(0,s.jsx)(i.h2,{id:"scan-library-files",children:"Scan Library Files"}),"\n",(0,s.jsx)(i.p,{children:"Scanning a library makes Komga check its folders and sub-folders for new or removed books. If it finds new media, it then pulls it into the library. You can think of scanning as \u201ccheck for new or changed content\u201d."}),"\n",(0,s.jsx)(i.p,{children:"All files that have changed after a scan will be Analyzed."}),"\n",(0,s.jsx)(i.p,{children:"You should Scan Library Files if you have:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Added or deleted files or folders"}),"\n",(0,s.jsx)(i.li,{children:"Renamed a file or folder"}),"\n",(0,s.jsx)(i.li,{children:"Moved files or folders from one location to another"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"By default, Komga will scan your libraries regularly."}),"\n",(0,s.jsx)(i.h3,{id:"deep-scan",children:"Deep scan"}),"\n",(0,s.jsx)(i.p,{children:"This will force the scanner to compare all scanned books with the ones stored in the database. Normally this is not required, as Komga uses the last modified time of the parent folders to decide whether to compare books, but some filesystems may behave differently."}),"\n",(0,s.jsx)(i.p,{children:"Trigger a Deep Scan if Komga is missing some books after a scan."}),"\n",(0,s.jsx)(i.h2,{id:"what-happens-during-a-scan",children:"What happens during a Scan?"}),"\n",(0,s.jsxs)(i.p,{children:["Komga will generate a library representation of your files on disk. A Komga library does ",(0,s.jsx)(i.em,{children:"not"})," represent exactly your folder structure."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Komga will create a ",(0,s.jsx)(i.em,{children:"Series"})," for each subfolder of any library, whatever the depth of this subfolder in your directory structure"]}),"\n",(0,s.jsxs)(i.li,{children:["Komga will create a ",(0,s.jsx)(i.em,{children:"Book"})," for each file found, and place it inside the ",(0,s.jsx)(i.em,{children:"Series"})," corresponding to the parent folder of the file"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"analyze-books",children:"Analyze books"}),"\n",(0,s.jsx)(i.p,{children:"Analysis is automatically performed when content is added to your Library. In rare cases, new versions of Komga may update the media analysis capabilities to correct something or add the ability to detect new things. In those cases, content may be re-analyzed when you access it after the new server version is installed."}),"\n",(0,s.jsx)(i.h3,{id:"what-happens-during-analysis",children:"What happens during Analysis?"}),"\n",(0,s.jsx)(i.p,{children:"Whenever an item is added to one of your Libraries, Komga performs some analysis on it to gather information. In addition, all files analyzed will also be refreshed for metadata."}),"\n",(0,s.jsx)(i.h4,{id:"gather-media-properties",children:"Gather media properties"}),"\n",(0,s.jsx)(i.p,{children:"The primary purpose of media analysis is to gather information about that media item. All of the media you add to a Library has properties that are useful to know, such as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Container: ZIP, RAR, EPUB, PDF, etc."}),"\n",(0,s.jsx)(i.li,{children:"Images Format: JPEG, PNG, WEBP, etc."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Why, though? What use are these media properties? Your Server, together with your apps, can use this information to help determine whether (and how) content can be played."}),"\n",(0,s.jsx)(i.p,{children:"For example: Imagine you have a CBR file with WEBP images, but you\u2019re using Internet Explorer (which can\u2019t read WEBP). Since the webreader knows what kind of content your browser can display and since your media analysis detected that the book has WEBP images, your Komga Server can convert those images to a compatible format (like JPEG) for you in order to let you read your book successfully."}),"\n",(0,s.jsx)(i.h4,{id:"generate-default-artwork",children:"Generate default artwork"}),"\n",(0,s.jsx)(i.p,{children:"During analysis, artwork will automatically be grabbed from a book file. The first page will be used for poster/thumbnail type purposes."}),"\n",(0,s.jsx)(i.h3,{id:"analyze-your-content",children:"Analyze your content"}),"\n",(0,s.jsx)(i.p,{children:"You can analyze content in multiple ways: for a book, for a series, or even for an entire Library."}),"\n",(0,s.jsxs)(i.p,{children:["Look for the action menu icon ",(0,s.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,s.jsx)(i.em,{children:"Analyze"}),"."]}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsx)(i.p,{children:"Depending on the size of your Library, analysis may take a while."})}),"\n",(0,s.jsx)(i.h3,{id:"media-analysis-screen",children:"Media Analysis screen"}),"\n",(0,s.jsxs)(i.p,{children:["You can check all the media for which the analysis did not succeed from the Media Analysis screen. You can access it from ",(0,s.jsx)(i.em,{children:"Media Management > Media Analysis"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"It will show you all books with a status of:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Error: Komga could not analyze the book. If possible, there will be a comment to describe the error."}),"\n",(0,s.jsx)(i.li,{children:"Unsupported: Komga does not support those files. The comment will give you more information."}),"\n"]}),"\n",(0,s.jsx)("a",{href:"/assets/media/guides/scan-analysis-refresh/media-analysis.png",children:(0,s.jsx)("img",{src:"/assets/media/guides/scan-analysis-refresh/media-analysis.png",style:{maxHeight:"400px"},alt:"Media Analysis"})}),"\n",(0,s.jsx)(i.h2,{id:"refresh-metadata",children:"Refresh metadata"}),"\n",(0,s.jsx)(i.p,{children:"Refreshing Metadata for a library, series, or individual book causes the metadata for the item to be refreshed, even if it already has metadata. You can think of refreshing as \u201cupdate metadata for the requested item even if it already has some\u201d."}),"\n",(0,s.jsx)(i.p,{children:"You should refresh a library or individual item if:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"You\u2019ve changed options for the library"}),"\n",(0,s.jsx)(i.li,{children:'You\u2019ve added "local media assets" (such as artwork)'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Metadata is gathered from the following sources:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["a local ",(0,s.jsx)(i.code,{children:"ComicInfo.xml"})," file located inside a CBZ or CBR"]}),"\n",(0,s.jsx)(i.li,{children:"the metadata of an EPUB file"}),"\n",(0,s.jsx)(i.li,{children:"local media assets"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The metadata refresh is dependent of the options of the Library."}),"\n",(0,s.jsx)(i.h3,{id:"import-metadata-for-cbrcbz-containing-a-comicinfoxml-file",children:"Import metadata for CBR/CBZ containing a ComicInfo.xml file"}),"\n",(0,s.jsx)(i.h4,{id:"book-metadata",children:"Book metadata"}),"\n",(0,s.jsxs)(i.p,{children:["This will import the following elements from the ",(0,s.jsx)(i.code,{children:"ComicInfo.xml"})," file in Komga:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Year"}),", ",(0,s.jsx)(i.code,{children:"Month"}),", and ",(0,s.jsx)(i.code,{children:"Day"})," to form the ",(0,s.jsx)(i.em,{children:"Release Date"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Writer"}),", ",(0,s.jsx)(i.code,{children:"Penciller"}),", ",(0,s.jsx)(i.code,{children:"Inker"}),", ",(0,s.jsx)(i.code,{children:"Colorist"}),", ",(0,s.jsx)(i.code,{children:"Letterer"}),", ",(0,s.jsx)(i.code,{children:"CoverArtist"}),", ",(0,s.jsx)(i.code,{children:"Editor"}),", and ",(0,s.jsx)(i.code,{children:"Translator"})," as ",(0,s.jsx)(i.em,{children:"Authors"})," with the according role. A value with multiple names separated by a ",(0,s.jsx)(i.code,{children:","})," will be split in different authors."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Title"}),", ",(0,s.jsx)(i.code,{children:"Summary"}),", ",(0,s.jsx)(i.code,{children:"Number"})," as their Komga equivalent"]}),"\n",(0,s.jsxs)(i.li,{children:["Valid ",(0,s.jsx)(i.code,{children:"Web"})," links as a book link"]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Tags"})," element will be split by ",(0,s.jsx)(i.code,{children:","})," and added to the book's ",(0,s.jsx)(i.em,{children:"tags"})]}),"\n",(0,s.jsxs)(i.li,{children:["If the ",(0,s.jsx)(i.code,{children:"GTIN"})," element contains a valid ISBN, as the book's ",(0,s.jsx)(i.em,{children:"ISBN"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"series-metadata",children:"Series metadata"}),"\n",(0,s.jsxs)(i.p,{children:["This will import the following elements from the ",(0,s.jsx)(i.code,{children:"ComicInfo.xml"})," of the Series' books in Komga:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Series"})," and ",(0,s.jsx)(i.code,{children:"Volume"})," elements will be used to overwrite the title of the Series, in the form ",(0,s.jsx)(i.code,{children:" ()"}),", or just ",(0,s.jsx)(i.code,{children:""})," if the ",(0,s.jsx)(i.code,{children:"Volume"})," element is not present, if the ",(0,s.jsx)(i.code,{children:"Volume"})," is ",(0,s.jsx)(i.code,{children:"1"}),", or if ",(0,s.jsx)(i.em,{children:"Append volume to series title"})," is disabled. If multiple values are present, the most frequent value from all books will be used."]}),"\n",(0,s.jsxs)(i.li,{children:["The various ",(0,s.jsx)(i.code,{children:"AgeRating"})," values will be converted to a number in Komga. The highest value from all books will be used."]}),"\n",(0,s.jsxs)(i.li,{children:["The most frequent ",(0,s.jsx)(i.code,{children:"Publisher"})," value will be used as Komga's equivalent."]}),"\n",(0,s.jsxs)(i.li,{children:["A ",(0,s.jsx)(i.code,{children:"Manga"})," element with the value ",(0,s.jsx)(i.code,{children:"YesAndRightToLeft"})," will mark the reading direction as ",(0,s.jsx)(i.em,{children:"Right to left"}),". The most frequent value from all books will be used."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Genre"})," element will be split by ",(0,s.jsx)(i.code,{children:","}),". All genres from all books will be added to the Series."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"LanguageISO"})," element will be used as the Series' language. The most frequent value from all books will be used."]}),"\n",(0,s.jsxs)(i.li,{children:["The highest value from ",(0,s.jsx)(i.code,{children:"Count"})," will be used as the total count of books."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"collections",children:"Collections"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"SeriesGroup"})," element will be split by ",(0,s.jsx)(i.code,{children:","})," and used to create collections with those names, or add the series to an existing collection if it exists."]}),"\n",(0,s.jsxs)(i.p,{children:["If the ",(0,s.jsx)(i.code,{children:"SeriesGroup"})," element is set to different values in each book of the series, then each value of the elements will create a collection."]}),"\n",(0,s.jsx)(i.h4,{id:"read-lists",children:"Read lists"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"AlternateSeries"})," or ",(0,s.jsx)(i.code,{children:"StoryArc"})," elements will be used to create a read list with that name, or add the book to an existing read list with that name."]}),"\n",(0,s.jsxs)(i.p,{children:["If the ",(0,s.jsx)(i.code,{children:"AlternateNumber"})," element is set, it will be used to position the book in the read list."]}),"\n",(0,s.jsx)(i.h5,{id:"storyarcnumber",children:"StoryArcNumber"}),"\n",(0,s.jsxs)(i.p,{children:["If the ",(0,s.jsx)(i.code,{children:"StoryArcNumber"})," element is set, it will be used in conjunction with ",(0,s.jsx)(i.code,{children:"StoryArc"})," to position the book in the read list."]}),"\n",(0,s.jsxs)(i.p,{children:["Both ",(0,s.jsx)(i.code,{children:"StoryArc"})," and ",(0,s.jsx)(i.code,{children:"StoryArcNumber"})," elements can contain multiple values, separated by ",(0,s.jsx)(i.code,{children:","}),". Komga will do its best to match each pair:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"If both elements are set, but do not contain the same number of values, the extra values will not be used"}),"\n",(0,s.jsx)(i.li,{children:"If there are invalid values, like blank strings or invalid numbers, the whole pair will be ignored"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"import-metadata-from-epub-files",children:"Import metadata from EPUB files"}),"\n",(0,s.jsx)(i.h4,{id:"book-metadata-1",children:"Book metadata"}),"\n",(0,s.jsx)(i.p,{children:"This will import the following fields from the Epub metadata in Komga:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:title"})," element as the ",(0,s.jsx)(i.em,{children:"Title"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:description"})," element as the ",(0,s.jsx)(i.em,{children:"Summary"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:date"})," element as the ",(0,s.jsx)(i.em,{children:"Release date"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:identifier"})," element as the ",(0,s.jsx)(i.em,{children:"ISBN"}),", if it is a valid ISBN"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:creator"})," element as ",(0,s.jsx)(i.em,{children:"Authors"}),". The role will be imported either from the ",(0,s.jsx)(i.code,{children:"opf:role"})," property, or from a ",(0,s.jsx)(i.code,{children:"meta"})," element containing ",(0,s.jsx)(i.code,{children:"role"})," property and a ",(0,s.jsx)(i.code,{children:"marc:relators"})," scheme. A value with multiple names separated by a ",(0,s.jsx)(i.code,{children:","})," will be split in different authors."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"series-metadata-1",children:"Series metadata"}),"\n",(0,s.jsx)(i.p,{children:"This will import the following fields from the Epub metadata in Komga:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:publisher"})," element as the ",(0,s.jsx)(i.em,{children:"Publisher"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:language"})," element as the ",(0,s.jsx)(i.em,{children:"Language"})]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"page-progression-direction"})," property of the ",(0,s.jsx)(i.code,{children:"spine"})," element as the ",(0,s.jsx)(i.em,{children:"Reading direction"})]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"belongs-to-collection"})," meta property will be used to overwrite the title of a Series. If multiple values are present, the most frequent value from all books will be used."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"import-metadata-generated-by-mylar",children:"Import metadata generated by Mylar"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.a,{href:"https://github.com/mylar3/mylar3",children:"Mylar"})," can generate a ",(0,s.jsx)(i.code,{children:"series.json"})," file inside your Series folders. This option will import the following fields into Komga:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"name"})," field will be used for the Series title. If the ",(0,s.jsx)(i.code,{children:"volume"})," field is set and is different from ",(0,s.jsx)(i.code,{children:"1"}),", then the ",(0,s.jsx)(i.code,{children:"year"})," field will be appended to the title, in the form ",(0,s.jsx)(i.code,{children:" ()"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"status"})," will be used to set the Series status."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"description_formatted"})," or ",(0,s.jsx)(i.code,{children:"description_text"})," will be used for the Series summary."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"publisher"})," will be used for the Series publisher."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"age_rating"})," will be used for the Series age rating."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"total_issues"})," will be used for the total count of books."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"import-local-media-assets",children:"Import local media assets"}),"\n",(0,s.jsx)(i.h4,{id:"local-artwork",children:"Local artwork"}),"\n",(0,s.jsxs)(i.p,{children:["This will enable import for local artwork, check the ",(0,s.jsx)(i.a,{href:"/docs/guides/local-artwork-assets",children:"Local Artwork Assets"})," section for more information."]}),"\n",(0,s.jsx)(i.h3,{id:"import-isbn-within-barcode",children:"Import ISBN within barcode"}),"\n",(0,s.jsx)(i.h4,{id:"isbn-barcode",children:"ISBN barcode"}),"\n",(0,s.jsx)(i.p,{children:"Komga will inspect the first and last 3 pages of each book for barcodes. If a barcode is present and contains an ISBN code, it will be imported."})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,i,n)=>{n.d(i,{R:()=>l,x:()=>t});var s=n(3696);const a={},r=s.createContext(a);function l(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0bf9748d.f02fa22e.js b/assets/js/0bf9748d.f02fa22e.js new file mode 100644 index 00000000..8d2b23f3 --- /dev/null +++ b/assets/js/0bf9748d.f02fa22e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2531],{2339:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});var s=n(2540),a=n(3023);const r={},l="Scanning, Analyzing and Refreshing Metadata",t={id:"guides/scan-analysis-refresh",title:"Scanning, Analyzing and Refreshing Metadata",description:"Once a library has been created, it is processed by Komga so all the files are matched to series and books, and metadata is gathered. As time goes on, you\u2019ll add and remove books to the libraries or make other changes that mean the library is no longer up-to-date. You can Scan libraries to bring them up-to-date. Scanning, Analyzing and Refreshing a library do different things.",source:"@site/docs/guides/scan-analysis-refresh.md",sourceDirName:"guides",slug:"/guides/scan-analysis-refresh",permalink:"/docs/guides/scan-analysis-refresh",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/scan-analysis-refresh.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Emptying Library Trash",permalink:"/docs/guides/trash"},next:{title:"Image Types",permalink:"/docs/guides/image-formats"}},o={},d=[{value:"Scan Library Files",id:"scan-library-files",level:2},{value:"Deep scan",id:"deep-scan",level:3},{value:"What happens during a Scan?",id:"what-happens-during-a-scan",level:2},{value:"Analyze books",id:"analyze-books",level:2},{value:"What happens during Analysis?",id:"what-happens-during-analysis",level:3},{value:"Gather media properties",id:"gather-media-properties",level:4},{value:"Generate default artwork",id:"generate-default-artwork",level:4},{value:"Analyze your content",id:"analyze-your-content",level:3},{value:"Media Analysis screen",id:"media-analysis-screen",level:3},{value:"Refresh metadata",id:"refresh-metadata",level:2},{value:"Import metadata for CBR/CBZ containing a ComicInfo.xml file",id:"import-metadata-for-cbrcbz-containing-a-comicinfoxml-file",level:3},{value:"Book metadata",id:"book-metadata",level:4},{value:"Series metadata",id:"series-metadata",level:4},{value:"Collections",id:"collections",level:4},{value:"Read lists",id:"read-lists",level:4},{value:"StoryArcNumber",id:"storyarcnumber",level:5},{value:"Import metadata from EPUB files",id:"import-metadata-from-epub-files",level:3},{value:"Book metadata",id:"book-metadata-1",level:4},{value:"Series metadata",id:"series-metadata-1",level:4},{value:"Import metadata generated by Mylar",id:"import-metadata-generated-by-mylar",level:3},{value:"Import local media assets",id:"import-local-media-assets",level:3},{value:"Local artwork",id:"local-artwork",level:4},{value:"Import ISBN within barcode",id:"import-isbn-within-barcode",level:3},{value:"ISBN barcode",id:"isbn-barcode",level:4}];function c(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"scanning-analyzing-and-refreshing-metadata",children:"Scanning, Analyzing and Refreshing Metadata"})}),"\n",(0,s.jsx)(i.p,{children:"Once a library has been created, it is processed by Komga so all the files are matched to series and books, and metadata is gathered. As time goes on, you\u2019ll add and remove books to the libraries or make other changes that mean the library is no longer up-to-date. You can Scan libraries to bring them up-to-date. Scanning, Analyzing and Refreshing a library do different things."}),"\n",(0,s.jsx)(i.h2,{id:"scan-library-files",children:"Scan Library Files"}),"\n",(0,s.jsx)(i.p,{children:"Scanning a library makes Komga check its folders and sub-folders for new or removed books. If it finds new media, it then pulls it into the library. You can think of scanning as \u201ccheck for new or changed content\u201d."}),"\n",(0,s.jsx)(i.p,{children:"All files that have changed after a scan will be Analyzed."}),"\n",(0,s.jsx)(i.p,{children:"You should Scan Library Files if you have:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Added or deleted files or folders"}),"\n",(0,s.jsx)(i.li,{children:"Renamed a file or folder"}),"\n",(0,s.jsx)(i.li,{children:"Moved files or folders from one location to another"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"By default, Komga will scan your libraries regularly."}),"\n",(0,s.jsx)(i.h3,{id:"deep-scan",children:"Deep scan"}),"\n",(0,s.jsx)(i.p,{children:"This will force the scanner to compare all scanned books with the ones stored in the database. Normally this is not required, as Komga uses the last modified time of the parent folders to decide whether to compare books, but some filesystems may behave differently."}),"\n",(0,s.jsx)(i.p,{children:"Trigger a Deep Scan if Komga is missing some books after a scan."}),"\n",(0,s.jsx)(i.h2,{id:"what-happens-during-a-scan",children:"What happens during a Scan?"}),"\n",(0,s.jsxs)(i.p,{children:["Komga will generate a library representation of your files on disk. A Komga library does ",(0,s.jsx)(i.em,{children:"not"})," represent exactly your folder structure."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Komga will create a ",(0,s.jsx)(i.em,{children:"Series"})," for each subfolder of any library, whatever the depth of this subfolder in your directory structure"]}),"\n",(0,s.jsxs)(i.li,{children:["Komga will create a ",(0,s.jsx)(i.em,{children:"Book"})," for each file found, and place it inside the ",(0,s.jsx)(i.em,{children:"Series"})," corresponding to the parent folder of the file"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"analyze-books",children:"Analyze books"}),"\n",(0,s.jsx)(i.p,{children:"Analysis is automatically performed when content is added to your Library. In rare cases, new versions of Komga may update the media analysis capabilities to correct something or add the ability to detect new things. In those cases, content may be re-analyzed when you access it after the new server version is installed."}),"\n",(0,s.jsx)(i.h3,{id:"what-happens-during-analysis",children:"What happens during Analysis?"}),"\n",(0,s.jsx)(i.p,{children:"Whenever an item is added to one of your Libraries, Komga performs some analysis on it to gather information. In addition, all files analyzed will also be refreshed for metadata."}),"\n",(0,s.jsx)(i.h4,{id:"gather-media-properties",children:"Gather media properties"}),"\n",(0,s.jsx)(i.p,{children:"The primary purpose of media analysis is to gather information about that media item. All of the media you add to a Library has properties that are useful to know, such as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Container: ZIP, RAR, EPUB, PDF, etc."}),"\n",(0,s.jsx)(i.li,{children:"Images Format: JPEG, PNG, WEBP, etc."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Why, though? What use are these media properties? Your Server, together with your apps, can use this information to help determine whether (and how) content can be played."}),"\n",(0,s.jsx)(i.p,{children:"For example: Imagine you have a CBR file with WEBP images, but you\u2019re using Internet Explorer (which can\u2019t read WEBP). Since the webreader knows what kind of content your browser can display and since your media analysis detected that the book has WEBP images, your Komga Server can convert those images to a compatible format (like JPEG) for you in order to let you read your book successfully."}),"\n",(0,s.jsx)(i.h4,{id:"generate-default-artwork",children:"Generate default artwork"}),"\n",(0,s.jsx)(i.p,{children:"During analysis, artwork will automatically be grabbed from a book file. The first page will be used for poster/thumbnail type purposes."}),"\n",(0,s.jsx)(i.h3,{id:"analyze-your-content",children:"Analyze your content"}),"\n",(0,s.jsx)(i.p,{children:"You can analyze content in multiple ways: for a book, for a series, or even for an entire Library."}),"\n",(0,s.jsxs)(i.p,{children:["Look for the action menu icon ",(0,s.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,s.jsx)(i.em,{children:"Analyze"}),"."]}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsx)(i.p,{children:"Depending on the size of your Library, analysis may take a while."})}),"\n",(0,s.jsx)(i.h3,{id:"media-analysis-screen",children:"Media Analysis screen"}),"\n",(0,s.jsxs)(i.p,{children:["You can check all the media for which the analysis did not succeed from the Media Analysis screen. You can access it from ",(0,s.jsx)(i.em,{children:"Media Management > Media Analysis"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"It will show you all books with a status of:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Error: Komga could not analyze the book. If possible, there will be a comment to describe the error."}),"\n",(0,s.jsx)(i.li,{children:"Unsupported: Komga does not support those files. The comment will give you more information."}),"\n"]}),"\n",(0,s.jsx)("a",{href:"/assets/media/guides/scan-analysis-refresh/media-analysis.png",children:(0,s.jsx)("img",{src:"/assets/media/guides/scan-analysis-refresh/media-analysis.png",style:{maxHeight:"400px"},alt:"Media Analysis"})}),"\n",(0,s.jsx)(i.h2,{id:"refresh-metadata",children:"Refresh metadata"}),"\n",(0,s.jsx)(i.p,{children:"Refreshing Metadata for a library, series, or individual book causes the metadata for the item to be refreshed, even if it already has metadata. You can think of refreshing as \u201cupdate metadata for the requested item even if it already has some\u201d."}),"\n",(0,s.jsx)(i.p,{children:"You should refresh a library or individual item if:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"You\u2019ve changed options for the library"}),"\n",(0,s.jsx)(i.li,{children:'You\u2019ve added "local media assets" (such as artwork)'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Metadata is gathered from the following sources:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["a local ",(0,s.jsx)(i.code,{children:"ComicInfo.xml"})," file located inside a CBZ or CBR"]}),"\n",(0,s.jsx)(i.li,{children:"the metadata of an EPUB file"}),"\n",(0,s.jsx)(i.li,{children:"local media assets"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The metadata refresh is dependent of the options of the Library."}),"\n",(0,s.jsx)(i.h3,{id:"import-metadata-for-cbrcbz-containing-a-comicinfoxml-file",children:"Import metadata for CBR/CBZ containing a ComicInfo.xml file"}),"\n",(0,s.jsx)(i.h4,{id:"book-metadata",children:"Book metadata"}),"\n",(0,s.jsxs)(i.p,{children:["This will import the following elements from the ",(0,s.jsx)(i.code,{children:"ComicInfo.xml"})," file in Komga:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Year"}),", ",(0,s.jsx)(i.code,{children:"Month"}),", and ",(0,s.jsx)(i.code,{children:"Day"})," to form the ",(0,s.jsx)(i.em,{children:"Release Date"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Writer"}),", ",(0,s.jsx)(i.code,{children:"Penciller"}),", ",(0,s.jsx)(i.code,{children:"Inker"}),", ",(0,s.jsx)(i.code,{children:"Colorist"}),", ",(0,s.jsx)(i.code,{children:"Letterer"}),", ",(0,s.jsx)(i.code,{children:"CoverArtist"}),", ",(0,s.jsx)(i.code,{children:"Editor"}),", and ",(0,s.jsx)(i.code,{children:"Translator"})," as ",(0,s.jsx)(i.em,{children:"Authors"})," with the according role. A value with multiple names separated by a ",(0,s.jsx)(i.code,{children:","})," will be split in different authors."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"Title"}),", ",(0,s.jsx)(i.code,{children:"Summary"}),", ",(0,s.jsx)(i.code,{children:"Number"})," as their Komga equivalent"]}),"\n",(0,s.jsxs)(i.li,{children:["Valid ",(0,s.jsx)(i.code,{children:"Web"})," links as a book link"]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Tags"})," element will be split by ",(0,s.jsx)(i.code,{children:","})," and added to the book's ",(0,s.jsx)(i.em,{children:"tags"})]}),"\n",(0,s.jsxs)(i.li,{children:["If the ",(0,s.jsx)(i.code,{children:"GTIN"})," element contains a valid ISBN, as the book's ",(0,s.jsx)(i.em,{children:"ISBN"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"series-metadata",children:"Series metadata"}),"\n",(0,s.jsxs)(i.p,{children:["This will import the following elements from the ",(0,s.jsx)(i.code,{children:"ComicInfo.xml"})," of the Series' books in Komga:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Series"})," and ",(0,s.jsx)(i.code,{children:"Volume"})," elements will be used to overwrite the title of the Series, in the form ",(0,s.jsx)(i.code,{children:" ()"}),", or just ",(0,s.jsx)(i.code,{children:""})," if the ",(0,s.jsx)(i.code,{children:"Volume"})," element is not present, if the ",(0,s.jsx)(i.code,{children:"Volume"})," is ",(0,s.jsx)(i.code,{children:"1"}),", or if ",(0,s.jsx)(i.em,{children:"Append volume to series title"})," is disabled. If multiple values are present, the most frequent value from all books will be used."]}),"\n",(0,s.jsxs)(i.li,{children:["The various ",(0,s.jsx)(i.code,{children:"AgeRating"})," values will be converted to a number in Komga. The highest value from all books will be used."]}),"\n",(0,s.jsxs)(i.li,{children:["The most frequent ",(0,s.jsx)(i.code,{children:"Publisher"})," value will be used as Komga's equivalent."]}),"\n",(0,s.jsxs)(i.li,{children:["A ",(0,s.jsx)(i.code,{children:"Manga"})," element with the value ",(0,s.jsx)(i.code,{children:"YesAndRightToLeft"})," will mark the reading direction as ",(0,s.jsx)(i.em,{children:"Right to left"}),". The most frequent value from all books will be used."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Genre"})," element will be split by ",(0,s.jsx)(i.code,{children:","}),". All genres from all books will be added to the Series."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"LanguageISO"})," element will be used as the Series' language. The most frequent value from all books will be used."]}),"\n",(0,s.jsxs)(i.li,{children:["The highest value from ",(0,s.jsx)(i.code,{children:"Count"})," will be used as the total count of books."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"collections",children:"Collections"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"SeriesGroup"})," element will be split by ",(0,s.jsx)(i.code,{children:","})," and used to create collections with those names, or add the series to an existing collection if it exists."]}),"\n",(0,s.jsxs)(i.p,{children:["If the ",(0,s.jsx)(i.code,{children:"SeriesGroup"})," element is set to different values in each book of the series, then each value of the elements will create a collection."]}),"\n",(0,s.jsx)(i.h4,{id:"read-lists",children:"Read lists"}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"AlternateSeries"})," or ",(0,s.jsx)(i.code,{children:"StoryArc"})," elements will be used to create a read list with that name, or add the book to an existing read list with that name."]}),"\n",(0,s.jsxs)(i.p,{children:["If the ",(0,s.jsx)(i.code,{children:"AlternateNumber"})," element is set, it will be used to position the book in the read list."]}),"\n",(0,s.jsx)(i.h5,{id:"storyarcnumber",children:"StoryArcNumber"}),"\n",(0,s.jsxs)(i.p,{children:["If the ",(0,s.jsx)(i.code,{children:"StoryArcNumber"})," element is set, it will be used in conjunction with ",(0,s.jsx)(i.code,{children:"StoryArc"})," to position the book in the read list."]}),"\n",(0,s.jsxs)(i.p,{children:["Both ",(0,s.jsx)(i.code,{children:"StoryArc"})," and ",(0,s.jsx)(i.code,{children:"StoryArcNumber"})," elements can contain multiple values, separated by ",(0,s.jsx)(i.code,{children:","}),". Komga will do its best to match each pair:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"If both elements are set, but do not contain the same number of values, the extra values will not be used"}),"\n",(0,s.jsx)(i.li,{children:"If there are invalid values, like blank strings or invalid numbers, the whole pair will be ignored"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"import-metadata-from-epub-files",children:"Import metadata from EPUB files"}),"\n",(0,s.jsx)(i.h4,{id:"book-metadata-1",children:"Book metadata"}),"\n",(0,s.jsx)(i.p,{children:"This will import the following fields from the Epub metadata in Komga:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:title"})," element as the ",(0,s.jsx)(i.em,{children:"Title"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:description"})," element as the ",(0,s.jsx)(i.em,{children:"Summary"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:date"})," element as the ",(0,s.jsx)(i.em,{children:"Release date"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:identifier"})," element as the ",(0,s.jsx)(i.em,{children:"ISBN"}),", if it is a valid ISBN"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:creator"})," element as ",(0,s.jsx)(i.em,{children:"Authors"}),". The role will be imported either from the ",(0,s.jsx)(i.code,{children:"opf:role"})," property, or from a ",(0,s.jsx)(i.code,{children:"meta"})," element containing ",(0,s.jsx)(i.code,{children:"role"})," property and a ",(0,s.jsx)(i.code,{children:"marc:relators"})," scheme. A value with multiple names separated by a ",(0,s.jsx)(i.code,{children:","})," will be split in different authors."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"series-metadata-1",children:"Series metadata"}),"\n",(0,s.jsx)(i.p,{children:"This will import the following fields from the Epub metadata in Komga:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:publisher"})," element as the ",(0,s.jsx)(i.em,{children:"Publisher"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dc:language"})," element as the ",(0,s.jsx)(i.em,{children:"Language"})]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"page-progression-direction"})," property of the ",(0,s.jsx)(i.code,{children:"spine"})," element as the ",(0,s.jsx)(i.em,{children:"Reading direction"})]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"belongs-to-collection"})," meta property will be used to overwrite the title of a Series. If multiple values are present, the most frequent value from all books will be used."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"import-metadata-generated-by-mylar",children:"Import metadata generated by Mylar"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.a,{href:"https://github.com/mylar3/mylar3",children:"Mylar"})," can generate a ",(0,s.jsx)(i.code,{children:"series.json"})," file inside your Series folders. This option will import the following fields into Komga:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"name"})," field will be used for the Series title. If the ",(0,s.jsx)(i.code,{children:"volume"})," field is set and is different from ",(0,s.jsx)(i.code,{children:"1"}),", then the ",(0,s.jsx)(i.code,{children:"year"})," field will be appended to the title, in the form ",(0,s.jsx)(i.code,{children:" ()"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"status"})," will be used to set the Series status."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"description_formatted"})," or ",(0,s.jsx)(i.code,{children:"description_text"})," will be used for the Series summary."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"publisher"})," will be used for the Series publisher."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"age_rating"})," will be used for the Series age rating."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"total_issues"})," will be used for the total count of books."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"import-local-media-assets",children:"Import local media assets"}),"\n",(0,s.jsx)(i.h4,{id:"local-artwork",children:"Local artwork"}),"\n",(0,s.jsxs)(i.p,{children:["This will enable import for local artwork, check the ",(0,s.jsx)(i.a,{href:"/docs/guides/local-artwork-assets",children:"Local Artwork Assets"})," section for more information."]}),"\n",(0,s.jsx)(i.h3,{id:"import-isbn-within-barcode",children:"Import ISBN within barcode"}),"\n",(0,s.jsx)(i.h4,{id:"isbn-barcode",children:"ISBN barcode"}),"\n",(0,s.jsx)(i.p,{children:"Komga will inspect the first and last 3 pages of each book for barcodes. If a barcode is present and contains an ISBN code, it will be imported."})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,i,n)=>{n.d(i,{R:()=>l,x:()=>t});var s=n(3696);const a={},r=s.createContext(a);function l(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c5c2428.49c61fa9.js b/assets/js/0c5c2428.49c61fa9.js new file mode 100644 index 00000000..e0f98b8f --- /dev/null +++ b/assets/js/0c5c2428.49c61fa9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6820],{2655:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var i=t(2540),a=t(3023);const o={},r="Run with the Jar file",s={id:"installation/jar",title:"Run with the Jar file",description:"You need Java version 17+ to run Komga. Check your version with java -version.",source:"@site/docs/installation/jar.md",sourceDirName:"installation",slug:"/installation/jar",permalink:"/docs/installation/jar",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/jar.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Run with Docker",permalink:"/docs/installation/docker"},next:{title:"Install via third-party integrations",permalink:"/docs/installation/thirdparty"}},c={},l=[{value:"Increase memory limit",id:"increase-memory-limit",level:2},{value:"Updating",id:"updating",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"run-with-the-jar-file",children:"Run with the Jar file"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["You need Java version 17+ to run Komga. Check your version with ",(0,i.jsx)(n.code,{children:"java -version"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["You can run Komga from the fat ",(0,i.jsx)(n.code,{children:"jar"})," file. You can download them in the ",(0,i.jsx)(n.a,{href:"https://github.com/gotson/komga/releases",children:"releases"})," section."]}),"\n",(0,i.jsxs)(n.p,{children:["In order to run Komga, use the following command (replace ",(0,i.jsx)(n.code,{children:"x.y.z"})," with the actual version number):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once Komga is started, you can access the ",(0,i.jsx)(n.a,{href:"/docs/guides/webui",children:"web interface"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["On Windows, use ",(0,i.jsx)(n.code,{children:"javaw"})," instead of ",(0,i.jsx)(n.code,{children:"java"})," to launch Komga ",(0,i.jsx)(n.em,{children:"without"})," a command prompt window appearing."]})}),"\n",(0,i.jsx)(n.h2,{id:"increase-memory-limit",children:"Increase memory limit"}),"\n",(0,i.jsxs)(n.p,{children:["By default the ",(0,i.jsx)(n.code,{children:"java"})," process will be limited in the maximum amount of memory (RAM) it can use, usually 1gb. If you encounter some ",(0,i.jsx)(n.code,{children:"OutOfMemoryException"})," in the logs you probably need to increase the maximum memory Komga can use."]}),"\n",(0,i.jsxs)(n.p,{children:["To do so, you can use the ",(0,i.jsx)(n.code,{children:"-Xmx"})," command line flag, where ",(0,i.jsx)(n.code,{children:""})," can be any amount like ",(0,i.jsx)(n.code,{children:"2048m"}),", ",(0,i.jsx)(n.code,{children:"4g"})," etc. For example to run Komga with a maximum of 4gb of memory:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"script",children:"java -jar -Xmx4g komga-x.y.z.jar\n"})}),"\n",(0,i.jsx)(n.h2,{id:"updating",children:"Updating"}),"\n",(0,i.jsxs)(n.p,{children:["To update just stop Komga, then start it with the latest ",(0,i.jsx)(n.code,{children:"jar"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var i=t(3696);const a={},o=i.createContext(a);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0c5c2428.8bc60d65.js b/assets/js/0c5c2428.8bc60d65.js deleted file mode 100644 index 76721845..00000000 --- a/assets/js/0c5c2428.8bc60d65.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6820],{2655:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var i=t(2540),a=t(3023);const o={},r="Run with the Jar file",s={id:"installation/jar",title:"Run with the Jar file",description:"You need Java version 17+ to run Komga. Check your version with java -version.",source:"@site/docs/installation/jar.md",sourceDirName:"installation",slug:"/installation/jar",permalink:"/docs/installation/jar",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/jar.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Run with Docker",permalink:"/docs/installation/docker"},next:{title:"Install via third-party integrations",permalink:"/docs/installation/thirdparty"}},c={},l=[{value:"Increase memory limit",id:"increase-memory-limit",level:2},{value:"Updating",id:"updating",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"run-with-the-jar-file",children:"Run with the Jar file"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["You need Java version 17+ to run Komga. Check your version with ",(0,i.jsx)(n.code,{children:"java -version"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["You can run Komga from the fat ",(0,i.jsx)(n.code,{children:"jar"})," file. You can download them in the ",(0,i.jsx)(n.a,{href:"https://github.com/gotson/komga/releases",children:"releases"})," section."]}),"\n",(0,i.jsxs)(n.p,{children:["In order to run Komga, use the following command (replace ",(0,i.jsx)(n.code,{children:"x.y.z"})," with the actual version number):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once Komga is started, you can access the ",(0,i.jsx)(n.a,{href:"/docs/guides/webui",children:"web interface"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["On Windows, use ",(0,i.jsx)(n.code,{children:"javaw"})," instead of ",(0,i.jsx)(n.code,{children:"java"})," to launch Komga ",(0,i.jsx)(n.em,{children:"without"})," a command prompt window appearing."]})}),"\n",(0,i.jsx)(n.h2,{id:"increase-memory-limit",children:"Increase memory limit"}),"\n",(0,i.jsxs)(n.p,{children:["By default the ",(0,i.jsx)(n.code,{children:"java"})," process will be limited in the maximum amount of memory (RAM) it can use, usually 1gb. If you encounter some ",(0,i.jsx)(n.code,{children:"OutOfMemoryException"})," in the logs you probably need to increase the maximum memory Komga can use."]}),"\n",(0,i.jsxs)(n.p,{children:["To do so, you can use the ",(0,i.jsx)(n.code,{children:"-Xmx"})," command line flag, where ",(0,i.jsx)(n.code,{children:""})," can be any amount like ",(0,i.jsx)(n.code,{children:"2048m"}),", ",(0,i.jsx)(n.code,{children:"4g"})," etc. For example to run Komga with a maximum of 4gb of memory:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",metastring:"script",children:"java -jar -Xmx4g komga-x.y.z.jar\n"})}),"\n",(0,i.jsx)(n.h2,{id:"updating",children:"Updating"}),"\n",(0,i.jsxs)(n.p,{children:["To update just stop Komga, then start it with the latest ",(0,i.jsx)(n.code,{children:"jar"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var i=t(3696);const a={},o=i.createContext(a);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1bb85636.08a6e4a2.js b/assets/js/1bb85636.08a6e4a2.js new file mode 100644 index 00000000..bcacbc48 --- /dev/null +++ b/assets/js/1bb85636.08a6e4a2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3054],{15:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=t(2540),i=t(3023);const s={},r="Read with Chunky Reader (iPad)",a={id:"guides/chunky",title:"Read with Chunky Reader (iPad)",description:"Chunky Reader does not work anymore with Komga 1.4.0+",source:"@site/docs/guides/chunky.md",sourceDirName:"guides",slug:"/guides/chunky",permalink:"/docs/guides/chunky",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/chunky.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Panels on iOS",permalink:"/docs/guides/panels"},next:{title:"Theme",permalink:"/docs/guides/theme"}},d={},c=[{value:"Background",id:"background",level:2},{value:"Adding your Komga server to Chunky",id:"adding-your-komga-server-to-chunky",level:2},{value:"Limitations",id:"limitations",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"read-with-chunky-reader-ipad",children:"Read with Chunky Reader (iPad)"})}),"\n",(0,o.jsx)(n.admonition,{title:"Note",type:"danger",children:(0,o.jsx)(n.p,{children:"Chunky Reader does not work anymore with Komga 1.4.0+"})}),"\n",(0,o.jsx)(n.h2,{id:"background",children:"Background"}),"\n",(0,o.jsxs)(n.p,{children:["Thanks to Komga's OPDS support, you can use the ",(0,o.jsx)(n.a,{href:"https://apps.apple.com/app/id663567628",children:"Chunky Reader"})," application for iPad to remotely download or stream your comics. Chunky Reader is at time of writing the only comic reader on iPad that supports the OPDS page streaming extension. This lets you stream individual pages without having to download the whole comic file onto your iPad."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"Please note that Chunky Reader's OPDS support requires the in app purchase which costs $3.99 or the equivalent of your local currency."})}),"\n",(0,o.jsx)(n.h2,{id:"adding-your-komga-server-to-chunky",children:"Adding your Komga server to Chunky"}),"\n",(0,o.jsxs)(n.p,{children:["First you need to make sure that you can browse to your komga server's web UI from Safari on your iPad. Open up Safari, navigate to your server's address and log in as normal. Next, open the address bar, delete ",(0,o.jsx)(n.code,{children:"/dashboard"})," part which is added automatically when you log in, and then append ",(0,o.jsx)(n.code,{children:"/opds/v1.2/catalog"})," to the end of the URL and press return."]}),"\n",(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/safari-check1.png"}),"\n",(0,o.jsx)(n.p,{children:"You should then see a screen like the below image, if you do, you're ready to proceed with configuring Chunky Reader. You may wish to copy the URL to your iPad clipboard for pasting later."}),"\n",(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/safari-check2.png"}),"\n",(0,o.jsx)(n.p,{children:"Open Chunky Reader and click the cloud icon, circled in red in the screenshot below."}),"\n",(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/cloud-symbol.png"}),"\n",(0,o.jsx)(n.p,{children:"In the pop up window, click the plus button, circled in red in the screenshot below."}),"\n",(0,o.jsx)("div",{class:"text--center",children:(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/plus-button.png",width:"300"})}),"\n",(0,o.jsx)(n.p,{children:'Now choose the green plus button next to "Calibre/Ubooquity/OPDS".'}),"\n",(0,o.jsx)("div",{class:"text--center",children:(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/opds-option.png",width:"300"})}),"\n",(0,o.jsxs)(n.p,{children:["In this dialogue box, enter your ",(0,o.jsx)(n.em,{children:"server address"})," (paste from the earlier step if you copied it to clipboard), ",(0,o.jsx)(n.em,{children:"username"}),", and ",(0,o.jsx)(n.em,{children:"password"}),". Then click ",(0,o.jsx)(n.em,{children:"Connect"}),". Your Komga server should now appear in the cloud icon menu. You can stream comics by navigating to them and tapping the name, or download them via clicking the blue download button next to a comic. You can download all the comics in a given view by tapping the ",(0,o.jsx)(n.em,{children:"All"})," button in the bottom right of the menu."]}),"\n",(0,o.jsx)("div",{class:"text--center",children:(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/list-view.png",width:"300"})}),"\n",(0,o.jsx)(n.h2,{id:"limitations",children:"Limitations"}),"\n",(0,o.jsxs)(n.p,{children:["Reading comics via Chunky Reader ",(0,o.jsx)(n.strong,{children:"does not"})," update the read progress. This means you will need to manually mark your comics as read via the web UI."]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var o=t(3696);const i={},s=o.createContext(i);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1bb85636.dc0c2eaa.js b/assets/js/1bb85636.dc0c2eaa.js deleted file mode 100644 index be73c62e..00000000 --- a/assets/js/1bb85636.dc0c2eaa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3054],{15:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=t(2540),i=t(3023);const s={},r="Read with Chunky Reader (iPad)",a={id:"guides/chunky",title:"Read with Chunky Reader (iPad)",description:"Chunky Reader does not work anymore with Komga 1.4.0+",source:"@site/docs/guides/chunky.md",sourceDirName:"guides",slug:"/guides/chunky",permalink:"/docs/guides/chunky",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/chunky.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Panels on iOS",permalink:"/docs/guides/panels"},next:{title:"Theme",permalink:"/docs/guides/theme"}},d={},c=[{value:"Background",id:"background",level:2},{value:"Adding your Komga server to Chunky",id:"adding-your-komga-server-to-chunky",level:2},{value:"Limitations",id:"limitations",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"read-with-chunky-reader-ipad",children:"Read with Chunky Reader (iPad)"})}),"\n",(0,o.jsx)(n.admonition,{title:"Note",type:"danger",children:(0,o.jsx)(n.p,{children:"Chunky Reader does not work anymore with Komga 1.4.0+"})}),"\n",(0,o.jsx)(n.h2,{id:"background",children:"Background"}),"\n",(0,o.jsxs)(n.p,{children:["Thanks to Komga's OPDS support, you can use the ",(0,o.jsx)(n.a,{href:"https://apps.apple.com/app/id663567628",children:"Chunky Reader"})," application for iPad to remotely download or stream your comics. Chunky Reader is at time of writing the only comic reader on iPad that supports the OPDS page streaming extension. This lets you stream individual pages without having to download the whole comic file onto your iPad."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"Please note that Chunky Reader's OPDS support requires the in app purchase which costs $3.99 or the equivalent of your local currency."})}),"\n",(0,o.jsx)(n.h2,{id:"adding-your-komga-server-to-chunky",children:"Adding your Komga server to Chunky"}),"\n",(0,o.jsxs)(n.p,{children:["First you need to make sure that you can browse to your komga server's web UI from Safari on your iPad. Open up Safari, navigate to your server's address and log in as normal. Next, open the address bar, delete ",(0,o.jsx)(n.code,{children:"/dashboard"})," part which is added automatically when you log in, and then append ",(0,o.jsx)(n.code,{children:"/opds/v1.2/catalog"})," to the end of the URL and press return."]}),"\n",(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/safari-check1.png"}),"\n",(0,o.jsx)(n.p,{children:"You should then see a screen like the below image, if you do, you're ready to proceed with configuring Chunky Reader. You may wish to copy the URL to your iPad clipboard for pasting later."}),"\n",(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/safari-check2.png"}),"\n",(0,o.jsx)(n.p,{children:"Open Chunky Reader and click the cloud icon, circled in red in the screenshot below."}),"\n",(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/cloud-symbol.png"}),"\n",(0,o.jsx)(n.p,{children:"In the pop up window, click the plus button, circled in red in the screenshot below."}),"\n",(0,o.jsx)("div",{class:"text--center",children:(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/plus-button.png",width:"300"})}),"\n",(0,o.jsx)(n.p,{children:'Now choose the green plus button next to "Calibre/Ubooquity/OPDS".'}),"\n",(0,o.jsx)("div",{class:"text--center",children:(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/opds-option.png",width:"300"})}),"\n",(0,o.jsxs)(n.p,{children:["In this dialogue box, enter your ",(0,o.jsx)(n.em,{children:"server address"})," (paste from the earlier step if you copied it to clipboard), ",(0,o.jsx)(n.em,{children:"username"}),", and ",(0,o.jsx)(n.em,{children:"password"}),". Then click ",(0,o.jsx)(n.em,{children:"Connect"}),". Your Komga server should now appear in the cloud icon menu. You can stream comics by navigating to them and tapping the name, or download them via clicking the blue download button next to a comic. You can download all the comics in a given view by tapping the ",(0,o.jsx)(n.em,{children:"All"})," button in the bottom right of the menu."]}),"\n",(0,o.jsx)("div",{class:"text--center",children:(0,o.jsx)("img",{src:"/assets/media/guides/chunky-setup/list-view.png",width:"300"})}),"\n",(0,o.jsx)(n.h2,{id:"limitations",children:"Limitations"}),"\n",(0,o.jsxs)(n.p,{children:["Reading comics via Chunky Reader ",(0,o.jsx)(n.strong,{children:"does not"})," update the read progress. This means you will need to manually mark your comics as read via the web UI."]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var o=t(3696);const i={},s=o.createContext(i);function r(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ec3b236.39500d0f.js b/assets/js/1ec3b236.39500d0f.js new file mode 100644 index 00000000..664bbf85 --- /dev/null +++ b/assets/js/1ec3b236.39500d0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[832],{9805:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=n(2540),o=n(3023);const i={},t="Command Line Interface",a={id:"guides/cli",title:"Command Line Interface",description:"Komga offers a few commands available from the command line.",source:"@site/docs/guides/cli.md",sourceDirName:"guides",slug:"/guides/cli",permalink:"/docs/guides/cli",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/cli.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Announcements",permalink:"/docs/guides/announcements"},next:{title:"Contribution",permalink:"/docs/contribution"}},d={},l=[{value:"How to use?",id:"how-to-use",level:2},{value:"With the jar file",id:"with-the-jar-file",level:3},{value:"With docker run",id:"with-docker-run",level:3},{value:"With docker-compose",id:"with-docker-compose",level:3},{value:"Available commands",id:"available-commands",level:2},{value:"List users",id:"list-users",level:3},{value:"Reset password for a user",id:"reset-password-for-a-user",level:3}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"command-line-interface",children:"Command Line Interface"})}),"\n",(0,r.jsx)(s.p,{children:"Komga offers a few commands available from the command line."}),"\n",(0,r.jsx)(s.h2,{id:"how-to-use",children:"How to use?"}),"\n",(0,r.jsx)(s.p,{children:"You just need to append the command to the command line. Note that Komga will still start and run as usual."}),"\n",(0,r.jsxs)(s.h3,{id:"with-the-jar-file",children:["With the ",(0,r.jsx)(s.code,{children:"jar"})," file"]}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"java -jar komga-x.y.z.jar --list-users\n"})}),"\n",(0,r.jsx)(s.h3,{id:"with-docker-run",children:"With docker run"}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"docker run ghcr.io/gotson/komga:latest --list-users\n"})}),"\n",(0,r.jsx)(s.h3,{id:"with-docker-compose",children:"With docker-compose"}),"\n",(0,r.jsxs)(s.p,{children:["You can override the ",(0,r.jsx)(s.code,{children:"command"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"services:\n komga:\n image: gotson/komga:latest\n command: --newpassword=toto --reset=admin@example.org\n"})}),"\n",(0,r.jsx)(s.h2,{id:"available-commands",children:"Available commands"}),"\n",(0,r.jsx)(s.h3,{id:"list-users",children:"List users"}),"\n",(0,r.jsxs)(s.p,{children:["Command: ",(0,r.jsx)(s.code,{children:"--list-users"})]}),"\n",(0,r.jsx)(s.p,{children:"This will output all the users configured in the database. The output will be shown in the console or the logs."}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"2023-08-02T13:41:45.215+08:00 INFO 1979 --- [ main] o.g.k.i.apprunner.ListUsersRunner : Here is a list of all users: [admin@example.org, jacky@example.org]"})}),"\n",(0,r.jsx)(s.h3,{id:"reset-password-for-a-user",children:"Reset password for a user"}),"\n",(0,r.jsxs)(s.p,{children:["Command: ",(0,r.jsx)(s.code,{children:"--reset=user@domain.com --newpassword=YourNewPassword"})]}),"\n",(0,r.jsx)(s.p,{children:"This will reset the password for the specified user."}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"2023-08-02T13:50:42.998+08:00 INFO 2806 --- [ main] o.g.k.i.apprunner.PasswordResetRunner : Reset password for user: admin@example.org"})})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>a});var r=n(3696);const o={},i=r.createContext(o);function t(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ec3b236.8b842671.js b/assets/js/1ec3b236.8b842671.js deleted file mode 100644 index f41a5c39..00000000 --- a/assets/js/1ec3b236.8b842671.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[832],{9805:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=n(2540),o=n(3023);const i={},t="Command Line Interface",a={id:"guides/cli",title:"Command Line Interface",description:"Komga offers a few commands available from the command line.",source:"@site/docs/guides/cli.md",sourceDirName:"guides",slug:"/guides/cli",permalink:"/docs/guides/cli",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/cli.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Announcements",permalink:"/docs/guides/announcements"},next:{title:"Contribution",permalink:"/docs/contribution"}},d={},l=[{value:"How to use?",id:"how-to-use",level:2},{value:"With the jar file",id:"with-the-jar-file",level:3},{value:"With docker run",id:"with-docker-run",level:3},{value:"With docker-compose",id:"with-docker-compose",level:3},{value:"Available commands",id:"available-commands",level:2},{value:"List users",id:"list-users",level:3},{value:"Reset password for a user",id:"reset-password-for-a-user",level:3}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"command-line-interface",children:"Command Line Interface"})}),"\n",(0,r.jsx)(s.p,{children:"Komga offers a few commands available from the command line."}),"\n",(0,r.jsx)(s.h2,{id:"how-to-use",children:"How to use?"}),"\n",(0,r.jsx)(s.p,{children:"You just need to append the command to the command line. Note that Komga will still start and run as usual."}),"\n",(0,r.jsxs)(s.h3,{id:"with-the-jar-file",children:["With the ",(0,r.jsx)(s.code,{children:"jar"})," file"]}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"java -jar komga-x.y.z.jar --list-users\n"})}),"\n",(0,r.jsx)(s.h3,{id:"with-docker-run",children:"With docker run"}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"docker run ghcr.io/gotson/komga:latest --list-users\n"})}),"\n",(0,r.jsx)(s.h3,{id:"with-docker-compose",children:"With docker-compose"}),"\n",(0,r.jsxs)(s.p,{children:["You can override the ",(0,r.jsx)(s.code,{children:"command"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"services:\n komga:\n image: gotson/komga:latest\n command: --newpassword=toto --reset=admin@example.org\n"})}),"\n",(0,r.jsx)(s.h2,{id:"available-commands",children:"Available commands"}),"\n",(0,r.jsx)(s.h3,{id:"list-users",children:"List users"}),"\n",(0,r.jsxs)(s.p,{children:["Command: ",(0,r.jsx)(s.code,{children:"--list-users"})]}),"\n",(0,r.jsx)(s.p,{children:"This will output all the users configured in the database. The output will be shown in the console or the logs."}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"2023-08-02T13:41:45.215+08:00 INFO 1979 --- [ main] o.g.k.i.apprunner.ListUsersRunner : Here is a list of all users: [admin@example.org, jacky@example.org]"})}),"\n",(0,r.jsx)(s.h3,{id:"reset-password-for-a-user",children:"Reset password for a user"}),"\n",(0,r.jsxs)(s.p,{children:["Command: ",(0,r.jsx)(s.code,{children:"--reset=user@domain.com --newpassword=YourNewPassword"})]}),"\n",(0,r.jsx)(s.p,{children:"This will reset the password for the specified user."}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.p,{children:(0,r.jsx)(s.code,{children:"2023-08-02T13:50:42.998+08:00 INFO 2806 --- [ main] o.g.k.i.apprunner.PasswordResetRunner : Reset password for user: admin@example.org"})})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>a});var r=n(3696);const o={},i=r.createContext(o);function t(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/206b31bb.0dcb7221.js b/assets/js/206b31bb.0dcb7221.js deleted file mode 100644 index 4a7e88c4..00000000 --- a/assets/js/206b31bb.0dcb7221.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6897],{2298:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>h});var i=s(2540),t=s(3023);const o={},r="One-Shots",l={id:"guides/oneshots",title:"One-Shots",description:"What are One-Shots?",source:"@site/docs/guides/oneshots.md",sourceDirName:"guides",slug:"/guides/oneshots",permalink:"/docs/guides/oneshots",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/oneshots.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Image Types",permalink:"/docs/guides/image-formats"},next:{title:"Edit Metadata",permalink:"/docs/guides/edit-metadata"}},d={},h=[{value:"What are One-Shots?",id:"what-are-one-shots",level:2},{value:"One-Shots handling",id:"one-shots-handling",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Processing",id:"processing",level:3},{value:"Metadata",id:"metadata",level:3},{value:"Dashboard",id:"dashboard",level:3},{value:"REST API",id:"rest-api",level:3}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"one-shots",children:"One-Shots"})}),"\n",(0,i.jsx)(n.h2,{id:"what-are-one-shots",children:"What are One-Shots?"}),"\n",(0,i.jsx)(n.p,{children:"One-Shots are series containing a single book."}),"\n",(0,i.jsx)(n.p,{children:"However not all series containing a single book are One-Shots. Here are some example of single book series that are not One-Shots:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"a series that has multiple books published, but only a single book is collected in Komga"}),"\n",(0,i.jsx)(n.li,{children:"a series that currently has only 1 book published, but will have more in the future"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Historically Komga required each series to be in its own directory on disk. This was cumbersome for One-Shots, as each book needed to be placed in a dedicated directory."}),"\n",(0,i.jsx)(n.p,{children:"With One-Shots handling, this is not necessary anymore."}),"\n",(0,i.jsx)(n.p,{children:"One-Shots are still composed of a series with a single book, but are handled slightly differently."}),"\n",(0,i.jsx)(n.h2,{id:"one-shots-handling",children:"One-Shots handling"}),"\n",(0,i.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["You can enable One-Shots handling through ",(0,i.jsx)(n.a,{href:"/docs/guides/libraries#one-shots-directory",children:"Library options"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"processing",children:"Processing"}),"\n",(0,i.jsxs)(n.p,{children:["One-Shots are detected during the scan. Any directory for which the full path contains the configured ",(0,i.jsx)(n.em,{children:"One-Shots directory"})," will generate One-Shot series instead of standard Series."]}),"\n",(0,i.jsxs)(n.p,{children:["Given the following directory structure, with ",(0,i.jsx)(n.em,{children:"One-Shots directory"})," configured to ",(0,i.jsx)(n.code,{children:"_oneshots"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"/data/books/Comics\n\u251c\u2500\u2500 Space Adventures\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_001.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_002.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_003.cbz\n\u2502\xa0\xa0 \u2514\u2500\u2500 _oneshots\n\u2502\xa0\xa0 \u2514\u2500\u2500 Pluto Adventures.cbz\n\u251c\u2500\u2500 Super Duck\n\u2502\xa0\xa0 \u251c\u2500\u2500 Super_Duck_001.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Super_Duck_002.cbz\n\u2502\xa0\xa0 \u2514\u2500\u2500 Super_Duck_003.cbz\n\u2514\u2500\u2500 _oneshots\n \u251c\u2500\u2500 A oneshot.cbz\n \u251c\u2500\u2500 Another oneshot.cbz\n \u2514\u2500\u2500 Yet another oneshot.cbz\n"})}),"\n",(0,i.jsx)(n.p,{children:"This will result in:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["2 regular series:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Space Adventures"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Super Duck"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["4 One-Shots:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Pluto Adventures"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"A oneshot"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Another oneshot"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Yet another oneshot"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"One-Shots directory"})," is checked against ",(0,i.jsx)(n.strong,{children:"any part of the directory path"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"_oneshots"})," will match on:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"/data/books/Comics/_oneshots"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"/data/books/Comics/My weirdly named _oneshots"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["To match only directories starting with the provided string, prefix ",(0,i.jsx)(n.em,{children:"One-Shots directory"})," with ",(0,i.jsx)(n.code,{children:"/"}),", like ",(0,i.jsx)(n.code,{children:"/_oneshots"})]})}),"\n",(0,i.jsx)(n.h3,{id:"metadata",children:"Metadata"}),"\n",(0,i.jsx)(n.p,{children:"While the book metadata will be processed as usual, the series metadata for One-Shots will be handled slightly differently:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["the Mylar ",(0,i.jsx)(n.code,{children:"series.json"})," is ignored"]}),"\n",(0,i.jsx)(n.li,{children:"the local artwork is ignored. The one for the book is still processed as usual."}),"\n",(0,i.jsxs)(n.li,{children:["in addition, some metadata is set:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"the series title and summary are set from the one of the book"}),"\n",(0,i.jsxs)(n.li,{children:["the series status is set to ",(0,i.jsx)(n.em,{children:"Ended"})]}),"\n",(0,i.jsx)(n.li,{children:"the series total book count is set to 1"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"dashboard",children:"Dashboard"}),"\n",(0,i.jsx)(n.p,{children:"The Dashboard has specific handling for One-Shots:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"One-Shots are displayed in a new view that shows both series and book metadata fields"}),"\n",(0,i.jsxs)(n.li,{children:["when editing One-Shots metadata, a new dialog will allow to edit both book and series level metadata fields.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"If you edit multiple items and all are One-Shots, this dialog is also used."}),"\n",(0,i.jsx)(n.li,{children:"If there is a mix of One-Shots and normal items (series or books), the regular dialog will be used instead.s"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"One-Shots can be added to both collections and readlists"}),"\n",(0,i.jsxs)(n.li,{children:["One-Shots will not show in the ",(0,i.jsx)(n.em,{children:"Recently Added Series"})," or ",(0,i.jsx)(n.em,{children:"Recently Updated Series"})," sections, but they will show in ",(0,i.jsx)(n.em,{children:"Recently Added Books"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Item card in Series views (when browsing libraries or collections):","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"will show an unread indicator in the top-right corner, instead of the number of unread books"}),"\n",(0,i.jsxs)(n.li,{children:["will display ",(0,i.jsx)(n.em,{children:"One-shot"})," at the bottom of the card instead of the number of books"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Item card in Book views (when browsing readlists or recommended) will not display the Series name nor the book number"}),"\n",(0,i.jsxs)(n.li,{children:["the Series filter panel has a ",(0,i.jsx)(n.em,{children:"One-shot"})," filter"]}),"\n",(0,i.jsx)(n.li,{children:"One-Shots will not show in the Series picker dialog when importing books"}),"\n",(0,i.jsx)(n.li,{children:"One-Shots will show only as books in the search bar and detailed search view"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"rest-api",children:"REST API"}),"\n",(0,i.jsxs)(n.p,{children:["One-Shots are still composed of a Series with a single Book, however both have a new ",(0,i.jsx)(n.code,{children:"boolean"})," attribute ",(0,i.jsx)(n.code,{children:"oneshot"})," which can be used in client applications to handle One-Shots differently."]})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},3023:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var i=s(3696);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/206b31bb.d4b32252.js b/assets/js/206b31bb.d4b32252.js new file mode 100644 index 00000000..bd7b1af1 --- /dev/null +++ b/assets/js/206b31bb.d4b32252.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6897],{2298:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>h});var i=s(2540),t=s(3023);const o={},r="One-Shots",l={id:"guides/oneshots",title:"One-Shots",description:"What are One-Shots?",source:"@site/docs/guides/oneshots.md",sourceDirName:"guides",slug:"/guides/oneshots",permalink:"/docs/guides/oneshots",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/oneshots.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Image Types",permalink:"/docs/guides/image-formats"},next:{title:"Edit Metadata",permalink:"/docs/guides/edit-metadata"}},d={},h=[{value:"What are One-Shots?",id:"what-are-one-shots",level:2},{value:"One-Shots handling",id:"one-shots-handling",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Processing",id:"processing",level:3},{value:"Metadata",id:"metadata",level:3},{value:"Dashboard",id:"dashboard",level:3},{value:"REST API",id:"rest-api",level:3}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"one-shots",children:"One-Shots"})}),"\n",(0,i.jsx)(n.h2,{id:"what-are-one-shots",children:"What are One-Shots?"}),"\n",(0,i.jsx)(n.p,{children:"One-Shots are series containing a single book."}),"\n",(0,i.jsx)(n.p,{children:"However not all series containing a single book are One-Shots. Here are some example of single book series that are not One-Shots:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"a series that has multiple books published, but only a single book is collected in Komga"}),"\n",(0,i.jsx)(n.li,{children:"a series that currently has only 1 book published, but will have more in the future"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Historically Komga required each series to be in its own directory on disk. This was cumbersome for One-Shots, as each book needed to be placed in a dedicated directory."}),"\n",(0,i.jsx)(n.p,{children:"With One-Shots handling, this is not necessary anymore."}),"\n",(0,i.jsx)(n.p,{children:"One-Shots are still composed of a series with a single book, but are handled slightly differently."}),"\n",(0,i.jsx)(n.h2,{id:"one-shots-handling",children:"One-Shots handling"}),"\n",(0,i.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["You can enable One-Shots handling through ",(0,i.jsx)(n.a,{href:"/docs/guides/libraries#one-shots-directory",children:"Library options"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"processing",children:"Processing"}),"\n",(0,i.jsxs)(n.p,{children:["One-Shots are detected during the scan. Any directory for which the full path contains the configured ",(0,i.jsx)(n.em,{children:"One-Shots directory"})," will generate One-Shot series instead of standard Series."]}),"\n",(0,i.jsxs)(n.p,{children:["Given the following directory structure, with ",(0,i.jsx)(n.em,{children:"One-Shots directory"})," configured to ",(0,i.jsx)(n.code,{children:"_oneshots"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"/data/books/Comics\n\u251c\u2500\u2500 Space Adventures\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_001.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_002.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_003.cbz\n\u2502\xa0\xa0 \u2514\u2500\u2500 _oneshots\n\u2502\xa0\xa0 \u2514\u2500\u2500 Pluto Adventures.cbz\n\u251c\u2500\u2500 Super Duck\n\u2502\xa0\xa0 \u251c\u2500\u2500 Super_Duck_001.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Super_Duck_002.cbz\n\u2502\xa0\xa0 \u2514\u2500\u2500 Super_Duck_003.cbz\n\u2514\u2500\u2500 _oneshots\n \u251c\u2500\u2500 A oneshot.cbz\n \u251c\u2500\u2500 Another oneshot.cbz\n \u2514\u2500\u2500 Yet another oneshot.cbz\n"})}),"\n",(0,i.jsx)(n.p,{children:"This will result in:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["2 regular series:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Space Adventures"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Super Duck"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["4 One-Shots:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Pluto Adventures"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"A oneshot"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Another oneshot"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.em,{children:"Yet another oneshot"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"One-Shots directory"})," is checked against ",(0,i.jsx)(n.strong,{children:"any part of the directory path"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"_oneshots"})," will match on:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"/data/books/Comics/_oneshots"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"/data/books/Comics/My weirdly named _oneshots"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["To match only directories starting with the provided string, prefix ",(0,i.jsx)(n.em,{children:"One-Shots directory"})," with ",(0,i.jsx)(n.code,{children:"/"}),", like ",(0,i.jsx)(n.code,{children:"/_oneshots"})]})}),"\n",(0,i.jsx)(n.h3,{id:"metadata",children:"Metadata"}),"\n",(0,i.jsx)(n.p,{children:"While the book metadata will be processed as usual, the series metadata for One-Shots will be handled slightly differently:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["the Mylar ",(0,i.jsx)(n.code,{children:"series.json"})," is ignored"]}),"\n",(0,i.jsx)(n.li,{children:"the local artwork is ignored. The one for the book is still processed as usual."}),"\n",(0,i.jsxs)(n.li,{children:["in addition, some metadata is set:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"the series title and summary are set from the one of the book"}),"\n",(0,i.jsxs)(n.li,{children:["the series status is set to ",(0,i.jsx)(n.em,{children:"Ended"})]}),"\n",(0,i.jsx)(n.li,{children:"the series total book count is set to 1"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"dashboard",children:"Dashboard"}),"\n",(0,i.jsx)(n.p,{children:"The Dashboard has specific handling for One-Shots:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"One-Shots are displayed in a new view that shows both series and book metadata fields"}),"\n",(0,i.jsxs)(n.li,{children:["when editing One-Shots metadata, a new dialog will allow to edit both book and series level metadata fields.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"If you edit multiple items and all are One-Shots, this dialog is also used."}),"\n",(0,i.jsx)(n.li,{children:"If there is a mix of One-Shots and normal items (series or books), the regular dialog will be used instead.s"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"One-Shots can be added to both collections and readlists"}),"\n",(0,i.jsxs)(n.li,{children:["One-Shots will not show in the ",(0,i.jsx)(n.em,{children:"Recently Added Series"})," or ",(0,i.jsx)(n.em,{children:"Recently Updated Series"})," sections, but they will show in ",(0,i.jsx)(n.em,{children:"Recently Added Books"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Item card in Series views (when browsing libraries or collections):","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"will show an unread indicator in the top-right corner, instead of the number of unread books"}),"\n",(0,i.jsxs)(n.li,{children:["will display ",(0,i.jsx)(n.em,{children:"One-shot"})," at the bottom of the card instead of the number of books"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Item card in Book views (when browsing readlists or recommended) will not display the Series name nor the book number"}),"\n",(0,i.jsxs)(n.li,{children:["the Series filter panel has a ",(0,i.jsx)(n.em,{children:"One-shot"})," filter"]}),"\n",(0,i.jsx)(n.li,{children:"One-Shots will not show in the Series picker dialog when importing books"}),"\n",(0,i.jsx)(n.li,{children:"One-Shots will show only as books in the search bar and detailed search view"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"rest-api",children:"REST API"}),"\n",(0,i.jsxs)(n.p,{children:["One-Shots are still composed of a Series with a single Book, however both have a new ",(0,i.jsx)(n.code,{children:"boolean"})," attribute ",(0,i.jsx)(n.code,{children:"oneshot"})," which can be used in client applications to handle One-Shots differently."]})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},3023:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var i=s(3696);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/24227623.e14fce65.js b/assets/js/24227623.e14fce65.js new file mode 100644 index 00000000..9f840150 --- /dev/null +++ b/assets/js/24227623.e14fce65.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7311],{4531:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>t,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var n=s(2540),a=s(3023);const i={},o="Read progress",d={id:"guides/read-progress",title:"Read progress",description:"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately.",source:"@site/docs/guides/read-progress.md",sourceDirName:"guides",slug:"/guides/read-progress",permalink:"/docs/guides/read-progress",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/read-progress.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Server settings & management",permalink:"/docs/guides/server-settings"},next:{title:"Collections",permalink:"/docs/guides/collections"}},t={},l=[{value:"Supported readers",id:"supported-readers",level:2},{value:"Webreader",id:"webreader",level:3},{value:"Mihon",id:"mihon",level:3},{value:"CDisplayEx",id:"cdisplayex",level:3},{value:"Unread and in progress indicators",id:"unread-and-in-progress-indicators",level:2},{value:"Marking progress manually",id:"marking-progress-manually",level:2}];function c(e){const r={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"read-progress",children:"Read progress"})}),"\n",(0,n.jsx)(r.p,{children:"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately."}),"\n",(0,n.jsx)(r.h2,{id:"supported-readers",children:"Supported readers"}),"\n",(0,n.jsx)(r.h3,{id:"webreader",children:"Webreader"}),"\n",(0,n.jsx)(r.p,{children:"The webreader can track the progress as you read:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"when you open a book that is in progress, the webreader will resume reading where you left it."}),"\n",(0,n.jsx)(r.li,{children:"when you finish reading a book, the webreader will mark it as read."}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"mihon",children:"Mihon"}),"\n",(0,n.jsxs)(r.p,{children:["Mihon can track progress of read books, using the Komga tracker. See ",(0,n.jsx)(r.a,{href:"/docs/guides/mihon#track-read-progress",children:"here"})," for more details."]}),"\n",(0,n.jsx)(r.h3,{id:"cdisplayex",children:"CDisplayEx"}),"\n",(0,n.jsxs)(r.p,{children:["CDisplayEx syncs read status and reading progress, See ",(0,n.jsx)(r.a,{href:"/docs/guides/cdisplayex#reading-status",children:"here"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"unread-and-in-progress-indicators",children:"Unread and in progress indicators"}),"\n",(0,n.jsx)(r.p,{children:"The book card will display read progress indicators:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"Unread books will display an orange tick in the top right corner:"}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/book-card-unread.png",style:{maxHeight:"300px"},alt:"Book card showing unread indicator"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"In progress books will display a progress bar at the bottom of the thumbnail:"}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/book-card-inprogress.png",style:{maxHeight:"300px"},alt:"Book card showing reading progress"}),"\n",(0,n.jsx)(r.p,{children:"In addition, the series card will display the number of unread books in the top right corner:"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/series-card-unread-count.png",style:{maxHeight:"300px"},alt:"Series card showing unread count of books"}),"\n",(0,n.jsx)(r.h2,{id:"marking-progress-manually",children:"Marking progress manually"}),"\n",(0,n.jsxs)(r.p,{children:["You can mark books or series as read or unread manually. Look for the action menu icon ",(0,n.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.jsx)(r.em,{children:"Mark as read"})," or ",(0,n.jsx)(r.em,{children:"Mark as unread"}),"."]})]})}function h(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3023:(e,r,s)=>{s.d(r,{R:()=>o,x:()=>d});var n=s(3696);const a={},i=n.createContext(a);function o(e){const r=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),n.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/24227623.f2dfb587.js b/assets/js/24227623.f2dfb587.js deleted file mode 100644 index dd950204..00000000 --- a/assets/js/24227623.f2dfb587.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7311],{4531:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>t,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var n=s(2540),a=s(3023);const i={},o="Read progress",d={id:"guides/read-progress",title:"Read progress",description:"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately.",source:"@site/docs/guides/read-progress.md",sourceDirName:"guides",slug:"/guides/read-progress",permalink:"/docs/guides/read-progress",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/read-progress.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Server settings & management",permalink:"/docs/guides/server-settings"},next:{title:"Collections",permalink:"/docs/guides/collections"}},t={},l=[{value:"Supported readers",id:"supported-readers",level:2},{value:"Webreader",id:"webreader",level:3},{value:"Mihon",id:"mihon",level:3},{value:"CDisplayEx",id:"cdisplayex",level:3},{value:"Unread and in progress indicators",id:"unread-and-in-progress-indicators",level:2},{value:"Marking progress manually",id:"marking-progress-manually",level:2}];function c(e){const r={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"read-progress",children:"Read progress"})}),"\n",(0,n.jsx)(r.p,{children:"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately."}),"\n",(0,n.jsx)(r.h2,{id:"supported-readers",children:"Supported readers"}),"\n",(0,n.jsx)(r.h3,{id:"webreader",children:"Webreader"}),"\n",(0,n.jsx)(r.p,{children:"The webreader can track the progress as you read:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"when you open a book that is in progress, the webreader will resume reading where you left it."}),"\n",(0,n.jsx)(r.li,{children:"when you finish reading a book, the webreader will mark it as read."}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"mihon",children:"Mihon"}),"\n",(0,n.jsxs)(r.p,{children:["Mihon can track progress of read books, using the Komga tracker. See ",(0,n.jsx)(r.a,{href:"/docs/guides/mihon#track-read-progress",children:"here"})," for more details."]}),"\n",(0,n.jsx)(r.h3,{id:"cdisplayex",children:"CDisplayEx"}),"\n",(0,n.jsxs)(r.p,{children:["CDisplayEx syncs read status and reading progress, See ",(0,n.jsx)(r.a,{href:"/docs/guides/cdisplayex#reading-status",children:"here"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"unread-and-in-progress-indicators",children:"Unread and in progress indicators"}),"\n",(0,n.jsx)(r.p,{children:"The book card will display read progress indicators:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"Unread books will display an orange tick in the top right corner:"}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/book-card-unread.png",style:{maxHeight:"300px"},alt:"Book card showing unread indicator"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"In progress books will display a progress bar at the bottom of the thumbnail:"}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/book-card-inprogress.png",style:{maxHeight:"300px"},alt:"Book card showing reading progress"}),"\n",(0,n.jsx)(r.p,{children:"In addition, the series card will display the number of unread books in the top right corner:"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/series-card-unread-count.png",style:{maxHeight:"300px"},alt:"Series card showing unread count of books"}),"\n",(0,n.jsx)(r.h2,{id:"marking-progress-manually",children:"Marking progress manually"}),"\n",(0,n.jsxs)(r.p,{children:["You can mark books or series as read or unread manually. Look for the action menu icon ",(0,n.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.jsx)(r.em,{children:"Mark as read"})," or ",(0,n.jsx)(r.em,{children:"Mark as unread"}),"."]})]})}function h(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3023:(e,r,s)=>{s.d(r,{R:()=>o,x:()=>d});var n=s(3696);const a={},i=n.createContext(a);function o(e){const r=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),n.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2b8f2de1.98daf9f6.js b/assets/js/2b8f2de1.98daf9f6.js deleted file mode 100644 index d25fad56..00000000 --- a/assets/js/2b8f2de1.98daf9f6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7769],{4537:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>a,frontMatter:()=>d,metadata:()=>l,toc:()=>c});var s=r(2540),n=r(3023);const d={},i="Read with any OPDS reader",l={id:"guides/opds",title:"Read with any OPDS reader",description:"Komga should work with any OPDS reader, whether they use OPDS v1 or v2.",source:"@site/docs/guides/opds.md",sourceDirName:"guides",slug:"/guides/opds",permalink:"/docs/guides/opds",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/opds.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with CDisplayEx",permalink:"/docs/guides/cdisplayex"},next:{title:"Read with Panels on iOS",permalink:"/docs/guides/panels"}},o={},c=[{value:"OPDS v2",id:"opds-v2",level:2},{value:"OPDS v1",id:"opds-v1",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"read-with-any-opds-reader",children:"Read with any OPDS reader"})}),"\n",(0,s.jsx)(t.p,{children:"Komga should work with any OPDS reader, whether they use OPDS v1 or v2."}),"\n",(0,s.jsx)(t.h2,{id:"opds-v2",children:"OPDS v2"}),"\n",(0,s.jsx)(t.p,{children:"You will need to configure the following URL in your OPDS reader:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"http(s)://your-server(:25600)(/baseUrl)/opds/v2/catalog\n"})}),"\n",(0,s.jsx)(t.p,{children:"Here is a list of reader applications that have been tested:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"OS"}),(0,s.jsx)(t.th,{children:"App name"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Status"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Sync read progress"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Streaming"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android / iOS"}),(0,s.jsxs)(t.td,{children:["Cantook by Aldiko (",(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.aldiko.android",children:"Android"}),", ",(0,s.jsx)(t.a,{href:"https://apps.apple.com/us/app/cantook-by-aldiko/id1476410111",children:"iOS"}),")"]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"Covers are not showing properly"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"Yes"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]})})]}),"\n",(0,s.jsx)(t.h2,{id:"opds-v1",children:"OPDS v1"}),"\n",(0,s.jsx)(t.p,{children:"You will need to configure the following URL in your OPDS reader:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"http(s)://your-server(:25600)(/baseUrl)/opds/v1.2/catalog\n"})}),"\n",(0,s.jsx)(t.p,{children:"Here is a list of reader applications that have been tested:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"OS"}),(0,s.jsx)(t.th,{children:"App name"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Status"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"OpenSearch support"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Page streaming support"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=org.geometerplus.zlibrary.ui.android",children:"FBReader: Favorite Book Reader"})}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Can't download CBR/CBZ, only PDF. PDF only supported in Premium version. Does not remember password."]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.flyersoft.moonreader",children:"Moon+ Reader"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.foobnix.pdf.reader",children:"Librera"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.obreey.reader",children:"PocketBook"})}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Doesn't show CBR/CBZ"]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"iOS"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"http://kybook-reader.com/",children:"KyBook 3"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:(0,s.jsx)(t.strong,{children:"Yes"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"iOS"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://panels.app/",children:"Panels"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,s.jsx)(t.strong,{children:"Yes"})," ",(0,s.jsx)("br",{}),"(v3.0.0+)"]}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,s.jsx)(t.strong,{children:"OPDS PSE 1.0"})," (v2.8.0+)",(0,s.jsx)("br",{}),(0,s.jsx)(t.strong,{children:"OPDS PSE 1.1"})," (v2.9.7+)"]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"iPadOS"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://apps.apple.com/us/app/chunky-comic-reader/id663567628",children:"Chunky Comic Reader"})}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Does not work anymore with Komga 1.4.0+"]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:(0,s.jsx)(t.strong,{children:"OPDS PSE 1.0"})})]})]})]}),"\n",(0,s.jsx)(t.p,{children:"The OPDS v1 feed also supports:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["OpenSearch functionality, to search by ",(0,s.jsx)(t.code,{children:"Series"})]}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://anansi-project.github.io/docs/opds-pse/intro",children:"OPDS Page Streaming Extension 1.2"})}),"\n"]})]})}function a(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3023:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>l});var s=r(3696);const n={},d=s.createContext(n);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2b8f2de1.fb3b48db.js b/assets/js/2b8f2de1.fb3b48db.js new file mode 100644 index 00000000..cd49f4ae --- /dev/null +++ b/assets/js/2b8f2de1.fb3b48db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7769],{4537:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>a,frontMatter:()=>d,metadata:()=>l,toc:()=>c});var s=r(2540),n=r(3023);const d={},i="Read with any OPDS reader",l={id:"guides/opds",title:"Read with any OPDS reader",description:"Komga should work with any OPDS reader, whether they use OPDS v1 or v2.",source:"@site/docs/guides/opds.md",sourceDirName:"guides",slug:"/guides/opds",permalink:"/docs/guides/opds",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/opds.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with CDisplayEx",permalink:"/docs/guides/cdisplayex"},next:{title:"Read with Panels on iOS",permalink:"/docs/guides/panels"}},o={},c=[{value:"OPDS v2",id:"opds-v2",level:2},{value:"OPDS v1",id:"opds-v1",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"read-with-any-opds-reader",children:"Read with any OPDS reader"})}),"\n",(0,s.jsx)(t.p,{children:"Komga should work with any OPDS reader, whether they use OPDS v1 or v2."}),"\n",(0,s.jsx)(t.h2,{id:"opds-v2",children:"OPDS v2"}),"\n",(0,s.jsx)(t.p,{children:"You will need to configure the following URL in your OPDS reader:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"http(s)://your-server(:25600)(/baseUrl)/opds/v2/catalog\n"})}),"\n",(0,s.jsx)(t.p,{children:"Here is a list of reader applications that have been tested:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"OS"}),(0,s.jsx)(t.th,{children:"App name"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Status"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Sync read progress"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Streaming"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android / iOS"}),(0,s.jsxs)(t.td,{children:["Cantook by Aldiko (",(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.aldiko.android",children:"Android"}),", ",(0,s.jsx)(t.a,{href:"https://apps.apple.com/us/app/cantook-by-aldiko/id1476410111",children:"iOS"}),")"]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"Covers are not showing properly"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"Yes"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]})})]}),"\n",(0,s.jsx)(t.h2,{id:"opds-v1",children:"OPDS v1"}),"\n",(0,s.jsx)(t.p,{children:"You will need to configure the following URL in your OPDS reader:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"http(s)://your-server(:25600)(/baseUrl)/opds/v1.2/catalog\n"})}),"\n",(0,s.jsx)(t.p,{children:"Here is a list of reader applications that have been tested:"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"OS"}),(0,s.jsx)(t.th,{children:"App name"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Status"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"OpenSearch support"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Page streaming support"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=org.geometerplus.zlibrary.ui.android",children:"FBReader: Favorite Book Reader"})}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Can't download CBR/CBZ, only PDF. PDF only supported in Premium version. Does not remember password."]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.flyersoft.moonreader",children:"Moon+ Reader"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.foobnix.pdf.reader",children:"Librera"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Android"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.obreey.reader",children:"PocketBook"})}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Doesn't show CBR/CBZ"]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"iOS"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"http://kybook-reader.com/",children:"KyBook 3"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:(0,s.jsx)(t.strong,{children:"Yes"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"iOS"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://panels.app/",children:"Panels"})}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,s.jsx)(t.strong,{children:"Yes"})," ",(0,s.jsx)("br",{}),"(v3.0.0+)"]}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,s.jsx)(t.strong,{children:"OPDS PSE 1.0"})," (v2.8.0+)",(0,s.jsx)("br",{}),(0,s.jsx)(t.strong,{children:"OPDS PSE 1.1"})," (v2.9.7+)"]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"iPadOS"}),(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://apps.apple.com/us/app/chunky-comic-reader/id663567628",children:"Chunky Comic Reader"})}),(0,s.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Does not work anymore with Komga 1.4.0+"]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:(0,s.jsx)(t.strong,{children:"OPDS PSE 1.0"})})]})]})]}),"\n",(0,s.jsx)(t.p,{children:"The OPDS v1 feed also supports:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["OpenSearch functionality, to search by ",(0,s.jsx)(t.code,{children:"Series"})]}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://anansi-project.github.io/docs/opds-pse/intro",children:"OPDS Page Streaming Extension 1.2"})}),"\n"]})]})}function a(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3023:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>l});var s=r(3696);const n={},d=s.createContext(n);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33e67961.0b797d9a.js b/assets/js/33e67961.0b797d9a.js new file mode 100644 index 00000000..95797cff --- /dev/null +++ b/assets/js/33e67961.0b797d9a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2579],{5214:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var i=n(2540),r=n(3023);const s={},t="Read with Kobo",a={id:"guides/kobo",title:"Read with Kobo",description:"The Kobo integration is based on the native Kobo Sync capability, where your Kobo eReader will sync to a Komga server instead of the official Kobo servers.",source:"@site/docs/guides/kobo.md",sourceDirName:"guides",slug:"/guides/kobo",permalink:"/docs/guides/kobo",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/kobo.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Mihon",permalink:"/docs/guides/mihon"},next:{title:"Read with Paperback",permalink:"/docs/guides/paperback"}},l={},d=[{value:"Features supported and limitations",id:"features-supported-and-limitations",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Generate API key",id:"generate-api-key",level:3},{value:"Setup Kobo",id:"setup-kobo",level:3},{value:"Force external port",id:"force-external-port",level:3},{value:"Migrating from Calibre-Web",id:"migrating-from-calibre-web",level:2},{value:"Privacy and Security",id:"privacy-and-security",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Force Kobo Sync",id:"force-kobo-sync",level:3},{value:"Access Kobo eReader logs",id:"access-kobo-ereader-logs",level:3},{value:"Komga logs",id:"komga-logs",level:3}];function c(e){const o={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"read-with-kobo",children:"Read with Kobo"})}),"\n",(0,i.jsx)(o.p,{children:"The Kobo integration is based on the native Kobo Sync capability, where your Kobo eReader will sync to a Komga server instead of the official Kobo servers."}),"\n",(0,i.jsx)(o.h2,{id:"features-supported-and-limitations",children:"Features supported and limitations"}),"\n",(0,i.jsx)(o.p,{children:"This is what is currently supported:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Only ",(0,i.jsx)(o.strong,{children:"EPUB"})," books from all libraries, along with their metadata and cover image, will be synced."]}),"\n",(0,i.jsx)(o.li,{children:"When books metadata is edited in Komga, they will be updated on the Kobo eReader."}),"\n",(0,i.jsx)(o.li,{children:"When books are deleted in Komga, they will be deleted on the Kobo eReader."}),"\n",(0,i.jsx)(o.li,{children:"Read progress is synced both ways (see also limitations below)"}),"\n",(0,i.jsxs)(o.li,{children:["If Kobo proxying is enabled in ",(0,i.jsx)(o.em,{children:"Server Settings"}),", Komga will relay requests to the official Kobo servers, and return both the Komga content and Kobo content to the Kobo eReader. This can be useful if you have official Kobo purchases."]}),"\n"]}),"\n",(0,i.jsx)(o.p,{children:"Limitations:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Read progress","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"For regular EPUB books, Kobo can only keep track of read progress at the beginning of a chapter, not within a chapter. Mid-chapter read progress will be lost when switching from Kobo to Komga or Komga to Kobo."}),"\n",(0,i.jsx)(o.li,{children:"For Kobo EPUB (KEPUB) books, Kobo uses its own mechanism to track progress. Komga does its best to map the Kobo specific read progress to Komga, but it may be off by a few pages.\nWhen syncing from Komga to Kobo, the Kobo will start at the beginning of the chapter."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(o.p,{children:["In order to use Kobo Sync with Komga, a Komga user must have the roles ",(0,i.jsx)(o.code,{children:"KOBO_SYNC"})," and ",(0,i.jsx)(o.code,{children:"FILE_DOWNLOAD"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["Proxying of unknown requests to the official Kobo servers can be enabled in ",(0,i.jsx)(o.em,{children:"Server Settings"}),". This is enabled globally for all users on the server."]}),"\n",(0,i.jsx)(o.h3,{id:"generate-api-key",children:"Generate API key"}),"\n",(0,i.jsxs)(o.p,{children:["The Kobo Sync Komga API uses a dedicated set of endpoints which require an API key to be accessed. Users can generate API keys from the ",(0,i.jsx)(o.em,{children:"Account Settings"})," page. Make sure to write down the generated key, as it won't be shown afterwards."]}),"\n",(0,i.jsx)(o.p,{children:"If you have multiple Kobo devices, it is recommended to use a different API key for each."}),"\n",(0,i.jsx)(o.h3,{id:"setup-kobo",children:"Setup Kobo"}),"\n",(0,i.jsxs)(o.p,{children:["Connect your Kobo eReader to your computer and open the ",(0,i.jsx)(o.code,{children:".kobo/Kobo/Kobo eReader.conf"})," file (you may need to display hidden files on Mac/Linux)."]}),"\n",(0,i.jsx)(o.p,{children:"The file should contain the following line (among others):"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"api_endpoint=https://storeapi.kobo.com\n"})}),"\n",(0,i.jsxs)(o.p,{children:["If the line does not exist, it must be created under the ",(0,i.jsx)(o.code,{children:"[OneStoreServices]"})," group."]}),"\n",(0,i.jsx)(o.p,{children:"You will need to replace this line with your external server address, in the following form:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"api_endpoint=https:///kobo/\n"})}),"\n",(0,i.jsx)(o.h3,{id:"force-external-port",children:"Force external port"}),"\n",(0,i.jsxs)(o.p,{children:["The Kobo eReader does not send valid HTTP ",(0,i.jsx)(o.code,{children:"Host"})," header, which could break the covers and file download in certain circumstances. Komga will try its best to automatically fix the incorrect Kobo headers, but in some specific cases it's not possible."]}),"\n",(0,i.jsxs)(o.p,{children:["If you experience some issues downloading covers or files from the Kobo, you will need to configure the ",(0,i.jsx)(o.em,{children:"Kobo Sync external port"})," (in ",(0,i.jsx)(o.em,{children:"Server Settings"}),") to the port that your Kobo is accessing. Normally it should be what you have configured in ",(0,i.jsx)(o.code,{children:"api_endpoint"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"A case where this would be required is if you access your Komga server directly (without a reverse proxy), with Komga running in Docker, and with a Docker mapped port that is different from the internal Komga port."}),"\n",(0,i.jsx)(o.h2,{id:"migrating-from-calibre-web",children:"Migrating from Calibre-Web"}),"\n",(0,i.jsxs)(o.p,{children:["If you have used Calibre-Web with Kobo Sync before, you can migrate to Komga by changing the ",(0,i.jsx)(o.code,{children:"Kobo eReader.conf"})," and point to your Komga server instead."]}),"\n",(0,i.jsx)(o.p,{children:"Books added by Calibre-Web should remain on your Kobo device."}),"\n",(0,i.jsx)(o.p,{children:"If you have Kobo proxying enabled, Komga is able to extract your Kobo authentication tokens from the Calibre-Web token (stored on the Kobo) transparently."}),"\n",(0,i.jsx)(o.h2,{id:"privacy-and-security",children:"Privacy and Security"}),"\n",(0,i.jsx)(o.p,{children:"The Kobo eReader sends out sensitive information during the Sync protocol. It is highly recommended to only use Kobo Sync over HTTPS."}),"\n",(0,i.jsx)(o.p,{children:"The API key is as sensitive as your username and password. Since the API key is part of the URL for Kobo Sync, you should not share this URL with anyone."}),"\n",(0,i.jsx)(o.p,{children:"Be careful when sharing Komga logs or Kobo logs, and redact any sensitive information."}),"\n",(0,i.jsx)(o.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsx)(o.h3,{id:"force-kobo-sync",children:"Force Kobo Sync"}),"\n",(0,i.jsxs)(o.p,{children:["If the Kobo eReader becomes out of sync with Komga somehow, you can force a full sync from the ",(0,i.jsx)(o.em,{children:"Account Settings"})," page. Locate the API key, and click the ",(0,i.jsx)(o.em,{children:"Force Kobo sync"})," icon."]}),"\n",(0,i.jsx)(o.h3,{id:"access-kobo-ereader-logs",children:"Access Kobo eReader logs"}),"\n",(0,i.jsx)(o.p,{children:"Logs on the Kobo device are encrypted and cannot be read when connecting the device to a computer."}),"\n",(0,i.jsx)(o.p,{children:"In order to get readable logs, you will need to enable Developer options:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["in the search bar, type ",(0,i.jsx)(o.code,{children:"devmodeon"})," and search"]}),"\n",(0,i.jsxs)(o.li,{children:["it will not show any search results, but you will be able to access Developer options under ",(0,i.jsx)(o.em,{children:"Settings > Device Information > Developer options"})]}),"\n",(0,i.jsxs)(o.li,{children:["In the ",(0,i.jsx)(o.em,{children:"Logging Category"})," section, enable the following: ",(0,i.jsx)(o.code,{children:"sync"}),", ",(0,i.jsx)(o.code,{children:"packetdump"})]}),"\n",(0,i.jsx)(o.li,{children:"Restart the Kobo eReader"}),"\n"]}),"\n",(0,i.jsx)(o.p,{children:"Once that's set, you will be able to stream the Kobo's logs using netcat. Use the following command on a computer that is on the same network as the Kobo:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-shell",children:"nc -v ${kobo IP address} 5001\n"})}),"\n",(0,i.jsx)(o.h3,{id:"komga-logs",children:"Komga logs"}),"\n",(0,i.jsxs)(o.p,{children:["Komga can log all incoming HTTP requests, including headers and body, by setting ",(0,i.jsx)(o.code,{children:"logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter"})," to ",(0,i.jsx)(o.code,{children:"DEBUG"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["To log outgoing HTTP requests to the official Kobo Store, set ",(0,i.jsx)(o.code,{children:"logging.level.org.gotson.komga.infrastructure.kobo"})," to ",(0,i.jsx)(o.code,{children:"DEBUG"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["You can also access the recent HTTP exchanges under the ",(0,i.jsx)(o.code,{children:"/actuator/httpexchanges"})," endpoint on your Komga server."]})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},3023:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>a});var i=n(3696);const r={},s=i.createContext(r);function t(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/33e67961.9424bad8.js b/assets/js/33e67961.9424bad8.js deleted file mode 100644 index 1573bd9a..00000000 --- a/assets/js/33e67961.9424bad8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2579],{5214:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var i=n(2540),r=n(3023);const s={},t="Read with Kobo",a={id:"guides/kobo",title:"Read with Kobo",description:"The Kobo integration is based on the native Kobo Sync capability, where your Kobo eReader will sync to a Komga server instead of the official Kobo servers.",source:"@site/docs/guides/kobo.md",sourceDirName:"guides",slug:"/guides/kobo",permalink:"/docs/guides/kobo",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/kobo.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Mihon",permalink:"/docs/guides/mihon"},next:{title:"Read with Paperback",permalink:"/docs/guides/paperback"}},l={},d=[{value:"Features supported and limitations",id:"features-supported-and-limitations",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Generate API key",id:"generate-api-key",level:3},{value:"Setup Kobo",id:"setup-kobo",level:3},{value:"Force external port",id:"force-external-port",level:3},{value:"Migrating from Calibre-Web",id:"migrating-from-calibre-web",level:2},{value:"Privacy and Security",id:"privacy-and-security",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Force Kobo Sync",id:"force-kobo-sync",level:3},{value:"Access Kobo eReader logs",id:"access-kobo-ereader-logs",level:3},{value:"Komga logs",id:"komga-logs",level:3}];function c(e){const o={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"read-with-kobo",children:"Read with Kobo"})}),"\n",(0,i.jsx)(o.p,{children:"The Kobo integration is based on the native Kobo Sync capability, where your Kobo eReader will sync to a Komga server instead of the official Kobo servers."}),"\n",(0,i.jsx)(o.h2,{id:"features-supported-and-limitations",children:"Features supported and limitations"}),"\n",(0,i.jsx)(o.p,{children:"This is what is currently supported:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Only ",(0,i.jsx)(o.strong,{children:"EPUB"})," books from all libraries, along with their metadata and cover image, will be synced."]}),"\n",(0,i.jsx)(o.li,{children:"When books metadata is edited in Komga, they will be updated on the Kobo eReader."}),"\n",(0,i.jsx)(o.li,{children:"When books are deleted in Komga, they will be deleted on the Kobo eReader."}),"\n",(0,i.jsx)(o.li,{children:"Read progress is synced both ways (see also limitations below)"}),"\n",(0,i.jsxs)(o.li,{children:["If Kobo proxying is enabled in ",(0,i.jsx)(o.em,{children:"Server Settings"}),", Komga will relay requests to the official Kobo servers, and return both the Komga content and Kobo content to the Kobo eReader. This can be useful if you have official Kobo purchases."]}),"\n"]}),"\n",(0,i.jsx)(o.p,{children:"Limitations:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Read progress","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"For regular EPUB books, Kobo can only keep track of read progress at the beginning of a chapter, not within a chapter. Mid-chapter read progress will be lost when switching from Kobo to Komga or Komga to Kobo."}),"\n",(0,i.jsx)(o.li,{children:"For Kobo EPUB (KEPUB) books, Kobo uses its own mechanism to track progress. Komga does its best to map the Kobo specific read progress to Komga, but it may be off by a few pages.\nWhen syncing from Komga to Kobo, the Kobo will start at the beginning of the chapter."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsxs)(o.p,{children:["In order to use Kobo Sync with Komga, a Komga user must have the roles ",(0,i.jsx)(o.code,{children:"KOBO_SYNC"})," and ",(0,i.jsx)(o.code,{children:"FILE_DOWNLOAD"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["Proxying of unknown requests to the official Kobo servers can be enabled in ",(0,i.jsx)(o.em,{children:"Server Settings"}),". This is enabled globally for all users on the server."]}),"\n",(0,i.jsx)(o.h3,{id:"generate-api-key",children:"Generate API key"}),"\n",(0,i.jsxs)(o.p,{children:["The Kobo Sync Komga API uses a dedicated set of endpoints which require an API key to be accessed. Users can generate API keys from the ",(0,i.jsx)(o.em,{children:"Account Settings"})," page. Make sure to write down the generated key, as it won't be shown afterwards."]}),"\n",(0,i.jsx)(o.p,{children:"If you have multiple Kobo devices, it is recommended to use a different API key for each."}),"\n",(0,i.jsx)(o.h3,{id:"setup-kobo",children:"Setup Kobo"}),"\n",(0,i.jsxs)(o.p,{children:["Connect your Kobo eReader to your computer and open the ",(0,i.jsx)(o.code,{children:".kobo/Kobo/Kobo eReader.conf"})," file (you may need to display hidden files on Mac/Linux)."]}),"\n",(0,i.jsx)(o.p,{children:"The file should contain the following line (among others):"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"api_endpoint=https://storeapi.kobo.com\n"})}),"\n",(0,i.jsxs)(o.p,{children:["If the line does not exist, it must be created under the ",(0,i.jsx)(o.code,{children:"[OneStoreServices]"})," group."]}),"\n",(0,i.jsx)(o.p,{children:"You will need to replace this line with your external server address, in the following form:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"api_endpoint=https:///kobo/\n"})}),"\n",(0,i.jsx)(o.h3,{id:"force-external-port",children:"Force external port"}),"\n",(0,i.jsxs)(o.p,{children:["The Kobo eReader does not send valid HTTP ",(0,i.jsx)(o.code,{children:"Host"})," header, which could break the covers and file download in certain circumstances. Komga will try its best to automatically fix the incorrect Kobo headers, but in some specific cases it's not possible."]}),"\n",(0,i.jsxs)(o.p,{children:["If you experience some issues downloading covers or files from the Kobo, you will need to configure the ",(0,i.jsx)(o.em,{children:"Kobo Sync external port"})," (in ",(0,i.jsx)(o.em,{children:"Server Settings"}),") to the port that your Kobo is accessing. Normally it should be what you have configured in ",(0,i.jsx)(o.code,{children:"api_endpoint"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"A case where this would be required is if you access your Komga server directly (without a reverse proxy), with Komga running in Docker, and with a Docker mapped port that is different from the internal Komga port."}),"\n",(0,i.jsx)(o.h2,{id:"migrating-from-calibre-web",children:"Migrating from Calibre-Web"}),"\n",(0,i.jsxs)(o.p,{children:["If you have used Calibre-Web with Kobo Sync before, you can migrate to Komga by changing the ",(0,i.jsx)(o.code,{children:"Kobo eReader.conf"})," and point to your Komga server instead."]}),"\n",(0,i.jsx)(o.p,{children:"Books added by Calibre-Web should remain on your Kobo device."}),"\n",(0,i.jsx)(o.p,{children:"If you have Kobo proxying enabled, Komga is able to extract your Kobo authentication tokens from the Calibre-Web token (stored on the Kobo) transparently."}),"\n",(0,i.jsx)(o.h2,{id:"privacy-and-security",children:"Privacy and Security"}),"\n",(0,i.jsx)(o.p,{children:"The Kobo eReader sends out sensitive information during the Sync protocol. It is highly recommended to only use Kobo Sync over HTTPS."}),"\n",(0,i.jsx)(o.p,{children:"The API key is as sensitive as your username and password. Since the API key is part of the URL for Kobo Sync, you should not share this URL with anyone."}),"\n",(0,i.jsx)(o.p,{children:"Be careful when sharing Komga logs or Kobo logs, and redact any sensitive information."}),"\n",(0,i.jsx)(o.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsx)(o.h3,{id:"force-kobo-sync",children:"Force Kobo Sync"}),"\n",(0,i.jsxs)(o.p,{children:["If the Kobo eReader becomes out of sync with Komga somehow, you can force a full sync from the ",(0,i.jsx)(o.em,{children:"Account Settings"})," page. Locate the API key, and click the ",(0,i.jsx)(o.em,{children:"Force Kobo sync"})," icon."]}),"\n",(0,i.jsx)(o.h3,{id:"access-kobo-ereader-logs",children:"Access Kobo eReader logs"}),"\n",(0,i.jsx)(o.p,{children:"Logs on the Kobo device are encrypted and cannot be read when connecting the device to a computer."}),"\n",(0,i.jsx)(o.p,{children:"In order to get readable logs, you will need to enable Developer options:"}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["in the search bar, type ",(0,i.jsx)(o.code,{children:"devmodeon"})," and search"]}),"\n",(0,i.jsxs)(o.li,{children:["it will not show any search results, but you will be able to access Developer options under ",(0,i.jsx)(o.em,{children:"Settings > Device Information > Developer options"})]}),"\n",(0,i.jsxs)(o.li,{children:["In the ",(0,i.jsx)(o.em,{children:"Logging Category"})," section, enable the following: ",(0,i.jsx)(o.code,{children:"sync"}),", ",(0,i.jsx)(o.code,{children:"packetdump"})]}),"\n",(0,i.jsx)(o.li,{children:"Restart the Kobo eReader"}),"\n"]}),"\n",(0,i.jsx)(o.p,{children:"Once that's set, you will be able to stream the Kobo's logs using netcat. Use the following command on a computer that is on the same network as the Kobo:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-shell",children:"nc -v ${kobo IP address} 5001\n"})}),"\n",(0,i.jsx)(o.h3,{id:"komga-logs",children:"Komga logs"}),"\n",(0,i.jsxs)(o.p,{children:["Komga can log all incoming HTTP requests, including headers and body, by setting ",(0,i.jsx)(o.code,{children:"logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter"})," to ",(0,i.jsx)(o.code,{children:"DEBUG"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["To log outgoing HTTP requests to the official Kobo Store, set ",(0,i.jsx)(o.code,{children:"logging.level.org.gotson.komga.infrastructure.kobo"})," to ",(0,i.jsx)(o.code,{children:"DEBUG"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["You can also access the recent HTTP exchanges under the ",(0,i.jsx)(o.code,{children:"/actuator/httpexchanges"})," endpoint on your Komga server."]})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},3023:(e,o,n)=>{n.d(o,{R:()=>t,x:()=>a});var i=n(3696);const r={},s=i.createContext(r);function t(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/416fe654.9e357634.js b/assets/js/416fe654.9e357634.js deleted file mode 100644 index fbbfa600..00000000 --- a/assets/js/416fe654.9e357634.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5216],{4975:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var s=n(2540),o=n(3023);const i={},r="Contribution",l={id:"contribution",title:"Contribution",description:"Code",source:"@site/docs/contribution.md",sourceDirName:".",slug:"/contribution",permalink:"/docs/contribution",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/contribution.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Command Line Interface",permalink:"/docs/guides/cli"},next:{title:"Community",permalink:"/docs/community"}},a={},h=[{value:"Code",id:"code",level:2},{value:"Application",id:"application",level:3},{value:"Mihon Extension",id:"mihon-extension",level:3},{value:"Website",id:"website",level:3},{value:"Translation",id:"translation",level:2},{value:"Helpful links",id:"helpful-links",level:4},{value:"Project status",id:"project-status",level:4},{value:"Donation",id:"donation",level:2},{value:"Sponsors",id:"sponsors",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"contribution",children:"Contribution"})}),"\n",(0,s.jsx)(t.h2,{id:"code",children:"Code"}),"\n",(0,s.jsx)(t.p,{children:"Skilled at code? Know how to improve something or you generally want to support the creation of the app?"}),"\n",(0,s.jsx)(t.h3,{id:"application",children:"Application"}),"\n",(0,s.jsxs)(t.p,{children:["The main application: ",(0,s.jsx)(t.a,{href:"https://github.com/gotson/komga",children:"gotson/komga"})," ",(0,s.jsx)("span",{class:"playgroundPreview",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/github/issues/gotson/komga?style=social",alt:"GitHub issues"})})]}),"\n",(0,s.jsx)(t.h3,{id:"mihon-extension",children:"Mihon Extension"}),"\n",(0,s.jsxs)(t.p,{children:["The official Komga extension for Mihon: ",(0,s.jsx)(t.a,{href:"https://github.com/keiyoushi/extensions-source/tree/main/src/all/komga",children:"keiyoushi/extensions-source"})]}),"\n",(0,s.jsx)(t.h3,{id:"website",children:"Website"}),"\n",(0,s.jsxs)(t.p,{children:["The repository that hosts this very website you're reading on now: ",(0,s.jsx)(t.a,{href:"https://github.com/gotson/komga-website",children:"gotson/komga-website"})]}),"\n",(0,s.jsx)(t.h2,{id:"translation",children:"Translation"}),"\n",(0,s.jsx)("a",{id:"weblate-status",href:"https://hosted.weblate.org/engage/komga/",children:(0,s.jsx)("img",{src:"https://hosted.weblate.org/widgets/komga/-/svg-badge.svg",alt:"Translation status"})}),"\n",(0,s.jsxs)(t.p,{children:["Want to help translate the app to your language? You can easily help by utilizing a service we use called ",(0,s.jsx)(t.strong,{children:"Weblate"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Visit our translation project ",(0,s.jsx)(t.a,{href:"https://hosted.weblate.org/engage/komga/",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h4,{id:"helpful-links",children:"Helpful links"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.weblate.org/en/latest/user/translating.html",children:"Translators guide"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.weblate.org/en/latest/user/profile.html#secondary-languages",children:"Secondary-languages"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.weblate.org/en/latest/user/profile.html#subscriptions",children:"Subscriptions"})}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"project-status",children:"Project status"}),"\n",(0,s.jsx)("a",{id:"weblate-status",href:"https://hosted.weblate.org/engage/komga/",children:(0,s.jsx)("img",{src:"https://hosted.weblate.org/widgets/komga/-/horizontal-auto.svg",alt:"Translation status"})}),"\n",(0,s.jsx)(t.h2,{id:"donation",children:"Donation"}),"\n",(0,s.jsx)(t.p,{children:"If you can't contribute code, but you still wish to help, then you can choose to contribute financially by using the buttons below, or going directly to any of those platforms:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://opencollective.com/komga",children:"Open Collective"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://ko-fi.com/gotson",children:"Ko-Fi"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/sponsors/gotson",children:"Github Sponsors"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"sponsors",children:"Sponsors"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("a",{href:"https://www.jetbrains.com/?from=Komga",target:"_blank",rel:"noopener",children:(0,s.jsx)("img",{src:"/assets/media/sponsors/sponsors-jetbrains.png",style:{maxHeight:"100px"}})})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>l});var s=n(3696);const o={},i=s.createContext(o);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/416fe654.9e7de143.js b/assets/js/416fe654.9e7de143.js new file mode 100644 index 00000000..6b560a6d --- /dev/null +++ b/assets/js/416fe654.9e7de143.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5216],{4975:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var s=n(2540),o=n(3023);const i={},r="Contribution",l={id:"contribution",title:"Contribution",description:"Code",source:"@site/docs/contribution.md",sourceDirName:".",slug:"/contribution",permalink:"/docs/contribution",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/contribution.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Command Line Interface",permalink:"/docs/guides/cli"},next:{title:"Community",permalink:"/docs/community"}},a={},h=[{value:"Code",id:"code",level:2},{value:"Application",id:"application",level:3},{value:"Mihon Extension",id:"mihon-extension",level:3},{value:"Website",id:"website",level:3},{value:"Translation",id:"translation",level:2},{value:"Helpful links",id:"helpful-links",level:4},{value:"Project status",id:"project-status",level:4},{value:"Donation",id:"donation",level:2},{value:"Sponsors",id:"sponsors",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"contribution",children:"Contribution"})}),"\n",(0,s.jsx)(t.h2,{id:"code",children:"Code"}),"\n",(0,s.jsx)(t.p,{children:"Skilled at code? Know how to improve something or you generally want to support the creation of the app?"}),"\n",(0,s.jsx)(t.h3,{id:"application",children:"Application"}),"\n",(0,s.jsxs)(t.p,{children:["The main application: ",(0,s.jsx)(t.a,{href:"https://github.com/gotson/komga",children:"gotson/komga"})," ",(0,s.jsx)("span",{class:"playgroundPreview",children:(0,s.jsx)(t.img,{src:"https://img.shields.io/github/issues/gotson/komga?style=social",alt:"GitHub issues"})})]}),"\n",(0,s.jsx)(t.h3,{id:"mihon-extension",children:"Mihon Extension"}),"\n",(0,s.jsxs)(t.p,{children:["The official Komga extension for Mihon: ",(0,s.jsx)(t.a,{href:"https://github.com/keiyoushi/extensions-source/tree/main/src/all/komga",children:"keiyoushi/extensions-source"})]}),"\n",(0,s.jsx)(t.h3,{id:"website",children:"Website"}),"\n",(0,s.jsxs)(t.p,{children:["The repository that hosts this very website you're reading on now: ",(0,s.jsx)(t.a,{href:"https://github.com/gotson/komga-website",children:"gotson/komga-website"})]}),"\n",(0,s.jsx)(t.h2,{id:"translation",children:"Translation"}),"\n",(0,s.jsx)("a",{id:"weblate-status",href:"https://hosted.weblate.org/engage/komga/",children:(0,s.jsx)("img",{src:"https://hosted.weblate.org/widgets/komga/-/svg-badge.svg",alt:"Translation status"})}),"\n",(0,s.jsxs)(t.p,{children:["Want to help translate the app to your language? You can easily help by utilizing a service we use called ",(0,s.jsx)(t.strong,{children:"Weblate"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Visit our translation project ",(0,s.jsx)(t.a,{href:"https://hosted.weblate.org/engage/komga/",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h4,{id:"helpful-links",children:"Helpful links"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.weblate.org/en/latest/user/translating.html",children:"Translators guide"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.weblate.org/en/latest/user/profile.html#secondary-languages",children:"Secondary-languages"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.weblate.org/en/latest/user/profile.html#subscriptions",children:"Subscriptions"})}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"project-status",children:"Project status"}),"\n",(0,s.jsx)("a",{id:"weblate-status",href:"https://hosted.weblate.org/engage/komga/",children:(0,s.jsx)("img",{src:"https://hosted.weblate.org/widgets/komga/-/horizontal-auto.svg",alt:"Translation status"})}),"\n",(0,s.jsx)(t.h2,{id:"donation",children:"Donation"}),"\n",(0,s.jsx)(t.p,{children:"If you can't contribute code, but you still wish to help, then you can choose to contribute financially by using the buttons below, or going directly to any of those platforms:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://opencollective.com/komga",children:"Open Collective"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://ko-fi.com/gotson",children:"Ko-Fi"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/sponsors/gotson",children:"Github Sponsors"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"sponsors",children:"Sponsors"}),"\n",(0,s.jsx)("br",{}),"\n",(0,s.jsx)("a",{href:"https://www.jetbrains.com/?from=Komga",target:"_blank",rel:"noopener",children:(0,s.jsx)("img",{src:"/assets/media/sponsors/sponsors-jetbrains.png",style:{maxHeight:"100px"}})})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>l});var s=n(3696);const o={},i=s.createContext(o);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49136dfa.951c184e.js b/assets/js/49136dfa.951c184e.js new file mode 100644 index 00000000..b532073e --- /dev/null +++ b/assets/js/49136dfa.951c184e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3259],{6673:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var t=o(2540),s=o(3023);const n={},l="Import Books",r={id:"guides/import-books",title:"Import Books",description:"Komga lets you import files that are outside your existing libraries directly into existing series folder (from the Import > Books screen).",source:"@site/docs/guides/import-books.md",sourceDirName:"guides",slug:"/guides/import-books",permalink:"/docs/guides/import-books",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/import-books.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Full Text Search",permalink:"/docs/guides/search"},next:{title:"Duplicate Files",permalink:"/docs/guides/duplicate-files"}},a={},d=[{value:"Scan for books",id:"scan-for-books",level:2},{value:"Select destination series",id:"select-destination-series",level:2},{value:"Check book details",id:"check-book-details",level:2},{value:"Finalize the import",id:"finalize-the-import",level:2}];function c(e){const i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"import-books",children:"Import Books"})}),"\n",(0,t.jsxs)(i.p,{children:["Komga lets you import files that are outside your existing libraries directly into existing series folder (from the ",(0,t.jsx)(i.em,{children:"Import > Books"})," screen)."]}),"\n",(0,t.jsx)(i.h2,{id:"scan-for-books",children:"Scan for books"}),"\n",(0,t.jsxs)(i.p,{children:["Start by choosing a folder to scan for eligible books, and click ",(0,t.jsx)(i.em,{children:"Scan"}),"."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/import-books/book-import-scan.png",style:{maxHeight:" 400px"},alt:"Scan for books"}),"\n",(0,t.jsx)(i.p,{children:"Komga will display a list of all files eligible for import."}),"\n",(0,t.jsx)(i.h2,{id:"select-destination-series",children:"Select destination series"}),"\n",(0,t.jsxs)(i.p,{children:["You will need to pick a destination series for each. You can choose individually, or for all the selected files at once using the ",(0,t.jsx)(i.em,{children:"Select Series"})," button."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/import-books/book-import-pick-series.png",style:{maxHeight:" 400px"},alt:"Select series"}),"\n",(0,t.jsx)(i.h2,{id:"check-book-details",children:"Check book details"}),"\n",(0,t.jsx)(i.p,{children:"For each book, you can:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"display the book details: format, number of pages, and detailed page list"}),"\n",(0,t.jsx)(i.li,{children:"browse the book pages"}),"\n",(0,t.jsx)(i.li,{children:"change the destination file name"}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"If you choose a number for a book, and a book already exists with that number, Komga will offer you to upgrade it, effectively replacing the existing file. In case of upgrade, you can:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"display the details of both books side by side"}),"\n",(0,t.jsx)(i.li,{children:"browse both books side by side"}),"\n"]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/import-books/book-import-buttons.png",style:{maxHeight:" 400px"},alt:"Book actions"}),"\n",(0,t.jsx)(i.h2,{id:"finalize-the-import",children:"Finalize the import"}),"\n",(0,t.jsx)(i.p,{children:"Komga will import only the selected files (checkbox on the left)."}),"\n",(0,t.jsx)(i.p,{children:"You can decide to:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"move the files: files will be moved from their location, effectively deleting the original file."}),"\n",(0,t.jsx)(i.li,{children:"copy/hardlink the files: Komga will try to hardlink the files to their destination (compatible file systems only), and if that doesn't work will copy the files to their destination, leaving the original file untouched."}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["Cick ",(0,t.jsx)(i.em,{children:"Import"})," to start the import process."]})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},3023:(e,i,o)=>{o.d(i,{R:()=>l,x:()=>r});var t=o(3696);const s={},n=t.createContext(s);function l(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49136dfa.cbfe11f0.js b/assets/js/49136dfa.cbfe11f0.js deleted file mode 100644 index 410e214c..00000000 --- a/assets/js/49136dfa.cbfe11f0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3259],{6673:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var t=o(2540),s=o(3023);const n={},l="Import Books",r={id:"guides/import-books",title:"Import Books",description:"Komga lets you import files that are outside your existing libraries directly into existing series folder (from the Import > Books screen).",source:"@site/docs/guides/import-books.md",sourceDirName:"guides",slug:"/guides/import-books",permalink:"/docs/guides/import-books",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/import-books.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Full Text Search",permalink:"/docs/guides/search"},next:{title:"Duplicate Files",permalink:"/docs/guides/duplicate-files"}},a={},d=[{value:"Scan for books",id:"scan-for-books",level:2},{value:"Select destination series",id:"select-destination-series",level:2},{value:"Check book details",id:"check-book-details",level:2},{value:"Finalize the import",id:"finalize-the-import",level:2}];function c(e){const i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"import-books",children:"Import Books"})}),"\n",(0,t.jsxs)(i.p,{children:["Komga lets you import files that are outside your existing libraries directly into existing series folder (from the ",(0,t.jsx)(i.em,{children:"Import > Books"})," screen)."]}),"\n",(0,t.jsx)(i.h2,{id:"scan-for-books",children:"Scan for books"}),"\n",(0,t.jsxs)(i.p,{children:["Start by choosing a folder to scan for eligible books, and click ",(0,t.jsx)(i.em,{children:"Scan"}),"."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/import-books/book-import-scan.png",style:{maxHeight:" 400px"},alt:"Scan for books"}),"\n",(0,t.jsx)(i.p,{children:"Komga will display a list of all files eligible for import."}),"\n",(0,t.jsx)(i.h2,{id:"select-destination-series",children:"Select destination series"}),"\n",(0,t.jsxs)(i.p,{children:["You will need to pick a destination series for each. You can choose individually, or for all the selected files at once using the ",(0,t.jsx)(i.em,{children:"Select Series"})," button."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/import-books/book-import-pick-series.png",style:{maxHeight:" 400px"},alt:"Select series"}),"\n",(0,t.jsx)(i.h2,{id:"check-book-details",children:"Check book details"}),"\n",(0,t.jsx)(i.p,{children:"For each book, you can:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"display the book details: format, number of pages, and detailed page list"}),"\n",(0,t.jsx)(i.li,{children:"browse the book pages"}),"\n",(0,t.jsx)(i.li,{children:"change the destination file name"}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"If you choose a number for a book, and a book already exists with that number, Komga will offer you to upgrade it, effectively replacing the existing file. In case of upgrade, you can:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"display the details of both books side by side"}),"\n",(0,t.jsx)(i.li,{children:"browse both books side by side"}),"\n"]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/import-books/book-import-buttons.png",style:{maxHeight:" 400px"},alt:"Book actions"}),"\n",(0,t.jsx)(i.h2,{id:"finalize-the-import",children:"Finalize the import"}),"\n",(0,t.jsx)(i.p,{children:"Komga will import only the selected files (checkbox on the left)."}),"\n",(0,t.jsx)(i.p,{children:"You can decide to:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"move the files: files will be moved from their location, effectively deleting the original file."}),"\n",(0,t.jsx)(i.li,{children:"copy/hardlink the files: Komga will try to hardlink the files to their destination (compatible file systems only), and if that doesn't work will copy the files to their destination, leaving the original file untouched."}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["Cick ",(0,t.jsx)(i.em,{children:"Import"})," to start the import process."]})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},3023:(e,i,o)=>{o.d(i,{R:()=>l,x:()=>r});var t=o(3696);const s={},n=t.createContext(s);function l(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c25ac78.0bc9e6c9.js b/assets/js/4c25ac78.0bc9e6c9.js deleted file mode 100644 index b314855b..00000000 --- a/assets/js/4c25ac78.0bc9e6c9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7994],{317:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>a,metadata:()=>d,toc:()=>o});var s=i(2540),n=i(3023);const a={},r="Edit Metadata",d={id:"guides/edit-metadata",title:"Edit Metadata",description:"In some cases, when you add an item to your Library, information such as summaries or release date is retrieved from embedded metadata. These details are shown when viewing the item to provide information about the item and make using Komga a more enjoyable experience.",source:"@site/docs/guides/edit-metadata.md",sourceDirName:"guides",slug:"/guides/edit-metadata",permalink:"/docs/guides/edit-metadata",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/edit-metadata.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"One-Shots",permalink:"/docs/guides/oneshots"},next:{title:"Local Artwork Assets",permalink:"/docs/guides/local-artwork-assets"}},l={},o=[{value:"The Edit Screen",id:"the-edit-screen",level:2},{value:"Opening the Edit Screen",id:"opening-the-edit-screen",level:3},{value:"From the Item Card",id:"from-the-item-card",level:4},{value:"From the Item Details",id:"from-the-item-details",level:4},{value:"Edit Screen Details",id:"edit-screen-details",level:3},{value:"Edit Screen for Series",id:"edit-screen-for-series",level:4},{value:"General",id:"general",level:5},{value:"Tags",id:"tags",level:5},{value:"Edit Screen for Books",id:"edit-screen-for-books",level:4},{value:"General",id:"general-1",level:5},{value:"Authors",id:"authors",level:5},{value:"Tags",id:"tags-1",level:5},{value:"Using the Edit Screen",id:"using-the-edit-screen",level:2},{value:"Editing Standard Fields, Tags or Authors",id:"editing-standard-fields-tags-or-authors",level:3},{value:"Changing Fields",id:"changing-fields",level:3},{value:"Locking And Unlocking",id:"locking-and-unlocking",level:3},{value:"Sort Titles",id:"sort-titles",level:3},{value:"Sort Numbers",id:"sort-numbers",level:3}];function h(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"edit-metadata",children:"Edit Metadata"})}),"\n",(0,s.jsx)(t.p,{children:"In some cases, when you add an item to your Library, information such as summaries or release date is retrieved from embedded metadata. These details are shown when viewing the item to provide information about the item and make using Komga a more enjoyable experience."}),"\n",(0,s.jsx)(t.p,{children:"You may wish to customize or change the information associated with a library item."}),"\n",(0,s.jsx)(t.h2,{id:"the-edit-screen",children:"The Edit Screen"}),"\n",(0,s.jsx)(t.h3,{id:"opening-the-edit-screen",children:"Opening the Edit Screen"}),"\n",(0,s.jsx)(t.p,{children:"The edit screen for an item can be accessed in several ways, depending on where you are."}),"\n",(0,s.jsx)(t.h4,{id:"from-the-item-card",children:"From the Item Card"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Hover over the item card"}),"\n",(0,s.jsxs)(t.li,{children:["Click the ",(0,s.jsx)("img",{src:"/assets/media/guides/edit-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," icon"]}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"from-the-item-details",children:"From the Item Details"}),"\n",(0,s.jsxs)(t.p,{children:["When viewing the details for a Library item, click the ",(0,s.jsx)("img",{src:"/assets/media/guides/edit-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," button in the top actionbar."]}),"\n",(0,s.jsx)(t.h3,{id:"edit-screen-details",children:"Edit Screen Details"}),"\n",(0,s.jsx)(t.p,{children:"The Edit Screen allows you to access title, authors, summary, tags, and more. There are several areas of the Edit Screen that can be accessed from the tabs on the left side."}),"\n",(0,s.jsx)(t.h4,{id:"edit-screen-for-series",children:"Edit Screen for Series"}),"\n",(0,s.jsx)(t.h5,{id:"general",children:"General"}),"\n",(0,s.jsx)(t.p,{children:"The General screen allows you to edit details such as the title, sort title, summary, and more."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-series-general-2.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-series-general-2.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h5,{id:"tags",children:"Tags"}),"\n",(0,s.jsx)(t.p,{children:"The Tags page includes metadata such as genres and tags. These are items that can have more than one value and are typically available for sorting or filtering."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-series-tags.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h4,{id:"edit-screen-for-books",children:"Edit Screen for Books"}),"\n",(0,s.jsx)(t.h5,{id:"general-1",children:"General"}),"\n",(0,s.jsx)(t.p,{children:"The General screen allows you to edit details such as the title, number, summary, and more."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-book-general.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h5,{id:"authors",children:"Authors"}),"\n",(0,s.jsx)(t.p,{children:"The Authors page includes metadata such as writers, pencillers, inkers, and more. These are items that can have more than one value and are typically available for sorting or filtering."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-book-authors.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h5,{id:"tags-1",children:"Tags"}),"\n",(0,s.jsx)(t.p,{children:"The Tags page includes metadata such as genres and tags. These are items that can have more than one value and are typically available for sorting or filtering."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-book-tags.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h2,{id:"using-the-edit-screen",children:"Using the Edit Screen"}),"\n",(0,s.jsx)(t.h3,{id:"editing-standard-fields-tags-or-authors",children:"Editing Standard Fields, Tags or Authors"}),"\n",(0,s.jsx)(t.h3,{id:"changing-fields",children:"Changing Fields"}),"\n",(0,s.jsx)(t.p,{children:"To edit the details for a particular piece of metadata:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Choose the tab of category you want to change on the left, then click the detail field"}),"\n",(0,s.jsx)(t.li,{children:"Type or paste the changes"}),"\n",(0,s.jsx)(t.li,{children:"For items in the Tags or Authors area, simply start typing the name. If the name already exists in the database, it will appear for you and you can select it. Otherwise, simply type out the name like normal."}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["To remove an item, click the ",(0,s.jsx)(t.code,{children:"X"})," next to the entry."]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/author-chip.png",style:{maxHeight:"80px"}}),"\n",(0,s.jsx)(t.h3,{id:"locking-and-unlocking",children:"Locking And Unlocking"}),"\n",(0,s.jsx)(t.p,{children:"If you\u2019ve made an edit to a field, it is automatically locked. A locked field will not be altered when an item is refreshed. To lock or unlock a field:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Edit the field and it will lock automatically"}),"\n",(0,s.jsx)(t.li,{children:"Click the lock icon to either lock or unlock the field"}),"\n",(0,s.jsx)(t.li,{children:"A field is locked when the lock icon is colored orange"}),"\n"]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/locked-field.png",style:{maxHeight:"80px"}}),"\n",(0,s.jsx)(t.h3,{id:"sort-titles",children:"Sort Titles"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Sort Title"})," field lets you control how items are sorted alphabetically. The ",(0,s.jsx)(t.code,{children:"Title"})," field is what will be displayed, but the ",(0,s.jsx)(t.code,{children:"Sort Title"})," field is used for sorting."]}),"\n",(0,s.jsx)(t.p,{children:'For example, if you want to ignore the article ("The") for your series like "The Boys":'}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:'Find the "The Boys" series and open the Edit Details screen'}),"\n",(0,s.jsxs)(t.li,{children:["Click in the ",(0,s.jsx)(t.code,{children:"Sort Title"}),' and type "Boys (The)" then ',(0,s.jsx)(t.code,{children:"Save Changes"})]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:['The result is that the series "The Boys" will appear together in the list under the letter B and sorted as entered in the ',(0,s.jsx)(t.code,{children:"Sort Title"})," field."]}),"\n",(0,s.jsx)(t.h3,{id:"sort-numbers",children:"Sort Numbers"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Sort Number"})," field lets you control how items are sorted within a series. The ",(0,s.jsx)(t.code,{children:"Number"})," field is what will be displayed, but the ",(0,s.jsx)(t.code,{children:"Sort Number"})," field is used for sorting."]}),"\n",(0,s.jsx)(t.p,{children:'For example, if you have a "2015 Special" that is between book 24 and 25:'}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["set the ",(0,s.jsx)(t.code,{children:"Number"}),' to "2015 Special"']}),"\n",(0,s.jsxs)(t.li,{children:["set the ",(0,s.jsx)(t.code,{children:"Sort Number"}),' to "24.5"']}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:'The result is that the special book will appear between book 24 and 25, and will show "2015 Special" as its number.'})]})}function c(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3023:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>d});var s=i(3696);const n={},a=s.createContext(n);function r(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c25ac78.e8a08b11.js b/assets/js/4c25ac78.e8a08b11.js new file mode 100644 index 00000000..68ca6016 --- /dev/null +++ b/assets/js/4c25ac78.e8a08b11.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7994],{317:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>a,metadata:()=>d,toc:()=>o});var s=i(2540),n=i(3023);const a={},r="Edit Metadata",d={id:"guides/edit-metadata",title:"Edit Metadata",description:"In some cases, when you add an item to your Library, information such as summaries or release date is retrieved from embedded metadata. These details are shown when viewing the item to provide information about the item and make using Komga a more enjoyable experience.",source:"@site/docs/guides/edit-metadata.md",sourceDirName:"guides",slug:"/guides/edit-metadata",permalink:"/docs/guides/edit-metadata",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/edit-metadata.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"One-Shots",permalink:"/docs/guides/oneshots"},next:{title:"Local Artwork Assets",permalink:"/docs/guides/local-artwork-assets"}},l={},o=[{value:"The Edit Screen",id:"the-edit-screen",level:2},{value:"Opening the Edit Screen",id:"opening-the-edit-screen",level:3},{value:"From the Item Card",id:"from-the-item-card",level:4},{value:"From the Item Details",id:"from-the-item-details",level:4},{value:"Edit Screen Details",id:"edit-screen-details",level:3},{value:"Edit Screen for Series",id:"edit-screen-for-series",level:4},{value:"General",id:"general",level:5},{value:"Tags",id:"tags",level:5},{value:"Edit Screen for Books",id:"edit-screen-for-books",level:4},{value:"General",id:"general-1",level:5},{value:"Authors",id:"authors",level:5},{value:"Tags",id:"tags-1",level:5},{value:"Using the Edit Screen",id:"using-the-edit-screen",level:2},{value:"Editing Standard Fields, Tags or Authors",id:"editing-standard-fields-tags-or-authors",level:3},{value:"Changing Fields",id:"changing-fields",level:3},{value:"Locking And Unlocking",id:"locking-and-unlocking",level:3},{value:"Sort Titles",id:"sort-titles",level:3},{value:"Sort Numbers",id:"sort-numbers",level:3}];function h(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"edit-metadata",children:"Edit Metadata"})}),"\n",(0,s.jsx)(t.p,{children:"In some cases, when you add an item to your Library, information such as summaries or release date is retrieved from embedded metadata. These details are shown when viewing the item to provide information about the item and make using Komga a more enjoyable experience."}),"\n",(0,s.jsx)(t.p,{children:"You may wish to customize or change the information associated with a library item."}),"\n",(0,s.jsx)(t.h2,{id:"the-edit-screen",children:"The Edit Screen"}),"\n",(0,s.jsx)(t.h3,{id:"opening-the-edit-screen",children:"Opening the Edit Screen"}),"\n",(0,s.jsx)(t.p,{children:"The edit screen for an item can be accessed in several ways, depending on where you are."}),"\n",(0,s.jsx)(t.h4,{id:"from-the-item-card",children:"From the Item Card"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Hover over the item card"}),"\n",(0,s.jsxs)(t.li,{children:["Click the ",(0,s.jsx)("img",{src:"/assets/media/guides/edit-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," icon"]}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"from-the-item-details",children:"From the Item Details"}),"\n",(0,s.jsxs)(t.p,{children:["When viewing the details for a Library item, click the ",(0,s.jsx)("img",{src:"/assets/media/guides/edit-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," button in the top actionbar."]}),"\n",(0,s.jsx)(t.h3,{id:"edit-screen-details",children:"Edit Screen Details"}),"\n",(0,s.jsx)(t.p,{children:"The Edit Screen allows you to access title, authors, summary, tags, and more. There are several areas of the Edit Screen that can be accessed from the tabs on the left side."}),"\n",(0,s.jsx)(t.h4,{id:"edit-screen-for-series",children:"Edit Screen for Series"}),"\n",(0,s.jsx)(t.h5,{id:"general",children:"General"}),"\n",(0,s.jsx)(t.p,{children:"The General screen allows you to edit details such as the title, sort title, summary, and more."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-series-general-2.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-series-general-2.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h5,{id:"tags",children:"Tags"}),"\n",(0,s.jsx)(t.p,{children:"The Tags page includes metadata such as genres and tags. These are items that can have more than one value and are typically available for sorting or filtering."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-series-tags.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h4,{id:"edit-screen-for-books",children:"Edit Screen for Books"}),"\n",(0,s.jsx)(t.h5,{id:"general-1",children:"General"}),"\n",(0,s.jsx)(t.p,{children:"The General screen allows you to edit details such as the title, number, summary, and more."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-book-general.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h5,{id:"authors",children:"Authors"}),"\n",(0,s.jsx)(t.p,{children:"The Authors page includes metadata such as writers, pencillers, inkers, and more. These are items that can have more than one value and are typically available for sorting or filtering."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-book-authors.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h5,{id:"tags-1",children:"Tags"}),"\n",(0,s.jsx)(t.p,{children:"The Tags page includes metadata such as genres and tags. These are items that can have more than one value and are typically available for sorting or filtering."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/edit-book-tags.png",style:{maxHeight:"300px"}}),"\n",(0,s.jsx)(t.h2,{id:"using-the-edit-screen",children:"Using the Edit Screen"}),"\n",(0,s.jsx)(t.h3,{id:"editing-standard-fields-tags-or-authors",children:"Editing Standard Fields, Tags or Authors"}),"\n",(0,s.jsx)(t.h3,{id:"changing-fields",children:"Changing Fields"}),"\n",(0,s.jsx)(t.p,{children:"To edit the details for a particular piece of metadata:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Choose the tab of category you want to change on the left, then click the detail field"}),"\n",(0,s.jsx)(t.li,{children:"Type or paste the changes"}),"\n",(0,s.jsx)(t.li,{children:"For items in the Tags or Authors area, simply start typing the name. If the name already exists in the database, it will appear for you and you can select it. Otherwise, simply type out the name like normal."}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["To remove an item, click the ",(0,s.jsx)(t.code,{children:"X"})," next to the entry."]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/author-chip.png",style:{maxHeight:"80px"}}),"\n",(0,s.jsx)(t.h3,{id:"locking-and-unlocking",children:"Locking And Unlocking"}),"\n",(0,s.jsx)(t.p,{children:"If you\u2019ve made an edit to a field, it is automatically locked. A locked field will not be altered when an item is refreshed. To lock or unlock a field:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Edit the field and it will lock automatically"}),"\n",(0,s.jsx)(t.li,{children:"Click the lock icon to either lock or unlock the field"}),"\n",(0,s.jsx)(t.li,{children:"A field is locked when the lock icon is colored orange"}),"\n"]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/edit-metadata/locked-field.png",style:{maxHeight:"80px"}}),"\n",(0,s.jsx)(t.h3,{id:"sort-titles",children:"Sort Titles"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Sort Title"})," field lets you control how items are sorted alphabetically. The ",(0,s.jsx)(t.code,{children:"Title"})," field is what will be displayed, but the ",(0,s.jsx)(t.code,{children:"Sort Title"})," field is used for sorting."]}),"\n",(0,s.jsx)(t.p,{children:'For example, if you want to ignore the article ("The") for your series like "The Boys":'}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:'Find the "The Boys" series and open the Edit Details screen'}),"\n",(0,s.jsxs)(t.li,{children:["Click in the ",(0,s.jsx)(t.code,{children:"Sort Title"}),' and type "Boys (The)" then ',(0,s.jsx)(t.code,{children:"Save Changes"})]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:['The result is that the series "The Boys" will appear together in the list under the letter B and sorted as entered in the ',(0,s.jsx)(t.code,{children:"Sort Title"})," field."]}),"\n",(0,s.jsx)(t.h3,{id:"sort-numbers",children:"Sort Numbers"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Sort Number"})," field lets you control how items are sorted within a series. The ",(0,s.jsx)(t.code,{children:"Number"})," field is what will be displayed, but the ",(0,s.jsx)(t.code,{children:"Sort Number"})," field is used for sorting."]}),"\n",(0,s.jsx)(t.p,{children:'For example, if you have a "2015 Special" that is between book 24 and 25:'}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["set the ",(0,s.jsx)(t.code,{children:"Number"}),' to "2015 Special"']}),"\n",(0,s.jsxs)(t.li,{children:["set the ",(0,s.jsx)(t.code,{children:"Sort Number"}),' to "24.5"']}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:'The result is that the special book will appear between book 24 and 25, and will show "2015 Special" as its number.'})]})}function c(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3023:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>d});var s=i(3696);const n={},a=s.createContext(n);function r(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4cc4731f.1009512f.js b/assets/js/4cc4731f.1009512f.js new file mode 100644 index 00000000..726be0ea --- /dev/null +++ b/assets/js/4cc4731f.1009512f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3390],{7255:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var s=i(2540),t=i(3023);const a={},l="Install via third-party integrations",o={id:"installation/thirdparty",title:"Install via third-party integrations",description:"Those methods are not officially supported, if you encounter installation issues please contact the respective authors.",source:"@site/docs/installation/thirdparty.md",sourceDirName:"installation",slug:"/installation/thirdparty",permalink:"/docs/installation/thirdparty",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/thirdparty.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Run with the Jar file",permalink:"/docs/installation/jar"},next:{title:"Configuration options",permalink:"/docs/installation/configuration"}},r={},d=[{value:"PikaPods",id:"pikapods",level:2},{value:"Windows Installer and Updater",id:"windows-installer-and-updater",level:2},{value:"Scoop (Windows)",id:"scoop-windows",level:2},{value:"Installation",id:"installation",level:3},{value:"1. (Skip if JDK is installed) Install JDK",id:"1-skip-if-jdk-is-installed-install-jdk",level:4},{value:"2. Install Komga",id:"2-install-komga",level:4},{value:"Manage",id:"manage",level:3},{value:"Run",id:"run",level:4},{value:"Update",id:"update",level:4},{value:"Uninstall",id:"uninstall",level:4},{value:"AUR - Arch User Repository",id:"aur---arch-user-repository",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Run",id:"run-1",level:3},{value:"QNAP",id:"qnap",level:2},{value:"FreeNAS",id:"freenas",level:2},{value:"YunoHost",id:"yunohost",level:2},{value:"TrueNAS SCALE",id:"truenas-scale",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"install-via-third-party-integrations",children:"Install via third-party integrations"})}),"\n",(0,s.jsx)(n.admonition,{title:"Warning",type:"warning",children:(0,s.jsx)(n.p,{children:"Those methods are not officially supported, if you encounter installation issues please contact the respective authors."})}),"\n",(0,s.jsx)(n.h2,{id:"pikapods",children:"PikaPods"}),"\n",(0,s.jsx)(n.p,{children:"Offers managed hosting for Komga and shares part of the revenue back to the project. From $2.9/month with $5 free welcome credit."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://www.pikapods.com/pods?run=komga",children:(0,s.jsx)(n.img,{src:"https://www.pikapods.com/static/run-button.svg",alt:"Run on PikaPods"})})}),"\n",(0,s.jsx)(n.h2,{id:"windows-installer-and-updater",children:"Windows Installer and Updater"}),"\n",(0,s.jsxs)(n.p,{children:["A ",(0,s.jsx)(n.a,{href:"https://github.com/losslesspng/SetUpKomgaJava",children:"Powershell script"})," to get up and running with Komga."]}),"\n",(0,s.jsx)(n.h2,{id:"scoop-windows",children:"Scoop (Windows)"}),"\n",(0,s.jsxs)(n.p,{children:["Komga is available in ",(0,s.jsx)(n.a,{href:"https://github.com/ScoopInstaller/Scoop",children:"Scoop"}),"'s ",(0,s.jsx)(n.a,{href:"https://github.com/ScoopInstaller/Extras",children:"extras"})," bucket."]}),"\n",(0,s.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(n.p,{children:["You need Scoop to use this installation method. Instruction to install Scoop can be found ",(0,s.jsx)(n.a,{href:"https://github.com/ScoopInstaller/Scoop#installation",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"1-skip-if-jdk-is-installed-install-jdk",children:"1. (Skip if JDK is installed) Install JDK"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"scoop bucket add java"})," and then run ",(0,s.jsx)(n.code,{children:"scoop install java/temurin-lts-jdk"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"2-install-komga",children:"2. Install Komga"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"scoop bucket add extras"})," and then run ",(0,s.jsx)(n.code,{children:"scoop install komga"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"manage",children:"Manage"}),"\n",(0,s.jsx)(n.h4,{id:"run",children:"Run"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"komga"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Note: Default config dir is ",(0,s.jsx)(n.code,{children:"%USERPROFILE%\\scoop\\apps\\komga\\current\\config"})]}),"\n",(0,s.jsx)(n.h4,{id:"update",children:"Update"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"scoop update komga"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"uninstall",children:"Uninstall"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"scoop uninstall komga"})]}),"\n",(0,s.jsx)(n.h2,{id:"aur---arch-user-repository",children:"AUR - Arch User Repository"}),"\n",(0,s.jsxs)(n.p,{children:["Komga is available as an ",(0,s.jsx)(n.a,{href:"https://aur.archlinux.org/packages/komga/",children:"AUR"})," package."]}),"\n",(0,s.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,s.jsxs)(n.p,{children:["It can be installed using ",(0,s.jsx)(n.code,{children:"yay -S komga"})," (or any other AUR package manager)."]}),"\n",(0,s.jsx)(n.h3,{id:"run-1",children:"Run"}),"\n",(0,s.jsxs)(n.p,{children:["Just run ",(0,s.jsx)(n.code,{children:"komga"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"qnap",children:"QNAP"}),"\n",(0,s.jsxs)(n.p,{children:["Komga is available as a ",(0,s.jsx)(n.a,{href:"https://www.qnapclub.eu/en/qpkg/853",children:"QPKG"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"freenas",children:"FreeNAS"}),"\n",(0,s.jsxs)(n.p,{children:["There is a ",(0,s.jsx)(n.a,{href:"https://blog.tommyku.com/blog/deploying-komga-on-freenas-jail/",children:"tutorial"})," to install Komga on FreeNAS jail."]}),"\n",(0,s.jsx)(n.h2,{id:"yunohost",children:"YunoHost"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://install-app.yunohost.org/?app=komga",children:(0,s.jsx)(n.img,{src:"https://install-app.yunohost.org/install-with-yunohost.svg",alt:"Install Komga with YunoHost"})})}),"\n",(0,s.jsx)(n.h2,{id:"truenas-scale",children:"TrueNAS SCALE"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Open ",(0,s.jsx)(n.code,{children:"Apps"})," then go to ",(0,s.jsx)(n.code,{children:"Discover Apps"})," and then search for ",(0,s.jsx)(n.code,{children:"Komga"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click on ",(0,s.jsx)(n.code,{children:"Komga"})," and then click on ",(0,s.jsx)(n.code,{children:"Install"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Leave everything as default, except:","\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Optional: Under ",(0,s.jsx)(n.code,{children:"Network Configuration"})," you can change the ",(0,s.jsx)(n.code,{children:"Web Port"}),". This is the port at which you can later access Komga."]}),"\n",(0,s.jsxs)(n.li,{children:["Optional: Under ",(0,s.jsx)(n.code,{children:"Storage Configuration"})," you can add the location to wherever your media files are currently stored by clicking ",(0,s.jsx)(n.code,{children:"Add"})," next to ",(0,s.jsx)(n.code,{children:"Additional Storage"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Install"}),"."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>o});var s=i(3696);const t={},a=s.createContext(t);function l(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4cc4731f.173de65f.js b/assets/js/4cc4731f.173de65f.js deleted file mode 100644 index 96409189..00000000 --- a/assets/js/4cc4731f.173de65f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3390],{7255:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var s=i(2540),t=i(3023);const a={},l="Install via third-party integrations",o={id:"installation/thirdparty",title:"Install via third-party integrations",description:"Those methods are not officially supported, if you encounter installation issues please contact the respective authors.",source:"@site/docs/installation/thirdparty.md",sourceDirName:"installation",slug:"/installation/thirdparty",permalink:"/docs/installation/thirdparty",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/thirdparty.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Run with the Jar file",permalink:"/docs/installation/jar"},next:{title:"Configuration options",permalink:"/docs/installation/configuration"}},r={},d=[{value:"PikaPods",id:"pikapods",level:2},{value:"Windows Installer and Updater",id:"windows-installer-and-updater",level:2},{value:"Scoop (Windows)",id:"scoop-windows",level:2},{value:"Installation",id:"installation",level:3},{value:"1. (Skip if JDK is installed) Install JDK",id:"1-skip-if-jdk-is-installed-install-jdk",level:4},{value:"2. Install Komga",id:"2-install-komga",level:4},{value:"Manage",id:"manage",level:3},{value:"Run",id:"run",level:4},{value:"Update",id:"update",level:4},{value:"Uninstall",id:"uninstall",level:4},{value:"AUR - Arch User Repository",id:"aur---arch-user-repository",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Run",id:"run-1",level:3},{value:"QNAP",id:"qnap",level:2},{value:"FreeNAS",id:"freenas",level:2},{value:"YunoHost",id:"yunohost",level:2},{value:"TrueNAS SCALE",id:"truenas-scale",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"install-via-third-party-integrations",children:"Install via third-party integrations"})}),"\n",(0,s.jsx)(n.admonition,{title:"Warning",type:"warning",children:(0,s.jsx)(n.p,{children:"Those methods are not officially supported, if you encounter installation issues please contact the respective authors."})}),"\n",(0,s.jsx)(n.h2,{id:"pikapods",children:"PikaPods"}),"\n",(0,s.jsx)(n.p,{children:"Offers managed hosting for Komga and shares part of the revenue back to the project. From $2.9/month with $5 free welcome credit."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://www.pikapods.com/pods?run=komga",children:(0,s.jsx)(n.img,{src:"https://www.pikapods.com/static/run-button.svg",alt:"Run on PikaPods"})})}),"\n",(0,s.jsx)(n.h2,{id:"windows-installer-and-updater",children:"Windows Installer and Updater"}),"\n",(0,s.jsxs)(n.p,{children:["A ",(0,s.jsx)(n.a,{href:"https://github.com/losslesspng/SetUpKomgaJava",children:"Powershell script"})," to get up and running with Komga."]}),"\n",(0,s.jsx)(n.h2,{id:"scoop-windows",children:"Scoop (Windows)"}),"\n",(0,s.jsxs)(n.p,{children:["Komga is available in ",(0,s.jsx)(n.a,{href:"https://github.com/ScoopInstaller/Scoop",children:"Scoop"}),"'s ",(0,s.jsx)(n.a,{href:"https://github.com/ScoopInstaller/Extras",children:"extras"})," bucket."]}),"\n",(0,s.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(n.p,{children:["You need Scoop to use this installation method. Instruction to install Scoop can be found ",(0,s.jsx)(n.a,{href:"https://github.com/ScoopInstaller/Scoop#installation",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"1-skip-if-jdk-is-installed-install-jdk",children:"1. (Skip if JDK is installed) Install JDK"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"scoop bucket add java"})," and then run ",(0,s.jsx)(n.code,{children:"scoop install java/temurin-lts-jdk"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"2-install-komga",children:"2. Install Komga"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"scoop bucket add extras"})," and then run ",(0,s.jsx)(n.code,{children:"scoop install komga"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"manage",children:"Manage"}),"\n",(0,s.jsx)(n.h4,{id:"run",children:"Run"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"komga"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Note: Default config dir is ",(0,s.jsx)(n.code,{children:"%USERPROFILE%\\scoop\\apps\\komga\\current\\config"})]}),"\n",(0,s.jsx)(n.h4,{id:"update",children:"Update"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"scoop update komga"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"uninstall",children:"Uninstall"}),"\n",(0,s.jsxs)(n.p,{children:["Run ",(0,s.jsx)(n.code,{children:"scoop uninstall komga"})]}),"\n",(0,s.jsx)(n.h2,{id:"aur---arch-user-repository",children:"AUR - Arch User Repository"}),"\n",(0,s.jsxs)(n.p,{children:["Komga is available as an ",(0,s.jsx)(n.a,{href:"https://aur.archlinux.org/packages/komga/",children:"AUR"})," package."]}),"\n",(0,s.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,s.jsxs)(n.p,{children:["It can be installed using ",(0,s.jsx)(n.code,{children:"yay -S komga"})," (or any other AUR package manager)."]}),"\n",(0,s.jsx)(n.h3,{id:"run-1",children:"Run"}),"\n",(0,s.jsxs)(n.p,{children:["Just run ",(0,s.jsx)(n.code,{children:"komga"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"qnap",children:"QNAP"}),"\n",(0,s.jsxs)(n.p,{children:["Komga is available as a ",(0,s.jsx)(n.a,{href:"https://www.qnapclub.eu/en/qpkg/853",children:"QPKG"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"freenas",children:"FreeNAS"}),"\n",(0,s.jsxs)(n.p,{children:["There is a ",(0,s.jsx)(n.a,{href:"https://blog.tommyku.com/blog/deploying-komga-on-freenas-jail/",children:"tutorial"})," to install Komga on FreeNAS jail."]}),"\n",(0,s.jsx)(n.h2,{id:"yunohost",children:"YunoHost"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://install-app.yunohost.org/?app=komga",children:(0,s.jsx)(n.img,{src:"https://install-app.yunohost.org/install-with-yunohost.svg",alt:"Install Komga with YunoHost"})})}),"\n",(0,s.jsx)(n.h2,{id:"truenas-scale",children:"TrueNAS SCALE"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Open ",(0,s.jsx)(n.code,{children:"Apps"})," then go to ",(0,s.jsx)(n.code,{children:"Discover Apps"})," and then search for ",(0,s.jsx)(n.code,{children:"Komga"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click on ",(0,s.jsx)(n.code,{children:"Komga"})," and then click on ",(0,s.jsx)(n.code,{children:"Install"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Leave everything as default, except:","\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Optional: Under ",(0,s.jsx)(n.code,{children:"Network Configuration"})," you can change the ",(0,s.jsx)(n.code,{children:"Web Port"}),". This is the port at which you can later access Komga."]}),"\n",(0,s.jsxs)(n.li,{children:["Optional: Under ",(0,s.jsx)(n.code,{children:"Storage Configuration"})," you can add the location to wherever your media files are currently stored by clicking ",(0,s.jsx)(n.code,{children:"Add"})," next to ",(0,s.jsx)(n.code,{children:"Additional Storage"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.code,{children:"Install"}),"."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>o});var s=i(3696);const t={},a=s.createContext(t);function l(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/55519d27.6972ea0e.js b/assets/js/55519d27.6972ea0e.js new file mode 100644 index 00000000..c9f3cc06 --- /dev/null +++ b/assets/js/55519d27.6972ea0e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[577],{2428:(e,i,r)=>{r.r(i),r.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var s=r(2540),n=r(3023);const a={},t="Libraries",l={id:"guides/libraries",title:"Libraries",description:"You can separate content in different libraries, a library is a group of books. Libraries access can also be restricted to specific users.",source:"@site/docs/guides/libraries.md",sourceDirName:"guides",slug:"/guides/libraries",permalink:"/docs/guides/libraries",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/libraries.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Desktop Application",permalink:"/docs/guides/desktop"},next:{title:"Emptying Library Trash",permalink:"/docs/guides/trash"}},o={},c=[{value:"Creating libraries",id:"creating-libraries",level:2},{value:"Scanner",id:"scanner",level:3},{value:"Empty trash automatically after every scan",id:"empty-trash-automatically-after-every-scan",level:4},{value:"Force directory modified time",id:"force-directory-modified-time",level:4},{value:"Scan on startup",id:"scan-on-startup",level:4},{value:"Scan interval",id:"scan-interval",level:4},{value:"One-Shots directory",id:"one-shots-directory",level:4},{value:"Scan for these file types",id:"scan-for-these-file-types",level:4},{value:"Directory exclusions",id:"directory-exclusions",level:4},{value:"Options",id:"options",level:3},{value:"Analysis",id:"analysis",level:4},{value:"Compute hash for files",id:"compute-hash-for-files",level:5},{value:"Compute hash for pages",id:"compute-hash-for-pages",level:5},{value:"Analyze page dimensions",id:"analyze-page-dimensions",level:5},{value:"File management",id:"file-management",level:4},{value:"Automatically repair incorrect file extensions",id:"automatically-repair-incorrect-file-extensions",level:5},{value:"Automatically convert to CBZ",id:"automatically-convert-to-cbz",level:5},{value:"Series cover",id:"series-cover",level:4},{value:"Metadata",id:"metadata",level:3},{value:"Edit a library",id:"edit-a-library",level:2},{value:"Delete a library",id:"delete-a-library",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"libraries",children:"Libraries"})}),"\n",(0,s.jsx)(i.p,{children:"You can separate content in different libraries, a library is a group of books. Libraries access can also be restricted to specific users."}),"\n",(0,s.jsx)(i.p,{children:"Each library has a root folder, and no library can share any part of their path."}),"\n",(0,s.jsxs)(i.p,{children:["For example if you have a library with a root path of ",(0,s.jsx)(i.code,{children:"/books/mangas"}),", you can't create a library with a root path of ",(0,s.jsx)(i.code,{children:"/books"}),", because the two root paths would overlap. You can however create a library with a root path of ",(0,s.jsx)(i.code,{children:"/books/comics"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"creating-libraries",children:"Creating libraries"}),"\n",(0,s.jsx)(i.p,{children:"From the web interface:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["click on the ",(0,s.jsx)(i.em,{children:"+"})," icon next to ",(0,s.jsx)(i.em,{children:"Libraries"})," in the sidebar ",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add.png",style:{verticalAlign:"middle",maxHeight:"32px"}})]}),"\n",(0,s.jsxs)(i.li,{children:["choose a ",(0,s.jsx)(i.em,{children:"Name"})," for your library"]}),"\n",(0,s.jsxs)(i.li,{children:["click the ",(0,s.jsx)(i.em,{children:"Browse"})," button and select a root folder containing your books"]}),"\n",(0,s.jsxs)(i.li,{children:["click ",(0,s.jsx)(i.em,{children:"Add"})]}),"\n"]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add-dialog.png",style:{maxHeight:"300px"},alt:"Add Library Dialog"}),"\n",(0,s.jsx)(i.p,{children:"You can also specify extra options."}),"\n",(0,s.jsx)(i.h3,{id:"scanner",children:"Scanner"}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add-scanner.png",style:{maxHeight:"400px"},alt:"Add Library Dialog Scanner"}),"\n",(0,s.jsx)(i.h4,{id:"empty-trash-automatically-after-every-scan",children:"Empty trash automatically after every scan"}),"\n",(0,s.jsxs)(i.p,{children:["See ",(0,s.jsx)(i.a,{href:"/docs/guides/trash#automatically-empty-trash",children:"Emptying library trash"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"force-directory-modified-time",children:"Force directory modified time"}),"\n",(0,s.jsx)(i.p,{children:"This will force the last modified time of a directory as the maximum from its own last modified time and the last modified time from all the books inside the directory. This should be used only if your filesystem does not update the last modified time of a directory when files inside it are modified (Google Drive for instance)."}),"\n",(0,s.jsx)(i.h4,{id:"scan-on-startup",children:"Scan on startup"}),"\n",(0,s.jsx)(i.p,{children:"If enabled, the library will be scanned when Komga starts."}),"\n",(0,s.jsx)(i.h4,{id:"scan-interval",children:"Scan interval"}),"\n",(0,s.jsx)(i.p,{children:"Choose to scan all of your libraries on a time-based interval. Choose the interval to use from the dropdown. Available frequencies:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"disabled"}),"\n",(0,s.jsx)(i.li,{children:"hourly"}),"\n",(0,s.jsx)(i.li,{children:"every 6 hours"}),"\n",(0,s.jsx)(i.li,{children:"every 12 hours"}),"\n",(0,s.jsx)(i.li,{children:"daily"}),"\n",(0,s.jsx)(i.li,{children:"weekly"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The scan interval is based on when Komga started, or when you changed that setting for the library. For instance, if you have it set to \u201cevery 6 hours\u201d and you start your server at 12:35, then a scan will be started around 18:35."}),"\n",(0,s.jsx)(i.h4,{id:"one-shots-directory",children:"One-Shots directory"}),"\n",(0,s.jsxs)(i.p,{children:["See ",(0,s.jsx)(i.a,{href:"/docs/guides/oneshots",children:"One-Shots"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"scan-for-these-file-types",children:"Scan for these file types"}),"\n",(0,s.jsx)(i.p,{children:"This will configure the scanner to only look for files with specific file extensions. Available types:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Comic Book archives: ",(0,s.jsx)(i.code,{children:"cbz"}),", ",(0,s.jsx)(i.code,{children:"zip"}),", ",(0,s.jsx)(i.code,{children:"cbr"}),", ",(0,s.jsx)(i.code,{children:"rar"})]}),"\n",(0,s.jsxs)(i.li,{children:["PDF: ",(0,s.jsx)(i.code,{children:"pdf"})]}),"\n",(0,s.jsxs)(i.li,{children:["Epub: ",(0,s.jsx)(i.code,{children:"epub"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"directory-exclusions",children:"Directory exclusions"}),"\n",(0,s.jsx)(i.p,{children:"You can specify any pattern to exclude directory subtrees from the scan."}),"\n",(0,s.jsx)(i.p,{children:"Any directory for which the full path contains any of the configured patterns will be ignored during the scan."}),"\n",(0,s.jsxs)(i.p,{children:["Patterns are checked against ",(0,s.jsx)(i.strong,{children:"any part of the directory path"}),":"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"#recycle"})," will match on:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"/data/books/Comics/#recycle"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"/data/books/Comics/My weirdly named #recycle comic"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.admonition,{type:"tip",children:(0,s.jsxs)(i.p,{children:["To match only directories starting with the provided string, prefix the pattern with ",(0,s.jsx)(i.code,{children:"/"}),", like ",(0,s.jsx)(i.code,{children:"/#recycle"})]})}),"\n",(0,s.jsx)(i.h3,{id:"options",children:"Options"}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add-options.png",style:{maxHeight:"500px"},alt:"Add Library Dialog Options"}),"\n",(0,s.jsx)(i.h4,{id:"analysis",children:"Analysis"}),"\n",(0,s.jsx)(i.h5,{id:"compute-hash-for-files",children:"Compute hash for files"}),"\n",(0,s.jsx)(i.p,{children:'Komga will compute a filehash for your files. This is required for the "restore from trash bin" functionality to work, and to detect duplicate files.'}),"\n",(0,s.jsx)(i.p,{children:"This can consume lots of resources on large libraries or slow hardware."}),"\n",(0,s.jsx)(i.h5,{id:"compute-hash-for-pages",children:"Compute hash for pages"}),"\n",(0,s.jsxs)(i.p,{children:["Komga will compute a filehash for the first and last 3 pages in each book (",(0,s.jsx)(i.code,{children:"cbz"})," only). Those are used to detect duplicate pages."]}),"\n",(0,s.jsx)(i.p,{children:"This can consume lots of resources on large libraries or slow hardware."}),"\n",(0,s.jsx)(i.h5,{id:"analyze-page-dimensions",children:"Analyze page dimensions"}),"\n",(0,s.jsx)(i.p,{children:"Komga will retrieve each page's dimensions (width and height). This is useful for:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"properly displaying landscape pages in the web reader, when using double pages"}),"\n",(0,s.jsx)(i.li,{children:'comparing page dimensions in the "Import" dialog'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"This can consume lots of resources on large libraries or slow hardware."}),"\n",(0,s.jsx)(i.h4,{id:"file-management",children:"File management"}),"\n",(0,s.jsx)(i.h5,{id:"automatically-repair-incorrect-file-extensions",children:"Automatically repair incorrect file extensions"}),"\n",(0,s.jsxs)(i.p,{children:["Files with an incorrect extension will be automatically renamed in the background. For example a ",(0,s.jsx)(i.code,{children:"zip"})," file with a ",(0,s.jsx)(i.code,{children:".cbr"})," extension will be renamed to ",(0,s.jsx)(i.code,{children:".cbz"}),"."]}),"\n",(0,s.jsx)(i.h5,{id:"automatically-convert-to-cbz",children:"Automatically convert to CBZ"}),"\n",(0,s.jsxs)(i.p,{children:["Books in ",(0,s.jsx)(i.code,{children:"rar"}),"/",(0,s.jsx)(i.code,{children:"cbr"})," format will be converted to ",(0,s.jsx)(i.code,{children:"cbz"})," automatically in the background. The ",(0,s.jsx)(i.code,{children:"zip"})," files are created with the ",(0,s.jsx)(i.code,{children:"DEFLATE"})," method without compression."]}),"\n",(0,s.jsx)(i.h4,{id:"series-cover",children:"Series cover"}),"\n",(0,s.jsx)(i.p,{children:"Choose which book cover is used for the series."}),"\n",(0,s.jsx)(i.h3,{id:"metadata",children:"Metadata"}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add-metadata.png",style:{maxHeight:"600px"},alt:"Add Library Dialog Metadata"}),"\n",(0,s.jsxs)(i.p,{children:["Check the ",(0,s.jsx)(i.a,{href:"/docs/guides/scan-analysis-refresh#refresh-metadata",children:"Refresh Metadata"})," section to know more about what they do."]}),"\n",(0,s.jsx)(i.h2,{id:"edit-a-library",children:"Edit a library"}),"\n",(0,s.jsxs)(i.p,{children:["To edit a library, look for the action menu icon ",(0,s.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,s.jsx)(i.em,{children:"Edit"}),"."]}),"\n",(0,s.jsxs)(i.admonition,{type:"warning",children:[(0,s.jsxs)(i.p,{children:["If you change the root folder of a library, and ",(0,s.jsx)(i.strong,{children:"the new path doesn't share anything with the previous path"}),", you will lose all your series, books and read progress for that library."]}),(0,s.jsxs)(i.p,{children:["If you change the path ",(0,s.jsx)(i.strong,{children:"for a parent directory of the current path"}),", you will not lose your content."]}),(0,s.jsxs)(i.p,{children:["If you change the path ",(0,s.jsx)(i.strong,{children:"for a child directory of the current path"}),", you will lose part of your content."]})]}),"\n",(0,s.jsx)(i.h2,{id:"delete-a-library",children:"Delete a library"}),"\n",(0,s.jsxs)(i.p,{children:["To delete a library, look for the action menu icon ",(0,s.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,s.jsx)(i.em,{children:"Delete"}),"."]}),"\n",(0,s.jsxs)(i.admonition,{type:"danger",children:[(0,s.jsx)(i.p,{children:"Deleting a library will remove all series and books contained in this library. Read progress for all those books will be deleted."}),(0,s.jsx)(i.p,{children:"Your media files will not be affected."}),(0,s.jsx)(i.p,{children:"This cannot be undone."})]})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},3023:(e,i,r)=>{r.d(i,{R:()=>t,x:()=>l});var s=r(3696);const n={},a=s.createContext(n);function t(e){const i=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:t(e.components),s.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/55519d27.af79e886.js b/assets/js/55519d27.af79e886.js deleted file mode 100644 index e74a56b0..00000000 --- a/assets/js/55519d27.af79e886.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[577],{2428:(e,i,r)=>{r.r(i),r.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var s=r(2540),n=r(3023);const a={},t="Libraries",l={id:"guides/libraries",title:"Libraries",description:"You can separate content in different libraries, a library is a group of books. Libraries access can also be restricted to specific users.",source:"@site/docs/guides/libraries.md",sourceDirName:"guides",slug:"/guides/libraries",permalink:"/docs/guides/libraries",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/libraries.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Desktop Application",permalink:"/docs/guides/desktop"},next:{title:"Emptying Library Trash",permalink:"/docs/guides/trash"}},o={},c=[{value:"Creating libraries",id:"creating-libraries",level:2},{value:"Scanner",id:"scanner",level:3},{value:"Empty trash automatically after every scan",id:"empty-trash-automatically-after-every-scan",level:4},{value:"Force directory modified time",id:"force-directory-modified-time",level:4},{value:"Scan on startup",id:"scan-on-startup",level:4},{value:"Scan interval",id:"scan-interval",level:4},{value:"One-Shots directory",id:"one-shots-directory",level:4},{value:"Scan for these file types",id:"scan-for-these-file-types",level:4},{value:"Directory exclusions",id:"directory-exclusions",level:4},{value:"Options",id:"options",level:3},{value:"Analysis",id:"analysis",level:4},{value:"Compute hash for files",id:"compute-hash-for-files",level:5},{value:"Compute hash for pages",id:"compute-hash-for-pages",level:5},{value:"Analyze page dimensions",id:"analyze-page-dimensions",level:5},{value:"File management",id:"file-management",level:4},{value:"Automatically repair incorrect file extensions",id:"automatically-repair-incorrect-file-extensions",level:5},{value:"Automatically convert to CBZ",id:"automatically-convert-to-cbz",level:5},{value:"Series cover",id:"series-cover",level:4},{value:"Metadata",id:"metadata",level:3},{value:"Edit a library",id:"edit-a-library",level:2},{value:"Delete a library",id:"delete-a-library",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"libraries",children:"Libraries"})}),"\n",(0,s.jsx)(i.p,{children:"You can separate content in different libraries, a library is a group of books. Libraries access can also be restricted to specific users."}),"\n",(0,s.jsx)(i.p,{children:"Each library has a root folder, and no library can share any part of their path."}),"\n",(0,s.jsxs)(i.p,{children:["For example if you have a library with a root path of ",(0,s.jsx)(i.code,{children:"/books/mangas"}),", you can't create a library with a root path of ",(0,s.jsx)(i.code,{children:"/books"}),", because the two root paths would overlap. You can however create a library with a root path of ",(0,s.jsx)(i.code,{children:"/books/comics"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"creating-libraries",children:"Creating libraries"}),"\n",(0,s.jsx)(i.p,{children:"From the web interface:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["click on the ",(0,s.jsx)(i.em,{children:"+"})," icon next to ",(0,s.jsx)(i.em,{children:"Libraries"})," in the sidebar ",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add.png",style:{verticalAlign:"middle",maxHeight:"32px"}})]}),"\n",(0,s.jsxs)(i.li,{children:["choose a ",(0,s.jsx)(i.em,{children:"Name"})," for your library"]}),"\n",(0,s.jsxs)(i.li,{children:["click the ",(0,s.jsx)(i.em,{children:"Browse"})," button and select a root folder containing your books"]}),"\n",(0,s.jsxs)(i.li,{children:["click ",(0,s.jsx)(i.em,{children:"Add"})]}),"\n"]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add-dialog.png",style:{maxHeight:"300px"},alt:"Add Library Dialog"}),"\n",(0,s.jsx)(i.p,{children:"You can also specify extra options."}),"\n",(0,s.jsx)(i.h3,{id:"scanner",children:"Scanner"}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add-scanner.png",style:{maxHeight:"400px"},alt:"Add Library Dialog Scanner"}),"\n",(0,s.jsx)(i.h4,{id:"empty-trash-automatically-after-every-scan",children:"Empty trash automatically after every scan"}),"\n",(0,s.jsxs)(i.p,{children:["See ",(0,s.jsx)(i.a,{href:"/docs/guides/trash#automatically-empty-trash",children:"Emptying library trash"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"force-directory-modified-time",children:"Force directory modified time"}),"\n",(0,s.jsx)(i.p,{children:"This will force the last modified time of a directory as the maximum from its own last modified time and the last modified time from all the books inside the directory. This should be used only if your filesystem does not update the last modified time of a directory when files inside it are modified (Google Drive for instance)."}),"\n",(0,s.jsx)(i.h4,{id:"scan-on-startup",children:"Scan on startup"}),"\n",(0,s.jsx)(i.p,{children:"If enabled, the library will be scanned when Komga starts."}),"\n",(0,s.jsx)(i.h4,{id:"scan-interval",children:"Scan interval"}),"\n",(0,s.jsx)(i.p,{children:"Choose to scan all of your libraries on a time-based interval. Choose the interval to use from the dropdown. Available frequencies:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"disabled"}),"\n",(0,s.jsx)(i.li,{children:"hourly"}),"\n",(0,s.jsx)(i.li,{children:"every 6 hours"}),"\n",(0,s.jsx)(i.li,{children:"every 12 hours"}),"\n",(0,s.jsx)(i.li,{children:"daily"}),"\n",(0,s.jsx)(i.li,{children:"weekly"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The scan interval is based on when Komga started, or when you changed that setting for the library. For instance, if you have it set to \u201cevery 6 hours\u201d and you start your server at 12:35, then a scan will be started around 18:35."}),"\n",(0,s.jsx)(i.h4,{id:"one-shots-directory",children:"One-Shots directory"}),"\n",(0,s.jsxs)(i.p,{children:["See ",(0,s.jsx)(i.a,{href:"/docs/guides/oneshots",children:"One-Shots"}),"."]}),"\n",(0,s.jsx)(i.h4,{id:"scan-for-these-file-types",children:"Scan for these file types"}),"\n",(0,s.jsx)(i.p,{children:"This will configure the scanner to only look for files with specific file extensions. Available types:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Comic Book archives: ",(0,s.jsx)(i.code,{children:"cbz"}),", ",(0,s.jsx)(i.code,{children:"zip"}),", ",(0,s.jsx)(i.code,{children:"cbr"}),", ",(0,s.jsx)(i.code,{children:"rar"})]}),"\n",(0,s.jsxs)(i.li,{children:["PDF: ",(0,s.jsx)(i.code,{children:"pdf"})]}),"\n",(0,s.jsxs)(i.li,{children:["Epub: ",(0,s.jsx)(i.code,{children:"epub"})]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"directory-exclusions",children:"Directory exclusions"}),"\n",(0,s.jsx)(i.p,{children:"You can specify any pattern to exclude directory subtrees from the scan."}),"\n",(0,s.jsx)(i.p,{children:"Any directory for which the full path contains any of the configured patterns will be ignored during the scan."}),"\n",(0,s.jsxs)(i.p,{children:["Patterns are checked against ",(0,s.jsx)(i.strong,{children:"any part of the directory path"}),":"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"#recycle"})," will match on:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"/data/books/Comics/#recycle"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.code,{children:"/data/books/Comics/My weirdly named #recycle comic"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.admonition,{type:"tip",children:(0,s.jsxs)(i.p,{children:["To match only directories starting with the provided string, prefix the pattern with ",(0,s.jsx)(i.code,{children:"/"}),", like ",(0,s.jsx)(i.code,{children:"/#recycle"})]})}),"\n",(0,s.jsx)(i.h3,{id:"options",children:"Options"}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add-options.png",style:{maxHeight:"500px"},alt:"Add Library Dialog Options"}),"\n",(0,s.jsx)(i.h4,{id:"analysis",children:"Analysis"}),"\n",(0,s.jsx)(i.h5,{id:"compute-hash-for-files",children:"Compute hash for files"}),"\n",(0,s.jsx)(i.p,{children:'Komga will compute a filehash for your files. This is required for the "restore from trash bin" functionality to work, and to detect duplicate files.'}),"\n",(0,s.jsx)(i.p,{children:"This can consume lots of resources on large libraries or slow hardware."}),"\n",(0,s.jsx)(i.h5,{id:"compute-hash-for-pages",children:"Compute hash for pages"}),"\n",(0,s.jsxs)(i.p,{children:["Komga will compute a filehash for the first and last 3 pages in each book (",(0,s.jsx)(i.code,{children:"cbz"})," only). Those are used to detect duplicate pages."]}),"\n",(0,s.jsx)(i.p,{children:"This can consume lots of resources on large libraries or slow hardware."}),"\n",(0,s.jsx)(i.h5,{id:"analyze-page-dimensions",children:"Analyze page dimensions"}),"\n",(0,s.jsx)(i.p,{children:"Komga will retrieve each page's dimensions (width and height). This is useful for:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"properly displaying landscape pages in the web reader, when using double pages"}),"\n",(0,s.jsx)(i.li,{children:'comparing page dimensions in the "Import" dialog'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"This can consume lots of resources on large libraries or slow hardware."}),"\n",(0,s.jsx)(i.h4,{id:"file-management",children:"File management"}),"\n",(0,s.jsx)(i.h5,{id:"automatically-repair-incorrect-file-extensions",children:"Automatically repair incorrect file extensions"}),"\n",(0,s.jsxs)(i.p,{children:["Files with an incorrect extension will be automatically renamed in the background. For example a ",(0,s.jsx)(i.code,{children:"zip"})," file with a ",(0,s.jsx)(i.code,{children:".cbr"})," extension will be renamed to ",(0,s.jsx)(i.code,{children:".cbz"}),"."]}),"\n",(0,s.jsx)(i.h5,{id:"automatically-convert-to-cbz",children:"Automatically convert to CBZ"}),"\n",(0,s.jsxs)(i.p,{children:["Books in ",(0,s.jsx)(i.code,{children:"rar"}),"/",(0,s.jsx)(i.code,{children:"cbr"})," format will be converted to ",(0,s.jsx)(i.code,{children:"cbz"})," automatically in the background. The ",(0,s.jsx)(i.code,{children:"zip"})," files are created with the ",(0,s.jsx)(i.code,{children:"DEFLATE"})," method without compression."]}),"\n",(0,s.jsx)(i.h4,{id:"series-cover",children:"Series cover"}),"\n",(0,s.jsx)(i.p,{children:"Choose which book cover is used for the series."}),"\n",(0,s.jsx)(i.h3,{id:"metadata",children:"Metadata"}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/libraries/library-add-metadata.png",style:{maxHeight:"600px"},alt:"Add Library Dialog Metadata"}),"\n",(0,s.jsxs)(i.p,{children:["Check the ",(0,s.jsx)(i.a,{href:"/docs/guides/scan-analysis-refresh#refresh-metadata",children:"Refresh Metadata"})," section to know more about what they do."]}),"\n",(0,s.jsx)(i.h2,{id:"edit-a-library",children:"Edit a library"}),"\n",(0,s.jsxs)(i.p,{children:["To edit a library, look for the action menu icon ",(0,s.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,s.jsx)(i.em,{children:"Edit"}),"."]}),"\n",(0,s.jsxs)(i.admonition,{type:"warning",children:[(0,s.jsxs)(i.p,{children:["If you change the root folder of a library, and ",(0,s.jsx)(i.strong,{children:"the new path doesn't share anything with the previous path"}),", you will lose all your series, books and read progress for that library."]}),(0,s.jsxs)(i.p,{children:["If you change the path ",(0,s.jsx)(i.strong,{children:"for a parent directory of the current path"}),", you will not lose your content."]}),(0,s.jsxs)(i.p,{children:["If you change the path ",(0,s.jsx)(i.strong,{children:"for a child directory of the current path"}),", you will lose part of your content."]})]}),"\n",(0,s.jsx)(i.h2,{id:"delete-a-library",children:"Delete a library"}),"\n",(0,s.jsxs)(i.p,{children:["To delete a library, look for the action menu icon ",(0,s.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,s.jsx)(i.em,{children:"Delete"}),"."]}),"\n",(0,s.jsxs)(i.admonition,{type:"danger",children:[(0,s.jsx)(i.p,{children:"Deleting a library will remove all series and books contained in this library. Read progress for all those books will be deleted."}),(0,s.jsx)(i.p,{children:"Your media files will not be affected."}),(0,s.jsx)(i.p,{children:"This cannot be undone."})]})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},3023:(e,i,r)=>{r.d(i,{R:()=>t,x:()=>l});var s=r(3696);const n={},a=s.createContext(n);function t(e){const i=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:t(e.components),s.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5592dbb1.5f4abf6a.js b/assets/js/5592dbb1.5f4abf6a.js deleted file mode 100644 index ceebc56d..00000000 --- a/assets/js/5592dbb1.5f4abf6a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4689],{8695:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=i(2540),o=i(3023);const s={},r="Desktop Application",a={id:"guides/desktop",title:"Desktop Application",description:"The Desktop application runs in your menu bar / tray icon:",source:"@site/docs/guides/desktop.md",sourceDirName:"guides",slug:"/guides/desktop",permalink:"/docs/guides/desktop",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/desktop.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Accessing the web interface",permalink:"/docs/guides/webui"},next:{title:"Libraries",permalink:"/docs/guides/libraries"}},c={},l=[];function p(e){const t={a:"a",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"desktop-application",children:"Desktop Application"})}),"\n",(0,n.jsx)(t.p,{children:"The Desktop application runs in your menu bar / tray icon:"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/desktop/desktop-menu.png",style:{maxHeight:"200px"},alt:"Desktop application menu"}),"\n",(0,n.jsx)(t.p,{children:"From the menu you can:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Open Komga: this will open the ",(0,n.jsx)(t.a,{href:"/docs/guides/webui",children:"web interface"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Show log file: this will open a file explorer at the location of the log file."}),"\n",(0,n.jsx)(t.li,{children:"Open configuration directory: this will open a file explorer at the location of the configuration directory."}),"\n",(0,n.jsx)(t.li,{children:"Quit Komga: this will stop Komga and exit the application."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},3023:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var n=i(3696);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5592dbb1.b1b9efbf.js b/assets/js/5592dbb1.b1b9efbf.js new file mode 100644 index 00000000..ed83cfde --- /dev/null +++ b/assets/js/5592dbb1.b1b9efbf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4689],{8695:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var n=i(2540),o=i(3023);const s={},r="Desktop Application",a={id:"guides/desktop",title:"Desktop Application",description:"The Desktop application runs in your menu bar / tray icon:",source:"@site/docs/guides/desktop.md",sourceDirName:"guides",slug:"/guides/desktop",permalink:"/docs/guides/desktop",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/desktop.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Accessing the web interface",permalink:"/docs/guides/webui"},next:{title:"Libraries",permalink:"/docs/guides/libraries"}},c={},l=[];function p(e){const t={a:"a",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"desktop-application",children:"Desktop Application"})}),"\n",(0,n.jsx)(t.p,{children:"The Desktop application runs in your menu bar / tray icon:"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/desktop/desktop-menu.png",style:{maxHeight:"200px"},alt:"Desktop application menu"}),"\n",(0,n.jsx)(t.p,{children:"From the menu you can:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Open Komga: this will open the ",(0,n.jsx)(t.a,{href:"/docs/guides/webui",children:"web interface"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"Show log file: this will open a file explorer at the location of the log file."}),"\n",(0,n.jsx)(t.li,{children:"Open configuration directory: this will open a file explorer at the location of the configuration directory."}),"\n",(0,n.jsx)(t.li,{children:"Quit Komga: this will stop Komga and exit the application."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},3023:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var n=i(3696);const o={},s=n.createContext(o);function r(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/58903ab2.86bc1eb9.js b/assets/js/58903ab2.86bc1eb9.js deleted file mode 100644 index cb6931bc..00000000 --- a/assets/js/58903ab2.86bc1eb9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[983],{9986:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>r});var a=n(2540),i=n(3023);const s={},o="Install the Desktop application",l={id:"installation/desktop",title:"Install the Desktop application",description:"You can install Komga from the Download page. Just follow the instructions on the page.",source:"@site/docs/installation/desktop.md",sourceDirName:"installation",slug:"/installation/desktop",permalink:"/docs/installation/desktop",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/desktop.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install from the Microsoft Store",permalink:"/docs/installation/ms-store"},next:{title:"Run with Docker",permalink:"/docs/installation/docker"}},d={},r=[{value:"Updating",id:"updating",level:2},{value:"Windows",id:"windows",level:3},{value:"macOS",id:"macos",level:3},{value:"Linux",id:"linux",level:3},{value:"Read next",id:"read-next",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"install-the-desktop-application",children:"Install the Desktop application"})}),"\n",(0,a.jsxs)(t.p,{children:["You can install Komga from the ",(0,a.jsx)(t.a,{href:"https://download.komga.org",children:"Download page"}),". Just follow the instructions on the page."]}),"\n",(0,a.jsx)(t.p,{children:"The desktop application is available for Windows, macOS and Linux."}),"\n",(0,a.jsx)(t.h2,{id:"updating",children:"Updating"}),"\n",(0,a.jsx)(t.p,{children:"The application will automatically update itself when a new version is available."}),"\n",(0,a.jsx)(t.h3,{id:"windows",children:"Windows"}),"\n",(0,a.jsx)(t.p,{children:"The OS itself will check for updates every 8 hours and upgrade the app in the background, even if it's not being used. Users will never see an update prompt."}),"\n",(0,a.jsx)(t.h3,{id:"macos",children:"macOS"}),"\n",(0,a.jsx)(t.p,{children:"The app will check for updates on startup without blocking the user, and on a schedule whilst the app runs. Once the user agrees, updates will be downloaded and applied in the background ready for the next launch."}),"\n",(0,a.jsx)(t.h3,{id:"linux",children:"Linux"}),"\n",(0,a.jsx)(t.p,{children:"An update check will be performed synchronously on each app start. If a new version is available then the update process will start and the update downloaded and applied, without any user interaction being required."}),"\n",(0,a.jsx)(t.h2,{id:"read-next",children:"Read next"}),"\n",(0,a.jsxs)(t.p,{children:["Check the ",(0,a.jsx)(t.a,{href:"/docs/guides/desktop",children:"Desktop Application"})," page."]})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>l});var a=n(3696);const i={},s=a.createContext(i);function o(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/58903ab2.b8a01bdc.js b/assets/js/58903ab2.b8a01bdc.js new file mode 100644 index 00000000..e49369c4 --- /dev/null +++ b/assets/js/58903ab2.b8a01bdc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[983],{9986:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>r});var a=n(2540),i=n(3023);const s={},o="Install the Desktop application",l={id:"installation/desktop",title:"Install the Desktop application",description:"You can install Komga from the Download page. Just follow the instructions on the page.",source:"@site/docs/installation/desktop.md",sourceDirName:"installation",slug:"/installation/desktop",permalink:"/docs/installation/desktop",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/desktop.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install from the Microsoft Store",permalink:"/docs/installation/ms-store"},next:{title:"Run with Docker",permalink:"/docs/installation/docker"}},d={},r=[{value:"Updating",id:"updating",level:2},{value:"Windows",id:"windows",level:3},{value:"macOS",id:"macos",level:3},{value:"Linux",id:"linux",level:3},{value:"Read next",id:"read-next",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"install-the-desktop-application",children:"Install the Desktop application"})}),"\n",(0,a.jsxs)(t.p,{children:["You can install Komga from the ",(0,a.jsx)(t.a,{href:"https://download.komga.org",children:"Download page"}),". Just follow the instructions on the page."]}),"\n",(0,a.jsx)(t.p,{children:"The desktop application is available for Windows, macOS and Linux."}),"\n",(0,a.jsx)(t.h2,{id:"updating",children:"Updating"}),"\n",(0,a.jsx)(t.p,{children:"The application will automatically update itself when a new version is available."}),"\n",(0,a.jsx)(t.h3,{id:"windows",children:"Windows"}),"\n",(0,a.jsx)(t.p,{children:"The OS itself will check for updates every 8 hours and upgrade the app in the background, even if it's not being used. Users will never see an update prompt."}),"\n",(0,a.jsx)(t.h3,{id:"macos",children:"macOS"}),"\n",(0,a.jsx)(t.p,{children:"The app will check for updates on startup without blocking the user, and on a schedule whilst the app runs. Once the user agrees, updates will be downloaded and applied in the background ready for the next launch."}),"\n",(0,a.jsx)(t.h3,{id:"linux",children:"Linux"}),"\n",(0,a.jsx)(t.p,{children:"An update check will be performed synchronously on each app start. If a new version is available then the update process will start and the update downloaded and applied, without any user interaction being required."}),"\n",(0,a.jsx)(t.h2,{id:"read-next",children:"Read next"}),"\n",(0,a.jsxs)(t.p,{children:["Check the ",(0,a.jsx)(t.a,{href:"/docs/guides/desktop",children:"Desktop Application"})," page."]})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>l});var a=n(3696);const i={},s=a.createContext(i);function o(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5ef0e9d6.86e97811.js b/assets/js/5ef0e9d6.86e97811.js deleted file mode 100644 index d19776df..00000000 --- a/assets/js/5ef0e9d6.86e97811.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[911],{392:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var n=a(2540),i=a(3023);const o={},s="Community",r={id:"community",title:"Community",description:"This page lists community applications or tools that can be used alongside Komga.",source:"@site/docs/community.md",sourceDirName:".",slug:"/community",permalink:"/docs/community",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/community.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Contribution",permalink:"/docs/contribution"},next:{title:"Frequently Asked Questions",permalink:"/docs/faq"}},l={},c=[{value:"Komf",id:"komf",level:2},{value:"Kurp",id:"kurp",level:2},{value:"Manga Manager",id:"manga-manager",level:2},{value:"KoMI",id:"komi",level:2},{value:"Mylar League",id:"mylar-league",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"community",children:"Community"})}),"\n",(0,n.jsx)(t.p,{children:"This page lists community applications or tools that can be used alongside Komga."}),"\n",(0,n.jsx)(t.h2,{id:"komf",children:"Komf"}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/Snd-R/komf",children:"Komga and Kavita Metadata Fetcher"})," is a tool that fetches metadata and thumbnails for your digital comic book library. It can automatically pick up added series and update their metadata and thumbnail."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"kurp",children:"Kurp"}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/Snd-R/kurp",children:"Komga and Kavita upscaling reverse proxy"}),". Reverse proxy that intercepts image requests and applies upscaling. Other requests are transparently proxied without noticable delay"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"manga-manager",children:"Manga Manager"}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/MangaManagerORG/Manga-Manager",children:"Manga Manager"})," is an all-in-one tool to make managing your manga library easy. Has a built-in metadata editor as well as cover and back cover editor."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"komi",children:"KoMI"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/edwinbadillo/KoMI",children:"KoMI"})," is a user script that adds buttons in the series page to perform metadata matching with online sources."]}),"\n",(0,n.jsx)(t.h2,{id:"mylar-league",children:"Mylar League"}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/flips22/mylar-league",children:"Mylar League"})," is a collection of various tools to aid in the integration of mylar and komga with leagueofcomicgeeks.com."]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},3023:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>r});var n=a(3696);const i={},o=n.createContext(i);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5ef0e9d6.b0ab1590.js b/assets/js/5ef0e9d6.b0ab1590.js new file mode 100644 index 00000000..5b6c725e --- /dev/null +++ b/assets/js/5ef0e9d6.b0ab1590.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[911],{392:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var n=a(2540),i=a(3023);const o={},s="Community",r={id:"community",title:"Community",description:"This page lists community applications or tools that can be used alongside Komga.",source:"@site/docs/community.md",sourceDirName:".",slug:"/community",permalink:"/docs/community",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/community.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Contribution",permalink:"/docs/contribution"},next:{title:"Frequently Asked Questions",permalink:"/docs/faq"}},l={},c=[{value:"Komf",id:"komf",level:2},{value:"Kurp",id:"kurp",level:2},{value:"Manga Manager",id:"manga-manager",level:2},{value:"KoMI",id:"komi",level:2},{value:"Mylar League",id:"mylar-league",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"community",children:"Community"})}),"\n",(0,n.jsx)(t.p,{children:"This page lists community applications or tools that can be used alongside Komga."}),"\n",(0,n.jsx)(t.h2,{id:"komf",children:"Komf"}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/Snd-R/komf",children:"Komga and Kavita Metadata Fetcher"})," is a tool that fetches metadata and thumbnails for your digital comic book library. It can automatically pick up added series and update their metadata and thumbnail."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"kurp",children:"Kurp"}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/Snd-R/kurp",children:"Komga and Kavita upscaling reverse proxy"}),". Reverse proxy that intercepts image requests and applies upscaling. Other requests are transparently proxied without noticable delay"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"manga-manager",children:"Manga Manager"}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/MangaManagerORG/Manga-Manager",children:"Manga Manager"})," is an all-in-one tool to make managing your manga library easy. Has a built-in metadata editor as well as cover and back cover editor."]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"komi",children:"KoMI"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/edwinbadillo/KoMI",children:"KoMI"})," is a user script that adds buttons in the series page to perform metadata matching with online sources."]}),"\n",(0,n.jsx)(t.h2,{id:"mylar-league",children:"Mylar League"}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/flips22/mylar-league",children:"Mylar League"})," is a collection of various tools to aid in the integration of mylar and komga with leagueofcomicgeeks.com."]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},3023:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>r});var n=a(3696);const i={},o=n.createContext(i);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/607df45e.7e062d2f.js b/assets/js/607df45e.7e062d2f.js deleted file mode 100644 index 090236b6..00000000 --- a/assets/js/607df45e.7e062d2f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8368],{5143:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var t=o(2540),r=o(3023);const i={},s="Google Drive and rclone",a={id:"installation/gdrive",title:"Google Drive and rclone",description:"If your books are stored on Google Drive, you can use Plexdrive or rclone to make them accessible to Komga.",source:"@site/docs/installation/gdrive.md",sourceDirName:"installation",slug:"/installation/gdrive",permalink:"/docs/installation/gdrive",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/gdrive.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Social login",permalink:"/docs/installation/oauth2"},next:{title:"Guides",permalink:"/docs/category/guides"}},c={},l=[];function d(e){const n={a:"a",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"google-drive-and-rclone",children:"Google Drive and rclone"})}),"\n",(0,t.jsxs)(n.p,{children:["If your books are stored on Google Drive, you can use ",(0,t.jsx)(n.a,{href:"https://github.com/plexdrive/plexdrive",children:"Plexdrive"})," or ",(0,t.jsx)(n.a,{href:"https://rclone.org/",children:"rclone"})," to make them accessible to Komga."]}),"\n",(0,t.jsxs)(n.p,{children:["You will need to configure your library to ",(0,t.jsx)(n.a,{href:"/docs/guides/libraries#force-directory-modified-time",children:"force the directory modified time"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Rclone requires some specific configuration to cache files locally, and work better with Komga.\nHere is a user-provided configuration that works well (thanks Magikarp):"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"rclone mount : \\\n --no-checksum \\\n --use-server-modtime \\\n --no-gzip-encoding \\\n --no-update-modtime \\\n --no-seek \\\n --modify-window 2m \\\n --allow-other \\\n --allow-non-empty \\\n --dir-cache-time 30m \\\n --cache-read-retries 15 \\\n --cache-db-purge \\\n --timeout 30m \\\n --vfs-cache-mode full \\\n --vfs-read-chunk-size 2M \\\n --vfs-read-chunk-size-limit 5M \\\n --vfs-cache-max-age 30m \\\n --attr-timeout 20s \\\n --poll-interval 9m \\\n --vfs-cache-poll-interval 10m\n"})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},3023:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var t=o(3696);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/607df45e.9481a27f.js b/assets/js/607df45e.9481a27f.js new file mode 100644 index 00000000..fb54c52b --- /dev/null +++ b/assets/js/607df45e.9481a27f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8368],{5143:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var t=o(2540),r=o(3023);const i={},s="Google Drive and rclone",a={id:"installation/gdrive",title:"Google Drive and rclone",description:"If your books are stored on Google Drive, you can use Plexdrive or rclone to make them accessible to Komga.",source:"@site/docs/installation/gdrive.md",sourceDirName:"installation",slug:"/installation/gdrive",permalink:"/docs/installation/gdrive",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/gdrive.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Social login",permalink:"/docs/installation/oauth2"},next:{title:"Guides",permalink:"/docs/category/guides"}},c={},l=[];function d(e){const n={a:"a",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"google-drive-and-rclone",children:"Google Drive and rclone"})}),"\n",(0,t.jsxs)(n.p,{children:["If your books are stored on Google Drive, you can use ",(0,t.jsx)(n.a,{href:"https://github.com/plexdrive/plexdrive",children:"Plexdrive"})," or ",(0,t.jsx)(n.a,{href:"https://rclone.org/",children:"rclone"})," to make them accessible to Komga."]}),"\n",(0,t.jsxs)(n.p,{children:["You will need to configure your library to ",(0,t.jsx)(n.a,{href:"/docs/guides/libraries#force-directory-modified-time",children:"force the directory modified time"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Rclone requires some specific configuration to cache files locally, and work better with Komga.\nHere is a user-provided configuration that works well (thanks Magikarp):"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"rclone mount : \\\n --no-checksum \\\n --use-server-modtime \\\n --no-gzip-encoding \\\n --no-update-modtime \\\n --no-seek \\\n --modify-window 2m \\\n --allow-other \\\n --allow-non-empty \\\n --dir-cache-time 30m \\\n --cache-read-retries 15 \\\n --cache-db-purge \\\n --timeout 30m \\\n --vfs-cache-mode full \\\n --vfs-read-chunk-size 2M \\\n --vfs-read-chunk-size-limit 5M \\\n --vfs-cache-max-age 30m \\\n --attr-timeout 20s \\\n --poll-interval 9m \\\n --vfs-cache-poll-interval 10m\n"})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},3023:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var t=o(3696);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/674e178f.74a463ec.js b/assets/js/674e178f.74a463ec.js new file mode 100644 index 00000000..24ab91ba --- /dev/null +++ b/assets/js/674e178f.74a463ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[205],{3499:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=t(2540),i=t(3023);const s={},a="Read with CDisplayEx",r={id:"guides/cdisplayex",title:"Read with CDisplayEx",description:"The premium version of CDisplayEx for Android allows you to connect",source:"@site/docs/guides/cdisplayex.md",sourceDirName:"guides",slug:"/guides/cdisplayex",permalink:"/docs/guides/cdisplayex",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/cdisplayex.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Paperback",permalink:"/docs/guides/paperback"},next:{title:"Read with any OPDS reader",permalink:"/docs/guides/opds"}},d={},l=[{value:"Add a new location",id:"add-a-new-location",level:2},{value:"Nested folders",id:"nested-folders",level:2},{value:"Library",id:"library",level:2},{value:"Reading status",id:"reading-status",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"read-with-cdisplayex",children:"Read with CDisplayEx"})}),"\n",(0,o.jsxs)(n.p,{children:["The premium version of ",(0,o.jsx)(n.a,{href:"https://www.cdisplayex.com/mobile/",children:"CDisplayEx"})," for Android allows you to connect\nto Komga using the ",(0,o.jsx)(n.a,{href:"/docs/api/rest#authenticating",children:"REST API"}),"."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["If you have disabled the ",(0,o.jsx)(n.a,{href:"/docs/guides/libraries#analyze-page-dimensions",children:"page dimensions analysis"})," option, re-enable it,\nit is necessary to open books with CDisplayEx."]})}),"\n",(0,o.jsx)(n.h2,{id:"add-a-new-location",children:"Add a new location"}),"\n",(0,o.jsxs)(n.p,{children:["On the home page, use the big ",(0,o.jsx)(n.strong,{children:"+"})," button at the bottom right to add a new location. Then choose the Komga option from the list that appears.\nA dialog box appears asking you to enter some information."]}),"\n",(0,o.jsxs)(n.p,{children:["You can specify an ",(0,o.jsx)(n.strong,{children:"IP Address"})," or a ",(0,o.jsx)(n.strong,{children:"host name"})," to identify the remote server.\nHere are some examples: ",(0,o.jsx)(n.code,{children:"192.168.1.12, computer.local, demo.komga.org, user.host.net/komga"})]}),"\n",(0,o.jsxs)(n.p,{children:["Enter your ",(0,o.jsx)(n.strong,{children:"username"})," and ",(0,o.jsx)(n.strong,{children:"password"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Specify a ",(0,o.jsx)(n.strong,{children:"port"})," number if you are using a different port than the one used by default by the HTTP or HTTPS protocols. If you are using HTTPS, check the ",(0,o.jsx)(n.strong,{children:"SSL"})," option."]}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsx)(n.p,{children:"If you are using a self-signed certificate and don't want to add it to your device, there is an experimental option to disable SSL certificate verification."})}),"\n",(0,o.jsxs)(n.p,{children:["The application uses a ",(0,o.jsx)(n.strong,{children:"virtual folder"})," structure to browse books by library, series, collections and reading lists. Select a folder to\nmake only part of your library accessible. If you want to make everything accessible, leave the ",(0,o.jsx)(n.strong,{children:"path"})," blank."]}),"\n",(0,o.jsxs)(n.p,{children:["Add a ",(0,o.jsx)(n.strong,{children:"description"})," and leave the other options checked."]}),"\n",(0,o.jsxs)(n.p,{children:["Now press the ",(0,o.jsx)(n.strong,{children:"ADD"})," button, the synchronization will start, depending on the size of your library and the performance of your server,\nit may take a few minutes or a few seconds. You will be notified when this operation is complete."]}),"\n",(0,o.jsx)(n.h2,{id:"nested-folders",children:"Nested folders"}),"\n",(0,o.jsx)(n.p,{children:"Without waiting for the synchronization to complete, you can browse folders by tapping on the location that was just\nadded to the home page. In this view, the server must be reachable. You will be able to navigate in a virtual folder structure."}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["To see a thumbnail on the folder and to display statistical information,\nyou must activate the thumbnail option: ",(0,o.jsx)(n.a,{href:"https://www.cdisplayex.com/mobile/settings/#show-a-thumbnail-on-folders",children:"Show a thumbnail on folders"})]})}),"\n",(0,o.jsx)(n.h2,{id:"library",children:"Library"}),"\n",(0,o.jsx)(n.p,{children:"Once the synchronization is complete, the location has been added to the application library, it is accessible offline.\nGo to the series from the home page or by using the navigation bar. If you want to read a book offline you need to download it,\nlong press on the book and use the download button."}),"\n",(0,o.jsx)(n.h2,{id:"reading-status",children:"Reading status"}),"\n",(0,o.jsx)(n.p,{children:"Reading status and read progress are synced at different times when you use the app."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"When you sync location manually. (Make a long press on the location and start the synchronization)"}),"\n",(0,o.jsx)(n.li,{children:"When you browse or refresh a series folder from a location."}),"\n",(0,o.jsx)(n.li,{children:"When you open and close a book."}),"\n",(0,o.jsx)(n.li,{children:"When the app goes into the background while a book is open."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>r});var o=t(3696);const i={},s=o.createContext(i);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/674e178f.94915e06.js b/assets/js/674e178f.94915e06.js deleted file mode 100644 index e3a59ae4..00000000 --- a/assets/js/674e178f.94915e06.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[205],{3499:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=t(2540),i=t(3023);const s={},a="Read with CDisplayEx",r={id:"guides/cdisplayex",title:"Read with CDisplayEx",description:"The premium version of CDisplayEx for Android allows you to connect",source:"@site/docs/guides/cdisplayex.md",sourceDirName:"guides",slug:"/guides/cdisplayex",permalink:"/docs/guides/cdisplayex",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/cdisplayex.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Paperback",permalink:"/docs/guides/paperback"},next:{title:"Read with any OPDS reader",permalink:"/docs/guides/opds"}},d={},l=[{value:"Add a new location",id:"add-a-new-location",level:2},{value:"Nested folders",id:"nested-folders",level:2},{value:"Library",id:"library",level:2},{value:"Reading status",id:"reading-status",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"read-with-cdisplayex",children:"Read with CDisplayEx"})}),"\n",(0,o.jsxs)(n.p,{children:["The premium version of ",(0,o.jsx)(n.a,{href:"https://www.cdisplayex.com/mobile/",children:"CDisplayEx"})," for Android allows you to connect\nto Komga using the ",(0,o.jsx)(n.a,{href:"/docs/api/rest#authenticating",children:"REST API"}),"."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsxs)(n.p,{children:["If you have disabled the ",(0,o.jsx)(n.a,{href:"/docs/guides/libraries#analyze-page-dimensions",children:"page dimensions analysis"})," option, re-enable it,\nit is necessary to open books with CDisplayEx."]})}),"\n",(0,o.jsx)(n.h2,{id:"add-a-new-location",children:"Add a new location"}),"\n",(0,o.jsxs)(n.p,{children:["On the home page, use the big ",(0,o.jsx)(n.strong,{children:"+"})," button at the bottom right to add a new location. Then choose the Komga option from the list that appears.\nA dialog box appears asking you to enter some information."]}),"\n",(0,o.jsxs)(n.p,{children:["You can specify an ",(0,o.jsx)(n.strong,{children:"IP Address"})," or a ",(0,o.jsx)(n.strong,{children:"host name"})," to identify the remote server.\nHere are some examples: ",(0,o.jsx)(n.code,{children:"192.168.1.12, computer.local, demo.komga.org, user.host.net/komga"})]}),"\n",(0,o.jsxs)(n.p,{children:["Enter your ",(0,o.jsx)(n.strong,{children:"username"})," and ",(0,o.jsx)(n.strong,{children:"password"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Specify a ",(0,o.jsx)(n.strong,{children:"port"})," number if you are using a different port than the one used by default by the HTTP or HTTPS protocols. If you are using HTTPS, check the ",(0,o.jsx)(n.strong,{children:"SSL"})," option."]}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsx)(n.p,{children:"If you are using a self-signed certificate and don't want to add it to your device, there is an experimental option to disable SSL certificate verification."})}),"\n",(0,o.jsxs)(n.p,{children:["The application uses a ",(0,o.jsx)(n.strong,{children:"virtual folder"})," structure to browse books by library, series, collections and reading lists. Select a folder to\nmake only part of your library accessible. If you want to make everything accessible, leave the ",(0,o.jsx)(n.strong,{children:"path"})," blank."]}),"\n",(0,o.jsxs)(n.p,{children:["Add a ",(0,o.jsx)(n.strong,{children:"description"})," and leave the other options checked."]}),"\n",(0,o.jsxs)(n.p,{children:["Now press the ",(0,o.jsx)(n.strong,{children:"ADD"})," button, the synchronization will start, depending on the size of your library and the performance of your server,\nit may take a few minutes or a few seconds. You will be notified when this operation is complete."]}),"\n",(0,o.jsx)(n.h2,{id:"nested-folders",children:"Nested folders"}),"\n",(0,o.jsx)(n.p,{children:"Without waiting for the synchronization to complete, you can browse folders by tapping on the location that was just\nadded to the home page. In this view, the server must be reachable. You will be able to navigate in a virtual folder structure."}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["To see a thumbnail on the folder and to display statistical information,\nyou must activate the thumbnail option: ",(0,o.jsx)(n.a,{href:"https://www.cdisplayex.com/mobile/settings/#show-a-thumbnail-on-folders",children:"Show a thumbnail on folders"})]})}),"\n",(0,o.jsx)(n.h2,{id:"library",children:"Library"}),"\n",(0,o.jsx)(n.p,{children:"Once the synchronization is complete, the location has been added to the application library, it is accessible offline.\nGo to the series from the home page or by using the navigation bar. If you want to read a book offline you need to download it,\nlong press on the book and use the download button."}),"\n",(0,o.jsx)(n.h2,{id:"reading-status",children:"Reading status"}),"\n",(0,o.jsx)(n.p,{children:"Reading status and read progress are synced at different times when you use the app."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"When you sync location manually. (Make a long press on the location and start the synchronization)"}),"\n",(0,o.jsx)(n.li,{children:"When you browse or refresh a series folder from a location."}),"\n",(0,o.jsx)(n.li,{children:"When you open and close a book."}),"\n",(0,o.jsx)(n.li,{children:"When the app goes into the background while a book is open."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>r});var o=t(3696);const i={},s=o.createContext(i);function a(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/767395cb.661472fb.js b/assets/js/767395cb.661472fb.js deleted file mode 100644 index 9004a52d..00000000 --- a/assets/js/767395cb.661472fb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4103],{7439:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=n(2540),r=n(3023);const s={},i="Expose your server",a={id:"installation/https",title:"Expose your server",description:"HTTPS",source:"@site/docs/installation/https.md",sourceDirName:"installation",slug:"/installation/https",permalink:"/docs/installation/https",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/https.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Configuration options",permalink:"/docs/installation/configuration"},next:{title:"Social login",permalink:"/docs/installation/oauth2"}},d={},c=[{value:"HTTPS",id:"https",level:2},{value:"Reverse proxy",id:"reverse-proxy",level:2},{value:"Caddy (v1)",id:"caddy-v1",level:3},{value:"Caddy (v2)",id:"caddy-v2",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"expose-your-server",children:"Expose your server"})}),"\n",(0,o.jsx)(t.h2,{id:"https",children:"HTTPS"}),"\n",(0,o.jsxs)(t.p,{children:["If you want to open your Komga server outside your local network, it is strongly advised to secure it with ",(0,o.jsx)(t.code,{children:"https"})," (especially due to the use of http basic authentication)."]}),"\n",(0,o.jsxs)(t.p,{children:["Spring Boot supports ",(0,o.jsx)(t.code,{children:"https"})," out of the box, but you will have to configure it, and ",(0,o.jsx)(t.code,{children:"https"})," is most useful only with valid certificates (not self-signed), which most people don't readily have available."]}),"\n",(0,o.jsxs)(t.p,{children:["I recommend using ",(0,o.jsx)(t.a,{href:"https://caddyserver.com/",children:"Caddy"})," as a reverse proxy, as it supports the automatic generation of ",(0,o.jsx)(t.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt"})," certificates."]}),"\n",(0,o.jsx)(t.h2,{id:"reverse-proxy",children:"Reverse proxy"}),"\n",(0,o.jsx)(t.p,{children:"Here are some sample configuration on how to configure reverse proxy for Komga."}),"\n",(0,o.jsx)(t.h3,{id:"caddy-v1",children:"Caddy (v1)"}),"\n",(0,o.jsx)(t.p,{children:"Without a base URL configured in Komga, using a subdomain:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"komga.yourdomain.com {\n proxy / http://your-komga-server:25600 {\n transparent\n }\n}\n"})}),"\n",(0,o.jsx)(t.p,{children:"With a base URL configured in Komga:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"yourdomain.com {\n proxy /komga http://your-komga-server:25600 {\n transparent\n }\n}\n"})}),"\n",(0,o.jsx)(t.h3,{id:"caddy-v2",children:"Caddy (v2)"}),"\n",(0,o.jsx)(t.p,{children:"Without a base URL configured in Komga, using a subdomain:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"komga.yourdomain.com {\n reverse_proxy http://your-komga-server:25600\n}\n"})}),"\n",(0,o.jsx)(t.p,{children:"With a base URL configured in Komga:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"yourdomain.com {\n reverse_proxy /komga/* http://your-komga-server:25600\n}\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var o=n(3696);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/767395cb.f386cd84.js b/assets/js/767395cb.f386cd84.js new file mode 100644 index 00000000..fba2f5b1 --- /dev/null +++ b/assets/js/767395cb.f386cd84.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4103],{7439:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=n(2540),r=n(3023);const s={},i="Expose your server",a={id:"installation/https",title:"Expose your server",description:"HTTPS",source:"@site/docs/installation/https.md",sourceDirName:"installation",slug:"/installation/https",permalink:"/docs/installation/https",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/https.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Configuration options",permalink:"/docs/installation/configuration"},next:{title:"Social login",permalink:"/docs/installation/oauth2"}},d={},c=[{value:"HTTPS",id:"https",level:2},{value:"Reverse proxy",id:"reverse-proxy",level:2},{value:"Caddy (v1)",id:"caddy-v1",level:3},{value:"Caddy (v2)",id:"caddy-v2",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"expose-your-server",children:"Expose your server"})}),"\n",(0,o.jsx)(t.h2,{id:"https",children:"HTTPS"}),"\n",(0,o.jsxs)(t.p,{children:["If you want to open your Komga server outside your local network, it is strongly advised to secure it with ",(0,o.jsx)(t.code,{children:"https"})," (especially due to the use of http basic authentication)."]}),"\n",(0,o.jsxs)(t.p,{children:["Spring Boot supports ",(0,o.jsx)(t.code,{children:"https"})," out of the box, but you will have to configure it, and ",(0,o.jsx)(t.code,{children:"https"})," is most useful only with valid certificates (not self-signed), which most people don't readily have available."]}),"\n",(0,o.jsxs)(t.p,{children:["I recommend using ",(0,o.jsx)(t.a,{href:"https://caddyserver.com/",children:"Caddy"})," as a reverse proxy, as it supports the automatic generation of ",(0,o.jsx)(t.a,{href:"https://letsencrypt.org/",children:"Let's Encrypt"})," certificates."]}),"\n",(0,o.jsx)(t.h2,{id:"reverse-proxy",children:"Reverse proxy"}),"\n",(0,o.jsx)(t.p,{children:"Here are some sample configuration on how to configure reverse proxy for Komga."}),"\n",(0,o.jsx)(t.h3,{id:"caddy-v1",children:"Caddy (v1)"}),"\n",(0,o.jsx)(t.p,{children:"Without a base URL configured in Komga, using a subdomain:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"komga.yourdomain.com {\n proxy / http://your-komga-server:25600 {\n transparent\n }\n}\n"})}),"\n",(0,o.jsx)(t.p,{children:"With a base URL configured in Komga:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"yourdomain.com {\n proxy /komga http://your-komga-server:25600 {\n transparent\n }\n}\n"})}),"\n",(0,o.jsx)(t.h3,{id:"caddy-v2",children:"Caddy (v2)"}),"\n",(0,o.jsx)(t.p,{children:"Without a base URL configured in Komga, using a subdomain:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"komga.yourdomain.com {\n reverse_proxy http://your-komga-server:25600\n}\n"})}),"\n",(0,o.jsx)(t.p,{children:"With a base URL configured in Komga:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"yourdomain.com {\n reverse_proxy /komga/* http://your-komga-server:25600\n}\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var o=n(3696);const r={},s=o.createContext(r);function i(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7d6e8713.ca4021a3.js b/assets/js/7d6e8713.ca4021a3.js new file mode 100644 index 00000000..dcb9394b --- /dev/null +++ b/assets/js/7d6e8713.ca4021a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7526],{2718:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>d,contentTitle:()=>s,default:()=>c,frontMatter:()=>t,metadata:()=>l,toc:()=>o});var n=i(2540),r=i(3023);const t={},s="Read with the Webreader",l={id:"guides/webreader",title:"Read with the Webreader",description:"Komga has an integrated Webreader packed with features.",source:"@site/docs/guides/webreader.md",sourceDirName:"guides",slug:"/guides/webreader",permalink:"/docs/guides/webreader",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/webreader.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Readers",permalink:"/docs/category/readers"},next:{title:"Read with Mihon",permalink:"/docs/guides/mihon"}},d={},o=[{value:"Settings",id:"settings",level:2},{value:"General",id:"general",level:3},{value:"Reading mode",id:"reading-mode",level:4},{value:"Animate page transitions",id:"animate-page-transitions",level:4},{value:"Gestures",id:"gestures",level:4},{value:"Display",id:"display",level:3},{value:"Background color",id:"background-color",level:4},{value:"Reader specific options: Paged reader",id:"reader-specific-options-paged-reader",level:3},{value:"Scale type",id:"scale-type",level:4},{value:"Double pages",id:"double-pages",level:4},{value:"Thumbnails explorer",id:"thumbnails-explorer",level:2},{value:"Help dialog",id:"help-dialog",level:2}];function h(e){const a={em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"read-with-the-webreader",children:"Read with the Webreader"})}),"\n",(0,n.jsx)(a.p,{children:"Komga has an integrated Webreader packed with features."}),"\n",(0,n.jsx)(a.p,{children:"To start reading a book, you can click on the read button either on the book card, or on the book details screen."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/webreader/book-card.png",style:{maxHeight:"300px"},alt:"Book Card Read Button"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/webreader/read-button.png",style:{maxHeight:"300px"},alt:"Book Details read button"}),"\n",(0,n.jsx)(a.p,{children:"Here is an overview of the Webreader's interface."}),"\n",(0,n.jsx)("a",{href:"/assets/media/guides/webreader/reader.png",children:(0,n.jsx)("img",{src:"/assets/media/guides/webreader/reader.png",alt:"Webreader overview"})}),"\n",(0,n.jsx)(a.h2,{id:"settings",children:"Settings"}),"\n",(0,n.jsx)(a.p,{children:"The Webreader can be configured in various ways from the settings dialog."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/webreader/reader-settings.png",style:{maxHeight:"400px"},alt:"Webreader settings"}),"\n",(0,n.jsx)(a.h3,{id:"general",children:"General"}),"\n",(0,n.jsx)(a.h4,{id:"reading-mode",children:"Reading mode"}),"\n",(0,n.jsx)(a.p,{children:"Four reading modes are available:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Left to right"}),"\n",(0,n.jsx)(a.li,{children:"Right to left"}),"\n",(0,n.jsx)(a.li,{children:"Vertical"}),"\n",(0,n.jsx)(a.li,{children:"Webtoon: displays all the pages in a continuous vertical strip"}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["The Webreader will automatically use the ",(0,n.jsx)(a.em,{children:"Reading direction"})," specified in the Book metadata."]}),"\n",(0,n.jsx)(a.h4,{id:"animate-page-transitions",children:"Animate page transitions"}),"\n",(0,n.jsx)(a.p,{children:"If enable, a smooth transition will be used to switch between pages."}),"\n",(0,n.jsx)(a.h4,{id:"gestures",children:"Gestures"}),"\n",(0,n.jsx)(a.p,{children:"Touch gestures are available in the Page reader only (Left to right, Right to left, Vertical), and can be disabled if necessary."}),"\n",(0,n.jsx)(a.h3,{id:"display",children:"Display"}),"\n",(0,n.jsx)(a.h4,{id:"background-color",children:"Background color"}),"\n",(0,n.jsx)(a.p,{children:"You can choose the background color of the reader between white and black."}),"\n",(0,n.jsx)(a.h3,{id:"reader-specific-options-paged-reader",children:"Reader specific options: Paged reader"}),"\n",(0,n.jsx)(a.h4,{id:"scale-type",children:"Scale type"}),"\n",(0,n.jsx)(a.p,{children:"Four scale types are available:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Fit to screen"}),"\n",(0,n.jsx)(a.li,{children:"Fit to width"}),"\n",(0,n.jsx)(a.li,{children:"Fit to height"}),"\n",(0,n.jsx)(a.li,{children:"Original"}),"\n"]}),"\n",(0,n.jsx)(a.h4,{id:"double-pages",children:"Double pages"}),"\n",(0,n.jsx)(a.p,{children:"When enabled, the Webreader will display two pages on the same screen, like an open book, with the following exceptions:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"The first and last page will always be shown as a single page"}),"\n",(0,n.jsx)(a.li,{children:"If a page has a landscape orientation (width > height), it will be show as a single page"}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"thumbnails-explorer",children:"Thumbnails explorer"}),"\n",(0,n.jsx)(a.p,{children:"You can use the Thumbnails explorer to have an overview of all the pages in the book, and to quickly navigate to a particular page."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/webreader/thumbnails-explorer.png",alt:"Thumbnails explorer"}),"\n",(0,n.jsx)(a.h2,{id:"help-dialog",children:"Help dialog"}),"\n",(0,n.jsx)(a.p,{children:"The help dialog will display the available keyboard shortcuts. The dialog is context-aware, and will only show shortcuts that are relevant to the current reading mode."})]})}function c(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3023:(e,a,i)=>{i.d(a,{R:()=>s,x:()=>l});var n=i(3696);const r={},t=n.createContext(r);function s(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function l(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7d6e8713.d613beb7.js b/assets/js/7d6e8713.d613beb7.js deleted file mode 100644 index e05d344d..00000000 --- a/assets/js/7d6e8713.d613beb7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7526],{2718:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>d,contentTitle:()=>s,default:()=>c,frontMatter:()=>t,metadata:()=>l,toc:()=>o});var n=i(2540),r=i(3023);const t={},s="Read with the Webreader",l={id:"guides/webreader",title:"Read with the Webreader",description:"Komga has an integrated Webreader packed with features.",source:"@site/docs/guides/webreader.md",sourceDirName:"guides",slug:"/guides/webreader",permalink:"/docs/guides/webreader",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/webreader.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Readers",permalink:"/docs/category/readers"},next:{title:"Read with Mihon",permalink:"/docs/guides/mihon"}},d={},o=[{value:"Settings",id:"settings",level:2},{value:"General",id:"general",level:3},{value:"Reading mode",id:"reading-mode",level:4},{value:"Animate page transitions",id:"animate-page-transitions",level:4},{value:"Gestures",id:"gestures",level:4},{value:"Display",id:"display",level:3},{value:"Background color",id:"background-color",level:4},{value:"Reader specific options: Paged reader",id:"reader-specific-options-paged-reader",level:3},{value:"Scale type",id:"scale-type",level:4},{value:"Double pages",id:"double-pages",level:4},{value:"Thumbnails explorer",id:"thumbnails-explorer",level:2},{value:"Help dialog",id:"help-dialog",level:2}];function h(e){const a={em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"read-with-the-webreader",children:"Read with the Webreader"})}),"\n",(0,n.jsx)(a.p,{children:"Komga has an integrated Webreader packed with features."}),"\n",(0,n.jsx)(a.p,{children:"To start reading a book, you can click on the read button either on the book card, or on the book details screen."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/webreader/book-card.png",style:{maxHeight:"300px"},alt:"Book Card Read Button"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/webreader/read-button.png",style:{maxHeight:"300px"},alt:"Book Details read button"}),"\n",(0,n.jsx)(a.p,{children:"Here is an overview of the Webreader's interface."}),"\n",(0,n.jsx)("a",{href:"/assets/media/guides/webreader/reader.png",children:(0,n.jsx)("img",{src:"/assets/media/guides/webreader/reader.png",alt:"Webreader overview"})}),"\n",(0,n.jsx)(a.h2,{id:"settings",children:"Settings"}),"\n",(0,n.jsx)(a.p,{children:"The Webreader can be configured in various ways from the settings dialog."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/webreader/reader-settings.png",style:{maxHeight:"400px"},alt:"Webreader settings"}),"\n",(0,n.jsx)(a.h3,{id:"general",children:"General"}),"\n",(0,n.jsx)(a.h4,{id:"reading-mode",children:"Reading mode"}),"\n",(0,n.jsx)(a.p,{children:"Four reading modes are available:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Left to right"}),"\n",(0,n.jsx)(a.li,{children:"Right to left"}),"\n",(0,n.jsx)(a.li,{children:"Vertical"}),"\n",(0,n.jsx)(a.li,{children:"Webtoon: displays all the pages in a continuous vertical strip"}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["The Webreader will automatically use the ",(0,n.jsx)(a.em,{children:"Reading direction"})," specified in the Book metadata."]}),"\n",(0,n.jsx)(a.h4,{id:"animate-page-transitions",children:"Animate page transitions"}),"\n",(0,n.jsx)(a.p,{children:"If enable, a smooth transition will be used to switch between pages."}),"\n",(0,n.jsx)(a.h4,{id:"gestures",children:"Gestures"}),"\n",(0,n.jsx)(a.p,{children:"Touch gestures are available in the Page reader only (Left to right, Right to left, Vertical), and can be disabled if necessary."}),"\n",(0,n.jsx)(a.h3,{id:"display",children:"Display"}),"\n",(0,n.jsx)(a.h4,{id:"background-color",children:"Background color"}),"\n",(0,n.jsx)(a.p,{children:"You can choose the background color of the reader between white and black."}),"\n",(0,n.jsx)(a.h3,{id:"reader-specific-options-paged-reader",children:"Reader specific options: Paged reader"}),"\n",(0,n.jsx)(a.h4,{id:"scale-type",children:"Scale type"}),"\n",(0,n.jsx)(a.p,{children:"Four scale types are available:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Fit to screen"}),"\n",(0,n.jsx)(a.li,{children:"Fit to width"}),"\n",(0,n.jsx)(a.li,{children:"Fit to height"}),"\n",(0,n.jsx)(a.li,{children:"Original"}),"\n"]}),"\n",(0,n.jsx)(a.h4,{id:"double-pages",children:"Double pages"}),"\n",(0,n.jsx)(a.p,{children:"When enabled, the Webreader will display two pages on the same screen, like an open book, with the following exceptions:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"The first and last page will always be shown as a single page"}),"\n",(0,n.jsx)(a.li,{children:"If a page has a landscape orientation (width > height), it will be show as a single page"}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"thumbnails-explorer",children:"Thumbnails explorer"}),"\n",(0,n.jsx)(a.p,{children:"You can use the Thumbnails explorer to have an overview of all the pages in the book, and to quickly navigate to a particular page."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/webreader/thumbnails-explorer.png",alt:"Thumbnails explorer"}),"\n",(0,n.jsx)(a.h2,{id:"help-dialog",children:"Help dialog"}),"\n",(0,n.jsx)(a.p,{children:"The help dialog will display the available keyboard shortcuts. The dialog is context-aware, and will only show shortcuts that are relevant to the current reading mode."})]})}function c(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3023:(e,a,i)=>{i.d(a,{R:()=>s,x:()=>l});var n=i(3696);const r={},t=n.createContext(r);function s(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function l(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8badb5d4.9bea614d.js b/assets/js/8badb5d4.9bea614d.js deleted file mode 100644 index 682e955a..00000000 --- a/assets/js/8badb5d4.9bea614d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5109],{6191:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>d,metadata:()=>a,toc:()=>l});var t=s(2540),i=s(3023);const d={},r="Image Types",a={id:"guides/image-formats",title:"Image Types",description:"Decoding images",source:"@site/docs/guides/image-formats.md",sourceDirName:"guides",slug:"/guides/image-formats",permalink:"/docs/guides/image-formats",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/image-formats.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Scanning, Analyzing and Refreshing Metadata",permalink:"/docs/guides/scan-analysis-refresh"},next:{title:"One-Shots",permalink:"/docs/guides/oneshots"}},c={},l=[{value:"Decoding images",id:"decoding-images",level:2},{value:"Common types",id:"common-types",level:2},{value:"Advanced types",id:"advanced-types",level:2}];function o(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"image-types",children:"Image Types"})}),"\n",(0,t.jsx)(n.h2,{id:"decoding-images",children:"Decoding images"}),"\n",(0,t.jsx)(n.p,{children:"Komga doesn't always need to decode images within your books. Image decoding is necessary in the following cases:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"thumbnail generation"}),"\n",(0,t.jsx)(n.li,{children:"ISBN barcode detection"}),"\n",(0,t.jsx)(n.li,{children:"analyze page dimensions"}),"\n",(0,t.jsx)(n.li,{children:"on-the-fly page conversion"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"If the client requesting a page can decode the format, Komga passes the raw image data without decoding."}),"\n",(0,t.jsx)(n.h2,{id:"common-types",children:"Common types"}),"\n",(0,t.jsx)(n.p,{children:"The following types are supported on every platform:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"JPEG"}),"\n",(0,t.jsx)(n.li,{children:"PNG"}),"\n",(0,t.jsx)(n.li,{children:"GIF"}),"\n",(0,t.jsx)(n.li,{children:"WebP"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"advanced-types",children:"Advanced types"}),"\n",(0,t.jsx)(n.p,{children:"More advanced types are supported on some platforms only, as they rely on native libraries for decoding."}),"\n",(0,t.jsx)(n.p,{children:"For WebP, the native library will be used if present. Else, the Java implementation will be used as fallback."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Platform"}),(0,t.jsx)(n.th,{children:"JPEG XL (jxl)"}),(0,t.jsx)(n.th,{children:"AVIF / HEIF"}),(0,t.jsx)(n.th,{children:"WebP"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"macOS app"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (native)"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Windows app"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (java)"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Docker amd64"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (native)"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Docker arm64"}),(0,t.jsx)(n.td,{children:"\u274c"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (native)"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Docker arm"}),(0,t.jsx)(n.td,{children:"\u274c"}),(0,t.jsx)(n.td,{children:"\u274c"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (java)"]})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["When using the ",(0,t.jsx)(n.code,{children:"jar"}),", you will need to provide the native libraries yourself, and run Java with the correct arguments. You can check for more details ",(0,t.jsx)(n.a,{href:"https://github.com/gotson/NightMonkeys#requirements",children:"here"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},3023:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(3696);const i={},d=t.createContext(i);function r(e){const n=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8badb5d4.b8a9618a.js b/assets/js/8badb5d4.b8a9618a.js new file mode 100644 index 00000000..2c5b0051 --- /dev/null +++ b/assets/js/8badb5d4.b8a9618a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5109],{6191:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>d,metadata:()=>a,toc:()=>l});var t=s(2540),i=s(3023);const d={},r="Image Types",a={id:"guides/image-formats",title:"Image Types",description:"Decoding images",source:"@site/docs/guides/image-formats.md",sourceDirName:"guides",slug:"/guides/image-formats",permalink:"/docs/guides/image-formats",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/image-formats.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Scanning, Analyzing and Refreshing Metadata",permalink:"/docs/guides/scan-analysis-refresh"},next:{title:"One-Shots",permalink:"/docs/guides/oneshots"}},c={},l=[{value:"Decoding images",id:"decoding-images",level:2},{value:"Common types",id:"common-types",level:2},{value:"Advanced types",id:"advanced-types",level:2}];function o(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"image-types",children:"Image Types"})}),"\n",(0,t.jsx)(n.h2,{id:"decoding-images",children:"Decoding images"}),"\n",(0,t.jsx)(n.p,{children:"Komga doesn't always need to decode images within your books. Image decoding is necessary in the following cases:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"thumbnail generation"}),"\n",(0,t.jsx)(n.li,{children:"ISBN barcode detection"}),"\n",(0,t.jsx)(n.li,{children:"analyze page dimensions"}),"\n",(0,t.jsx)(n.li,{children:"on-the-fly page conversion"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"If the client requesting a page can decode the format, Komga passes the raw image data without decoding."}),"\n",(0,t.jsx)(n.h2,{id:"common-types",children:"Common types"}),"\n",(0,t.jsx)(n.p,{children:"The following types are supported on every platform:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"JPEG"}),"\n",(0,t.jsx)(n.li,{children:"PNG"}),"\n",(0,t.jsx)(n.li,{children:"GIF"}),"\n",(0,t.jsx)(n.li,{children:"WebP"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"advanced-types",children:"Advanced types"}),"\n",(0,t.jsx)(n.p,{children:"More advanced types are supported on some platforms only, as they rely on native libraries for decoding."}),"\n",(0,t.jsx)(n.p,{children:"For WebP, the native library will be used if present. Else, the Java implementation will be used as fallback."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Platform"}),(0,t.jsx)(n.th,{children:"JPEG XL (jxl)"}),(0,t.jsx)(n.th,{children:"AVIF / HEIF"}),(0,t.jsx)(n.th,{children:"WebP"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"macOS app"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (native)"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Windows app"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (java)"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Docker amd64"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (native)"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Docker arm64"}),(0,t.jsx)(n.td,{children:"\u274c"}),(0,t.jsx)(n.td,{children:"\u2714\ufe0f"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (native)"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Docker arm"}),(0,t.jsx)(n.td,{children:"\u274c"}),(0,t.jsx)(n.td,{children:"\u274c"}),(0,t.jsxs)(n.td,{children:["\u2714\ufe0f"," (java)"]})]})]})]}),"\n",(0,t.jsxs)(n.p,{children:["When using the ",(0,t.jsx)(n.code,{children:"jar"}),", you will need to provide the native libraries yourself, and run Java with the correct arguments. You can check for more details ",(0,t.jsx)(n.a,{href:"https://github.com/gotson/NightMonkeys#requirements",children:"here"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},3023:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(3696);const i={},d=t.createContext(i);function r(e){const n=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/97c4f258.2a365b24.js b/assets/js/97c4f258.2a365b24.js deleted file mode 100644 index 1a5e86bc..00000000 --- a/assets/js/97c4f258.2a365b24.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1057],{340:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=o(2540),s=o(3023);const r={},t="Configuration options",a={id:"installation/configuration",title:"Configuration options",description:"Komga has sensible default values for all configuration keys. You only need to configure it if you want to change the default behaviour.",source:"@site/docs/installation/configuration.md",sourceDirName:"installation",slug:"/installation/configuration",permalink:"/docs/installation/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/configuration.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install via third-party integrations",permalink:"/docs/installation/thirdparty"},next:{title:"Expose your server",permalink:"/docs/installation/https"}},l={},d=[{value:"Optional configuration",id:"optional-configuration",level:2},{value:"KOMGA_CONFIGDIR / komga.config-dir: <directory>",id:"komga_configdir--komgaconfig-dir-directory",level:4},{value:"SERVER_PORT / server.port: <port>",id:"server_port--serverport-port",level:4},{value:"SERVER_SERVLET_CONTEXT_PATH / server.servlet.context-path: <baseUrl>",id:"server_servlet_context_path--serverservletcontext-path-baseurl",level:4},{value:"SERVER_SERVLET_SESSION_TIMEOUT / server.servlet.session.timeout: <duration>",id:"server_servlet_session_timeout--serverservletsessiontimeout-duration",level:4},{value:"KOMGA_LIBRARIES_SCAN_CRON / komga.libraries-scan-cron: <cron>",id:"komga_libraries_scan_cron--komgalibraries-scan-cron-cron",level:4},{value:"KOMGA_LIBRARIES_SCAN_STARTUP / komga.libraries-scan-startup: <true/false>",id:"komga_libraries_scan_startup--komgalibraries-scan-startup-truefalse",level:4},{value:"KOMGA_LIBRARIES_SCAN_DIRECTORY_EXCLUSIONS / komga.libraries-scan-directory-exclusions: <exclusions>",id:"komga_libraries_scan_directory_exclusions--komgalibraries-scan-directory-exclusions-exclusions",level:4},{value:"KOMGA_REMEMBERME_KEY / komga.remember-me.key: <key>",id:"komga_rememberme_key--komgaremember-mekey-key",level:4},{value:"KOMGA_REMEMBERME_VALIDITY / komga.remember-me.validity: <duration>",id:"komga_rememberme_validity--komgaremember-mevalidity-duration",level:4},{value:"KOMGA_SESSIONTIMEOUT / komga.session-timeout: <duration>",id:"komga_sessiontimeout--komgasession-timeout-duration",level:4},{value:"KOMGA_DATABASE_FILE / komga.database.file: <file path>",id:"komga_database_file--komgadatabasefile-file-path",level:4},{value:"KOMGA_CORS_ALLOWED_ORIGINS / komga.cors.allowed-origins: <origins>",id:"komga_cors_allowed_origins--komgacorsallowed-origins-origins",level:4},{value:"KOMGA_DELETE_EMPTY_COLLECTIONS / komga.delete-empty-collections: <true/false>",id:"komga_delete_empty_collections--komgadelete-empty-collections-truefalse",level:4},{value:"KOMGA_DELETE_EMPTY_READ_LISTS / komga.delete-empty-read-lists: <true/false>",id:"komga_delete_empty_read_lists--komgadelete-empty-read-lists-truefalse",level:4},{value:"KOMGA_OAUTH2_ACCOUNT_CREATION / komga.oauth2-account-creation: <true/false>",id:"komga_oauth2_account_creation--komgaoauth2-account-creation-truefalse",level:4},{value:"KOMGA_OIDC_EMAIL_VERIFICATION / komga.oidc-email-verification: <true/false>",id:"komga_oidc_email_verification--komgaoidc-email-verification-truefalse",level:4},{value:"LOGGING_FILE_NAME / logging.file.name: <logfile name>",id:"logging_file_name--loggingfilename-logfile-name",level:4},{value:"KOMGA_TASKCONSUMERS / komga.task-consumers: <int>",id:"komga_taskconsumers--komgatask-consumers-int",level:4},{value:"KOMGA_TASKCONSUMERSMAX / komga.task-consumers-max: <int>",id:"komga_taskconsumersmax--komgatask-consumers-max-int",level:4},{value:"Sample Configuration File",id:"sample-configuration-file",level:2},{value:"Database performance",id:"database-performance",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",del:"del",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"configuration-options",children:"Configuration options"})}),"\n",(0,n.jsxs)(i.admonition,{type:"tip",children:[(0,n.jsx)(i.p,{children:"Komga has sensible default values for all configuration keys. You only need to configure it if you want to change the default behaviour."}),(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.code,{children:"application.yml"})," file does not exist by default, you need to create one if you want to customize the configuration."]})]}),"\n",(0,n.jsxs)(i.p,{children:["Komga relies heavily on ",(0,n.jsx)(i.a,{href:"https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html",children:"Spring Boot's configuration"}),", leveraging ",(0,n.jsx)(i.code,{children:"profiles"})," and configuration ",(0,n.jsx)(i.code,{children:"properties"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["The easiest way to configure is either via environment variables (a good fit for ",(0,n.jsx)(i.code,{children:"docker"})," and ",(0,n.jsx)(i.code,{children:"docker-compose"}),") or by using an ",(0,n.jsx)(i.code,{children:"application.yml"})," file located in the configuration directory:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["The Docker image will load any ",(0,n.jsx)(i.code,{children:"application.yml"})," file located in the ",(0,n.jsx)(i.code,{children:"/config"})," mounted folder."]}),"\n",(0,n.jsxs)(i.li,{children:["The Jar will load any ",(0,n.jsx)(i.code,{children:"application.yml"})," file located in the ",(0,n.jsx)(i.code,{children:"komga.config-dir"})," directory (defaults to ",(0,n.jsx)(i.code,{children:"~/.komga"}),", ",(0,n.jsx)(i.a,{href:"#komga-configdir-komga-config-dir-directory",children:"more details"}),")."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Each configuration key can have a different format depending if it's from the environment variable, or from the ",(0,n.jsx)(i.code,{children:"application.yml"})," file. In the following section I will provide both format in the form ",(0,n.jsx)(i.code,{children:"ENVIRONMENT_VARIABLE"})," / ",(0,n.jsx)(i.code,{children:"application-property"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["You can also specify configuration via the command line, when launching the ",(0,n.jsx)(i.code,{children:"jar"}),". Use the ",(0,n.jsx)(i.code,{children:"application-property"})," form, and prefix with ",(0,n.jsx)(i.code,{children:"--"}),". For example:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-shell",children:'java -jar komga.jar --server.servlet.context-path="/komga" --server.port=8443\n'})}),"\n",(0,n.jsx)(i.h2,{id:"optional-configuration",children:"Optional configuration"}),"\n",(0,n.jsx)(i.p,{children:"You can use some optional configuration keys:"}),"\n",(0,n.jsxs)(i.h4,{id:"komga_configdir--komgaconfig-dir-directory",children:["KOMGA_CONFIGDIR / komga.config-dir: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"The Komga configuration directory. Will be used to store the logs, database, and any other file Komga needs."}),"\n",(0,n.jsx)(i.p,{children:"Defaults to:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"%LOCALAPPDATA%/Komga"})," on the ",(0,n.jsx)(i.em,{children:"Windows app"}),". That folder is virtualized by Windows."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"~/Library/Application Support/Komga"})," on the macOS app."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"~/.komga"})," otherwise."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"~"})," is your home directory on Unix, and your User profile on Windows."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.em,{children:["When overriding this configuration, you need to use ",(0,n.jsx)(i.code,{children:"${user.home}"})," instead of ",(0,n.jsx)(i.code,{children:"~"})," (this is a specific Spring Boot variable)."]})}),"\n",(0,n.jsxs)(i.h4,{id:"server_port--serverport-port",children:["SERVER_PORT / server.port: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"Port to listen to for the API and web interface."}),"\n",(0,n.jsxs)(i.p,{children:["Can also be configured from the ",(0,n.jsx)(i.a,{href:"/docs/guides/server-settings#server-port",children:"Server Settings"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Defaults to ",(0,n.jsx)(i.code,{children:"25600"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"server_servlet_context_path--serverservletcontext-path-baseurl",children:["SERVER_SERVLET_CONTEXT_PATH / server.servlet.context-path: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"Base URL, useful if you need to reverse proxy with a subfolder."}),"\n",(0,n.jsxs)(i.p,{children:["Can also be configured from the ",(0,n.jsx)(i.a,{href:"/docs/guides/server-settings#base-url",children:"Server Settings"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Defaults to ",(0,n.jsx)(i.code,{children:"/"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"server_servlet_session_timeout--serverservletsessiontimeout-duration",children:["SERVER_SERVLET_SESSION_TIMEOUT / server.servlet.session.timeout: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsxs)(i.p,{children:["The duration after which an inactive session will expire. You can specify the timeunit, for example ",(0,n.jsx)(i.code,{children:"14d"})," for 14 days, or ",(0,n.jsx)(i.code,{children:"24h"})," for 24 hours. If no unit is set, seconds will be used."]}),"\n",(0,n.jsx)(i.p,{children:"Defaults to 30 minutes."}),"\n",(0,n.jsx)(i.h4,{id:"komga_libraries_scan_cron--komgalibraries-scan-cron-cron",children:(0,n.jsxs)(i.del,{children:["KOMGA_LIBRARIES_SCAN_CRON / komga.libraries-scan-cron: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsxs)(i.p,{children:["This has been moved to ",(0,n.jsx)(i.a,{href:"/docs/guides/libraries#scan-interval",children:"Library options: scan interval"}),"."]}),"\n",(0,n.jsx)(i.h4,{id:"komga_libraries_scan_startup--komgalibraries-scan-startup-truefalse",children:(0,n.jsxs)(i.del,{children:["KOMGA_LIBRARIES_SCAN_STARTUP / komga.libraries-scan-startup: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsxs)(i.p,{children:["This has been moved to ",(0,n.jsx)(i.a,{href:"/docs/guides/libraries#scan-on-startup",children:"Library options: scan on startup"}),"."]}),"\n",(0,n.jsx)(i.h4,{id:"komga_libraries_scan_directory_exclusions--komgalibraries-scan-directory-exclusions-exclusions",children:(0,n.jsxs)(i.del,{children:["KOMGA_LIBRARIES_SCAN_DIRECTORY_EXCLUSIONS / komga.libraries-scan-directory-exclusions: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsxs)(i.p,{children:["This has been moved to ",(0,n.jsx)(i.a,{href:"/docs/guides/libraries#directory-exclusions",children:"Library options: directory exclusions"}),"."]}),"\n",(0,n.jsx)(i.h4,{id:"komga_rememberme_key--komgaremember-mekey-key",children:(0,n.jsxs)(i.del,{children:["KOMGA_REMEMBERME_KEY / komga.remember-me.key: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been moved to Server Settings."}),"\n",(0,n.jsx)(i.h4,{id:"komga_rememberme_validity--komgaremember-mevalidity-duration",children:(0,n.jsxs)(i.del,{children:["KOMGA_REMEMBERME_VALIDITY / komga.remember-me.validity: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been moved to Server Settings."}),"\n",(0,n.jsx)(i.h4,{id:"komga_sessiontimeout--komgasession-timeout-duration",children:(0,n.jsxs)(i.del,{children:["KOMGA_SESSIONTIMEOUT / komga.session-timeout: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsxs)(i.p,{children:["This has been replaced by ",(0,n.jsx)(i.code,{children:"server.servlet.session.timeout"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"komga_database_file--komgadatabasefile-file-path",children:["KOMGA_DATABASE_FILE / komga.database.file: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"File path for the SQLite database."}),"\n",(0,n.jsxs)(i.p,{children:["If you want to change the directory, it is advised to change ",(0,n.jsx)(i.code,{children:"komga.config-dir"})," instead."]}),"\n",(0,n.jsx)(i.p,{children:"Defaults to:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"/config/database.sqlite"})," for ",(0,n.jsx)(i.em,{children:"Docker"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"\\${komga.config-dir}/database.sqlite"})," otherwise."]}),"\n"]}),"\n",(0,n.jsxs)(i.h4,{id:"komga_cors_allowed_origins--komgacorsallowed-origins-origins",children:["KOMGA_CORS_ALLOWED_ORIGINS / komga.cors.allowed-origins: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"A list of origins to allow for CORS."}),"\n",(0,n.jsx)(i.p,{children:"Defaults to empty list."}),"\n",(0,n.jsx)(i.h4,{id:"komga_delete_empty_collections--komgadelete-empty-collections-truefalse",children:(0,n.jsxs)(i.del,{children:["KOMGA_DELETE_EMPTY_COLLECTIONS / komga.delete-empty-collections: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been moved to Server Settings."}),"\n",(0,n.jsx)(i.h4,{id:"komga_delete_empty_read_lists--komgadelete-empty-read-lists-truefalse",children:(0,n.jsxs)(i.del,{children:["KOMGA_DELETE_EMPTY_READ_LISTS / komga.delete-empty-read-lists: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been moved to Server Settings."}),"\n",(0,n.jsxs)(i.h4,{id:"komga_oauth2_account_creation--komgaoauth2-account-creation-truefalse",children:["KOMGA_OAUTH2_ACCOUNT_CREATION / komga.oauth2-account-creation: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"A boolean indicating whether Komga should create new users when a login via OAuth2/OIDC succeeds, but there is no existing user with that email."}),"\n",(0,n.jsxs)(i.p,{children:["Such users will be created with a random password, which the user can subsequently change from the ",(0,n.jsx)(i.em,{children:"Account Settings"})," page later on, for example to be able to connect using OPDS or Mihon."]}),"\n",(0,n.jsx)(i.admonition,{type:"warning",children:(0,n.jsx)(i.p,{children:"It is recommended to enable this only with OAuth2 providers you control"})}),"\n",(0,n.jsxs)(i.p,{children:["Defaults to ",(0,n.jsx)(i.code,{children:"false"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"komga_oidc_email_verification--komgaoidc-email-verification-truefalse",children:["KOMGA_OIDC_EMAIL_VERIFICATION / komga.oidc-email-verification: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsxs)(i.p,{children:["A boolean indicating whether Komga should check whether the ",(0,n.jsx)(i.code,{children:"email_verified"})," claim is present and true in the OpenID Connect request."]}),"\n",(0,n.jsx)(i.admonition,{type:"warning",children:(0,n.jsx)(i.p,{children:"It is recommended to disable this only with OIDC providers that do not verify emails (like Azure AD)"})}),"\n",(0,n.jsxs)(i.p,{children:["Defaults to ",(0,n.jsx)(i.code,{children:"true"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"logging_file_name--loggingfilename-logfile-name",children:["LOGGING_FILE_NAME / logging.file.name: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"Name of the log file."}),"\n",(0,n.jsxs)(i.p,{children:["If you want to change the directory, it is advised to change ",(0,n.jsx)(i.code,{children:"komga.config-dir"})," instead."]}),"\n",(0,n.jsx)(i.p,{children:"Defaults to:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"~/Library/Logs/Komga/komga.log"})," for the ",(0,n.jsx)(i.em,{children:"macOS app"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"/config/logs/komga.log"})," for ",(0,n.jsx)(i.em,{children:"Docker"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"\\${komga.config-dir}/komga.log"})," otherwise."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"~"})," is your home directory on Unix, and your User profile on Windows."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.em,{children:["When overriding this configuration, you need to use ",(0,n.jsx)(i.code,{children:"${user.home}"})," instead of ",(0,n.jsx)(i.code,{children:"~"})," (this is a specific Spring Boot variable)."]})}),"\n",(0,n.jsx)(i.h4,{id:"komga_taskconsumers--komgatask-consumers-int",children:(0,n.jsxs)(i.del,{children:["KOMGA_TASKCONSUMERS / komga.task-consumers: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been removed."}),"\n",(0,n.jsx)(i.h4,{id:"komga_taskconsumersmax--komgatask-consumers-max-int",children:(0,n.jsxs)(i.del,{children:["KOMGA_TASKCONSUMERSMAX / komga.task-consumers-max: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been removed."}),"\n",(0,n.jsx)(i.h2,{id:"sample-configuration-file",children:"Sample Configuration File"}),"\n",(0,n.jsxs)(i.p,{children:["Here is a sample ",(0,n.jsx)(i.code,{children:"application.yml"})," file in case you need to customize it. Keep only the lines you need."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-yaml",children:"# Only keep lines that are relevant to you!\n# Lines starting with # are comments\n# Make sure indentation is correct (2 spaces at every indentation level), yaml is very sensitive!\nkomga:\n database:\n file: ${user.home}/.komga/database.sqlite\n cors.allowed-origins:\n - http://localhost:8081\n - http://localhost:8082\n delete-empty-collections: true\n delete-empty-read-lists: true\nserver:\n port: 25600\n servlet:\n session.timeout: 7d # session timeout, here 7 days\n context-path: /komga\n"})}),"\n",(0,n.jsx)(i.h2,{id:"database-performance",children:"Database performance"}),"\n",(0,n.jsx)(i.admonition,{type:"warning",children:(0,n.jsx)(i.p,{children:"Use at your own risk!"})}),"\n",(0,n.jsx)(i.p,{children:"Some specific configuration keys are available to tweak the database performance."}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-yaml",children:"komga:\n database:\n # sets the retry timeout when SQLITE_BUSY error happens\n busy-timeout: 30s\n \n # changes the journal mode\n # accepted values are: DELETE, TRUNCATE, PERSIST, MEMORY, WAL, OFF\n # most likely to be set to wal if needed, check https://sqlite.org/wal.html for more details\n journal-mode: wal\n \n # pool size will determine the number of connections in the pool\n # this takes precedence over max-pool-size if set\n # defaults to undefined\n pool-size: 1\n \n # max-pool-size will determine the maximum number of connections in the pool\n # when set, the number of connections is set to the number of available processors capped at max-pool-size\n # defaults to 1\n max-pool-size: 8\n \n # pragmas accepts a list of key/value pairs where:\n # - key is the pragma name (see https://www.sqlite.org/pragma.html)\n # - value is the pragma value\n pragmas:\n # here are some example pragmas\n page_size: 1024\n synchronous: OFF\n"})})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3023:(e,i,o)=>{o.d(i,{R:()=>t,x:()=>a});var n=o(3696);const s={},r=n.createContext(s);function t(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/97c4f258.8e36b3d8.js b/assets/js/97c4f258.8e36b3d8.js new file mode 100644 index 00000000..9bd3d20e --- /dev/null +++ b/assets/js/97c4f258.8e36b3d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1057],{340:(e,i,o)=>{o.r(i),o.d(i,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=o(2540),s=o(3023);const r={},t="Configuration options",a={id:"installation/configuration",title:"Configuration options",description:"Komga has sensible default values for all configuration keys. You only need to configure it if you want to change the default behaviour.",source:"@site/docs/installation/configuration.md",sourceDirName:"installation",slug:"/installation/configuration",permalink:"/docs/installation/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/configuration.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install via third-party integrations",permalink:"/docs/installation/thirdparty"},next:{title:"Expose your server",permalink:"/docs/installation/https"}},l={},d=[{value:"Optional configuration",id:"optional-configuration",level:2},{value:"KOMGA_CONFIGDIR / komga.config-dir: <directory>",id:"komga_configdir--komgaconfig-dir-directory",level:4},{value:"SERVER_PORT / server.port: <port>",id:"server_port--serverport-port",level:4},{value:"SERVER_SERVLET_CONTEXT_PATH / server.servlet.context-path: <baseUrl>",id:"server_servlet_context_path--serverservletcontext-path-baseurl",level:4},{value:"SERVER_SERVLET_SESSION_TIMEOUT / server.servlet.session.timeout: <duration>",id:"server_servlet_session_timeout--serverservletsessiontimeout-duration",level:4},{value:"KOMGA_LIBRARIES_SCAN_CRON / komga.libraries-scan-cron: <cron>",id:"komga_libraries_scan_cron--komgalibraries-scan-cron-cron",level:4},{value:"KOMGA_LIBRARIES_SCAN_STARTUP / komga.libraries-scan-startup: <true/false>",id:"komga_libraries_scan_startup--komgalibraries-scan-startup-truefalse",level:4},{value:"KOMGA_LIBRARIES_SCAN_DIRECTORY_EXCLUSIONS / komga.libraries-scan-directory-exclusions: <exclusions>",id:"komga_libraries_scan_directory_exclusions--komgalibraries-scan-directory-exclusions-exclusions",level:4},{value:"KOMGA_REMEMBERME_KEY / komga.remember-me.key: <key>",id:"komga_rememberme_key--komgaremember-mekey-key",level:4},{value:"KOMGA_REMEMBERME_VALIDITY / komga.remember-me.validity: <duration>",id:"komga_rememberme_validity--komgaremember-mevalidity-duration",level:4},{value:"KOMGA_SESSIONTIMEOUT / komga.session-timeout: <duration>",id:"komga_sessiontimeout--komgasession-timeout-duration",level:4},{value:"KOMGA_DATABASE_FILE / komga.database.file: <file path>",id:"komga_database_file--komgadatabasefile-file-path",level:4},{value:"KOMGA_CORS_ALLOWED_ORIGINS / komga.cors.allowed-origins: <origins>",id:"komga_cors_allowed_origins--komgacorsallowed-origins-origins",level:4},{value:"KOMGA_DELETE_EMPTY_COLLECTIONS / komga.delete-empty-collections: <true/false>",id:"komga_delete_empty_collections--komgadelete-empty-collections-truefalse",level:4},{value:"KOMGA_DELETE_EMPTY_READ_LISTS / komga.delete-empty-read-lists: <true/false>",id:"komga_delete_empty_read_lists--komgadelete-empty-read-lists-truefalse",level:4},{value:"KOMGA_OAUTH2_ACCOUNT_CREATION / komga.oauth2-account-creation: <true/false>",id:"komga_oauth2_account_creation--komgaoauth2-account-creation-truefalse",level:4},{value:"KOMGA_OIDC_EMAIL_VERIFICATION / komga.oidc-email-verification: <true/false>",id:"komga_oidc_email_verification--komgaoidc-email-verification-truefalse",level:4},{value:"LOGGING_FILE_NAME / logging.file.name: <logfile name>",id:"logging_file_name--loggingfilename-logfile-name",level:4},{value:"KOMGA_TASKCONSUMERS / komga.task-consumers: <int>",id:"komga_taskconsumers--komgatask-consumers-int",level:4},{value:"KOMGA_TASKCONSUMERSMAX / komga.task-consumers-max: <int>",id:"komga_taskconsumersmax--komgatask-consumers-max-int",level:4},{value:"Sample Configuration File",id:"sample-configuration-file",level:2},{value:"Database performance",id:"database-performance",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",del:"del",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"configuration-options",children:"Configuration options"})}),"\n",(0,n.jsxs)(i.admonition,{type:"tip",children:[(0,n.jsx)(i.p,{children:"Komga has sensible default values for all configuration keys. You only need to configure it if you want to change the default behaviour."}),(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.code,{children:"application.yml"})," file does not exist by default, you need to create one if you want to customize the configuration."]})]}),"\n",(0,n.jsxs)(i.p,{children:["Komga relies heavily on ",(0,n.jsx)(i.a,{href:"https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html",children:"Spring Boot's configuration"}),", leveraging ",(0,n.jsx)(i.code,{children:"profiles"})," and configuration ",(0,n.jsx)(i.code,{children:"properties"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["The easiest way to configure is either via environment variables (a good fit for ",(0,n.jsx)(i.code,{children:"docker"})," and ",(0,n.jsx)(i.code,{children:"docker-compose"}),") or by using an ",(0,n.jsx)(i.code,{children:"application.yml"})," file located in the configuration directory:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["The Docker image will load any ",(0,n.jsx)(i.code,{children:"application.yml"})," file located in the ",(0,n.jsx)(i.code,{children:"/config"})," mounted folder."]}),"\n",(0,n.jsxs)(i.li,{children:["The Jar will load any ",(0,n.jsx)(i.code,{children:"application.yml"})," file located in the ",(0,n.jsx)(i.code,{children:"komga.config-dir"})," directory (defaults to ",(0,n.jsx)(i.code,{children:"~/.komga"}),", ",(0,n.jsx)(i.a,{href:"#komga-configdir-komga-config-dir-directory",children:"more details"}),")."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Each configuration key can have a different format depending if it's from the environment variable, or from the ",(0,n.jsx)(i.code,{children:"application.yml"})," file. In the following section I will provide both format in the form ",(0,n.jsx)(i.code,{children:"ENVIRONMENT_VARIABLE"})," / ",(0,n.jsx)(i.code,{children:"application-property"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["You can also specify configuration via the command line, when launching the ",(0,n.jsx)(i.code,{children:"jar"}),". Use the ",(0,n.jsx)(i.code,{children:"application-property"})," form, and prefix with ",(0,n.jsx)(i.code,{children:"--"}),". For example:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-shell",children:'java -jar komga.jar --server.servlet.context-path="/komga" --server.port=8443\n'})}),"\n",(0,n.jsx)(i.h2,{id:"optional-configuration",children:"Optional configuration"}),"\n",(0,n.jsx)(i.p,{children:"You can use some optional configuration keys:"}),"\n",(0,n.jsxs)(i.h4,{id:"komga_configdir--komgaconfig-dir-directory",children:["KOMGA_CONFIGDIR / komga.config-dir: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"The Komga configuration directory. Will be used to store the logs, database, and any other file Komga needs."}),"\n",(0,n.jsx)(i.p,{children:"Defaults to:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"%LOCALAPPDATA%/Komga"})," on the ",(0,n.jsx)(i.em,{children:"Windows app"}),". That folder is virtualized by Windows."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"~/Library/Application Support/Komga"})," on the macOS app."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"~/.komga"})," otherwise."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"~"})," is your home directory on Unix, and your User profile on Windows."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.em,{children:["When overriding this configuration, you need to use ",(0,n.jsx)(i.code,{children:"${user.home}"})," instead of ",(0,n.jsx)(i.code,{children:"~"})," (this is a specific Spring Boot variable)."]})}),"\n",(0,n.jsxs)(i.h4,{id:"server_port--serverport-port",children:["SERVER_PORT / server.port: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"Port to listen to for the API and web interface."}),"\n",(0,n.jsxs)(i.p,{children:["Can also be configured from the ",(0,n.jsx)(i.a,{href:"/docs/guides/server-settings#server-port",children:"Server Settings"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Defaults to ",(0,n.jsx)(i.code,{children:"25600"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"server_servlet_context_path--serverservletcontext-path-baseurl",children:["SERVER_SERVLET_CONTEXT_PATH / server.servlet.context-path: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"Base URL, useful if you need to reverse proxy with a subfolder."}),"\n",(0,n.jsxs)(i.p,{children:["Can also be configured from the ",(0,n.jsx)(i.a,{href:"/docs/guides/server-settings#base-url",children:"Server Settings"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Defaults to ",(0,n.jsx)(i.code,{children:"/"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"server_servlet_session_timeout--serverservletsessiontimeout-duration",children:["SERVER_SERVLET_SESSION_TIMEOUT / server.servlet.session.timeout: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsxs)(i.p,{children:["The duration after which an inactive session will expire. You can specify the timeunit, for example ",(0,n.jsx)(i.code,{children:"14d"})," for 14 days, or ",(0,n.jsx)(i.code,{children:"24h"})," for 24 hours. If no unit is set, seconds will be used."]}),"\n",(0,n.jsx)(i.p,{children:"Defaults to 30 minutes."}),"\n",(0,n.jsx)(i.h4,{id:"komga_libraries_scan_cron--komgalibraries-scan-cron-cron",children:(0,n.jsxs)(i.del,{children:["KOMGA_LIBRARIES_SCAN_CRON / komga.libraries-scan-cron: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsxs)(i.p,{children:["This has been moved to ",(0,n.jsx)(i.a,{href:"/docs/guides/libraries#scan-interval",children:"Library options: scan interval"}),"."]}),"\n",(0,n.jsx)(i.h4,{id:"komga_libraries_scan_startup--komgalibraries-scan-startup-truefalse",children:(0,n.jsxs)(i.del,{children:["KOMGA_LIBRARIES_SCAN_STARTUP / komga.libraries-scan-startup: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsxs)(i.p,{children:["This has been moved to ",(0,n.jsx)(i.a,{href:"/docs/guides/libraries#scan-on-startup",children:"Library options: scan on startup"}),"."]}),"\n",(0,n.jsx)(i.h4,{id:"komga_libraries_scan_directory_exclusions--komgalibraries-scan-directory-exclusions-exclusions",children:(0,n.jsxs)(i.del,{children:["KOMGA_LIBRARIES_SCAN_DIRECTORY_EXCLUSIONS / komga.libraries-scan-directory-exclusions: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsxs)(i.p,{children:["This has been moved to ",(0,n.jsx)(i.a,{href:"/docs/guides/libraries#directory-exclusions",children:"Library options: directory exclusions"}),"."]}),"\n",(0,n.jsx)(i.h4,{id:"komga_rememberme_key--komgaremember-mekey-key",children:(0,n.jsxs)(i.del,{children:["KOMGA_REMEMBERME_KEY / komga.remember-me.key: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been moved to Server Settings."}),"\n",(0,n.jsx)(i.h4,{id:"komga_rememberme_validity--komgaremember-mevalidity-duration",children:(0,n.jsxs)(i.del,{children:["KOMGA_REMEMBERME_VALIDITY / komga.remember-me.validity: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been moved to Server Settings."}),"\n",(0,n.jsx)(i.h4,{id:"komga_sessiontimeout--komgasession-timeout-duration",children:(0,n.jsxs)(i.del,{children:["KOMGA_SESSIONTIMEOUT / komga.session-timeout: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsxs)(i.p,{children:["This has been replaced by ",(0,n.jsx)(i.code,{children:"server.servlet.session.timeout"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"komga_database_file--komgadatabasefile-file-path",children:["KOMGA_DATABASE_FILE / komga.database.file: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"File path for the SQLite database."}),"\n",(0,n.jsxs)(i.p,{children:["If you want to change the directory, it is advised to change ",(0,n.jsx)(i.code,{children:"komga.config-dir"})," instead."]}),"\n",(0,n.jsx)(i.p,{children:"Defaults to:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"/config/database.sqlite"})," for ",(0,n.jsx)(i.em,{children:"Docker"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"\\${komga.config-dir}/database.sqlite"})," otherwise."]}),"\n"]}),"\n",(0,n.jsxs)(i.h4,{id:"komga_cors_allowed_origins--komgacorsallowed-origins-origins",children:["KOMGA_CORS_ALLOWED_ORIGINS / komga.cors.allowed-origins: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"A list of origins to allow for CORS."}),"\n",(0,n.jsx)(i.p,{children:"Defaults to empty list."}),"\n",(0,n.jsx)(i.h4,{id:"komga_delete_empty_collections--komgadelete-empty-collections-truefalse",children:(0,n.jsxs)(i.del,{children:["KOMGA_DELETE_EMPTY_COLLECTIONS / komga.delete-empty-collections: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been moved to Server Settings."}),"\n",(0,n.jsx)(i.h4,{id:"komga_delete_empty_read_lists--komgadelete-empty-read-lists-truefalse",children:(0,n.jsxs)(i.del,{children:["KOMGA_DELETE_EMPTY_READ_LISTS / komga.delete-empty-read-lists: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been moved to Server Settings."}),"\n",(0,n.jsxs)(i.h4,{id:"komga_oauth2_account_creation--komgaoauth2-account-creation-truefalse",children:["KOMGA_OAUTH2_ACCOUNT_CREATION / komga.oauth2-account-creation: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"A boolean indicating whether Komga should create new users when a login via OAuth2/OIDC succeeds, but there is no existing user with that email."}),"\n",(0,n.jsxs)(i.p,{children:["Such users will be created with a random password, which the user can subsequently change from the ",(0,n.jsx)(i.em,{children:"Account Settings"})," page later on, for example to be able to connect using OPDS or Mihon."]}),"\n",(0,n.jsx)(i.admonition,{type:"warning",children:(0,n.jsx)(i.p,{children:"It is recommended to enable this only with OAuth2 providers you control"})}),"\n",(0,n.jsxs)(i.p,{children:["Defaults to ",(0,n.jsx)(i.code,{children:"false"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"komga_oidc_email_verification--komgaoidc-email-verification-truefalse",children:["KOMGA_OIDC_EMAIL_VERIFICATION / komga.oidc-email-verification: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsxs)(i.p,{children:["A boolean indicating whether Komga should check whether the ",(0,n.jsx)(i.code,{children:"email_verified"})," claim is present and true in the OpenID Connect request."]}),"\n",(0,n.jsx)(i.admonition,{type:"warning",children:(0,n.jsx)(i.p,{children:"It is recommended to disable this only with OIDC providers that do not verify emails (like Azure AD)"})}),"\n",(0,n.jsxs)(i.p,{children:["Defaults to ",(0,n.jsx)(i.code,{children:"true"}),"."]}),"\n",(0,n.jsxs)(i.h4,{id:"logging_file_name--loggingfilename-logfile-name",children:["LOGGING_FILE_NAME / logging.file.name: ",(0,n.jsx)(i.code,{children:""})]}),"\n",(0,n.jsx)(i.p,{children:"Name of the log file."}),"\n",(0,n.jsxs)(i.p,{children:["If you want to change the directory, it is advised to change ",(0,n.jsx)(i.code,{children:"komga.config-dir"})," instead."]}),"\n",(0,n.jsx)(i.p,{children:"Defaults to:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"~/Library/Logs/Komga/komga.log"})," for the ",(0,n.jsx)(i.em,{children:"macOS app"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"/config/logs/komga.log"})," for ",(0,n.jsx)(i.em,{children:"Docker"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"\\${komga.config-dir}/komga.log"})," otherwise."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"~"})," is your home directory on Unix, and your User profile on Windows."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.em,{children:["When overriding this configuration, you need to use ",(0,n.jsx)(i.code,{children:"${user.home}"})," instead of ",(0,n.jsx)(i.code,{children:"~"})," (this is a specific Spring Boot variable)."]})}),"\n",(0,n.jsx)(i.h4,{id:"komga_taskconsumers--komgatask-consumers-int",children:(0,n.jsxs)(i.del,{children:["KOMGA_TASKCONSUMERS / komga.task-consumers: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been removed."}),"\n",(0,n.jsx)(i.h4,{id:"komga_taskconsumersmax--komgatask-consumers-max-int",children:(0,n.jsxs)(i.del,{children:["KOMGA_TASKCONSUMERSMAX / komga.task-consumers-max: ",(0,n.jsx)(i.code,{children:""})]})}),"\n",(0,n.jsx)(i.p,{children:"This has been removed."}),"\n",(0,n.jsx)(i.h2,{id:"sample-configuration-file",children:"Sample Configuration File"}),"\n",(0,n.jsxs)(i.p,{children:["Here is a sample ",(0,n.jsx)(i.code,{children:"application.yml"})," file in case you need to customize it. Keep only the lines you need."]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-yaml",children:"# Only keep lines that are relevant to you!\n# Lines starting with # are comments\n# Make sure indentation is correct (2 spaces at every indentation level), yaml is very sensitive!\nkomga:\n database:\n file: ${user.home}/.komga/database.sqlite\n cors.allowed-origins:\n - http://localhost:8081\n - http://localhost:8082\n delete-empty-collections: true\n delete-empty-read-lists: true\nserver:\n port: 25600\n servlet:\n session.timeout: 7d # session timeout, here 7 days\n context-path: /komga\n"})}),"\n",(0,n.jsx)(i.h2,{id:"database-performance",children:"Database performance"}),"\n",(0,n.jsx)(i.admonition,{type:"warning",children:(0,n.jsx)(i.p,{children:"Use at your own risk!"})}),"\n",(0,n.jsx)(i.p,{children:"Some specific configuration keys are available to tweak the database performance."}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-yaml",children:"komga:\n database:\n # sets the retry timeout when SQLITE_BUSY error happens\n busy-timeout: 30s\n \n # changes the journal mode\n # accepted values are: DELETE, TRUNCATE, PERSIST, MEMORY, WAL, OFF\n # most likely to be set to wal if needed, check https://sqlite.org/wal.html for more details\n journal-mode: wal\n \n # pool size will determine the number of connections in the pool\n # this takes precedence over max-pool-size if set\n # defaults to undefined\n pool-size: 1\n \n # max-pool-size will determine the maximum number of connections in the pool\n # when set, the number of connections is set to the number of available processors capped at max-pool-size\n # defaults to 1\n max-pool-size: 8\n \n # pragmas accepts a list of key/value pairs where:\n # - key is the pragma name (see https://www.sqlite.org/pragma.html)\n # - value is the pragma value\n pragmas:\n # here are some example pragmas\n page_size: 1024\n synchronous: OFF\n"})})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3023:(e,i,o)=>{o.d(i,{R:()=>t,x:()=>a});var n=o(3696);const s={},r=n.createContext(s);function t(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/98ce5054.5ec05dba.js b/assets/js/98ce5054.5ec05dba.js new file mode 100644 index 00000000..da04a0e5 --- /dev/null +++ b/assets/js/98ce5054.5ec05dba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5628],{6407:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var t=r(2540),n=r(3023);const o={},i="Local Artwork Assets",d={id:"guides/local-artwork-assets",title:"Local Artwork Assets",description:"Supported Artwork Image Formats",source:"@site/docs/guides/local-artwork-assets.md",sourceDirName:"guides",slug:"/guides/local-artwork-assets",permalink:"/docs/guides/local-artwork-assets",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/local-artwork-assets.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Edit Metadata",permalink:"/docs/guides/edit-metadata"},next:{title:"User accounts",permalink:"/docs/guides/user-accounts"}},l={},c=[{value:"Supported Artwork Image Formats",id:"supported-artwork-image-formats",level:2},{value:"Poster Artwork",id:"poster-artwork",level:2},{value:"Books",id:"books",level:4},{value:"Series",id:"series",level:4}];function a(e){const s={code:"code",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"local-artwork-assets",children:"Local Artwork Assets"})}),"\n",(0,t.jsx)(s.h2,{id:"supported-artwork-image-formats",children:"Supported Artwork Image Formats"}),"\n",(0,t.jsx)(s.p,{children:"There are a number of supported custom media items that need to be named correctly to be detected. The supported image file formats are:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"jpg"}),"\n",(0,t.jsx)(s.li,{children:"jpeg"}),"\n",(0,t.jsx)(s.li,{children:"png"}),"\n",(0,t.jsx)(s.li,{children:"webp"}),"\n",(0,t.jsx)(s.li,{children:"tbn"}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"poster-artwork",children:"Poster Artwork"}),"\n",(0,t.jsx)(s.p,{children:"Posters are typically displayed for books, series and collections on dashboards, library views, and when looking at details for the element. Poster art is typically of 21:29.7 aspect ratio. Custom Poster artwork will be detected and used if named and stored as follows."}),"\n",(0,t.jsx)(s.h4,{id:"books",children:"Books"}),"\n",(0,t.jsx)(s.p,{children:"Custom poster must have the same name as the book file:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"Exact book name.ext"})}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"ext"})," is the file extension."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"/Series\n Book 10.cbz\n Book 10.jpg\n"})}),"\n",(0,t.jsx)(s.p,{children:"More than one poster image can be included. For multiple items to be scanned, they should be named as follows:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"Exact book name-X.ext"})}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:["Where ",(0,t.jsx)(s.code,{children:"-X"})," is a number."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"/Series\n Book 12.cbz\n Book 12-1.jpg\n Book 12-2.png\n"})}),"\n",(0,t.jsx)(s.h4,{id:"series",children:"Series"}),"\n",(0,t.jsx)(s.p,{children:"Custom poster must be located in the Series directory and named as follows:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"cover.ext"})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"default.ext"})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"folder.ext"})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"series.ext"})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"poster.ext"})}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"ext"})," is the file extension."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"/Series\n poster.jpg\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},3023:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>d});var t=r(3696);const n={},o=t.createContext(n);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/98ce5054.8e34cd23.js b/assets/js/98ce5054.8e34cd23.js deleted file mode 100644 index 2cbcd2b4..00000000 --- a/assets/js/98ce5054.8e34cd23.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5628],{6407:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var t=r(2540),n=r(3023);const o={},i="Local Artwork Assets",d={id:"guides/local-artwork-assets",title:"Local Artwork Assets",description:"Supported Artwork Image Formats",source:"@site/docs/guides/local-artwork-assets.md",sourceDirName:"guides",slug:"/guides/local-artwork-assets",permalink:"/docs/guides/local-artwork-assets",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/local-artwork-assets.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Edit Metadata",permalink:"/docs/guides/edit-metadata"},next:{title:"User accounts",permalink:"/docs/guides/user-accounts"}},l={},c=[{value:"Supported Artwork Image Formats",id:"supported-artwork-image-formats",level:2},{value:"Poster Artwork",id:"poster-artwork",level:2},{value:"Books",id:"books",level:4},{value:"Series",id:"series",level:4}];function a(e){const s={code:"code",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"local-artwork-assets",children:"Local Artwork Assets"})}),"\n",(0,t.jsx)(s.h2,{id:"supported-artwork-image-formats",children:"Supported Artwork Image Formats"}),"\n",(0,t.jsx)(s.p,{children:"There are a number of supported custom media items that need to be named correctly to be detected. The supported image file formats are:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"jpg"}),"\n",(0,t.jsx)(s.li,{children:"jpeg"}),"\n",(0,t.jsx)(s.li,{children:"png"}),"\n",(0,t.jsx)(s.li,{children:"webp"}),"\n",(0,t.jsx)(s.li,{children:"tbn"}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"poster-artwork",children:"Poster Artwork"}),"\n",(0,t.jsx)(s.p,{children:"Posters are typically displayed for books, series and collections on dashboards, library views, and when looking at details for the element. Poster art is typically of 21:29.7 aspect ratio. Custom Poster artwork will be detected and used if named and stored as follows."}),"\n",(0,t.jsx)(s.h4,{id:"books",children:"Books"}),"\n",(0,t.jsx)(s.p,{children:"Custom poster must have the same name as the book file:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"Exact book name.ext"})}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"ext"})," is the file extension."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"/Series\n Book 10.cbz\n Book 10.jpg\n"})}),"\n",(0,t.jsx)(s.p,{children:"More than one poster image can be included. For multiple items to be scanned, they should be named as follows:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"Exact book name-X.ext"})}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:["Where ",(0,t.jsx)(s.code,{children:"-X"})," is a number."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"/Series\n Book 12.cbz\n Book 12-1.jpg\n Book 12-2.png\n"})}),"\n",(0,t.jsx)(s.h4,{id:"series",children:"Series"}),"\n",(0,t.jsx)(s.p,{children:"Custom poster must be located in the Series directory and named as follows:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"cover.ext"})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"default.ext"})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"folder.ext"})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"series.ext"})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.code,{children:"poster.ext"})}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:"ext"})," is the file extension."]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"/Series\n poster.jpg\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},3023:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>d});var t=r(3696);const n={},o=t.createContext(n);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a09c2993.25baf151.js b/assets/js/a09c2993.25baf151.js new file mode 100644 index 00000000..4eba82ac --- /dev/null +++ b/assets/js/a09c2993.25baf151.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5899],{549:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var s=i(2540),t=i(3023);const r={},o="Introduction",d={id:"introduction",title:"Introduction",description:"What is Komga?",source:"@site/docs/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/docs/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/introduction.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",next:{title:"Installation",permalink:"/docs/category/installation"}},l={},a=[{value:"What is Komga?",id:"what-is-komga",level:2},{value:"What media and devices work?",id:"what-media-and-devices-work",level:2},{value:"Komga supports these media file types",id:"komga-supports-these-media-file-types",level:3},{value:"Komga server compatibility",id:"komga-server-compatibility",level:3},{value:"Demo",id:"demo",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"introduction",children:"Introduction"})}),"\n",(0,s.jsx)(n.h2,{id:"what-is-komga",children:"What is Komga?"}),"\n",(0,s.jsx)(n.p,{children:"Komga is a media server for your comics, mangas, BDs, magazines and eBooks."}),"\n",(0,s.jsx)(n.p,{children:"How it works:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Install and run Komga on a computer or NAS."}),"\n",(0,s.jsx)(n.li,{children:"Add libraries by type of content and let Komga do the rest."}),"\n",(0,s.jsx)(n.li,{children:"Use the web interface or any compatible client."}),"\n",(0,s.jsx)(n.li,{children:"Enjoy your books!"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"what-media-and-devices-work",children:"What media and devices work?"}),"\n",(0,s.jsx)(n.h3,{id:"komga-supports-these-media-file-types",children:"Komga supports these media file types"}),"\n",(0,s.jsx)(n.p,{children:"Komga supports the following file types:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Comic book archives: ",(0,s.jsx)(n.em,{children:"CBZ"})," and ",(0,s.jsx)(n.em,{children:"CBR"})," (except solid archives, for RAR5 see below)"]}),"\n",(0,s.jsxs)(n.li,{children:["eBooks in ",(0,s.jsx)(n.em,{children:"EPUB"})," format"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"PDF"})," files"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"RAR 5 is supported on some platforms only, as it relies on native libraries for decoding."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Platform"}),(0,s.jsx)(n.th,{children:"RAR 5"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"macOS app"}),(0,s.jsx)(n.td,{children:"\u2714\ufe0f"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Windows app"}),(0,s.jsx)(n.td,{children:"\u2714\ufe0f"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Docker amd64"}),(0,s.jsx)(n.td,{children:"\u2714\ufe0f"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Docker arm64"}),(0,s.jsx)(n.td,{children:"\u2714\ufe0f"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Docker arm"}),(0,s.jsx)(n.td,{children:"\u274c"})]})]})]}),"\n",(0,s.jsxs)(n.p,{children:["When using the ",(0,s.jsx)(n.code,{children:"jar"}),", you will need to provide the native library yourself, and run Java with the correct arguments. You can check for more details ",(0,s.jsx)(n.a,{href:"https://github.com/gotson/NightCompress/#requirements",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"komga-server-compatibility",children:"Komga server compatibility"}),"\n",(0,s.jsx)(n.p,{children:"Komga can run on any system that can run Java or Docker:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Windows"}),"\n",(0,s.jsx)(n.li,{children:"macOS"}),"\n",(0,s.jsx)(n.li,{children:"Linux"}),"\n",(0,s.jsx)(n.li,{children:"Many popular NAS devices such as QNAP, Synology and more"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"demo",children:"Demo"}),"\n",(0,s.jsxs)(n.p,{children:["A demonstration website is available at: ",(0,s.jsx)(n.a,{href:"https://demo.komga.org",children:"https://demo.komga.org"})]}),"\n",(0,s.jsx)(n.p,{children:"You can log in using the following credentials:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Login: ",(0,s.jsx)(n.code,{children:"demo@komga.org"})]}),"\n",(0,s.jsxs)(n.li,{children:["Password: ",(0,s.jsx)(n.code,{children:"komga-demo"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>d});var s=i(3696);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a09c2993.6d0adad7.js b/assets/js/a09c2993.6d0adad7.js deleted file mode 100644 index f661bc90..00000000 --- a/assets/js/a09c2993.6d0adad7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5899],{549:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var s=i(2540),t=i(3023);const r={},o="Introduction",d={id:"introduction",title:"Introduction",description:"What is Komga?",source:"@site/docs/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/docs/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/introduction.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",next:{title:"Installation",permalink:"/docs/category/installation"}},l={},a=[{value:"What is Komga?",id:"what-is-komga",level:2},{value:"What media and devices work?",id:"what-media-and-devices-work",level:2},{value:"Komga supports these media file types",id:"komga-supports-these-media-file-types",level:3},{value:"Komga server compatibility",id:"komga-server-compatibility",level:3},{value:"Demo",id:"demo",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"introduction",children:"Introduction"})}),"\n",(0,s.jsx)(n.h2,{id:"what-is-komga",children:"What is Komga?"}),"\n",(0,s.jsx)(n.p,{children:"Komga is a media server for your comics, mangas, BDs, magazines and eBooks."}),"\n",(0,s.jsx)(n.p,{children:"How it works:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Install and run Komga on a computer or NAS."}),"\n",(0,s.jsx)(n.li,{children:"Add libraries by type of content and let Komga do the rest."}),"\n",(0,s.jsx)(n.li,{children:"Use the web interface or any compatible client."}),"\n",(0,s.jsx)(n.li,{children:"Enjoy your books!"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"what-media-and-devices-work",children:"What media and devices work?"}),"\n",(0,s.jsx)(n.h3,{id:"komga-supports-these-media-file-types",children:"Komga supports these media file types"}),"\n",(0,s.jsx)(n.p,{children:"Komga supports the following file types:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Comic book archives: ",(0,s.jsx)(n.em,{children:"CBZ"})," and ",(0,s.jsx)(n.em,{children:"CBR"})," (except solid archives, for RAR5 see below)"]}),"\n",(0,s.jsxs)(n.li,{children:["eBooks in ",(0,s.jsx)(n.em,{children:"EPUB"})," format"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.em,{children:"PDF"})," files"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"RAR 5 is supported on some platforms only, as it relies on native libraries for decoding."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Platform"}),(0,s.jsx)(n.th,{children:"RAR 5"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"macOS app"}),(0,s.jsx)(n.td,{children:"\u2714\ufe0f"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Windows app"}),(0,s.jsx)(n.td,{children:"\u274c"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Docker amd64"}),(0,s.jsx)(n.td,{children:"\u2714\ufe0f"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Docker arm64"}),(0,s.jsx)(n.td,{children:"\u2714\ufe0f"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Docker arm"}),(0,s.jsx)(n.td,{children:"\u274c"})]})]})]}),"\n",(0,s.jsxs)(n.p,{children:["When using the ",(0,s.jsx)(n.code,{children:"jar"}),", you will need to provide the native library yourself, and run Java with the correct arguments. You can check for more details ",(0,s.jsx)(n.a,{href:"https://github.com/gotson/NightCompress/#requirements",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"komga-server-compatibility",children:"Komga server compatibility"}),"\n",(0,s.jsx)(n.p,{children:"Komga can run on any system that can run Java or Docker:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Windows"}),"\n",(0,s.jsx)(n.li,{children:"macOS"}),"\n",(0,s.jsx)(n.li,{children:"Linux"}),"\n",(0,s.jsx)(n.li,{children:"Many popular NAS devices such as QNAP, Synology and more"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"demo",children:"Demo"}),"\n",(0,s.jsxs)(n.p,{children:["A demonstration website is available at: ",(0,s.jsx)(n.a,{href:"https://demo.komga.org",children:"https://demo.komga.org"})]}),"\n",(0,s.jsx)(n.p,{children:"You can log in using the following credentials:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Login: ",(0,s.jsx)(n.code,{children:"demo@komga.org"})]}),"\n",(0,s.jsxs)(n.li,{children:["Password: ",(0,s.jsx)(n.code,{children:"komga-demo"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>d});var s=i(3696);const t={},r=s.createContext(t);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a22ccb60.29576c43.js b/assets/js/a22ccb60.29576c43.js new file mode 100644 index 00000000..3e56bbde --- /dev/null +++ b/assets/js/a22ccb60.29576c43.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1598],{8176:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var t=i(2540),r=i(3023);const o={},d="Deprecation",s={id:"api/deprecation",title:"Deprecation",description:"To be removed in 2.0.0",source:"@site/docs/api/deprecation.md",sourceDirName:"api",slug:"/api/deprecation",permalink:"/docs/api/deprecation",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/api/deprecation.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"api",previous:{title:"REST API",permalink:"/docs/api/rest"}},a={},c=[{value:"To be removed in 2.0.0",id:"to-be-removed-in-200",level:2},{value:"PUT /api/v1/libraries/{libraryId}",id:"put-apiv1librarieslibraryid",level:3}];function l(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"deprecation",children:"Deprecation"})}),"\n",(0,t.jsx)(n.h2,{id:"to-be-removed-in-200",children:"To be removed in 2.0.0"}),"\n",(0,t.jsxs)(n.p,{children:["The following API endpoints will be removed in version ",(0,t.jsx)(n.code,{children:"2.0.0"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"put-apiv1librarieslibraryid",children:"PUT /api/v1/libraries/{libraryId}"}),"\n",(0,t.jsxs)(n.p,{children:["Deprecated since version: ",(0,t.jsx)(n.code,{children:"1.3.0"})]}),"\n",(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.code,{children:"PATCH /api/v1/libraries/{libraryId}"})," instead, without any change needed. The ",(0,t.jsx)(n.code,{children:"PUT"})," endpoint redirects to the ",(0,t.jsx)(n.code,{children:"PATCH"})," endpoint internally."]}),"\n",(0,t.jsx)(n.p,{children:"The endpoint now accepts a partial DTO, and will only update fields that are present."})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},3023:(e,n,i)=>{i.d(n,{R:()=>d,x:()=>s});var t=i(3696);const r={},o=t.createContext(r);function d(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a22ccb60.8ca36230.js b/assets/js/a22ccb60.8ca36230.js deleted file mode 100644 index d014a024..00000000 --- a/assets/js/a22ccb60.8ca36230.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1598],{8176:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var t=i(2540),r=i(3023);const o={},d="Deprecation",s={id:"api/deprecation",title:"Deprecation",description:"To be removed in 2.0.0",source:"@site/docs/api/deprecation.md",sourceDirName:"api",slug:"/api/deprecation",permalink:"/docs/api/deprecation",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/api/deprecation.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"api",previous:{title:"REST API",permalink:"/docs/api/rest"}},a={},c=[{value:"To be removed in 2.0.0",id:"to-be-removed-in-200",level:2},{value:"PUT /api/v1/libraries/{libraryId}",id:"put-apiv1librarieslibraryid",level:3}];function l(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"deprecation",children:"Deprecation"})}),"\n",(0,t.jsx)(n.h2,{id:"to-be-removed-in-200",children:"To be removed in 2.0.0"}),"\n",(0,t.jsxs)(n.p,{children:["The following API endpoints will be removed in version ",(0,t.jsx)(n.code,{children:"2.0.0"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"put-apiv1librarieslibraryid",children:"PUT /api/v1/libraries/{libraryId}"}),"\n",(0,t.jsxs)(n.p,{children:["Deprecated since version: ",(0,t.jsx)(n.code,{children:"1.3.0"})]}),"\n",(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.code,{children:"PATCH /api/v1/libraries/{libraryId}"})," instead, without any change needed. The ",(0,t.jsx)(n.code,{children:"PUT"})," endpoint redirects to the ",(0,t.jsx)(n.code,{children:"PATCH"})," endpoint internally."]}),"\n",(0,t.jsx)(n.p,{children:"The endpoint now accepts a partial DTO, and will only update fields that are present."})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},3023:(e,n,i)=>{i.d(n,{R:()=>d,x:()=>s});var t=i(3696);const r={},o=t.createContext(r);function d(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a624e12b.50bde33c.js b/assets/js/a624e12b.50bde33c.js new file mode 100644 index 00000000..802ec619 --- /dev/null +++ b/assets/js/a624e12b.50bde33c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1130],{4511:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=o(2540),t=o(3023);const r={},s="Social login",a={id:"installation/oauth2",title:"Social login",description:"Komga supports social login via OAuth2 and OpenID Connect. In order for this to work, Komga needs to retrieve the user's email address via your provider, and will match it with the email of the Komga users.",source:"@site/docs/installation/oauth2.md",sourceDirName:"installation",slug:"/installation/oauth2",permalink:"/docs/installation/oauth2",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/oauth2.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Expose your server",permalink:"/docs/installation/https"},next:{title:"Google Drive and rclone",permalink:"/docs/installation/gdrive"}},c={},l=[{value:"Guide for common providers",id:"guide-for-common-providers",level:2},{value:"Google",id:"google",level:3},{value:"Facebook",id:"facebook",level:3},{value:"Github",id:"github",level:3},{value:"Advanced configuration",id:"advanced-configuration",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"social-login",children:"Social login"})}),"\n",(0,i.jsxs)(n.p,{children:["Komga supports social login via ",(0,i.jsx)(n.strong,{children:"OAuth2"})," and ",(0,i.jsx)(n.strong,{children:"OpenID Connect"}),". In order for this to work, Komga needs to retrieve the user's email address via your provider, and will match it with the email of the Komga users."]}),"\n",(0,i.jsxs)(n.p,{children:["In order to setup social login, you will need to create an application in the developer portal of the social login provider of your choice (Google, Facebook, Github\u2026), and retrieve a ",(0,i.jsx)(n.em,{children:"Client ID"})," and ",(0,i.jsx)(n.em,{children:"Client Secret"}),". You will also need to configure a ",(0,i.jsx)(n.em,{children:"Redirect URI"})," in the application you created."]}),"\n",(0,i.jsxs)(n.p,{children:["You can enable automatic account creation upon successful social login, see ",(0,i.jsx)(n.a,{href:"/docs/installation/configuration#komga-oauth2-account-creation-komga-oauth2-account-creation-true-false",children:"here"})," for more details."]}),"\n",(0,i.jsx)(n.h2,{id:"guide-for-common-providers",children:"Guide for common providers"}),"\n",(0,i.jsx)(n.p,{children:"You can easily configure Google, Github, and Facebook without any complex configuration."}),"\n",(0,i.jsx)(n.h3,{id:"google",children:"Google"}),"\n",(0,i.jsxs)(n.p,{children:["Follow the instructions on the ",(0,i.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/OpenIDConnect",children:"OpenID Connect page"}),', starting in the section, "Setting up OAuth 2.0".']}),"\n",(0,i.jsxs)(n.p,{children:['When asked for a "Redirect URI", use ',(0,i.jsx)(n.code,{children:"{baseUrl}/login/oauth2/code/google"}),", where ",(0,i.jsx)(n.code,{children:"baseUrl"})," is your server's address."]}),"\n",(0,i.jsx)(n.p,{children:'After completing the "Obtain OAuth 2.0 credentials" instructions, you should have a new OAuth Client with credentials consisting of a Client ID and a Client Secret.'}),"\n",(0,i.jsxs)(n.p,{children:["Modify your ",(0,i.jsx)(n.code,{children:"application.yml"})," as below and replace the values in the ",(0,i.jsx)(n.code,{children:"client-id"})," and ",(0,i.jsx)(n.code,{children:"client-secret"})," property with the OAuth 2.0 credentials you created earlier."]}),"\n",(0,i.jsx)(n.p,{children:"Sample configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: 1044613984fsf335-mnsdvkjy3yf98294unfmnvd8.apps.googleusercontent.com\n client-secret: jwhfkjhwefkn44t8vcxml3m\n"})}),"\n",(0,i.jsx)(n.h3,{id:"facebook",children:"Facebook"}),"\n",(0,i.jsxs)(n.p,{children:["Follow the ",(0,i.jsx)(n.a,{href:"https://developers.facebook.com/docs/development/register",children:"instructions"})," to create an App, and add the Facebook Login product."]}),"\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.code,{children:"Valid OAuth Redirect URIs"}),", use ",(0,i.jsx)(n.code,{children:"{baseUrl}/login/oauth2/code/facebook"}),", where ",(0,i.jsx)(n.code,{children:"baseUrl"})," is your server's address."]}),"\n",(0,i.jsxs)(n.p,{children:["Modify your ",(0,i.jsx)(n.code,{children:"application.yml"})," as below and replace the values in the ",(0,i.jsx)(n.code,{children:"client-id"})," and ",(0,i.jsx)(n.code,{children:"client-secret"})," property with the App ID and App Secret."]}),"\n",(0,i.jsx)(n.p,{children:"Sample configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"spring:\n security:\n oauth2:\n client:\n registration:\n facebook:\n client-id: 227581266063919\n client-secret: 47f03915334f49cdueru810069321964929\n"})}),"\n",(0,i.jsx)(n.h3,{id:"github",children:"Github"}),"\n",(0,i.jsxs)(n.p,{children:["Register a ",(0,i.jsx)(n.a,{href:"https://github.com/settings/applications/new",children:"new application"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:['For the "Authorization callback URL", use ',(0,i.jsx)(n.code,{children:"{baseUrl}/login/oauth2/code/github"}),", where ",(0,i.jsx)(n.code,{children:"baseUrl"})," is your server's address."]}),"\n",(0,i.jsx)(n.p,{children:"Generate a new Client Secret, you should now have a Client ID and Client Secret."}),"\n",(0,i.jsxs)(n.p,{children:["Modify your ",(0,i.jsx)(n.code,{children:"application.yml"})," as below and replace the values in the ",(0,i.jsx)(n.code,{children:"client-id"})," and ",(0,i.jsx)(n.code,{children:"client-secret"})," property with the OAuth 2.0 credentials you created earlier."]}),"\n",(0,i.jsx)(n.p,{children:"Sample configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"spring:\n security:\n oauth2:\n client:\n registration:\n github:\n client-id: 62736jnfksui37384hnmsdnf\n client-secret: jhjgfy67363uhif762328938844940e3e8c8629c18f9\n scope: user:email\n"})}),"\n",(0,i.jsx)(n.h2,{id:"advanced-configuration",children:"Advanced configuration"}),"\n",(0,i.jsx)(n.p,{children:"You can configure any OAuth2 provider, but you will need to provide a more extensive configuration. The below example shows how to configure a Keycloak instance, but any provider could be configured in a similar fashion."}),"\n",(0,i.jsxs)(n.p,{children:["Modify your ",(0,i.jsx)(n.code,{children:"application.yml"})," as below and replace the values in the ",(0,i.jsx)(n.code,{children:"client-id"})," and ",(0,i.jsx)(n.code,{children:"client-secret"})," property with your credentials You will also need to update the various URIs in the ",(0,i.jsx)(n.code,{children:"provider"})," section."]}),"\n",(0,i.jsx)(n.p,{children:"You need to make sure that the users have an email setup, and that it has been marked as verified."}),"\n",(0,i.jsxs)(n.p,{children:["When configuring the client in your provider, you may need to input a redirect URI. Use the following: ",(0,i.jsx)(n.code,{children:"{baseUrl}/login/oauth2/code/{registrationId}"}),", where ",(0,i.jsx)(n.code,{children:"baseUrl"})," is your server's address, and ",(0,i.jsx)(n.code,{children:"registrationId"})," is the name of the configuration key (",(0,i.jsx)(n.code,{children:"keycloak"})," in the below example)."]}),"\n",(0,i.jsxs)(n.p,{children:["There are 2 options to configure a provider, either set ",(0,i.jsx)(n.code,{children:"issuer-uri"})," or all of the following: ",(0,i.jsx)(n.code,{children:"authorization-uri"}),", ",(0,i.jsx)(n.code,{children:"token-uri"}),",\n",(0,i.jsx)(n.code,{children:"jwk-set-uri"}),", ",(0,i.jsx)(n.code,{children:"user-info-uri"}),". If your authentication server provides ",(0,i.jsx)(n.code,{children:"issuer-uri"}),", this option is preferred."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"registration"})," section contains a ",(0,i.jsx)(n.code,{children:"provider"})," option, this must be the same name as specified in the\n",(0,i.jsx)(n.code,{children:"provider"})," configuration. (In the example below, we've configured ",(0,i.jsx)(n.code,{children:"provider"})," with name ",(0,i.jsx)(n.code,{children:"keycloak"}),", so in the\n",(0,i.jsx)(n.code,{children:"registration"})," section we set ",(0,i.jsx)(n.code,{children:"provider: keycloak"}),"). The name of the provider can be whatever you want, no need\nto use the service's name if you don't want to."]}),"\n",(0,i.jsx)(n.p,{children:"Sample configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'spring:\n security:\n oauth2:\n client:\n registration:\n keycloak:\n provider: keycloak # this must match the provider below\n client-id: your-client-id\n client-secret: c830e452-a2a9-40a0-93c1-eb84ea688245\n client-name: Keycloak\n scope: openid,email\n authorization-grant-type: authorization_code\n # the placeholders in {} will be replaced automatically, you don\'t need to change this line\n redirect-uri: "{baseUrl}/{action}/oauth2/code/{registrationId}"\n provider:\n keycloak: # this must match the provider above\n user-name-attribute: sub\n # either set the issuer-uri, in which case the app will lookup the configuration for you automatically\n issuer-uri: http://localhost:8085/auth/realms/komgatest\n # or set all of the following\n authorization-uri: http://localhost:8085/auth/realms/komgatest/protocol/openid-connect/auth\n token-uri: http://localhost:8085/auth/realms/komgatest/protocol/openid-connect/token\n jwk-set-uri: http://localhost:8085/auth/realms/komgatest/protocol/openid-connect/certs\n user-info-uri: http://localhost:8085/auth/realms/komgatest/protocol/openid-connect/userinfo\n'})})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},3023:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var i=o(3696);const t={},r=i.createContext(t);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a624e12b.ded498d7.js b/assets/js/a624e12b.ded498d7.js deleted file mode 100644 index fcb740e5..00000000 --- a/assets/js/a624e12b.ded498d7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1130],{4511:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=o(2540),t=o(3023);const r={},s="Social login",a={id:"installation/oauth2",title:"Social login",description:"Komga supports social login via OAuth2 and OpenID Connect. In order for this to work, Komga needs to retrieve the user's email address via your provider, and will match it with the email of the Komga users.",source:"@site/docs/installation/oauth2.md",sourceDirName:"installation",slug:"/installation/oauth2",permalink:"/docs/installation/oauth2",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/oauth2.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Expose your server",permalink:"/docs/installation/https"},next:{title:"Google Drive and rclone",permalink:"/docs/installation/gdrive"}},c={},l=[{value:"Guide for common providers",id:"guide-for-common-providers",level:2},{value:"Google",id:"google",level:3},{value:"Facebook",id:"facebook",level:3},{value:"Github",id:"github",level:3},{value:"Advanced configuration",id:"advanced-configuration",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"social-login",children:"Social login"})}),"\n",(0,i.jsxs)(n.p,{children:["Komga supports social login via ",(0,i.jsx)(n.strong,{children:"OAuth2"})," and ",(0,i.jsx)(n.strong,{children:"OpenID Connect"}),". In order for this to work, Komga needs to retrieve the user's email address via your provider, and will match it with the email of the Komga users."]}),"\n",(0,i.jsxs)(n.p,{children:["In order to setup social login, you will need to create an application in the developer portal of the social login provider of your choice (Google, Facebook, Github\u2026), and retrieve a ",(0,i.jsx)(n.em,{children:"Client ID"})," and ",(0,i.jsx)(n.em,{children:"Client Secret"}),". You will also need to configure a ",(0,i.jsx)(n.em,{children:"Redirect URI"})," in the application you created."]}),"\n",(0,i.jsxs)(n.p,{children:["You can enable automatic account creation upon successful social login, see ",(0,i.jsx)(n.a,{href:"/docs/installation/configuration#komga-oauth2-account-creation-komga-oauth2-account-creation-true-false",children:"here"})," for more details."]}),"\n",(0,i.jsx)(n.h2,{id:"guide-for-common-providers",children:"Guide for common providers"}),"\n",(0,i.jsx)(n.p,{children:"You can easily configure Google, Github, and Facebook without any complex configuration."}),"\n",(0,i.jsx)(n.h3,{id:"google",children:"Google"}),"\n",(0,i.jsxs)(n.p,{children:["Follow the instructions on the ",(0,i.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/OpenIDConnect",children:"OpenID Connect page"}),', starting in the section, "Setting up OAuth 2.0".']}),"\n",(0,i.jsxs)(n.p,{children:['When asked for a "Redirect URI", use ',(0,i.jsx)(n.code,{children:"{baseUrl}/login/oauth2/code/google"}),", where ",(0,i.jsx)(n.code,{children:"baseUrl"})," is your server's address."]}),"\n",(0,i.jsx)(n.p,{children:'After completing the "Obtain OAuth 2.0 credentials" instructions, you should have a new OAuth Client with credentials consisting of a Client ID and a Client Secret.'}),"\n",(0,i.jsxs)(n.p,{children:["Modify your ",(0,i.jsx)(n.code,{children:"application.yml"})," as below and replace the values in the ",(0,i.jsx)(n.code,{children:"client-id"})," and ",(0,i.jsx)(n.code,{children:"client-secret"})," property with the OAuth 2.0 credentials you created earlier."]}),"\n",(0,i.jsx)(n.p,{children:"Sample configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: 1044613984fsf335-mnsdvkjy3yf98294unfmnvd8.apps.googleusercontent.com\n client-secret: jwhfkjhwefkn44t8vcxml3m\n"})}),"\n",(0,i.jsx)(n.h3,{id:"facebook",children:"Facebook"}),"\n",(0,i.jsxs)(n.p,{children:["Follow the ",(0,i.jsx)(n.a,{href:"https://developers.facebook.com/docs/development/register",children:"instructions"})," to create an App, and add the Facebook Login product."]}),"\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.code,{children:"Valid OAuth Redirect URIs"}),", use ",(0,i.jsx)(n.code,{children:"{baseUrl}/login/oauth2/code/facebook"}),", where ",(0,i.jsx)(n.code,{children:"baseUrl"})," is your server's address."]}),"\n",(0,i.jsxs)(n.p,{children:["Modify your ",(0,i.jsx)(n.code,{children:"application.yml"})," as below and replace the values in the ",(0,i.jsx)(n.code,{children:"client-id"})," and ",(0,i.jsx)(n.code,{children:"client-secret"})," property with the App ID and App Secret."]}),"\n",(0,i.jsx)(n.p,{children:"Sample configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"spring:\n security:\n oauth2:\n client:\n registration:\n facebook:\n client-id: 227581266063919\n client-secret: 47f03915334f49cdueru810069321964929\n"})}),"\n",(0,i.jsx)(n.h3,{id:"github",children:"Github"}),"\n",(0,i.jsxs)(n.p,{children:["Register a ",(0,i.jsx)(n.a,{href:"https://github.com/settings/applications/new",children:"new application"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:['For the "Authorization callback URL", use ',(0,i.jsx)(n.code,{children:"{baseUrl}/login/oauth2/code/github"}),", where ",(0,i.jsx)(n.code,{children:"baseUrl"})," is your server's address."]}),"\n",(0,i.jsx)(n.p,{children:"Generate a new Client Secret, you should now have a Client ID and Client Secret."}),"\n",(0,i.jsxs)(n.p,{children:["Modify your ",(0,i.jsx)(n.code,{children:"application.yml"})," as below and replace the values in the ",(0,i.jsx)(n.code,{children:"client-id"})," and ",(0,i.jsx)(n.code,{children:"client-secret"})," property with the OAuth 2.0 credentials you created earlier."]}),"\n",(0,i.jsx)(n.p,{children:"Sample configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"spring:\n security:\n oauth2:\n client:\n registration:\n github:\n client-id: 62736jnfksui37384hnmsdnf\n client-secret: jhjgfy67363uhif762328938844940e3e8c8629c18f9\n scope: user:email\n"})}),"\n",(0,i.jsx)(n.h2,{id:"advanced-configuration",children:"Advanced configuration"}),"\n",(0,i.jsx)(n.p,{children:"You can configure any OAuth2 provider, but you will need to provide a more extensive configuration. The below example shows how to configure a Keycloak instance, but any provider could be configured in a similar fashion."}),"\n",(0,i.jsxs)(n.p,{children:["Modify your ",(0,i.jsx)(n.code,{children:"application.yml"})," as below and replace the values in the ",(0,i.jsx)(n.code,{children:"client-id"})," and ",(0,i.jsx)(n.code,{children:"client-secret"})," property with your credentials You will also need to update the various URIs in the ",(0,i.jsx)(n.code,{children:"provider"})," section."]}),"\n",(0,i.jsx)(n.p,{children:"You need to make sure that the users have an email setup, and that it has been marked as verified."}),"\n",(0,i.jsxs)(n.p,{children:["When configuring the client in your provider, you may need to input a redirect URI. Use the following: ",(0,i.jsx)(n.code,{children:"{baseUrl}/login/oauth2/code/{registrationId}"}),", where ",(0,i.jsx)(n.code,{children:"baseUrl"})," is your server's address, and ",(0,i.jsx)(n.code,{children:"registrationId"})," is the name of the configuration key (",(0,i.jsx)(n.code,{children:"keycloak"})," in the below example)."]}),"\n",(0,i.jsxs)(n.p,{children:["There are 2 options to configure a provider, either set ",(0,i.jsx)(n.code,{children:"issuer-uri"})," or all of the following: ",(0,i.jsx)(n.code,{children:"authorization-uri"}),", ",(0,i.jsx)(n.code,{children:"token-uri"}),",\n",(0,i.jsx)(n.code,{children:"jwk-set-uri"}),", ",(0,i.jsx)(n.code,{children:"user-info-uri"}),". If your authentication server provides ",(0,i.jsx)(n.code,{children:"issuer-uri"}),", this option is preferred."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"registration"})," section contains a ",(0,i.jsx)(n.code,{children:"provider"})," option, this must be the same name as specified in the\n",(0,i.jsx)(n.code,{children:"provider"})," configuration. (In the example below, we've configured ",(0,i.jsx)(n.code,{children:"provider"})," with name ",(0,i.jsx)(n.code,{children:"keycloak"}),", so in the\n",(0,i.jsx)(n.code,{children:"registration"})," section we set ",(0,i.jsx)(n.code,{children:"provider: keycloak"}),"). The name of the provider can be whatever you want, no need\nto use the service's name if you don't want to."]}),"\n",(0,i.jsx)(n.p,{children:"Sample configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'spring:\n security:\n oauth2:\n client:\n registration:\n keycloak:\n provider: keycloak # this must match the provider below\n client-id: your-client-id\n client-secret: c830e452-a2a9-40a0-93c1-eb84ea688245\n client-name: Keycloak\n scope: openid,email\n authorization-grant-type: authorization_code\n # the placeholders in {} will be replaced automatically, you don\'t need to change this line\n redirect-uri: "{baseUrl}/{action}/oauth2/code/{registrationId}"\n provider:\n keycloak: # this must match the provider above\n user-name-attribute: sub\n # either set the issuer-uri, in which case the app will lookup the configuration for you automatically\n issuer-uri: http://localhost:8085/auth/realms/komgatest\n # or set all of the following\n authorization-uri: http://localhost:8085/auth/realms/komgatest/protocol/openid-connect/auth\n token-uri: http://localhost:8085/auth/realms/komgatest/protocol/openid-connect/token\n jwk-set-uri: http://localhost:8085/auth/realms/komgatest/protocol/openid-connect/certs\n user-info-uri: http://localhost:8085/auth/realms/komgatest/protocol/openid-connect/userinfo\n'})})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},3023:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var i=o(3696);const t={},r=i.createContext(t);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a981d65e.39e97a72.js b/assets/js/a981d65e.39e97a72.js deleted file mode 100644 index ed9eb668..00000000 --- a/assets/js/a981d65e.39e97a72.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8792],{9185:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>n,metadata:()=>o,toc:()=>h});var i=a(2540),r=a(3023);const n={},s="Emptying Library Trash",o={id:"guides/trash",title:"Emptying Library Trash",description:"Like modern operating systems, Komga uses a concept of placing items in the \u201ctrash\u201d before they\u2019re permanently removed. If you move or delete the file for a library item or if the file somehow becomes unavailable, then the library item will be placed into the \u201ctrash\u201d. This helps prevent against items being accidentally or unintentionally removed from your Library. It can be particularly helpful in situations where a drive or network share where content is stored isn\u2019t available when a Library Scan occurs. By default, the item will remain in the trash until you perform an \u201cEmpty Trash\u201d on your Server.",source:"@site/docs/guides/trash.md",sourceDirName:"guides",slug:"/guides/trash",permalink:"/docs/guides/trash",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/trash.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Libraries",permalink:"/docs/guides/libraries"},next:{title:"Scanning, Analyzing and Refreshing Metadata",permalink:"/docs/guides/scan-analysis-refresh"}},l={},h=[{value:"File Hashes",id:"file-hashes",level:2},{value:"Automatically Empty Trash",id:"automatically-empty-trash",level:2},{value:"Manually Empty Trash",id:"manually-empty-trash",level:2}];function c(e){const t={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"emptying-library-trash",children:"Emptying Library Trash"})}),"\n",(0,i.jsx)(t.p,{children:"Like modern operating systems, Komga uses a concept of placing items in the \u201ctrash\u201d before they\u2019re permanently removed. If you move or delete the file for a library item or if the file somehow becomes unavailable, then the library item will be placed into the \u201ctrash\u201d. This helps prevent against items being accidentally or unintentionally removed from your Library. It can be particularly helpful in situations where a drive or network share where content is stored isn\u2019t available when a Library Scan occurs. By default, the item will remain in the trash until you perform an \u201cEmpty Trash\u201d on your Server."}),"\n",(0,i.jsx)(t.p,{children:"If an item is currently in the trash, it can be restored back to the Library by making the file for the library item available again at the expected location. Conversely, if you perform an \u201cEmpty Trash\u201d on your Server, then the item is discarded from the trash and can no longer be automatically restored."}),"\n",(0,i.jsx)(t.p,{children:'Items currently in the trash will be displayed with an "Unavailable" indicator.'}),"\n",(0,i.jsx)("img",{src:"/assets/media/guides/trash/unavailable-card.png",style:{maxHeight:"300px"},alt:"Unavailable indicator on card"}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)("img",{src:"/assets/media/guides/trash/unavailable-details.png",style:{maxHeight:"300px"},alt:"Unavailable indicator on details view"}),"\n",(0,i.jsx)(t.h2,{id:"file-hashes",children:"File Hashes"}),"\n",(0,i.jsx)(t.p,{children:"With the trash bin, you can move or rename files and folders without losing your metadata, read progress, or read lists and collections."}),"\n",(0,i.jsxs)(t.p,{children:["To track your files when they are renamed or restored, Komga generates a file hash for each file. If Komga doesn't have a file hash for a file, it won't be able to restore data after a file move or rename. Hashing files requires some computing power, so you may want to disable this entirely on low-end devices (see ",(0,i.jsx)(t.a,{href:"/docs/installation/configuration",children:"Configuration"}),")."]}),"\n",(0,i.jsx)(t.h2,{id:"automatically-empty-trash",children:"Automatically Empty Trash"}),"\n",(0,i.jsx)(t.p,{children:"By default, items found removed from a Library are placed in the trash until the trash is emptied. You can choose to have your Server automatically empty the trash after every scan occurs if you wish. To do so:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Open Komga web interface"}),"\n",(0,i.jsx)(t.li,{children:"Edit the library for which you want to change the setting"}),"\n",(0,i.jsxs)(t.li,{children:["Enable the ",(0,i.jsx)(t.em,{children:"Empty trash automatically after every scan"})," option"]}),"\n",(0,i.jsx)(t.li,{children:"Save Changes"}),"\n"]}),"\n",(0,i.jsx)("img",{src:"/assets/media/guides/trash/empty-trash-after-scan.png",style:{maxHeight:"300px"},alt:"Empty trash automatically after every scan option"}),"\n",(0,i.jsxs)(t.admonition,{type:"danger",children:[(0,i.jsx)(t.p,{children:"Enabling this option means that content will be removed from your Library immediately with no chance to simply restore it if there was a mistake."}),(0,i.jsx)(t.p,{children:"It will also prevent folder and file moves between libraries."})]}),"\n",(0,i.jsx)(t.h2,{id:"manually-empty-trash",children:"Manually Empty Trash"}),"\n",(0,i.jsx)(t.p,{children:"If you have items in the trash that you\u2019re ready to remove, you can empty the trash. When you choose to empty the trash, you\u2019ll need to confirm your choice."}),"\n",(0,i.jsxs)(t.p,{children:["Look for the action menu icon ",(0,i.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,i.jsx)(t.em,{children:"Empty Trash"}),"."]}),"\n",(0,i.jsx)("img",{src:"/assets/media/guides/trash/empty-trash-confirmation-dialog.png",style:{maxHeight:"250px"},alt:"Empty trash confirmation dialog"})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},3023:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var i=a(3696);const r={},n=i.createContext(r);function s(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a981d65e.aba281dd.js b/assets/js/a981d65e.aba281dd.js new file mode 100644 index 00000000..9a747b5c --- /dev/null +++ b/assets/js/a981d65e.aba281dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8792],{9185:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>n,metadata:()=>o,toc:()=>h});var i=a(2540),r=a(3023);const n={},s="Emptying Library Trash",o={id:"guides/trash",title:"Emptying Library Trash",description:"Like modern operating systems, Komga uses a concept of placing items in the \u201ctrash\u201d before they\u2019re permanently removed. If you move or delete the file for a library item or if the file somehow becomes unavailable, then the library item will be placed into the \u201ctrash\u201d. This helps prevent against items being accidentally or unintentionally removed from your Library. It can be particularly helpful in situations where a drive or network share where content is stored isn\u2019t available when a Library Scan occurs. By default, the item will remain in the trash until you perform an \u201cEmpty Trash\u201d on your Server.",source:"@site/docs/guides/trash.md",sourceDirName:"guides",slug:"/guides/trash",permalink:"/docs/guides/trash",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/trash.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Libraries",permalink:"/docs/guides/libraries"},next:{title:"Scanning, Analyzing and Refreshing Metadata",permalink:"/docs/guides/scan-analysis-refresh"}},l={},h=[{value:"File Hashes",id:"file-hashes",level:2},{value:"Automatically Empty Trash",id:"automatically-empty-trash",level:2},{value:"Manually Empty Trash",id:"manually-empty-trash",level:2}];function c(e){const t={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"emptying-library-trash",children:"Emptying Library Trash"})}),"\n",(0,i.jsx)(t.p,{children:"Like modern operating systems, Komga uses a concept of placing items in the \u201ctrash\u201d before they\u2019re permanently removed. If you move or delete the file for a library item or if the file somehow becomes unavailable, then the library item will be placed into the \u201ctrash\u201d. This helps prevent against items being accidentally or unintentionally removed from your Library. It can be particularly helpful in situations where a drive or network share where content is stored isn\u2019t available when a Library Scan occurs. By default, the item will remain in the trash until you perform an \u201cEmpty Trash\u201d on your Server."}),"\n",(0,i.jsx)(t.p,{children:"If an item is currently in the trash, it can be restored back to the Library by making the file for the library item available again at the expected location. Conversely, if you perform an \u201cEmpty Trash\u201d on your Server, then the item is discarded from the trash and can no longer be automatically restored."}),"\n",(0,i.jsx)(t.p,{children:'Items currently in the trash will be displayed with an "Unavailable" indicator.'}),"\n",(0,i.jsx)("img",{src:"/assets/media/guides/trash/unavailable-card.png",style:{maxHeight:"300px"},alt:"Unavailable indicator on card"}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)("img",{src:"/assets/media/guides/trash/unavailable-details.png",style:{maxHeight:"300px"},alt:"Unavailable indicator on details view"}),"\n",(0,i.jsx)(t.h2,{id:"file-hashes",children:"File Hashes"}),"\n",(0,i.jsx)(t.p,{children:"With the trash bin, you can move or rename files and folders without losing your metadata, read progress, or read lists and collections."}),"\n",(0,i.jsxs)(t.p,{children:["To track your files when they are renamed or restored, Komga generates a file hash for each file. If Komga doesn't have a file hash for a file, it won't be able to restore data after a file move or rename. Hashing files requires some computing power, so you may want to disable this entirely on low-end devices (see ",(0,i.jsx)(t.a,{href:"/docs/installation/configuration",children:"Configuration"}),")."]}),"\n",(0,i.jsx)(t.h2,{id:"automatically-empty-trash",children:"Automatically Empty Trash"}),"\n",(0,i.jsx)(t.p,{children:"By default, items found removed from a Library are placed in the trash until the trash is emptied. You can choose to have your Server automatically empty the trash after every scan occurs if you wish. To do so:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"Open Komga web interface"}),"\n",(0,i.jsx)(t.li,{children:"Edit the library for which you want to change the setting"}),"\n",(0,i.jsxs)(t.li,{children:["Enable the ",(0,i.jsx)(t.em,{children:"Empty trash automatically after every scan"})," option"]}),"\n",(0,i.jsx)(t.li,{children:"Save Changes"}),"\n"]}),"\n",(0,i.jsx)("img",{src:"/assets/media/guides/trash/empty-trash-after-scan.png",style:{maxHeight:"300px"},alt:"Empty trash automatically after every scan option"}),"\n",(0,i.jsxs)(t.admonition,{type:"danger",children:[(0,i.jsx)(t.p,{children:"Enabling this option means that content will be removed from your Library immediately with no chance to simply restore it if there was a mistake."}),(0,i.jsx)(t.p,{children:"It will also prevent folder and file moves between libraries."})]}),"\n",(0,i.jsx)(t.h2,{id:"manually-empty-trash",children:"Manually Empty Trash"}),"\n",(0,i.jsx)(t.p,{children:"If you have items in the trash that you\u2019re ready to remove, you can empty the trash. When you choose to empty the trash, you\u2019ll need to confirm your choice."}),"\n",(0,i.jsxs)(t.p,{children:["Look for the action menu icon ",(0,i.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,i.jsx)(t.em,{children:"Empty Trash"}),"."]}),"\n",(0,i.jsx)("img",{src:"/assets/media/guides/trash/empty-trash-confirmation-dialog.png",style:{maxHeight:"250px"},alt:"Empty trash confirmation dialog"})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},3023:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var i=a(3696);const r={},n=i.createContext(r);function s(e){const t=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ac07380c.8fd8cd08.js b/assets/js/ac07380c.8fd8cd08.js deleted file mode 100644 index 64072e3e..00000000 --- a/assets/js/ac07380c.8fd8cd08.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3962],{2416:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var t=r(2540),i=r(3023);const s={},o="Run with Docker",c={id:"installation/docker",title:"Run with Docker",description:"Registries",source:"@site/docs/installation/docker.md",sourceDirName:"installation",slug:"/installation/docker",permalink:"/docs/installation/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/docker.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install the Desktop application",permalink:"/docs/installation/desktop"},next:{title:"Run with the Jar file",permalink:"/docs/installation/jar"}},d={},a=[{value:"Registries",id:"registries",level:2},{value:"Version tags",id:"version-tags",level:2},{value:"Usage",id:"usage",level:2},{value:"docker",id:"docker",level:3},{value:"docker-compose",id:"docker-compose",level:3},{value:"Parameters",id:"parameters",level:2},{value:"User / Group Identifiers",id:"user--group-identifiers",level:2},{value:"Increase memory limit",id:"increase-memory-limit",level:2},{value:"Support info",id:"support-info",level:2},{value:"Updating",id:"updating",level:2},{value:"Via Docker Run/Create",id:"via-docker-runcreate",level:3},{value:"Via Docker Compose",id:"via-docker-compose",level:3},{value:"Automatic updates",id:"automatic-updates",level:3}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"run-with-docker",children:"Run with Docker"})}),"\n",(0,t.jsx)(n.h2,{id:"registries",children:"Registries"}),"\n",(0,t.jsx)(n.p,{children:"The Docker images are published on:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://hub.docker.com/r/gotson/komga",children:"DockerHub"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/gotson/komga/pkgs/container/komga",children:"ghcr.io"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"version-tags",children:"Version tags"}),"\n",(0,t.jsx)(n.p,{children:"This image provides various versions that are available via tags."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{style:{textAlign:"center"},children:(0,t.jsx)(n.strong,{children:"Tag"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Description"})})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"latest"})}),(0,t.jsx)(n.td,{children:"latest commit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"MAJOR.x"})}),(0,t.jsxs)(n.td,{children:["latest ",(0,t.jsx)(n.code,{children:"MAJOR"})," version, for example ",(0,t.jsx)(n.code,{children:"0.x"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"x.y.z"})}),(0,t.jsxs)(n.td,{children:["version ",(0,t.jsx)(n.code,{children:"x.y.z"})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.p,{children:"Here are some example snippets to help you get started creating a container."}),"\n",(0,t.jsx)(n.h3,{id:"docker",children:"docker"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"docker create \\\n --name=komga \\\n --user 1000:1000 \\\n -p 25600:25600 \\\n --mount type=bind,source=/path/to/config,target=/config \\\n --mount type=bind,source=/path/to/data,target=/data \\\n --restart unless-stopped \\\n gotson/komga\n"})}),"\n",(0,t.jsx)(n.p,{children:"Then start the container:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"docker start komga\n"})}),"\n",(0,t.jsx)(n.h3,{id:"docker-compose",children:"docker-compose"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"---\nversion: '3.3'\nservices:\n komga:\n image: gotson/komga\n container_name: komga\n volumes:\n - type: bind\n source: /path/to/config\n target: /config\n - type: bind\n source: /path/to/data\n target: /data\n - type: bind\n source: /etc/timezone #alternatively you can use a TZ environment variable, like TZ=Europe/London\n target: /etc/timezone\n read_only: true\n ports:\n - 25600:25600\n user: \"1000:1000\"\n # remove the whole environment section if you don't need it\n environment:\n - =\n restart: unless-stopped\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsxs)(n.p,{children:["Container images are configured using parameters passed at runtime (such as those above).\nThese parameters are separated by a colon and indicate ",(0,t.jsx)(n.code,{children:"external:internal"})," respectively.\nFor example, ",(0,t.jsx)(n.code,{children:"-p 8080:80"})," would expose port ",(0,t.jsx)(n.code,{children:"80"})," from inside the container to be accessible from the host's IP on port ",(0,t.jsx)(n.code,{children:"8080"})," outside the container."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Parameter"}),(0,t.jsx)(n.th,{children:"Function"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"-p 25600:25600"})}),(0,t.jsx)(n.td,{children:"The port for the Komga APIs and web interface"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"--user 1000:1000"})}),(0,t.jsxs)(n.td,{children:["User",":Group"," identifier - see below for explanation"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"--mount type=bind,source=/path/to/config,target=/config"})}),(0,t.jsx)(n.td,{children:"Database and Komga configurations"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"--mount type=bind,source=/path/to/data,target=/data"})}),(0,t.jsx)(n.td,{children:"Location of your data directory on disk. Choose a folder that contains both your books and your preferred import location for hardlinks to work."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"-e ENV_VAR=value"})}),(0,t.jsxs)(n.td,{children:["Any ",(0,t.jsx)(n.a,{href:"/docs/installation/configuration",children:"configuration"})," environment variable"]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"user--group-identifiers",children:"User / Group Identifiers"}),"\n",(0,t.jsxs)(n.p,{children:["When using volumes (",(0,t.jsx)(n.code,{children:"-v"})," flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user ID and group ID."]}),"\n",(0,t.jsx)(n.p,{children:"Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic."}),"\n",(0,t.jsxs)(n.p,{children:["In this instance ",(0,t.jsx)(n.code,{children:"UID=1000"})," and ",(0,t.jsx)(n.code,{children:"GID=1000"}),", to find yours use ",(0,t.jsx)(n.code,{children:"id "})," as below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ id \n uid=1000(jdoe) gid=1000(jdgroup) groups=1000(jdgroup)\n"})}),"\n",(0,t.jsx)(n.h2,{id:"increase-memory-limit",children:"Increase memory limit"}),"\n",(0,t.jsxs)(n.p,{children:["By default the ",(0,t.jsx)(n.code,{children:"java"})," process will be limited in the maximum amount of memory (RAM) it can use, usually 1gb. If you encounter some ",(0,t.jsx)(n.code,{children:"OutOfMemoryException"})," in the logs you probably need to increase the maximum memory Komga can use."]}),"\n",(0,t.jsxs)(n.p,{children:["To do so, you can use the ",(0,t.jsx)(n.code,{children:"JAVA_TOOL_OPTIONS=-Xmx"})," environment variable, where ",(0,t.jsx)(n.code,{children:""})," can be any amount like ",(0,t.jsx)(n.code,{children:"2048m"}),", ",(0,t.jsx)(n.code,{children:"4g"})," etc. For example to run Komga with a maximum of 4gb of memory:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",metastring:"script",children:"JAVA_TOOL_OPTIONS=-Xmx4g\n"})}),"\n",(0,t.jsx)(n.h2,{id:"support-info",children:"Support info"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Shell access whilst the container is running: ",(0,t.jsx)(n.code,{children:"docker exec -it komga /bin/bash"})]}),"\n",(0,t.jsxs)(n.li,{children:["To monitor the logs of the container in realtime: ",(0,t.jsx)(n.code,{children:"docker logs -f komga"})]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"updating",children:"Updating"}),"\n",(0,t.jsx)(n.p,{children:"Below are the instructions for updating containers:"}),"\n",(0,t.jsx)(n.h3,{id:"via-docker-runcreate",children:"Via Docker Run/Create"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Update the image: ",(0,t.jsx)(n.code,{children:"docker pull gotson/komga"})]}),"\n",(0,t.jsxs)(n.li,{children:["Stop the running container: ",(0,t.jsx)(n.code,{children:"docker stop komga"})]}),"\n",(0,t.jsxs)(n.li,{children:["Delete the container: ",(0,t.jsx)(n.code,{children:"docker rm komga"})]}),"\n",(0,t.jsxs)(n.li,{children:["Recreate a new container with the same docker create parameters as instructed above (if mapped correctly to a host folder, your ",(0,t.jsx)(n.code,{children:"/config"})," folder and settings will be preserved)"]}),"\n",(0,t.jsxs)(n.li,{children:["Start the new container: ",(0,t.jsx)(n.code,{children:"docker start komga"})]}),"\n",(0,t.jsxs)(n.li,{children:["You can also remove the old dangling images: ",(0,t.jsx)(n.code,{children:"docker image prune"})]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"via-docker-compose",children:"Via Docker Compose"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Update all images: ",(0,t.jsx)(n.code,{children:"docker-compose pull"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["or update a single image: ",(0,t.jsx)(n.code,{children:"docker-compose pull komga"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Let compose update all containers as necessary: ",(0,t.jsx)(n.code,{children:"docker-compose up -d"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["or update a single container: ",(0,t.jsx)(n.code,{children:"docker-compose up -d komga"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["You can also remove the old dangling images: ",(0,t.jsx)(n.code,{children:"docker image prune"})]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"automatic-updates",children:"Automatic updates"}),"\n",(0,t.jsxs)(n.p,{children:["You can use ",(0,t.jsx)(n.a,{href:"https://github.com/containrrr/watchtower",children:"Watchtower"})," to automatically update your containers."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},3023:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>c});var t=r(3696);const i={},s=t.createContext(i);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ac07380c.fb84db6a.js b/assets/js/ac07380c.fb84db6a.js new file mode 100644 index 00000000..cba7dc72 --- /dev/null +++ b/assets/js/ac07380c.fb84db6a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3962],{2416:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var t=r(2540),i=r(3023);const s={},o="Run with Docker",c={id:"installation/docker",title:"Run with Docker",description:"Registries",source:"@site/docs/installation/docker.md",sourceDirName:"installation",slug:"/installation/docker",permalink:"/docs/installation/docker",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/docker.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install the Desktop application",permalink:"/docs/installation/desktop"},next:{title:"Run with the Jar file",permalink:"/docs/installation/jar"}},d={},a=[{value:"Registries",id:"registries",level:2},{value:"Version tags",id:"version-tags",level:2},{value:"Usage",id:"usage",level:2},{value:"docker",id:"docker",level:3},{value:"docker-compose",id:"docker-compose",level:3},{value:"Parameters",id:"parameters",level:2},{value:"User / Group Identifiers",id:"user--group-identifiers",level:2},{value:"Increase memory limit",id:"increase-memory-limit",level:2},{value:"Support info",id:"support-info",level:2},{value:"Updating",id:"updating",level:2},{value:"Via Docker Run/Create",id:"via-docker-runcreate",level:3},{value:"Via Docker Compose",id:"via-docker-compose",level:3},{value:"Automatic updates",id:"automatic-updates",level:3}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"run-with-docker",children:"Run with Docker"})}),"\n",(0,t.jsx)(n.h2,{id:"registries",children:"Registries"}),"\n",(0,t.jsx)(n.p,{children:"The Docker images are published on:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://hub.docker.com/r/gotson/komga",children:"DockerHub"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/gotson/komga/pkgs/container/komga",children:"ghcr.io"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"version-tags",children:"Version tags"}),"\n",(0,t.jsx)(n.p,{children:"This image provides various versions that are available via tags."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{style:{textAlign:"center"},children:(0,t.jsx)(n.strong,{children:"Tag"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Description"})})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"latest"})}),(0,t.jsx)(n.td,{children:"latest commit"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"MAJOR.x"})}),(0,t.jsxs)(n.td,{children:["latest ",(0,t.jsx)(n.code,{children:"MAJOR"})," version, for example ",(0,t.jsx)(n.code,{children:"0.x"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"x.y.z"})}),(0,t.jsxs)(n.td,{children:["version ",(0,t.jsx)(n.code,{children:"x.y.z"})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.p,{children:"Here are some example snippets to help you get started creating a container."}),"\n",(0,t.jsx)(n.h3,{id:"docker",children:"docker"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"docker create \\\n --name=komga \\\n --user 1000:1000 \\\n -p 25600:25600 \\\n --mount type=bind,source=/path/to/config,target=/config \\\n --mount type=bind,source=/path/to/data,target=/data \\\n --restart unless-stopped \\\n gotson/komga\n"})}),"\n",(0,t.jsx)(n.p,{children:"Then start the container:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"docker start komga\n"})}),"\n",(0,t.jsx)(n.h3,{id:"docker-compose",children:"docker-compose"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"---\nversion: '3.3'\nservices:\n komga:\n image: gotson/komga\n container_name: komga\n volumes:\n - type: bind\n source: /path/to/config\n target: /config\n - type: bind\n source: /path/to/data\n target: /data\n - type: bind\n source: /etc/timezone #alternatively you can use a TZ environment variable, like TZ=Europe/London\n target: /etc/timezone\n read_only: true\n ports:\n - 25600:25600\n user: \"1000:1000\"\n # remove the whole environment section if you don't need it\n environment:\n - =\n restart: unless-stopped\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsxs)(n.p,{children:["Container images are configured using parameters passed at runtime (such as those above).\nThese parameters are separated by a colon and indicate ",(0,t.jsx)(n.code,{children:"external:internal"})," respectively.\nFor example, ",(0,t.jsx)(n.code,{children:"-p 8080:80"})," would expose port ",(0,t.jsx)(n.code,{children:"80"})," from inside the container to be accessible from the host's IP on port ",(0,t.jsx)(n.code,{children:"8080"})," outside the container."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Parameter"}),(0,t.jsx)(n.th,{children:"Function"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"-p 25600:25600"})}),(0,t.jsx)(n.td,{children:"The port for the Komga APIs and web interface"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"--user 1000:1000"})}),(0,t.jsxs)(n.td,{children:["User",":Group"," identifier - see below for explanation"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"--mount type=bind,source=/path/to/config,target=/config"})}),(0,t.jsx)(n.td,{children:"Database and Komga configurations"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"--mount type=bind,source=/path/to/data,target=/data"})}),(0,t.jsx)(n.td,{children:"Location of your data directory on disk. Choose a folder that contains both your books and your preferred import location for hardlinks to work."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:(0,t.jsx)(n.code,{children:"-e ENV_VAR=value"})}),(0,t.jsxs)(n.td,{children:["Any ",(0,t.jsx)(n.a,{href:"/docs/installation/configuration",children:"configuration"})," environment variable"]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"user--group-identifiers",children:"User / Group Identifiers"}),"\n",(0,t.jsxs)(n.p,{children:["When using volumes (",(0,t.jsx)(n.code,{children:"-v"})," flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user ID and group ID."]}),"\n",(0,t.jsx)(n.p,{children:"Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic."}),"\n",(0,t.jsxs)(n.p,{children:["In this instance ",(0,t.jsx)(n.code,{children:"UID=1000"})," and ",(0,t.jsx)(n.code,{children:"GID=1000"}),", to find yours use ",(0,t.jsx)(n.code,{children:"id "})," as below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"$ id \n uid=1000(jdoe) gid=1000(jdgroup) groups=1000(jdgroup)\n"})}),"\n",(0,t.jsx)(n.h2,{id:"increase-memory-limit",children:"Increase memory limit"}),"\n",(0,t.jsxs)(n.p,{children:["By default the ",(0,t.jsx)(n.code,{children:"java"})," process will be limited in the maximum amount of memory (RAM) it can use, usually 1gb. If you encounter some ",(0,t.jsx)(n.code,{children:"OutOfMemoryException"})," in the logs you probably need to increase the maximum memory Komga can use."]}),"\n",(0,t.jsxs)(n.p,{children:["To do so, you can use the ",(0,t.jsx)(n.code,{children:"JAVA_TOOL_OPTIONS=-Xmx"})," environment variable, where ",(0,t.jsx)(n.code,{children:""})," can be any amount like ",(0,t.jsx)(n.code,{children:"2048m"}),", ",(0,t.jsx)(n.code,{children:"4g"})," etc. For example to run Komga with a maximum of 4gb of memory:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",metastring:"script",children:"JAVA_TOOL_OPTIONS=-Xmx4g\n"})}),"\n",(0,t.jsx)(n.h2,{id:"support-info",children:"Support info"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Shell access whilst the container is running: ",(0,t.jsx)(n.code,{children:"docker exec -it komga /bin/bash"})]}),"\n",(0,t.jsxs)(n.li,{children:["To monitor the logs of the container in realtime: ",(0,t.jsx)(n.code,{children:"docker logs -f komga"})]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"updating",children:"Updating"}),"\n",(0,t.jsx)(n.p,{children:"Below are the instructions for updating containers:"}),"\n",(0,t.jsx)(n.h3,{id:"via-docker-runcreate",children:"Via Docker Run/Create"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Update the image: ",(0,t.jsx)(n.code,{children:"docker pull gotson/komga"})]}),"\n",(0,t.jsxs)(n.li,{children:["Stop the running container: ",(0,t.jsx)(n.code,{children:"docker stop komga"})]}),"\n",(0,t.jsxs)(n.li,{children:["Delete the container: ",(0,t.jsx)(n.code,{children:"docker rm komga"})]}),"\n",(0,t.jsxs)(n.li,{children:["Recreate a new container with the same docker create parameters as instructed above (if mapped correctly to a host folder, your ",(0,t.jsx)(n.code,{children:"/config"})," folder and settings will be preserved)"]}),"\n",(0,t.jsxs)(n.li,{children:["Start the new container: ",(0,t.jsx)(n.code,{children:"docker start komga"})]}),"\n",(0,t.jsxs)(n.li,{children:["You can also remove the old dangling images: ",(0,t.jsx)(n.code,{children:"docker image prune"})]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"via-docker-compose",children:"Via Docker Compose"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Update all images: ",(0,t.jsx)(n.code,{children:"docker-compose pull"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["or update a single image: ",(0,t.jsx)(n.code,{children:"docker-compose pull komga"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Let compose update all containers as necessary: ",(0,t.jsx)(n.code,{children:"docker-compose up -d"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["or update a single container: ",(0,t.jsx)(n.code,{children:"docker-compose up -d komga"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["You can also remove the old dangling images: ",(0,t.jsx)(n.code,{children:"docker image prune"})]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"automatic-updates",children:"Automatic updates"}),"\n",(0,t.jsxs)(n.p,{children:["You can use ",(0,t.jsx)(n.a,{href:"https://github.com/containrrr/watchtower",children:"Watchtower"})," to automatically update your containers."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},3023:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>c});var t=r(3696);const i={},s=t.createContext(i);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b242fde9.202d6252.js b/assets/js/b242fde9.202d6252.js new file mode 100644 index 00000000..0c4d5186 --- /dev/null +++ b/assets/js/b242fde9.202d6252.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7549],{2840:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>o,contentTitle:()=>c,default:()=>u,frontMatter:()=>l,metadata:()=>a,toc:()=>r});var s=t(2540),n=t(3023);const l={},c="Duplicate Files",a={id:"guides/duplicate-files",title:"Duplicate Files",description:"Komga can detect duplicate files among your books.",source:"@site/docs/guides/duplicate-files.md",sourceDirName:"guides",slug:"/guides/duplicate-files",permalink:"/docs/guides/duplicate-files",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/duplicate-files.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Import Books",permalink:"/docs/guides/import-books"},next:{title:"Duplicate Pages",permalink:"/docs/guides/duplicate-pages"}},o={},r=[{value:"Browsing Duplicate Files",id:"browsing-duplicate-files",level:2}];function d(e){const i={a:"a",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"duplicate-files",children:"Duplicate Files"})}),"\n",(0,s.jsx)(i.p,{children:"Komga can detect duplicate files among your books."}),"\n",(0,s.jsxs)(i.p,{children:["You need to enable ",(0,s.jsx)(i.a,{href:"/docs/guides/libraries#compute-hash-for-files",children:"file hashing"})," for your libraries."]}),"\n",(0,s.jsxs)(i.p,{children:["You can manage duplicate pages from ",(0,s.jsx)(i.em,{children:"Server Settings > Duplicate Files"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"browsing-duplicate-files",children:"Browsing Duplicate Files"}),"\n",(0,s.jsx)(i.p,{children:"This screen will show all the duplicate files."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/duplicate-files/duplicate-files.png",style:{maxHeight:" 400px"},alt:"Browse Duplicate Files"}),"\n",(0,s.jsx)(i.p,{children:"You can direcly delete a duplicate file by clicking on the trashcan icon."})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},3023:(e,i,t)=>{t.d(i,{R:()=>c,x:()=>a});var s=t(3696);const n={},l=s.createContext(n);function c(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b242fde9.2f41171d.js b/assets/js/b242fde9.2f41171d.js deleted file mode 100644 index 05fb849c..00000000 --- a/assets/js/b242fde9.2f41171d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7549],{2840:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>o,contentTitle:()=>c,default:()=>u,frontMatter:()=>l,metadata:()=>a,toc:()=>r});var s=t(2540),n=t(3023);const l={},c="Duplicate Files",a={id:"guides/duplicate-files",title:"Duplicate Files",description:"Komga can detect duplicate files among your books.",source:"@site/docs/guides/duplicate-files.md",sourceDirName:"guides",slug:"/guides/duplicate-files",permalink:"/docs/guides/duplicate-files",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/duplicate-files.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Import Books",permalink:"/docs/guides/import-books"},next:{title:"Duplicate Pages",permalink:"/docs/guides/duplicate-pages"}},o={},r=[{value:"Browsing Duplicate Files",id:"browsing-duplicate-files",level:2}];function d(e){const i={a:"a",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"duplicate-files",children:"Duplicate Files"})}),"\n",(0,s.jsx)(i.p,{children:"Komga can detect duplicate files among your books."}),"\n",(0,s.jsxs)(i.p,{children:["You need to enable ",(0,s.jsx)(i.a,{href:"/docs/guides/libraries#compute-hash-for-files",children:"file hashing"})," for your libraries."]}),"\n",(0,s.jsxs)(i.p,{children:["You can manage duplicate pages from ",(0,s.jsx)(i.em,{children:"Server Settings > Duplicate Files"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"browsing-duplicate-files",children:"Browsing Duplicate Files"}),"\n",(0,s.jsx)(i.p,{children:"This screen will show all the duplicate files."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/duplicate-files/duplicate-files.png",style:{maxHeight:" 400px"},alt:"Browse Duplicate Files"}),"\n",(0,s.jsx)(i.p,{children:"You can direcly delete a duplicate file by clicking on the trashcan icon."})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},3023:(e,i,t)=>{t.d(i,{R:()=>c,x:()=>a});var s=t(3696);const n={},l=s.createContext(n);function c(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b94207ad.912dcf51.js b/assets/js/b94207ad.912dcf51.js new file mode 100644 index 00000000..9ffb187b --- /dev/null +++ b/assets/js/b94207ad.912dcf51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1982],{8264:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var n=o(2540),s=o(3023);const i={},r="Install from the Microsoft Store",a={id:"installation/ms-store",title:"Install from the Microsoft Store",description:"You can install Komga from the Microsoft Store.",source:"@site/docs/installation/ms-store.md",sourceDirName:"installation",slug:"/installation/ms-store",permalink:"/docs/installation/ms-store",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/ms-store.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Official methods",permalink:"/docs/category/official-methods"},next:{title:"Install the Desktop application",permalink:"/docs/installation/desktop"}},l={},c=[{value:"Updating",id:"updating",level:2},{value:"Read next",id:"read-next",level:2}];function d(t){const e={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",...(0,s.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"install-from-the-microsoft-store",children:"Install from the Microsoft Store"})}),"\n",(0,n.jsxs)(e.p,{children:["You can install Komga from the ",(0,n.jsx)(e.a,{href:"https://www.microsoft.com/store/apps/9N924KC4S4HG",children:"Microsoft Store"}),"."]}),"\n",(0,n.jsx)(e.h2,{id:"updating",children:"Updating"}),"\n",(0,n.jsx)(e.p,{children:"The application will automatically update itself when a new version is available from the Microsoft Store."}),"\n",(0,n.jsx)(e.p,{children:"Note that it takes up to a day or two for new releases to show in the Microsoft Store, as Microsoft needs to validate every new version."}),"\n",(0,n.jsx)(e.h2,{id:"read-next",children:"Read next"}),"\n",(0,n.jsxs)(e.p,{children:["Check the ",(0,n.jsx)(e.a,{href:"/docs/guides/desktop",children:"Desktop Application"})," page."]})]})}function h(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(d,{...t})}):d(t)}},3023:(t,e,o)=>{o.d(e,{R:()=>r,x:()=>a});var n=o(3696);const s={},i=n.createContext(s);function r(t){const e=n.useContext(i);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),n.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/b94207ad.eeab4cd3.js b/assets/js/b94207ad.eeab4cd3.js deleted file mode 100644 index 57efc71b..00000000 --- a/assets/js/b94207ad.eeab4cd3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1982],{8264:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var n=o(2540),s=o(3023);const i={},r="Install from the Microsoft Store",a={id:"installation/ms-store",title:"Install from the Microsoft Store",description:"You can install Komga from the Microsoft Store.",source:"@site/docs/installation/ms-store.md",sourceDirName:"installation",slug:"/installation/ms-store",permalink:"/docs/installation/ms-store",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/ms-store.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Official methods",permalink:"/docs/category/official-methods"},next:{title:"Install the Desktop application",permalink:"/docs/installation/desktop"}},l={},c=[{value:"Updating",id:"updating",level:2},{value:"Read next",id:"read-next",level:2}];function d(t){const e={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",...(0,s.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"install-from-the-microsoft-store",children:"Install from the Microsoft Store"})}),"\n",(0,n.jsxs)(e.p,{children:["You can install Komga from the ",(0,n.jsx)(e.a,{href:"https://www.microsoft.com/store/apps/9N924KC4S4HG",children:"Microsoft Store"}),"."]}),"\n",(0,n.jsx)(e.h2,{id:"updating",children:"Updating"}),"\n",(0,n.jsx)(e.p,{children:"The application will automatically update itself when a new version is available from the Microsoft Store."}),"\n",(0,n.jsx)(e.p,{children:"Note that it takes up to a day or two for new releases to show in the Microsoft Store, as Microsoft needs to validate every new version."}),"\n",(0,n.jsx)(e.h2,{id:"read-next",children:"Read next"}),"\n",(0,n.jsxs)(e.p,{children:["Check the ",(0,n.jsx)(e.a,{href:"/docs/guides/desktop",children:"Desktop Application"})," page."]})]})}function h(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(d,{...t})}):d(t)}},3023:(t,e,o)=>{o.d(e,{R:()=>r,x:()=>a});var n=o(3696);const s={},i=n.createContext(s);function r(t){const e=n.useContext(i);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:r(t.components),n.createElement(i.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/b94d24b4.5c9cd31e.js b/assets/js/b94d24b4.5c9cd31e.js deleted file mode 100644 index fc058a98..00000000 --- a/assets/js/b94d24b4.5c9cd31e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4940],{299:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var s=t(2540),o=t(3023);const i={},c="Announcements",r={id:"guides/announcements",title:"Announcements",description:"Announcements from the Komga website will be shown inside the application.",source:"@site/docs/guides/announcements.md",sourceDirName:"guides",slug:"/guides/announcements",permalink:"/docs/guides/announcements",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/announcements.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Theme",permalink:"/docs/guides/theme"},next:{title:"Command Line Interface",permalink:"/docs/guides/cli"}},a={},d=[];function u(e){const n={a:"a",em:"em",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"announcements",children:"Announcements"})}),"\n",(0,s.jsxs)(n.p,{children:["Announcements from the ",(0,s.jsx)(n.a,{href:"/blog",children:"Komga website"})," will be shown inside the application."]}),"\n",(0,s.jsxs)(n.p,{children:["An orange dot will indicate that some announcements are unread. From the ",(0,s.jsx)(n.em,{children:"Announcements"})," view, a user can mark announcements as read, which will clear the orange dot indicator."]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/announcements/announcements.png"})]})}function m(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>r});var s=t(3696);const o={},i=s.createContext(o);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b94d24b4.c2d4866f.js b/assets/js/b94d24b4.c2d4866f.js new file mode 100644 index 00000000..b015604f --- /dev/null +++ b/assets/js/b94d24b4.c2d4866f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4940],{299:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var s=t(2540),o=t(3023);const i={},c="Announcements",r={id:"guides/announcements",title:"Announcements",description:"Announcements from the Komga website will be shown inside the application.",source:"@site/docs/guides/announcements.md",sourceDirName:"guides",slug:"/guides/announcements",permalink:"/docs/guides/announcements",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/announcements.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Theme",permalink:"/docs/guides/theme"},next:{title:"Command Line Interface",permalink:"/docs/guides/cli"}},a={},d=[];function u(e){const n={a:"a",em:"em",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"announcements",children:"Announcements"})}),"\n",(0,s.jsxs)(n.p,{children:["Announcements from the ",(0,s.jsx)(n.a,{href:"/blog",children:"Komga website"})," will be shown inside the application."]}),"\n",(0,s.jsxs)(n.p,{children:["An orange dot will indicate that some announcements are unread. From the ",(0,s.jsx)(n.em,{children:"Announcements"})," view, a user can mark announcements as read, which will clear the orange dot indicator."]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/announcements/announcements.png"})]})}function m(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>r});var s=t(3696);const o={},i=s.createContext(o);function c(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c2d7cd96.6e2fce27.js b/assets/js/c2d7cd96.6e2fce27.js new file mode 100644 index 00000000..7c03a334 --- /dev/null +++ b/assets/js/c2d7cd96.6e2fce27.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9091],{895:(e,l,s)=>{s.r(l),s.d(l,{assets:()=>o,contentTitle:()=>d,default:()=>t,frontMatter:()=>r,metadata:()=>c,toc:()=>h});var i=s(2540),n=s(3023);const r={},d="Full Text Search",c={id:"guides/search",title:"Full Text Search",description:"Komga leverages Full Text Search (FTS hereafter) to provide relevant results from your libraries.",source:"@site/docs/guides/search.md",sourceDirName:"guides",slug:"/guides/search",permalink:"/docs/guides/search",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/search.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read lists",permalink:"/docs/guides/readlists"},next:{title:"Import Books",permalink:"/docs/guides/import-books"}},o={},h=[{value:"Series additional fields",id:"series-additional-fields",level:3},{value:"Book additional fields",id:"book-additional-fields",level:3}];function a(e){const l={a:"a",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l.header,{children:(0,i.jsx)(l.h1,{id:"full-text-search",children:"Full Text Search"})}),"\n",(0,i.jsxs)(l.p,{children:["Komga leverages ",(0,i.jsx)(l.a,{href:"https://en.wikipedia.org/wiki/Full-text_search",children:"Full Text Search"})," (FTS hereafter) to provide relevant results from your libraries."]}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsx)(l.li,{children:"FTS will order results by relevance"}),"\n",(0,i.jsx)(l.li,{children:"FTS is case-insensitive"}),"\n",(0,i.jsx)(l.li,{children:"When searching with CJK characters (Chinese, Japanese, Korean), a minimum of 2 characters is required."}),"\n",(0,i.jsxs)(l.li,{children:["The order of words is not important: ",(0,i.jsx)(l.code,{children:"batman robin"})," will match ",(0,i.jsx)(l.code,{children:"Robin & Batman"})]}),"\n",(0,i.jsxs)(l.li,{children:["To search by words in order, enclose your search in ",(0,i.jsx)(l.code,{children:'"'}),": ",(0,i.jsx)(l.code,{children:'"white knight"'})," will not match ",(0,i.jsx)(l.code,{children:"knight white"})," nor ",(0,i.jsx)(l.code,{children:"white and knight"})]}),"\n",(0,i.jsx)(l.li,{children:"By default, the search will match the item title. For Books, the ISBN will also be matched by default."}),"\n",(0,i.jsxs)(l.li,{children:["You can use the ",(0,i.jsx)(l.code,{children:"AND"}),", ",(0,i.jsx)(l.code,{children:"OR"})," and ",(0,i.jsx)(l.code,{children:"NOT"})," operators (UPPERCASE) to build complex queries:","\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"batman NOT publisher:dc"})," will match all ",(0,i.jsx)(l.code,{children:"Batman"})," series not published by ",(0,i.jsx)(l.em,{children:"DC Comics"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"batman OR robin"})," will match ",(0,i.jsx)(l.code,{children:"Batman"})," or ",(0,i.jsx)(l.code,{children:"Robin"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"batman AND (robin OR superman)"})," will match ",(0,i.jsx)(l.code,{children:"Superman & Batman"})," and ",(0,i.jsx)(l.code,{children:"Batman & Robin"})]}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"writer:remender penciller:murphy"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:["You can perform range queries using the ",(0,i.jsx)(l.code,{children:"[a TO b]"})," syntax. Example: ",(0,i.jsx)(l.code,{children:"release_date:[1990 TO 2000]"}),". Note that the matching is lexicographic, not numerical. You can also use wildcards: ",(0,i.jsx)(l.code,{children:"release_date:[2010 TO *]"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(l.p,{children:["Some extra fields are available for search using the ",(0,i.jsx)(l.code,{children:"field:search"})," syntax, see after."]}),"\n",(0,i.jsx)(l.h3,{id:"series-additional-fields",children:"Series additional fields"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"publisher"}),". Example: ",(0,i.jsx)(l.code,{children:"publisher:vertigo"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"status"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["Possible values: ",(0,i.jsx)(l.code,{children:"ongoing"}),", ",(0,i.jsx)(l.code,{children:"ended"}),", ",(0,i.jsx)(l.code,{children:"hiatus"}),", ",(0,i.jsx)(l.code,{children:"abandoned"})]}),"\n",(0,i.jsxs)(l.li,{children:["Example: ",(0,i.jsx)(l.code,{children:"status:hiatus"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"reading_direction"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["Possible values: ",(0,i.jsx)(l.code,{children:"left_to_right"}),", ",(0,i.jsx)(l.code,{children:"right_to_left"}),", ",(0,i.jsx)(l.code,{children:"vertical"}),", ",(0,i.jsx)(l.code,{children:"webtoon"})]}),"\n",(0,i.jsxs)(l.li,{children:["Example: ",(0,i.jsx)(l.code,{children:"reading_direction:right_to_left"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"age_rating"}),". Example: ",(0,i.jsx)(l.code,{children:"age_rating:12"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"language"}),". Example: ",(0,i.jsx)(l.code,{children:"language:fr"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"tag"})," will search any tag, whether it is set at Series or Book level. Example: ",(0,i.jsx)(l.code,{children:"tag:action"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"series_tag"})," will search series tags only"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"book_tag"})," will search book tags only"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"genre"}),". Example: ",(0,i.jsx)(l.code,{children:"genre:action"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"author"})," will search authors with any role. Example: ",(0,i.jsx)(l.code,{children:"author:(sean murphy)"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["You can also search by specific role. Example: ",(0,i.jsx)(l.code,{children:"writer:remender"})]}),"\n",(0,i.jsxs)(l.li,{children:["Possible role values are: ",(0,i.jsx)(l.code,{children:"writer"}),", ",(0,i.jsx)(l.code,{children:"penciller"}),", ",(0,i.jsx)(l.code,{children:"letterer"}),", ",(0,i.jsx)(l.code,{children:"inker"}),", ",(0,i.jsx)(l.code,{children:"editor"}),", ",(0,i.jsx)(l.code,{children:"cover"}),", ",(0,i.jsx)(l.code,{children:"colorist"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"book_count"}),", which is the number of books present in that Series. Example: ",(0,i.jsx)(l.code,{children:"book_count:1"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"total_book_count"}),". Example: ",(0,i.jsx)(l.code,{children:"total_book_count:100"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"release_date"})," will search by year released. Example: ",(0,i.jsx)(l.code,{children:"release_date:1999"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"deleted"})," will search soft-deleted series. Example: ",(0,i.jsx)(l.code,{children:"deleted:true"})," or ",(0,i.jsx)(l.code,{children:"deleted:false"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"complete"})," will search complete series, ie series where the ",(0,i.jsx)(l.em,{children:"total book counts"})," (from metadata) is equals to the actual book counts (number of files). Example: ",(0,i.jsx)(l.code,{children:"complete:true"})," or ",(0,i.jsx)(l.code,{children:"complete:false"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"sharing_label"}),". Example: ",(0,i.jsx)(l.code,{children:"sharing_label:kids"})]}),"\n"]}),"\n",(0,i.jsx)(l.h3,{id:"book-additional-fields",children:"Book additional fields"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"tag"})," will search any tag. Example: ",(0,i.jsx)(l.code,{children:'tag:"double pages"'})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"author"})," will search authors with any role. Example: ",(0,i.jsx)(l.code,{children:"author:(sean murphy)"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["You can also search by specific role. Example: ",(0,i.jsx)(l.code,{children:"writer:remender"})]}),"\n",(0,i.jsxs)(l.li,{children:["Possible role values are: ",(0,i.jsx)(l.code,{children:"writer"}),", ",(0,i.jsx)(l.code,{children:"penciller"}),", ",(0,i.jsx)(l.code,{children:"letterer"}),", ",(0,i.jsx)(l.code,{children:"inker"}),", ",(0,i.jsx)(l.code,{children:"editor"}),", ",(0,i.jsx)(l.code,{children:"cover"}),", ",(0,i.jsx)(l.code,{children:"colorist"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"release_date"})," will search by year released. Example: ",(0,i.jsx)(l.code,{children:"release_date:1999"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"status"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["Possible values: ",(0,i.jsx)(l.code,{children:"ready"}),", ",(0,i.jsx)(l.code,{children:"unknown"}),", ",(0,i.jsx)(l.code,{children:"error"}),", ",(0,i.jsx)(l.code,{children:"unsupported"}),", ",(0,i.jsx)(l.code,{children:"outdated"})]}),"\n",(0,i.jsxs)(l.li,{children:["Example: ",(0,i.jsx)(l.code,{children:"status:(error OR unsupported)"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"deleted"})," will search soft-deleted books. Example: ",(0,i.jsx)(l.code,{children:"deleted:true"})," or ",(0,i.jsx)(l.code,{children:"deleted:false"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"oneshot"})," will search for One-Shots only. Example: ",(0,i.jsx)(l.code,{children:"oneshot:true"})," or ",(0,i.jsx)(l.code,{children:"oneshot:false"})]}),"\n"]}),"\n",(0,i.jsx)(l.p,{children:"Some additional Series fields will be available if the book is a One-Shot:"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"publisher"})}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"status"}),", which should always be ",(0,i.jsx)(l.code,{children:"ended"})]}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"reading_direction"})}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"age_rating"})}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"language"})}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"genre"})}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"sharing_label"})}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"complete"}),", which will always be ",(0,i.jsx)(l.code,{children:"true"})]}),"\n"]})]})}function t(e={}){const{wrapper:l}={...(0,n.R)(),...e.components};return l?(0,i.jsx)(l,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},3023:(e,l,s)=>{s.d(l,{R:()=>d,x:()=>c});var i=s(3696);const n={},r=i.createContext(n);function d(e){const l=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(l):{...l,...e}}),[l,e])}function c(e){let l;return l=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:l},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c2d7cd96.99b10f2b.js b/assets/js/c2d7cd96.99b10f2b.js deleted file mode 100644 index 6869a0dd..00000000 --- a/assets/js/c2d7cd96.99b10f2b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9091],{895:(e,l,s)=>{s.r(l),s.d(l,{assets:()=>o,contentTitle:()=>d,default:()=>t,frontMatter:()=>r,metadata:()=>c,toc:()=>h});var i=s(2540),n=s(3023);const r={},d="Full Text Search",c={id:"guides/search",title:"Full Text Search",description:"Komga leverages Full Text Search (FTS hereafter) to provide relevant results from your libraries.",source:"@site/docs/guides/search.md",sourceDirName:"guides",slug:"/guides/search",permalink:"/docs/guides/search",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/search.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read lists",permalink:"/docs/guides/readlists"},next:{title:"Import Books",permalink:"/docs/guides/import-books"}},o={},h=[{value:"Series additional fields",id:"series-additional-fields",level:3},{value:"Book additional fields",id:"book-additional-fields",level:3}];function a(e){const l={a:"a",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l.header,{children:(0,i.jsx)(l.h1,{id:"full-text-search",children:"Full Text Search"})}),"\n",(0,i.jsxs)(l.p,{children:["Komga leverages ",(0,i.jsx)(l.a,{href:"https://en.wikipedia.org/wiki/Full-text_search",children:"Full Text Search"})," (FTS hereafter) to provide relevant results from your libraries."]}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsx)(l.li,{children:"FTS will order results by relevance"}),"\n",(0,i.jsx)(l.li,{children:"FTS is case-insensitive"}),"\n",(0,i.jsx)(l.li,{children:"When searching with CJK characters (Chinese, Japanese, Korean), a minimum of 2 characters is required."}),"\n",(0,i.jsxs)(l.li,{children:["The order of words is not important: ",(0,i.jsx)(l.code,{children:"batman robin"})," will match ",(0,i.jsx)(l.code,{children:"Robin & Batman"})]}),"\n",(0,i.jsxs)(l.li,{children:["To search by words in order, enclose your search in ",(0,i.jsx)(l.code,{children:'"'}),": ",(0,i.jsx)(l.code,{children:'"white knight"'})," will not match ",(0,i.jsx)(l.code,{children:"knight white"})," nor ",(0,i.jsx)(l.code,{children:"white and knight"})]}),"\n",(0,i.jsx)(l.li,{children:"By default, the search will match the item title. For Books, the ISBN will also be matched by default."}),"\n",(0,i.jsxs)(l.li,{children:["You can use the ",(0,i.jsx)(l.code,{children:"AND"}),", ",(0,i.jsx)(l.code,{children:"OR"})," and ",(0,i.jsx)(l.code,{children:"NOT"})," operators (UPPERCASE) to build complex queries:","\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"batman NOT publisher:dc"})," will match all ",(0,i.jsx)(l.code,{children:"Batman"})," series not published by ",(0,i.jsx)(l.em,{children:"DC Comics"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"batman OR robin"})," will match ",(0,i.jsx)(l.code,{children:"Batman"})," or ",(0,i.jsx)(l.code,{children:"Robin"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"batman AND (robin OR superman)"})," will match ",(0,i.jsx)(l.code,{children:"Superman & Batman"})," and ",(0,i.jsx)(l.code,{children:"Batman & Robin"})]}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"writer:remender penciller:murphy"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:["You can perform range queries using the ",(0,i.jsx)(l.code,{children:"[a TO b]"})," syntax. Example: ",(0,i.jsx)(l.code,{children:"release_date:[1990 TO 2000]"}),". Note that the matching is lexicographic, not numerical. You can also use wildcards: ",(0,i.jsx)(l.code,{children:"release_date:[2010 TO *]"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(l.p,{children:["Some extra fields are available for search using the ",(0,i.jsx)(l.code,{children:"field:search"})," syntax, see after."]}),"\n",(0,i.jsx)(l.h3,{id:"series-additional-fields",children:"Series additional fields"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"publisher"}),". Example: ",(0,i.jsx)(l.code,{children:"publisher:vertigo"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"status"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["Possible values: ",(0,i.jsx)(l.code,{children:"ongoing"}),", ",(0,i.jsx)(l.code,{children:"ended"}),", ",(0,i.jsx)(l.code,{children:"hiatus"}),", ",(0,i.jsx)(l.code,{children:"abandoned"})]}),"\n",(0,i.jsxs)(l.li,{children:["Example: ",(0,i.jsx)(l.code,{children:"status:hiatus"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"reading_direction"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["Possible values: ",(0,i.jsx)(l.code,{children:"left_to_right"}),", ",(0,i.jsx)(l.code,{children:"right_to_left"}),", ",(0,i.jsx)(l.code,{children:"vertical"}),", ",(0,i.jsx)(l.code,{children:"webtoon"})]}),"\n",(0,i.jsxs)(l.li,{children:["Example: ",(0,i.jsx)(l.code,{children:"reading_direction:right_to_left"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"age_rating"}),". Example: ",(0,i.jsx)(l.code,{children:"age_rating:12"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"language"}),". Example: ",(0,i.jsx)(l.code,{children:"language:fr"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"tag"})," will search any tag, whether it is set at Series or Book level. Example: ",(0,i.jsx)(l.code,{children:"tag:action"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"series_tag"})," will search series tags only"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"book_tag"})," will search book tags only"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"genre"}),". Example: ",(0,i.jsx)(l.code,{children:"genre:action"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"author"})," will search authors with any role. Example: ",(0,i.jsx)(l.code,{children:"author:(sean murphy)"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["You can also search by specific role. Example: ",(0,i.jsx)(l.code,{children:"writer:remender"})]}),"\n",(0,i.jsxs)(l.li,{children:["Possible role values are: ",(0,i.jsx)(l.code,{children:"writer"}),", ",(0,i.jsx)(l.code,{children:"penciller"}),", ",(0,i.jsx)(l.code,{children:"letterer"}),", ",(0,i.jsx)(l.code,{children:"inker"}),", ",(0,i.jsx)(l.code,{children:"editor"}),", ",(0,i.jsx)(l.code,{children:"cover"}),", ",(0,i.jsx)(l.code,{children:"colorist"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"book_count"}),", which is the number of books present in that Series. Example: ",(0,i.jsx)(l.code,{children:"book_count:1"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"total_book_count"}),". Example: ",(0,i.jsx)(l.code,{children:"total_book_count:100"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"release_date"})," will search by year released. Example: ",(0,i.jsx)(l.code,{children:"release_date:1999"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"deleted"})," will search soft-deleted series. Example: ",(0,i.jsx)(l.code,{children:"deleted:true"})," or ",(0,i.jsx)(l.code,{children:"deleted:false"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"complete"})," will search complete series, ie series where the ",(0,i.jsx)(l.em,{children:"total book counts"})," (from metadata) is equals to the actual book counts (number of files). Example: ",(0,i.jsx)(l.code,{children:"complete:true"})," or ",(0,i.jsx)(l.code,{children:"complete:false"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"sharing_label"}),". Example: ",(0,i.jsx)(l.code,{children:"sharing_label:kids"})]}),"\n"]}),"\n",(0,i.jsx)(l.h3,{id:"book-additional-fields",children:"Book additional fields"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"tag"})," will search any tag. Example: ",(0,i.jsx)(l.code,{children:'tag:"double pages"'})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"author"})," will search authors with any role. Example: ",(0,i.jsx)(l.code,{children:"author:(sean murphy)"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["You can also search by specific role. Example: ",(0,i.jsx)(l.code,{children:"writer:remender"})]}),"\n",(0,i.jsxs)(l.li,{children:["Possible role values are: ",(0,i.jsx)(l.code,{children:"writer"}),", ",(0,i.jsx)(l.code,{children:"penciller"}),", ",(0,i.jsx)(l.code,{children:"letterer"}),", ",(0,i.jsx)(l.code,{children:"inker"}),", ",(0,i.jsx)(l.code,{children:"editor"}),", ",(0,i.jsx)(l.code,{children:"cover"}),", ",(0,i.jsx)(l.code,{children:"colorist"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"release_date"})," will search by year released. Example: ",(0,i.jsx)(l.code,{children:"release_date:1999"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"status"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsxs)(l.li,{children:["Possible values: ",(0,i.jsx)(l.code,{children:"ready"}),", ",(0,i.jsx)(l.code,{children:"unknown"}),", ",(0,i.jsx)(l.code,{children:"error"}),", ",(0,i.jsx)(l.code,{children:"unsupported"}),", ",(0,i.jsx)(l.code,{children:"outdated"})]}),"\n",(0,i.jsxs)(l.li,{children:["Example: ",(0,i.jsx)(l.code,{children:"status:(error OR unsupported)"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"deleted"})," will search soft-deleted books. Example: ",(0,i.jsx)(l.code,{children:"deleted:true"})," or ",(0,i.jsx)(l.code,{children:"deleted:false"})]}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"oneshot"})," will search for One-Shots only. Example: ",(0,i.jsx)(l.code,{children:"oneshot:true"})," or ",(0,i.jsx)(l.code,{children:"oneshot:false"})]}),"\n"]}),"\n",(0,i.jsx)(l.p,{children:"Some additional Series fields will be available if the book is a One-Shot:"}),"\n",(0,i.jsxs)(l.ul,{children:["\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"publisher"})}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"status"}),", which should always be ",(0,i.jsx)(l.code,{children:"ended"})]}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"reading_direction"})}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"age_rating"})}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"language"})}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"genre"})}),"\n",(0,i.jsx)(l.li,{children:(0,i.jsx)(l.code,{children:"sharing_label"})}),"\n",(0,i.jsxs)(l.li,{children:[(0,i.jsx)(l.code,{children:"complete"}),", which will always be ",(0,i.jsx)(l.code,{children:"true"})]}),"\n"]})]})}function t(e={}){const{wrapper:l}={...(0,n.R)(),...e.components};return l?(0,i.jsx)(l,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},3023:(e,l,s)=>{s.d(l,{R:()=>d,x:()=>c});var i=s(3696);const n={},r=i.createContext(n);function d(e){const l=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(l):{...l,...e}}),[l,e])}function c(e){let l;return l=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:l},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c777247d.445ad470.js b/assets/js/c777247d.445ad470.js deleted file mode 100644 index 185c84bf..00000000 --- a/assets/js/c777247d.445ad470.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8688],{8416:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=s(2540),t=s(3023);const r={},o="Read with Mihon",a={id:"guides/mihon",title:"Read with Mihon",description:"Install and configure",source:"@site/docs/guides/mihon.md",sourceDirName:"guides",slug:"/guides/mihon",permalink:"/docs/guides/mihon",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/mihon.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with the Webreader",permalink:"/docs/guides/webreader"},next:{title:"Read with Kobo",permalink:"/docs/guides/kobo"}},d={},c=[{value:"Install and configure",id:"install-and-configure",level:2},{value:"Browse",id:"browse",level:2},{value:"Track read progress",id:"track-read-progress",level:2},{value:"Compatibility",id:"compatibility",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"read-with-mihon",children:"Read with Mihon"})}),"\n",(0,n.jsx)(i.h2,{id:"install-and-configure",children:"Install and configure"}),"\n",(0,n.jsxs)(i.p,{children:["Komga has an official extension for ",(0,n.jsx)(i.a,{href:"https://mihon.app/",children:"Mihon"})," (formerly Tachiyomi), available from the ",(0,n.jsx)(i.a,{href:"https://keiyoushi.github.io/",children:"Keiyoushi repository of extensions"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"Once installed, the extension will let you configure up to 10 Komga servers."}),"\n",(0,n.jsxs)(i.p,{children:["You will need to configure the extension with your ",(0,n.jsx)(i.em,{children:"server address"}),", ",(0,n.jsx)(i.em,{children:"username"})," and ",(0,n.jsx)(i.em,{children:"password"})," before you can use it."]}),"\n",(0,n.jsxs)(i.admonition,{type:"tip",children:[(0,n.jsxs)(i.p,{children:["Example server address: ",(0,n.jsx)(i.code,{children:"http://my.server:25600(/baseUrl)"})]}),(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.strong,{children:["Note that there is no trailing slash (",(0,n.jsx)(i.code,{children:"/"}),")."]})})]}),"\n",(0,n.jsx)(i.h2,{id:"browse",children:"Browse"}),"\n",(0,n.jsx)(i.p,{children:"You can browse series, use the filter menu, and search for series."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-browse.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension browse"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-filters.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension filters"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-search.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension search"}),"\n",(0,n.jsx)(i.h2,{id:"track-read-progress",children:"Track read progress"}),"\n",(0,n.jsxs)(i.p,{children:["Mihon can keep your read progress in sync with your Komga server. Check the official Mihon website for ",(0,n.jsx)(i.a,{href:"https://mihon.app/docs/guides/tracking#enhanced-services",children:"instructions"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,n.jsx)(i.p,{children:"For better compatibility, ensure you always have the latest versions of:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Komga server"}),"\n",(0,n.jsx)(i.li,{children:"Mihon"}),"\n",(0,n.jsx)(i.li,{children:"Komga extension"}),"\n"]})]})}function l(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3023:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(3696);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c777247d.b2256ed5.js b/assets/js/c777247d.b2256ed5.js new file mode 100644 index 00000000..065a33a6 --- /dev/null +++ b/assets/js/c777247d.b2256ed5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8688],{8416:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=s(2540),t=s(3023);const r={},o="Read with Mihon",a={id:"guides/mihon",title:"Read with Mihon",description:"Install and configure",source:"@site/docs/guides/mihon.md",sourceDirName:"guides",slug:"/guides/mihon",permalink:"/docs/guides/mihon",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/mihon.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with the Webreader",permalink:"/docs/guides/webreader"},next:{title:"Read with Kobo",permalink:"/docs/guides/kobo"}},d={},c=[{value:"Install and configure",id:"install-and-configure",level:2},{value:"Browse",id:"browse",level:2},{value:"Track read progress",id:"track-read-progress",level:2},{value:"Compatibility",id:"compatibility",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"read-with-mihon",children:"Read with Mihon"})}),"\n",(0,n.jsx)(i.h2,{id:"install-and-configure",children:"Install and configure"}),"\n",(0,n.jsxs)(i.p,{children:["Komga has an official extension for ",(0,n.jsx)(i.a,{href:"https://mihon.app/",children:"Mihon"})," (formerly Tachiyomi), available from the ",(0,n.jsx)(i.a,{href:"https://keiyoushi.github.io/",children:"Keiyoushi repository of extensions"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"Once installed, the extension will let you configure up to 10 Komga servers."}),"\n",(0,n.jsxs)(i.p,{children:["You will need to configure the extension with your ",(0,n.jsx)(i.em,{children:"server address"}),", ",(0,n.jsx)(i.em,{children:"username"})," and ",(0,n.jsx)(i.em,{children:"password"})," before you can use it."]}),"\n",(0,n.jsxs)(i.admonition,{type:"tip",children:[(0,n.jsxs)(i.p,{children:["Example server address: ",(0,n.jsx)(i.code,{children:"http://my.server:25600(/baseUrl)"})]}),(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.strong,{children:["Note that there is no trailing slash (",(0,n.jsx)(i.code,{children:"/"}),")."]})})]}),"\n",(0,n.jsx)(i.h2,{id:"browse",children:"Browse"}),"\n",(0,n.jsx)(i.p,{children:"You can browse series, use the filter menu, and search for series."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-browse.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension browse"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-filters.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension filters"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-search.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension search"}),"\n",(0,n.jsx)(i.h2,{id:"track-read-progress",children:"Track read progress"}),"\n",(0,n.jsxs)(i.p,{children:["Mihon can keep your read progress in sync with your Komga server. Check the official Mihon website for ",(0,n.jsx)(i.a,{href:"https://mihon.app/docs/guides/tracking#enhanced-services",children:"instructions"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,n.jsx)(i.p,{children:"For better compatibility, ensure you always have the latest versions of:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Komga server"}),"\n",(0,n.jsx)(i.li,{children:"Mihon"}),"\n",(0,n.jsx)(i.li,{children:"Komga extension"}),"\n"]})]})}function l(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3023:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(3696);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ca683365.40c423da.js b/assets/js/ca683365.40c423da.js deleted file mode 100644 index 0b7a34c9..00000000 --- a/assets/js/ca683365.40c423da.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3372],{9802:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var s=n(2540),i=n(3023);const r={},o="Theme",c={id:"guides/theme",title:"Theme",description:"You can customize the application theme from the sidebar.",source:"@site/docs/guides/theme.md",sourceDirName:"guides",slug:"/guides/theme",permalink:"/docs/guides/theme",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/theme.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Chunky Reader (iPad)",permalink:"/docs/guides/chunky"},next:{title:"Announcements",permalink:"/docs/guides/announcements"}},a={},d=[];function h(e){const t={h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"theme",children:"Theme"})}),"\n",(0,s.jsx)(t.p,{children:"You can customize the application theme from the sidebar."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/theme/theme.png",style:{maxHeight:"50px"}}),"\n",(0,s.jsx)(t.p,{children:"Three themes are available:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Light"}),"\n",(0,s.jsx)(t.li,{children:"Dark"}),"\n",(0,s.jsx)(t.li,{children:"System: this will follow the theme of your OS."}),"\n"]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/theme/theme-list.png",style:{maxHeight:"150px"}})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var s=n(3696);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ca683365.9d8cb1e5.js b/assets/js/ca683365.9d8cb1e5.js new file mode 100644 index 00000000..cdbaca6c --- /dev/null +++ b/assets/js/ca683365.9d8cb1e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3372],{9802:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var s=n(2540),i=n(3023);const r={},o="Theme",c={id:"guides/theme",title:"Theme",description:"You can customize the application theme from the sidebar.",source:"@site/docs/guides/theme.md",sourceDirName:"guides",slug:"/guides/theme",permalink:"/docs/guides/theme",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/theme.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Chunky Reader (iPad)",permalink:"/docs/guides/chunky"},next:{title:"Announcements",permalink:"/docs/guides/announcements"}},a={},d=[];function h(e){const t={h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"theme",children:"Theme"})}),"\n",(0,s.jsx)(t.p,{children:"You can customize the application theme from the sidebar."}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/theme/theme.png",style:{maxHeight:"50px"}}),"\n",(0,s.jsx)(t.p,{children:"Three themes are available:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Light"}),"\n",(0,s.jsx)(t.li,{children:"Dark"}),"\n",(0,s.jsx)(t.li,{children:"System: this will follow the theme of your OS."}),"\n"]}),"\n",(0,s.jsx)("img",{src:"/assets/media/guides/theme/theme-list.png",style:{maxHeight:"150px"}})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>c});var s=n(3696);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d135d818.2c62488d.js b/assets/js/d135d818.2c62488d.js new file mode 100644 index 00000000..2b8d186c --- /dev/null +++ b/assets/js/d135d818.2c62488d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4569],{499:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=t(2540),s=t(3023);const i={},o="Duplicate Pages",l={id:"guides/duplicate-pages",title:"Duplicate Pages",description:"Komga can detect duplicate pages among your books, and delete them manually or automatically.",source:"@site/docs/guides/duplicate-pages.md",sourceDirName:"guides",slug:"/guides/duplicate-pages",permalink:"/docs/guides/duplicate-pages",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/duplicate-pages.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Duplicate Files",permalink:"/docs/guides/duplicate-files"},next:{title:"Readers",permalink:"/docs/category/readers"}},r={},c=[{value:"Browsing New Duplicates",id:"browsing-new-duplicates",level:2},{value:"Browsing Known Duplicates",id:"browsing-known-duplicates",level:2}];function d(e){const n={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"duplicate-pages",children:"Duplicate Pages"})}),"\n",(0,a.jsx)(n.p,{children:"Komga can detect duplicate pages among your books, and delete them manually or automatically."}),"\n",(0,a.jsxs)(n.p,{children:["You need to enable ",(0,a.jsx)(n.a,{href:"/docs/guides/libraries#compute-hash-for-pages",children:"page hashing"})," for your libraries."]}),"\n",(0,a.jsxs)(n.p,{children:["You can manage duplicate pages from ",(0,a.jsx)(n.em,{children:"Server Settings > Duplicate Pages"}),"."]}),"\n",(0,a.jsxs)(n.admonition,{type:"warning",children:[(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Duplicate page removal will modify your files."})}),(0,a.jsx)(n.p,{children:"It is recommended to perform a backup, and to try using manual deletion before using automatic deletion."})]}),"\n",(0,a.jsx)(n.h2,{id:"browsing-new-duplicates",children:"Browsing New Duplicates"}),"\n",(0,a.jsxs)(n.p,{children:["This screen will show all the newly detected duplicate pages. You can sort them by ",(0,a.jsx)(n.em,{children:"Count"})," of duplicates, ",(0,a.jsx)(n.em,{children:"Size"})," of the image, or the ",(0,a.jsx)(n.em,{children:"Total Size"})," you could save by deleting it."]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/duplicate-pages/duplicate-pages-new.png",style:{maxHeight:" 400px"},alt:"Browse New Duplicates"}),"\n",(0,a.jsx)(n.p,{children:"For each duplicate page, you can:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.em,{children:"Ignore"}),": It won't show anymore on this page, and Komga won't do anything about it."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.em,{children:"Manual Delete"}),": You will be able to trigger manual deletion from the ",(0,a.jsx)(n.em,{children:"Known"})," view."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.em,{children:"Auto Delete"}),": Komga will automatically remove those pages after a library scan."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["You can also see the detailed list of matches by clicking on the ",(0,a.jsx)(n.em,{children:"Matches"})," button. It will show all the books containing the duplicate page, as well as the image for each, so you can perform a visual check. You can also delete matches individually."]}),"\n",(0,a.jsx)(n.h2,{id:"browsing-known-duplicates",children:"Browsing Known Duplicates"}),"\n",(0,a.jsxs)(n.p,{children:["This screen will show all the duplicate pages for which you chose an action. You can sort them by ",(0,a.jsx)(n.em,{children:"Deletion Count"})," , ",(0,a.jsx)(n.em,{children:"Size"})," of the image, or the ",(0,a.jsx)(n.em,{children:"Space Saved"})," so far."]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/duplicate-pages/duplicate-pages-known.png",style:{maxHeight:" 400px"},alt:"Browse Known Duplicates"}),"\n",(0,a.jsxs)(n.p,{children:["For each page, you can change the action. You can ",(0,a.jsx)(n.em,{children:"Ignore"})," a page that was set for deletion, or mark an ignored one for deletion, if you changed your mind."]}),"\n",(0,a.jsxs)(n.p,{children:["For pages set for ",(0,a.jsx)(n.em,{children:"Manual Delete"}),", you can trigger the deletion using the ",(0,a.jsx)(n.em,{children:"Delete Matches"})," button."]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var a=t(3696);const s={},i=a.createContext(s);function o(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d135d818.c00c16c2.js b/assets/js/d135d818.c00c16c2.js deleted file mode 100644 index ec142c08..00000000 --- a/assets/js/d135d818.c00c16c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4569],{499:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=t(2540),s=t(3023);const i={},o="Duplicate Pages",l={id:"guides/duplicate-pages",title:"Duplicate Pages",description:"Komga can detect duplicate pages among your books, and delete them manually or automatically.",source:"@site/docs/guides/duplicate-pages.md",sourceDirName:"guides",slug:"/guides/duplicate-pages",permalink:"/docs/guides/duplicate-pages",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/duplicate-pages.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Duplicate Files",permalink:"/docs/guides/duplicate-files"},next:{title:"Readers",permalink:"/docs/category/readers"}},r={},c=[{value:"Browsing New Duplicates",id:"browsing-new-duplicates",level:2},{value:"Browsing Known Duplicates",id:"browsing-known-duplicates",level:2}];function d(e){const n={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"duplicate-pages",children:"Duplicate Pages"})}),"\n",(0,a.jsx)(n.p,{children:"Komga can detect duplicate pages among your books, and delete them manually or automatically."}),"\n",(0,a.jsxs)(n.p,{children:["You need to enable ",(0,a.jsx)(n.a,{href:"/docs/guides/libraries#compute-hash-for-pages",children:"page hashing"})," for your libraries."]}),"\n",(0,a.jsxs)(n.p,{children:["You can manage duplicate pages from ",(0,a.jsx)(n.em,{children:"Server Settings > Duplicate Pages"}),"."]}),"\n",(0,a.jsxs)(n.admonition,{type:"warning",children:[(0,a.jsx)(n.p,{children:(0,a.jsx)(n.strong,{children:"Duplicate page removal will modify your files."})}),(0,a.jsx)(n.p,{children:"It is recommended to perform a backup, and to try using manual deletion before using automatic deletion."})]}),"\n",(0,a.jsx)(n.h2,{id:"browsing-new-duplicates",children:"Browsing New Duplicates"}),"\n",(0,a.jsxs)(n.p,{children:["This screen will show all the newly detected duplicate pages. You can sort them by ",(0,a.jsx)(n.em,{children:"Count"})," of duplicates, ",(0,a.jsx)(n.em,{children:"Size"})," of the image, or the ",(0,a.jsx)(n.em,{children:"Total Size"})," you could save by deleting it."]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/duplicate-pages/duplicate-pages-new.png",style:{maxHeight:" 400px"},alt:"Browse New Duplicates"}),"\n",(0,a.jsx)(n.p,{children:"For each duplicate page, you can:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.em,{children:"Ignore"}),": It won't show anymore on this page, and Komga won't do anything about it."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.em,{children:"Manual Delete"}),": You will be able to trigger manual deletion from the ",(0,a.jsx)(n.em,{children:"Known"})," view."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.em,{children:"Auto Delete"}),": Komga will automatically remove those pages after a library scan."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["You can also see the detailed list of matches by clicking on the ",(0,a.jsx)(n.em,{children:"Matches"})," button. It will show all the books containing the duplicate page, as well as the image for each, so you can perform a visual check. You can also delete matches individually."]}),"\n",(0,a.jsx)(n.h2,{id:"browsing-known-duplicates",children:"Browsing Known Duplicates"}),"\n",(0,a.jsxs)(n.p,{children:["This screen will show all the duplicate pages for which you chose an action. You can sort them by ",(0,a.jsx)(n.em,{children:"Deletion Count"})," , ",(0,a.jsx)(n.em,{children:"Size"})," of the image, or the ",(0,a.jsx)(n.em,{children:"Space Saved"})," so far."]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/duplicate-pages/duplicate-pages-known.png",style:{maxHeight:" 400px"},alt:"Browse Known Duplicates"}),"\n",(0,a.jsxs)(n.p,{children:["For each page, you can change the action. You can ",(0,a.jsx)(n.em,{children:"Ignore"})," a page that was set for deletion, or mark an ignored one for deletion, if you changed your mind."]}),"\n",(0,a.jsxs)(n.p,{children:["For pages set for ",(0,a.jsx)(n.em,{children:"Manual Delete"}),", you can trigger the deletion using the ",(0,a.jsx)(n.em,{children:"Delete Matches"})," button."]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},3023:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var a=t(3696);const s={},i=a.createContext(s);function o(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d6e0cd3c.1c7b5a76.js b/assets/js/d6e0cd3c.1c7b5a76.js deleted file mode 100644 index 17a1f375..00000000 --- a/assets/js/d6e0cd3c.1c7b5a76.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6225],{2680:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});var s=n(2540),c=n(3023);const i={},r="Accessing the web interface",o={id:"guides/webui",title:"Accessing the web interface",description:"Once Komga is started, you can access the web interface at//:(/baseUrl).",source:"@site/docs/guides/webui.md",sourceDirName:"guides",slug:"/guides/webui",permalink:"/docs/guides/webui",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/webui.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Guides",permalink:"/docs/category/guides"},next:{title:"Desktop Application",permalink:"/docs/guides/desktop"}},a={},d=[{value:"Create user account",id:"create-user-account",level:2}];function l(e){const t={admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,c.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"accessing-the-web-interface",children:"Accessing the web interface"})}),"\n",(0,s.jsxs)(t.p,{children:["Once Komga is started, you can access the web interface at: ",(0,s.jsx)(t.code,{children:"http://:(/baseUrl)"}),"."]}),"\n",(0,s.jsxs)(t.admonition,{type:"tip",children:[(0,s.jsxs)(t.p,{children:["If you are running Komga locally, ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.code,{children:""})})," will be ",(0,s.jsx)(t.code,{children:"localhost"}),"."]}),(0,s.jsxs)(t.p,{children:["The default ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.code,{children:""})})," is ",(0,s.jsx)(t.code,{children:"25600"}),"."]})]}),"\n",(0,s.jsx)(t.h2,{id:"create-user-account",children:"Create user account"}),"\n",(0,s.jsxs)(t.p,{children:["You will be asked to create a user account. Choose an ",(0,s.jsx)(t.em,{children:"email"})," and ",(0,s.jsx)(t.em,{children:"password"}),", then click on ",(0,s.jsx)(t.strong,{children:"Create User Account"}),"."]}),"\n",(0,s.jsx)("div",{class:"text--center",children:(0,s.jsx)("img",{src:"/assets/media/installation/create-initial-account.png",style:{maxHeight:"500px"},alt:"Create initial account"})})]})}function u(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var s=n(3696);const c={},i=s.createContext(c);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d6e0cd3c.5d23eee4.js b/assets/js/d6e0cd3c.5d23eee4.js new file mode 100644 index 00000000..9663826c --- /dev/null +++ b/assets/js/d6e0cd3c.5d23eee4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6225],{2680:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});var s=n(2540),c=n(3023);const i={},r="Accessing the web interface",o={id:"guides/webui",title:"Accessing the web interface",description:"Once Komga is started, you can access the web interface at//:(/baseUrl).",source:"@site/docs/guides/webui.md",sourceDirName:"guides",slug:"/guides/webui",permalink:"/docs/guides/webui",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/webui.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Guides",permalink:"/docs/category/guides"},next:{title:"Desktop Application",permalink:"/docs/guides/desktop"}},a={},d=[{value:"Create user account",id:"create-user-account",level:2}];function l(e){const t={admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,c.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"accessing-the-web-interface",children:"Accessing the web interface"})}),"\n",(0,s.jsxs)(t.p,{children:["Once Komga is started, you can access the web interface at: ",(0,s.jsx)(t.code,{children:"http://:(/baseUrl)"}),"."]}),"\n",(0,s.jsxs)(t.admonition,{type:"tip",children:[(0,s.jsxs)(t.p,{children:["If you are running Komga locally, ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.code,{children:""})})," will be ",(0,s.jsx)(t.code,{children:"localhost"}),"."]}),(0,s.jsxs)(t.p,{children:["The default ",(0,s.jsx)(t.em,{children:(0,s.jsx)(t.code,{children:""})})," is ",(0,s.jsx)(t.code,{children:"25600"}),"."]})]}),"\n",(0,s.jsx)(t.h2,{id:"create-user-account",children:"Create user account"}),"\n",(0,s.jsxs)(t.p,{children:["You will be asked to create a user account. Choose an ",(0,s.jsx)(t.em,{children:"email"})," and ",(0,s.jsx)(t.em,{children:"password"}),", then click on ",(0,s.jsx)(t.strong,{children:"Create User Account"}),"."]}),"\n",(0,s.jsx)("div",{class:"text--center",children:(0,s.jsx)("img",{src:"/assets/media/installation/create-initial-account.png",style:{maxHeight:"500px"},alt:"Create initial account"})})]})}function u(e={}){const{wrapper:t}={...(0,c.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},3023:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var s=n(3696);const c={},i=s.createContext(c);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d86518ca.42f54bcd.js b/assets/js/d86518ca.42f54bcd.js deleted file mode 100644 index c9c43527..00000000 --- a/assets/js/d86518ca.42f54bcd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[303],{782:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var s=n(2540),t=n(3023);const i={},o="Read with Paperback",a={id:"guides/paperback",title:"Read with Paperback",description:"Komga has an extension for Paperback, a free iOS and iPadOS reader.",source:"@site/docs/guides/paperback.md",sourceDirName:"guides",slug:"/guides/paperback",permalink:"/docs/guides/paperback",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/paperback.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Kobo",permalink:"/docs/guides/kobo"},next:{title:"Read with CDisplayEx",permalink:"/docs/guides/cdisplayex"}},d={},l=[{value:"Install and configure",id:"install-and-configure",level:2},{value:"Add the source repository",id:"add-the-source-repository",level:3},{value:"Install the source",id:"install-the-source",level:3},{value:"Configure the source",id:"configure-the-source",level:3},{value:"Track read progress",id:"track-read-progress",level:2},{value:"Add the tracker repository",id:"add-the-tracker-repository",level:3},{value:"Install the tracker",id:"install-the-tracker",level:3},{value:"Changelog and Compatibility",id:"changelog-and-compatibility",level:2}];function c(e){const r={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Details:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"read-with-paperback",children:"Read with Paperback"})}),"\n",(0,s.jsxs)(r.p,{children:["Komga has an extension for ",(0,s.jsx)(r.a,{href:"https://paperback.moe/",children:"Paperback"}),", a free iOS and iPadOS reader."]}),"\n",(0,s.jsx)(r.admonition,{type:"warning",children:(0,s.jsx)(r.p,{children:"Paperback requires iOS 13.4+ or iPadOS 13.4+."})}),"\n",(0,s.jsx)(r.h2,{id:"install-and-configure",children:"Install and configure"}),"\n",(0,s.jsx)(r.h3,{id:"add-the-source-repository",children:"Add the source repository"}),"\n",(0,s.jsxs)(r.p,{children:["Support for Komga comes pre-installed with Paperback under the ",(0,s.jsx)(r.code,{children:"Paperback"})," source name. If deleted the extension and repository simply open ",(0,s.jsx)(r.a,{href:"https://paperback-ios.github.io/extensions-default/0.8/",children:"the repository page"})," on your device and tap ",(0,s.jsx)(r.strong,{children:"Add to Paperback"}),"."]}),"\n",(0,s.jsx)(r.p,{children:'Once Paperback opens choose "Add as Source Repo" on the popup.'}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Add the source repository manually"}),(0,s.jsx)(r.p,{children:"If you prefer, it is also possible to add the repository manually:"}),(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["In the app, go to ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Sources"})," then press ",(0,s.jsx)(r.strong,{children:"Edit"})," on the top right-hand corner."]}),"\n",(0,s.jsxs)(r.li,{children:["Press the top left-hand corner ",(0,s.jsx)(r.strong,{children:"+"})," button to add a repository."]}),"\n",(0,s.jsxs)(r.li,{children:["Use the base url:","\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{children:"https://paperback-ios.github.io/extensions-default/0.8/\n"})}),"\n"]}),"\n"]})]}),"\n",(0,s.jsx)(r.h3,{id:"install-the-source",children:"Install the source"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["In the app ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Sources"})," windows, choose ",(0,s.jsx)(r.code,{children:"Browse Official Repo"}),", or ",(0,s.jsx)(r.code,{children:"Browse ..."})," followed by the repository name you chose previously"]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Install the source ",(0,s.jsx)(r.strong,{children:"Paperback"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"configure-the-source",children:"Configure the source"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["In the app ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Sources"}),", press the ",(0,s.jsx)(r.code,{children:"Paperback"})," source"]}),"\n",(0,s.jsxs)(r.li,{children:["Select ",(0,s.jsx)(r.strong,{children:"Server Settings"})," and set your:","\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"server url"}),"\n",(0,s.jsx)(r.li,{children:"username"}),"\n",(0,s.jsx)(r.li,{children:"password"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["Press ",(0,s.jsx)(r.strong,{children:"Save"})," to exit"]}),"\n"]}),"\n",(0,s.jsx)(r.admonition,{type:"tip",children:(0,s.jsxs)(r.p,{children:["You can test your settings by opening ",(0,s.jsx)(r.strong,{children:"Try Settings"})," below the Server Settings section"]})}),"\n",(0,s.jsx)(r.h2,{id:"track-read-progress",children:"Track read progress"}),"\n",(0,s.jsx)(r.p,{children:"It is possible to sync read chapters from the app to the Komga server using an implicit tracker."}),"\n",(0,s.jsx)(r.h3,{id:"add-the-tracker-repository",children:"Add the tracker repository"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["In the app, go to ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Trackers"})," then press ",(0,s.jsx)(r.strong,{children:"Edit"})," on the top right-hand corner"]}),"\n",(0,s.jsxs)(r.li,{children:["Press the top left-hand corner ",(0,s.jsx)(r.strong,{children:"+"})," button to add a repository."]}),"\n",(0,s.jsxs)(r.li,{children:["Use the base url (",(0,s.jsx)(r.strong,{children:"do not"})," open this url):","\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{children:"https://paperback-ios.github.io/trackers-main/main/\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"install-the-tracker",children:"Install the tracker"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["In the app ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Trackers"})," windows, choose ",(0,s.jsx)(r.code,{children:"Browse ..."})," for the repository you just added"]}),"\n",(0,s.jsxs)(r.li,{children:["Install the tracker ",(0,s.jsx)(r.strong,{children:"Paperback"})]}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"When you read or mark as read a chapter in the app, it will now be marked as such on your Komga server."}),"\n",(0,s.jsx)(r.h2,{id:"changelog-and-compatibility",children:"Changelog and Compatibility"}),"\n",(0,s.jsx)(r.p,{children:"Each version of the Komga extension need a specific version of the Komga server to work properly."})]})}function h(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,r,n)=>{n.d(r,{R:()=>o,x:()=>a});var s=n(3696);const t={},i=s.createContext(t);function o(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d86518ca.81e2b5be.js b/assets/js/d86518ca.81e2b5be.js new file mode 100644 index 00000000..1a010be3 --- /dev/null +++ b/assets/js/d86518ca.81e2b5be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[303],{782:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var s=n(2540),t=n(3023);const i={},o="Read with Paperback",a={id:"guides/paperback",title:"Read with Paperback",description:"Komga has an extension for Paperback, a free iOS and iPadOS reader.",source:"@site/docs/guides/paperback.md",sourceDirName:"guides",slug:"/guides/paperback",permalink:"/docs/guides/paperback",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/paperback.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Kobo",permalink:"/docs/guides/kobo"},next:{title:"Read with CDisplayEx",permalink:"/docs/guides/cdisplayex"}},d={},l=[{value:"Install and configure",id:"install-and-configure",level:2},{value:"Add the source repository",id:"add-the-source-repository",level:3},{value:"Install the source",id:"install-the-source",level:3},{value:"Configure the source",id:"configure-the-source",level:3},{value:"Track read progress",id:"track-read-progress",level:2},{value:"Add the tracker repository",id:"add-the-tracker-repository",level:3},{value:"Install the tracker",id:"install-the-tracker",level:3},{value:"Changelog and Compatibility",id:"changelog-and-compatibility",level:2}];function c(e){const r={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Details:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"read-with-paperback",children:"Read with Paperback"})}),"\n",(0,s.jsxs)(r.p,{children:["Komga has an extension for ",(0,s.jsx)(r.a,{href:"https://paperback.moe/",children:"Paperback"}),", a free iOS and iPadOS reader."]}),"\n",(0,s.jsx)(r.admonition,{type:"warning",children:(0,s.jsx)(r.p,{children:"Paperback requires iOS 13.4+ or iPadOS 13.4+."})}),"\n",(0,s.jsx)(r.h2,{id:"install-and-configure",children:"Install and configure"}),"\n",(0,s.jsx)(r.h3,{id:"add-the-source-repository",children:"Add the source repository"}),"\n",(0,s.jsxs)(r.p,{children:["Support for Komga comes pre-installed with Paperback under the ",(0,s.jsx)(r.code,{children:"Paperback"})," source name. If deleted the extension and repository simply open ",(0,s.jsx)(r.a,{href:"https://paperback-ios.github.io/extensions-default/0.8/",children:"the repository page"})," on your device and tap ",(0,s.jsx)(r.strong,{children:"Add to Paperback"}),"."]}),"\n",(0,s.jsx)(r.p,{children:'Once Paperback opens choose "Add as Source Repo" on the popup.'}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Add the source repository manually"}),(0,s.jsx)(r.p,{children:"If you prefer, it is also possible to add the repository manually:"}),(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["In the app, go to ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Sources"})," then press ",(0,s.jsx)(r.strong,{children:"Edit"})," on the top right-hand corner."]}),"\n",(0,s.jsxs)(r.li,{children:["Press the top left-hand corner ",(0,s.jsx)(r.strong,{children:"+"})," button to add a repository."]}),"\n",(0,s.jsxs)(r.li,{children:["Use the base url:","\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{children:"https://paperback-ios.github.io/extensions-default/0.8/\n"})}),"\n"]}),"\n"]})]}),"\n",(0,s.jsx)(r.h3,{id:"install-the-source",children:"Install the source"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["In the app ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Sources"})," windows, choose ",(0,s.jsx)(r.code,{children:"Browse Official Repo"}),", or ",(0,s.jsx)(r.code,{children:"Browse ..."})," followed by the repository name you chose previously"]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Install the source ",(0,s.jsx)(r.strong,{children:"Paperback"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"configure-the-source",children:"Configure the source"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["In the app ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Sources"}),", press the ",(0,s.jsx)(r.code,{children:"Paperback"})," source"]}),"\n",(0,s.jsxs)(r.li,{children:["Select ",(0,s.jsx)(r.strong,{children:"Server Settings"})," and set your:","\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"server url"}),"\n",(0,s.jsx)(r.li,{children:"username"}),"\n",(0,s.jsx)(r.li,{children:"password"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["Press ",(0,s.jsx)(r.strong,{children:"Save"})," to exit"]}),"\n"]}),"\n",(0,s.jsx)(r.admonition,{type:"tip",children:(0,s.jsxs)(r.p,{children:["You can test your settings by opening ",(0,s.jsx)(r.strong,{children:"Try Settings"})," below the Server Settings section"]})}),"\n",(0,s.jsx)(r.h2,{id:"track-read-progress",children:"Track read progress"}),"\n",(0,s.jsx)(r.p,{children:"It is possible to sync read chapters from the app to the Komga server using an implicit tracker."}),"\n",(0,s.jsx)(r.h3,{id:"add-the-tracker-repository",children:"Add the tracker repository"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["In the app, go to ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Trackers"})," then press ",(0,s.jsx)(r.strong,{children:"Edit"})," on the top right-hand corner"]}),"\n",(0,s.jsxs)(r.li,{children:["Press the top left-hand corner ",(0,s.jsx)(r.strong,{children:"+"})," button to add a repository."]}),"\n",(0,s.jsxs)(r.li,{children:["Use the base url (",(0,s.jsx)(r.strong,{children:"do not"})," open this url):","\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{children:"https://paperback-ios.github.io/trackers-main/main/\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"install-the-tracker",children:"Install the tracker"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["In the app ",(0,s.jsx)(r.strong,{children:"Settings"}),", ",(0,s.jsx)(r.strong,{children:"External Trackers"})," windows, choose ",(0,s.jsx)(r.code,{children:"Browse ..."})," for the repository you just added"]}),"\n",(0,s.jsxs)(r.li,{children:["Install the tracker ",(0,s.jsx)(r.strong,{children:"Paperback"})]}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"When you read or mark as read a chapter in the app, it will now be marked as such on your Komga server."}),"\n",(0,s.jsx)(r.h2,{id:"changelog-and-compatibility",children:"Changelog and Compatibility"}),"\n",(0,s.jsx)(r.p,{children:"Each version of the Komga extension need a specific version of the Komga server to work properly."})]})}function h(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3023:(e,r,n)=>{n.d(r,{R:()=>o,x:()=>a});var s=n(3696);const t={},i=s.createContext(t);function o(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/df8142cd.59a69c90.js b/assets/js/df8142cd.59a69c90.js deleted file mode 100644 index 4330c39d..00000000 --- a/assets/js/df8142cd.59a69c90.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1915],{3654:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var t=s(2540),i=s(3023);const o={},r="REST API",a={id:"api/rest",title:"REST API",description:"Komga offers a REST API, which you can browse using Swagger. It's available at /swagger-ui.html.",source:"@site/docs/api/rest.md",sourceDirName:"api",slug:"/api/rest",permalink:"/docs/api/rest",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/api/rest.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"api",next:{title:"Deprecation",permalink:"/docs/api/deprecation"}},c={},l=[{value:"Authenticating",id:"authenticating",level:2},{value:"Sessions",id:"sessions",level:2},{value:"Remember Me",id:"remember-me",level:2},{value:"Logout",id:"logout",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"rest-api",children:"REST API"})}),"\n",(0,t.jsxs)(n.p,{children:["Komga offers a REST API, which you can browse using Swagger. It's available at ",(0,t.jsx)(n.code,{children:"/swagger-ui.html"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The OpenAPI specification is also available ",(0,t.jsx)(n.a,{href:"https://github.com/gotson/komga/blob/master/komga/docs/openapi.json",children:"here"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"authenticating",children:"Authenticating"}),"\n",(0,t.jsxs)(n.p,{children:["Most endpoints require authentication. Authentication is done using ",(0,t.jsx)(n.strong,{children:"Basic Authentication"})," and can be set on any endpoint."]}),"\n",(0,t.jsx)(n.h2,{id:"sessions",children:"Sessions"}),"\n",(0,t.jsx)(n.p,{children:"Upon successful authentication, a session is created, and can be reused."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["By default, a ",(0,t.jsx)(n.code,{children:"SESSION"})," cookie is set via ",(0,t.jsx)(n.code,{children:"Set-Cookie"})," response header. This works well for browsers and clients that can handle cookies."]}),"\n",(0,t.jsxs)(n.li,{children:["If you specify a header ",(0,t.jsx)(n.code,{children:"X-Auth-Token"})," during authentication, the session ID will be returned via this same header. You can then pass that header again for subsequent requests to reuse the session."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you need to set the session cookie later on, you can call ",(0,t.jsx)(n.code,{children:"/api/v1/login/set-cookie"})," with ",(0,t.jsx)(n.code,{children:"X-Auth-Token"}),". The response will contain the ",(0,t.jsx)(n.code,{children:"Set-Cookie"})," header."]}),"\n",(0,t.jsx)(n.h2,{id:"remember-me",children:"Remember Me"}),"\n",(0,t.jsxs)(n.p,{children:["During authentication, if a request parameter ",(0,t.jsx)(n.code,{children:"remember-me"})," is passed and set to ",(0,t.jsx)(n.code,{children:"true"}),", the server will also return a ",(0,t.jsx)(n.code,{children:"remember-me"})," cookie. This cookie will be used to login automatically even if the session has expired."]}),"\n",(0,t.jsx)(n.h2,{id:"logout",children:"Logout"}),"\n",(0,t.jsxs)(n.p,{children:["You can explicitely logout an existing session by calling ",(0,t.jsx)(n.code,{children:"/api/logout"}),". This would return a ",(0,t.jsx)(n.code,{children:"204"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},3023:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(3696);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/df8142cd.a8336367.js b/assets/js/df8142cd.a8336367.js new file mode 100644 index 00000000..ceabebfe --- /dev/null +++ b/assets/js/df8142cd.a8336367.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1915],{3654:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var t=s(2540),i=s(3023);const o={},r="REST API",a={id:"api/rest",title:"REST API",description:"Komga offers a REST API, which you can browse using Swagger. It's available at /swagger-ui.html.",source:"@site/docs/api/rest.md",sourceDirName:"api",slug:"/api/rest",permalink:"/docs/api/rest",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/api/rest.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"api",next:{title:"Deprecation",permalink:"/docs/api/deprecation"}},c={},l=[{value:"Authenticating",id:"authenticating",level:2},{value:"Sessions",id:"sessions",level:2},{value:"Remember Me",id:"remember-me",level:2},{value:"Logout",id:"logout",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"rest-api",children:"REST API"})}),"\n",(0,t.jsxs)(n.p,{children:["Komga offers a REST API, which you can browse using Swagger. It's available at ",(0,t.jsx)(n.code,{children:"/swagger-ui.html"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The OpenAPI specification is also available ",(0,t.jsx)(n.a,{href:"https://github.com/gotson/komga/blob/master/komga/docs/openapi.json",children:"here"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"authenticating",children:"Authenticating"}),"\n",(0,t.jsxs)(n.p,{children:["Most endpoints require authentication. Authentication is done using ",(0,t.jsx)(n.strong,{children:"Basic Authentication"})," and can be set on any endpoint."]}),"\n",(0,t.jsx)(n.h2,{id:"sessions",children:"Sessions"}),"\n",(0,t.jsx)(n.p,{children:"Upon successful authentication, a session is created, and can be reused."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["By default, a ",(0,t.jsx)(n.code,{children:"SESSION"})," cookie is set via ",(0,t.jsx)(n.code,{children:"Set-Cookie"})," response header. This works well for browsers and clients that can handle cookies."]}),"\n",(0,t.jsxs)(n.li,{children:["If you specify a header ",(0,t.jsx)(n.code,{children:"X-Auth-Token"})," during authentication, the session ID will be returned via this same header. You can then pass that header again for subsequent requests to reuse the session."]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you need to set the session cookie later on, you can call ",(0,t.jsx)(n.code,{children:"/api/v1/login/set-cookie"})," with ",(0,t.jsx)(n.code,{children:"X-Auth-Token"}),". The response will contain the ",(0,t.jsx)(n.code,{children:"Set-Cookie"})," header."]}),"\n",(0,t.jsx)(n.h2,{id:"remember-me",children:"Remember Me"}),"\n",(0,t.jsxs)(n.p,{children:["During authentication, if a request parameter ",(0,t.jsx)(n.code,{children:"remember-me"})," is passed and set to ",(0,t.jsx)(n.code,{children:"true"}),", the server will also return a ",(0,t.jsx)(n.code,{children:"remember-me"})," cookie. This cookie will be used to login automatically even if the session has expired."]}),"\n",(0,t.jsx)(n.h2,{id:"logout",children:"Logout"}),"\n",(0,t.jsxs)(n.p,{children:["You can explicitely logout an existing session by calling ",(0,t.jsx)(n.code,{children:"/api/logout"}),". This would return a ",(0,t.jsx)(n.code,{children:"204"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},3023:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(3696);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e41126ef.0a2e295e.js b/assets/js/e41126ef.0a2e295e.js new file mode 100644 index 00000000..6167d5f8 --- /dev/null +++ b/assets/js/e41126ef.0a2e295e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3147],{7166:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>r,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>o});var t=s(2540),l=s(3023);const n={},d="Read lists",a={id:"guides/readlists",title:"Read lists",description:'Read lists let you gather related books together. Think of it as playlists, but for books. For example, you might add all the books where Wolverine appears together in a "Wolverine" read list.',source:"@site/docs/guides/readlists.md",sourceDirName:"guides",slug:"/guides/readlists",permalink:"/docs/guides/readlists",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/readlists.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Collections",permalink:"/docs/guides/collections"},next:{title:"Full Text Search",permalink:"/docs/guides/search"}},r={},o=[{value:"Adding books to a read list",id:"adding-books-to-a-read-list",level:2},{value:"Finding the Read Lists",id:"finding-the-read-lists",level:2},{value:"Book details screen",id:"book-details-screen",level:3},{value:"Viewing the libraries "By Read List"",id:"viewing-the-libraries-by-read-list",level:3},{value:"Read List details",id:"read-list-details",level:2},{value:"Read List ordering",id:"read-list-ordering",level:3},{value:"Edit read list elements",id:"edit-read-list-elements",level:3},{value:"Deleting a read list",id:"deleting-a-read-list",level:2},{value:"Import read lists from ComicRack",id:"import-read-lists-from-comicrack",level:2}];function c(e){const i={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"read-lists",children:"Read lists"})}),"\n",(0,t.jsx)(i.p,{children:'Read lists let you gather related books together. Think of it as playlists, but for books. For example, you might add all the books where Wolverine appears together in a "Wolverine" read list.'}),"\n",(0,t.jsx)(i.h2,{id:"adding-books-to-a-read-list",children:"Adding books to a read list"}),"\n",(0,t.jsxs)(i.p,{children:["You can add a Book to a read list from the action menu icon ",(0,t.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,t.jsx)(i.em,{children:"Add to read list"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["You can also select multiple books, and click on ",(0,t.jsx)(i.em,{children:"Add to read list"}),"."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/multiselect-add-readlist.png",style:{maxHeight:" 80px"}}),"\n",(0,t.jsx)(i.p,{children:"A dialog will show up, where you can either add books to an existing read list, or create a new read list."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/add-readlist-dialog.png",style:{maxHeight:" 300px"}}),"\n",(0,t.jsx)(i.h2,{id:"finding-the-read-lists",children:"Finding the Read Lists"}),"\n",(0,t.jsx)(i.p,{children:"Read lists can be discovered or viewed in three ways:"}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Book details screen"}),"\n",(0,t.jsx)(i.li,{children:'Viewing the libraries "By Read List"'}),"\n",(0,t.jsx)(i.li,{children:"Searching in the search bar"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"book-details-screen",children:"Book details screen"}),"\n",(0,t.jsx)(i.p,{children:"When viewing the details screen for a specific book that belongs to a read list, the read list will be displayed in a collapsible panel."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/book-readlist-collapsed.png",style:{maxHeight:"300px"}}),"\n",(0,t.jsx)(i.p,{children:"Click on the panel to expand it and see the content of the read list."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/book-readlist-expanded.png",style:{maxHeight:"300px"}}),"\n",(0,t.jsx)(i.h3,{id:"viewing-the-libraries-by-read-list",children:'Viewing the libraries "By Read List"'}),"\n",(0,t.jsx)(i.p,{children:'Only show read lists that exist in the library. Opening a read list goes to the "read list details" screen (see below).'}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/browse-readlists.png",style:{maxHeight:"100px"}}),"\n",(0,t.jsx)(i.h2,{id:"read-list-details",children:"Read List details"}),"\n",(0,t.jsx)(i.p,{children:"The read list details screen contains all the books that belong to the read list. It can include books from any library and any series. By adding items in different libraries or series to read lists, you can relate them to each other."}),"\n",(0,t.jsx)(i.h3,{id:"read-list-ordering",children:"Read List ordering"}),"\n",(0,t.jsx)(i.p,{children:"By default books in a read list are ordered manually. However, you can edit a read list and choose to disable the manual ordering, in which case books will be ordered by release date."}),"\n",(0,t.jsx)(i.p,{children:"Either click on the edit button on the read list card."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-card.png",style:{maxHeight:"300px"}}),"\n",(0,t.jsx)(i.p,{children:"Or click on the edit button from the read list details screen."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-button.png",style:{maxHeight:"60px"}}),"\n",(0,t.jsx)(i.p,{children:"A dialog will show up, where you can edit the read list's ordering."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-dialog.png",style:{maxHeight:"300px"}}),"\n",(0,t.jsx)(i.p,{children:"A manually ordered read list will be showing as such in the read list details screen."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-manual-ordering.png",style:{maxHeight:"50px"}}),"\n",(0,t.jsx)(i.h3,{id:"edit-read-list-elements",children:"Edit read list elements"}),"\n",(0,t.jsx)(i.p,{children:"From the read list details screen you can edit the elements composing a read list. To do so, click on the corresponding button in the toolbar."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-elements-button.png",style:{maxHeight:"80px"}}),"\n",(0,t.jsx)(i.p,{children:"The book cards will show two extra elements:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"a delete button, to remove the book from the read list"}),"\n",(0,t.jsx)(i.li,{children:"a grip handle, which let you drag and drop books to reorder them (only available when the read list is manually ordered)"}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Once you are done with your changes, click the tick in the top bar. Click the cross to discard your changes."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-elements.png",style:{maxHeight:"400px"}}),"\n",(0,t.jsx)(i.h2,{id:"deleting-a-read-list",children:"Deleting a read list"}),"\n",(0,t.jsxs)(i.p,{children:["To delete a read list, look for the action menu icon ",(0,t.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,t.jsx)(i.em,{children:"Delete"}),"."]}),"\n",(0,t.jsx)(i.p,{children:"This will not delete the items in the read list, nor your media files."}),"\n",(0,t.jsx)(i.h2,{id:"import-read-lists-from-comicrack",children:"Import read lists from ComicRack"}),"\n",(0,t.jsxs)(i.p,{children:["You can import ComicRack reading lists in ",(0,t.jsx)(i.code,{children:".cbl"})," format from the ",(0,t.jsx)(i.em,{children:"Import > Read List"})," screen."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/import.png",style:{maxHeight:"400px"}}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:".cbl"})," files contain the following information:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"read list name"}),"\n",(0,t.jsx)(i.li,{children:"books contained in the list, in order"}),"\n",(0,t.jsxs)(i.li,{children:["for each book:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"name of the series it is part of"}),"\n",(0,t.jsx)(i.li,{children:"volume of the series"}),"\n",(0,t.jsx)(i.li,{children:"year of the series"}),"\n",(0,t.jsx)(i.li,{children:"number of that book in the series"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Komga will try to match each book in the list in the following way:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["part of a series named ",(0,t.jsx)(i.code,{children:"Series"})," or ",(0,t.jsx)(i.code,{children:"Series (Volume)"})]}),"\n",(0,t.jsx)(i.li,{children:"where the number matches"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["The result will be shown after you click the ",(0,t.jsx)(i.em,{children:"Match"})," button."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/import-results.png",style:{maxHeight:"500px"}}),"\n",(0,t.jsx)(i.p,{children:"If some books are not matched, you can manually choose a series and a book. Duplicates and missing books will be shown with an error indicator on the right side."}),"\n",(0,t.jsxs)(i.p,{children:["Click ",(0,t.jsx)(i.em,{children:"Create"})," to create the read list. If some books are unmatched, you can still create the read list (a confirmation dialog will pop-up)."]})]})}function h(e={}){const{wrapper:i}={...(0,l.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},3023:(e,i,s)=>{s.d(i,{R:()=>d,x:()=>a});var t=s(3696);const l={},n=t.createContext(l);function d(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:d(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e41126ef.f7bd60c5.js b/assets/js/e41126ef.f7bd60c5.js deleted file mode 100644 index f2429d85..00000000 --- a/assets/js/e41126ef.f7bd60c5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[3147],{7166:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>r,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>o});var t=s(2540),l=s(3023);const n={},d="Read lists",a={id:"guides/readlists",title:"Read lists",description:'Read lists let you gather related books together. Think of it as playlists, but for books. For example, you might add all the books where Wolverine appears together in a "Wolverine" read list.',source:"@site/docs/guides/readlists.md",sourceDirName:"guides",slug:"/guides/readlists",permalink:"/docs/guides/readlists",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/readlists.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Collections",permalink:"/docs/guides/collections"},next:{title:"Full Text Search",permalink:"/docs/guides/search"}},r={},o=[{value:"Adding books to a read list",id:"adding-books-to-a-read-list",level:2},{value:"Finding the Read Lists",id:"finding-the-read-lists",level:2},{value:"Book details screen",id:"book-details-screen",level:3},{value:"Viewing the libraries "By Read List"",id:"viewing-the-libraries-by-read-list",level:3},{value:"Read List details",id:"read-list-details",level:2},{value:"Read List ordering",id:"read-list-ordering",level:3},{value:"Edit read list elements",id:"edit-read-list-elements",level:3},{value:"Deleting a read list",id:"deleting-a-read-list",level:2},{value:"Import read lists from ComicRack",id:"import-read-lists-from-comicrack",level:2}];function c(e){const i={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"read-lists",children:"Read lists"})}),"\n",(0,t.jsx)(i.p,{children:'Read lists let you gather related books together. Think of it as playlists, but for books. For example, you might add all the books where Wolverine appears together in a "Wolverine" read list.'}),"\n",(0,t.jsx)(i.h2,{id:"adding-books-to-a-read-list",children:"Adding books to a read list"}),"\n",(0,t.jsxs)(i.p,{children:["You can add a Book to a read list from the action menu icon ",(0,t.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,t.jsx)(i.em,{children:"Add to read list"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["You can also select multiple books, and click on ",(0,t.jsx)(i.em,{children:"Add to read list"}),"."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/multiselect-add-readlist.png",style:{maxHeight:" 80px"}}),"\n",(0,t.jsx)(i.p,{children:"A dialog will show up, where you can either add books to an existing read list, or create a new read list."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/add-readlist-dialog.png",style:{maxHeight:" 300px"}}),"\n",(0,t.jsx)(i.h2,{id:"finding-the-read-lists",children:"Finding the Read Lists"}),"\n",(0,t.jsx)(i.p,{children:"Read lists can be discovered or viewed in three ways:"}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Book details screen"}),"\n",(0,t.jsx)(i.li,{children:'Viewing the libraries "By Read List"'}),"\n",(0,t.jsx)(i.li,{children:"Searching in the search bar"}),"\n"]}),"\n",(0,t.jsx)(i.h3,{id:"book-details-screen",children:"Book details screen"}),"\n",(0,t.jsx)(i.p,{children:"When viewing the details screen for a specific book that belongs to a read list, the read list will be displayed in a collapsible panel."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/book-readlist-collapsed.png",style:{maxHeight:"300px"}}),"\n",(0,t.jsx)(i.p,{children:"Click on the panel to expand it and see the content of the read list."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/book-readlist-expanded.png",style:{maxHeight:"300px"}}),"\n",(0,t.jsx)(i.h3,{id:"viewing-the-libraries-by-read-list",children:'Viewing the libraries "By Read List"'}),"\n",(0,t.jsx)(i.p,{children:'Only show read lists that exist in the library. Opening a read list goes to the "read list details" screen (see below).'}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/browse-readlists.png",style:{maxHeight:"100px"}}),"\n",(0,t.jsx)(i.h2,{id:"read-list-details",children:"Read List details"}),"\n",(0,t.jsx)(i.p,{children:"The read list details screen contains all the books that belong to the read list. It can include books from any library and any series. By adding items in different libraries or series to read lists, you can relate them to each other."}),"\n",(0,t.jsx)(i.h3,{id:"read-list-ordering",children:"Read List ordering"}),"\n",(0,t.jsx)(i.p,{children:"By default books in a read list are ordered manually. However, you can edit a read list and choose to disable the manual ordering, in which case books will be ordered by release date."}),"\n",(0,t.jsx)(i.p,{children:"Either click on the edit button on the read list card."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-card.png",style:{maxHeight:"300px"}}),"\n",(0,t.jsx)(i.p,{children:"Or click on the edit button from the read list details screen."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-button.png",style:{maxHeight:"60px"}}),"\n",(0,t.jsx)(i.p,{children:"A dialog will show up, where you can edit the read list's ordering."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-dialog.png",style:{maxHeight:"300px"}}),"\n",(0,t.jsx)(i.p,{children:"A manually ordered read list will be showing as such in the read list details screen."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-manual-ordering.png",style:{maxHeight:"50px"}}),"\n",(0,t.jsx)(i.h3,{id:"edit-read-list-elements",children:"Edit read list elements"}),"\n",(0,t.jsx)(i.p,{children:"From the read list details screen you can edit the elements composing a read list. To do so, click on the corresponding button in the toolbar."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-elements-button.png",style:{maxHeight:"80px"}}),"\n",(0,t.jsx)(i.p,{children:"The book cards will show two extra elements:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"a delete button, to remove the book from the read list"}),"\n",(0,t.jsx)(i.li,{children:"a grip handle, which let you drag and drop books to reorder them (only available when the read list is manually ordered)"}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Once you are done with your changes, click the tick in the top bar. Click the cross to discard your changes."}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/readlist-edit-elements.png",style:{maxHeight:"400px"}}),"\n",(0,t.jsx)(i.h2,{id:"deleting-a-read-list",children:"Deleting a read list"}),"\n",(0,t.jsxs)(i.p,{children:["To delete a read list, look for the action menu icon ",(0,t.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,t.jsx)(i.em,{children:"Delete"}),"."]}),"\n",(0,t.jsx)(i.p,{children:"This will not delete the items in the read list, nor your media files."}),"\n",(0,t.jsx)(i.h2,{id:"import-read-lists-from-comicrack",children:"Import read lists from ComicRack"}),"\n",(0,t.jsxs)(i.p,{children:["You can import ComicRack reading lists in ",(0,t.jsx)(i.code,{children:".cbl"})," format from the ",(0,t.jsx)(i.em,{children:"Import > Read List"})," screen."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/import.png",style:{maxHeight:"400px"}}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.code,{children:".cbl"})," files contain the following information:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"read list name"}),"\n",(0,t.jsx)(i.li,{children:"books contained in the list, in order"}),"\n",(0,t.jsxs)(i.li,{children:["for each book:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"name of the series it is part of"}),"\n",(0,t.jsx)(i.li,{children:"volume of the series"}),"\n",(0,t.jsx)(i.li,{children:"year of the series"}),"\n",(0,t.jsx)(i.li,{children:"number of that book in the series"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"Komga will try to match each book in the list in the following way:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["part of a series named ",(0,t.jsx)(i.code,{children:"Series"})," or ",(0,t.jsx)(i.code,{children:"Series (Volume)"})]}),"\n",(0,t.jsx)(i.li,{children:"where the number matches"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["The result will be shown after you click the ",(0,t.jsx)(i.em,{children:"Match"})," button."]}),"\n",(0,t.jsx)("img",{src:"/assets/media/guides/readlists/import-results.png",style:{maxHeight:"500px"}}),"\n",(0,t.jsx)(i.p,{children:"If some books are not matched, you can manually choose a series and a book. Duplicates and missing books will be shown with an error indicator on the right side."}),"\n",(0,t.jsxs)(i.p,{children:["Click ",(0,t.jsx)(i.em,{children:"Create"})," to create the read list. If some books are unmatched, you can still create the read list (a confirmation dialog will pop-up)."]})]})}function h(e={}){const{wrapper:i}={...(0,l.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},3023:(e,i,s)=>{s.d(i,{R:()=>d,x:()=>a});var t=s(3696);const l={},n=t.createContext(l);function d(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:d(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ebc1cc14.426bb5b4.js b/assets/js/ebc1cc14.426bb5b4.js new file mode 100644 index 00000000..c109eb50 --- /dev/null +++ b/assets/js/ebc1cc14.426bb5b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6119],{3244:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>t,metadata:()=>i,toc:()=>l});var a=n(2540),o=n(3023);const t={},r="Read with Panels on iOS",i={id:"guides/panels",title:"Read with Panels on iOS",description:"Background",source:"@site/docs/guides/panels.md",sourceDirName:"guides",slug:"/guides/panels",permalink:"/docs/guides/panels",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/panels.md",tags:[],version:"current",lastUpdatedAt:1726552986e3,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with any OPDS reader",permalink:"/docs/guides/opds"},next:{title:"Read with Chunky Reader (iPad)",permalink:"/docs/guides/chunky"}},d={},l=[{value:"Background",id:"background",level:2},{value:"Adding your Komga server to Panels",id:"adding-your-komga-server-to-panels",level:2},{value:"Komga as Import Service",id:"komga-as-import-service",level:2},{value:"Komga as a Library",id:"komga-as-a-library",level:2}];function c(e){const s={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"read-with-panels-on-ios",children:"Read with Panels on iOS"})}),"\n",(0,a.jsx)(s.h2,{id:"background",children:"Background"}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.a,{href:"https://apps.apple.com/us/app/panels-comic-reader/id1236567663",children:"Panels app"})," allows you to connect with any OPDS compatible server. With Panels you will be able to to remotely download or stream your comics using your iPhone or iPad. With Panels, users can conveniently navigate through their entire Komga library and keep track of their reading progress."]}),"\n",(0,a.jsx)(s.admonition,{type:"warning",children:(0,a.jsx)(s.p,{children:"Please note that Panels OPDS support requires either a Panels+ subscription or Panels in-app purchase."})}),"\n",(0,a.jsx)(s.h2,{id:"adding-your-komga-server-to-panels",children:"Adding your Komga server to Panels"}),"\n",(0,a.jsx)(s.p,{children:"An OPDS feed is added to Panels as an importing service. From that point, it can be used either as a new library or just to download titles to your own device library."}),"\n",(0,a.jsx)(s.p,{children:"To add a new OPDS feed, open Panels and go to Library -> Connect Service -> OPDS."}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/01.png",style:{maxHeight:"800px"}}),"\n",(0,a.jsxs)(s.p,{children:["You'll be taken to the OPDS configuration screen. Give any name to your server, then enter your ",(0,a.jsx)(s.em,{children:"server address"}),", ",(0,a.jsx)(s.em,{children:"username"}),", and ",(0,a.jsx)(s.em,{children:"password"}),". Tap on ",(0,a.jsx)(s.em,{children:"Apply"}),"."]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/02.png",style:{maxHeight:"800px"}}),"\n",(0,a.jsx)(s.p,{children:"Your Komga server should now appear both as a new library and as a new Import Service. Let's explore both options."}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/03.png",style:{maxHeight:"800px"}}),"\n",(0,a.jsx)(s.h2,{id:"komga-as-import-service",children:"Komga as Import Service"}),"\n",(0,a.jsx)(s.p,{children:"You can use this method if you plan to use your Komga server mainly to import (download) comics into your device."}),"\n",(0,a.jsx)(s.p,{children:"To add content to your library, you can follow either of these 2 flows:"}),"\n",(0,a.jsxs)(s.ol,{children:["\n",(0,a.jsx)(s.li,{children:"From he content screen, tap your server, navigate and select the files you want to import, and last select where yo place them in your device library."}),"\n"]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/04.png"}),"\n",(0,a.jsxs)(s.ol,{start:"2",children:["\n",(0,a.jsx)(s.li,{children:'Navigate first to the location in your device library where you want your files to be imported. Then tap the 3 dot symbol and select "Import Files". Choose your server and find the files you want to download to your phone.'}),"\n"]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/05.png"}),"\n",(0,a.jsx)(s.p,{children:'From either of the above flows above, your download should start and be visible from the "Downloads" tab.'}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/06.png",style:{maxHeight:"800px"}}),"\n",(0,a.jsx)(s.h2,{id:"komga-as-a-library",children:"Komga as a Library"}),"\n",(0,a.jsx)(s.p,{children:"Panels treats OPDS feeds as libraries. That means you can navigate your server library as if it was on your own device, with the benefit of keeping all files stored somewhere else.\nOnce you find a title you want to read, you can tap to open and start reading it (stream) or you can choose to download it for offline use. Long press a title (or select many) to show all options."}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/07.png"})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>r,x:()=>i});var a=n(3696);const o={},t=a.createContext(o);function r(e){const s=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),a.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ebc1cc14.a450d1e2.js b/assets/js/ebc1cc14.a450d1e2.js deleted file mode 100644 index c5f70664..00000000 --- a/assets/js/ebc1cc14.a450d1e2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6119],{3244:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>t,metadata:()=>i,toc:()=>l});var a=n(2540),o=n(3023);const t={},r="Read with Panels on iOS",i={id:"guides/panels",title:"Read with Panels on iOS",description:"Background",source:"@site/docs/guides/panels.md",sourceDirName:"guides",slug:"/guides/panels",permalink:"/docs/guides/panels",draft:!1,unlisted:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/panels.md",tags:[],version:"current",lastUpdatedAt:172543799e4,frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with any OPDS reader",permalink:"/docs/guides/opds"},next:{title:"Read with Chunky Reader (iPad)",permalink:"/docs/guides/chunky"}},d={},l=[{value:"Background",id:"background",level:2},{value:"Adding your Komga server to Panels",id:"adding-your-komga-server-to-panels",level:2},{value:"Komga as Import Service",id:"komga-as-import-service",level:2},{value:"Komga as a Library",id:"komga-as-a-library",level:2}];function c(e){const s={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"read-with-panels-on-ios",children:"Read with Panels on iOS"})}),"\n",(0,a.jsx)(s.h2,{id:"background",children:"Background"}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.a,{href:"https://apps.apple.com/us/app/panels-comic-reader/id1236567663",children:"Panels app"})," allows you to connect with any OPDS compatible server. With Panels you will be able to to remotely download or stream your comics using your iPhone or iPad. With Panels, users can conveniently navigate through their entire Komga library and keep track of their reading progress."]}),"\n",(0,a.jsx)(s.admonition,{type:"warning",children:(0,a.jsx)(s.p,{children:"Please note that Panels OPDS support requires either a Panels+ subscription or Panels in-app purchase."})}),"\n",(0,a.jsx)(s.h2,{id:"adding-your-komga-server-to-panels",children:"Adding your Komga server to Panels"}),"\n",(0,a.jsx)(s.p,{children:"An OPDS feed is added to Panels as an importing service. From that point, it can be used either as a new library or just to download titles to your own device library."}),"\n",(0,a.jsx)(s.p,{children:"To add a new OPDS feed, open Panels and go to Library -> Connect Service -> OPDS."}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/01.png",style:{maxHeight:"800px"}}),"\n",(0,a.jsxs)(s.p,{children:["You'll be taken to the OPDS configuration screen. Give any name to your server, then enter your ",(0,a.jsx)(s.em,{children:"server address"}),", ",(0,a.jsx)(s.em,{children:"username"}),", and ",(0,a.jsx)(s.em,{children:"password"}),". Tap on ",(0,a.jsx)(s.em,{children:"Apply"}),"."]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/02.png",style:{maxHeight:"800px"}}),"\n",(0,a.jsx)(s.p,{children:"Your Komga server should now appear both as a new library and as a new Import Service. Let's explore both options."}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/03.png",style:{maxHeight:"800px"}}),"\n",(0,a.jsx)(s.h2,{id:"komga-as-import-service",children:"Komga as Import Service"}),"\n",(0,a.jsx)(s.p,{children:"You can use this method if you plan to use your Komga server mainly to import (download) comics into your device."}),"\n",(0,a.jsx)(s.p,{children:"To add content to your library, you can follow either of these 2 flows:"}),"\n",(0,a.jsxs)(s.ol,{children:["\n",(0,a.jsx)(s.li,{children:"From he content screen, tap your server, navigate and select the files you want to import, and last select where yo place them in your device library."}),"\n"]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/04.png"}),"\n",(0,a.jsxs)(s.ol,{start:"2",children:["\n",(0,a.jsx)(s.li,{children:'Navigate first to the location in your device library where you want your files to be imported. Then tap the 3 dot symbol and select "Import Files". Choose your server and find the files you want to download to your phone.'}),"\n"]}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/05.png"}),"\n",(0,a.jsx)(s.p,{children:'From either of the above flows above, your download should start and be visible from the "Downloads" tab.'}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/06.png",style:{maxHeight:"800px"}}),"\n",(0,a.jsx)(s.h2,{id:"komga-as-a-library",children:"Komga as a Library"}),"\n",(0,a.jsx)(s.p,{children:"Panels treats OPDS feeds as libraries. That means you can navigate your server library as if it was on your own device, with the benefit of keeping all files stored somewhere else.\nOnce you find a title you want to read, you can tap to open and start reading it (stream) or you can choose to download it for offline use. Long press a title (or select many) to show all options."}),"\n",(0,a.jsx)("img",{src:"/assets/media/guides/panels-setup/07.png"})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>r,x:()=>i});var a=n(3696);const o={},t=a.createContext(o);function r(e){const s=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),a.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.6baaae66.js b/assets/js/main.a7722e66.js similarity index 75% rename from assets/js/main.6baaae66.js rename to assets/js/main.a7722e66.js index d4b7dbef..a3b501d5 100644 --- a/assets/js/main.6baaae66.js +++ b/assets/js/main.a7722e66.js @@ -1,2 +1,2 @@ -/*! For license information please see main.6baaae66.js.LICENSE.txt */ -(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6411],{5044:(e,t,n)=>{"use strict";n.d(t,{Bc:()=>g,E8:()=>Hn,a1:()=>Un});var r=n(3696);n(8325);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function c(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a=[],i=!0,s=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(e){s=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(s)throw o}}return a}}(e,t)||d(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e){return function(e){if(Array.isArray(e))return f(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||d(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(e,t){if(e){if("string"==typeof e)return f(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?f(e,t):void 0}}function f(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function R(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function L(e){for(var t=1;t=3||2===n&&r>=4||1===n&&r>=10);function a(t,n,r){if(o&&void 0!==r){var a=r[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[t].concat(P(n),[{headers:i}]))}else e.apply(void 0,[t].concat(P(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&a("clickedObjectIDsAfterSearch",M(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&a("clickedObjectIDs",M(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&a("convertedObjectIDsAfterSearch",M(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&a("convertedObjectIDs",M(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&t.reduce((function(e,t){var n=t.items,r=N(t,T);return[].concat(P(e),P(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function B(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function z(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function $(e){return $="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},$(e)}function U(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?H(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&G({onItemsChange:r,items:n,insights:s,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;i("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:s}}),n((function(e){var t=e.item,n=e.state,r=e.event;z(t)&&o({state:n,event:r,insights:s,item:t,insightsEvents:[q({eventName:"Item Selected"},O({item:t,items:l.current}))]})})),r((function(e){var t=e.item,n=e.state,r=e.event;z(t)&&a({state:n,event:r,insights:s,item:t,insightsEvents:[q({eventName:"Item Active"},O({item:t,items:l.current}))]})}))},onStateChange:function(e){var t=e.state;c({state:t})},__autocomplete_pluginOptions:e}}function Q(e,t){var n=t;return{then:function(t,r){return Q(e.then(X(t,n,e),X(r,n,e)),n)},catch:function(t){return Q(e.catch(X(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),Q(e.finally(X(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function Z(e){return Q(e,{isCanceled:!1,onCancelList:[]})}function X(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function J(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function te(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(w++),plugins:o,initialState:ge({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(function(e){return function(e){if(Array.isArray(e))return me(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return me(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?me(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:E,onResolve:E};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=te(te({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return v(e)})).then((function(e){return e.map((function(e){return ge(ge({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:ge({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function ve(e){return ve="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ve(e)}function we(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Se(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Ie);Be&&o.environment.clearTimeout(Be);var c=l.setCollections,u=l.setIsOpen,d=l.setQuery,f=l.setActiveItemId,p=l.setStatus;if(d(a),f(o.defaultActiveItemId),!a&&!1===o.openOnFocus){var m,h=s.getState().collections.map((function(e){return Re(Re({},e),{},{items:[]})}));p("idle"),c(h),u(null!==(m=r.isOpen)&&void 0!==m?m:o.shouldPanelOpen({state:s.getState()}));var g=Z(ze(h).then((function(){return Promise.resolve()})));return s.pendingRequests.add(g)}p("loading"),Be=o.environment.setTimeout((function(){p("stalled")}),o.stallThreshold);var y=Z(ze(o.getSources(Re({query:a,refresh:i,state:s.getState()},l)).then((function(e){return Promise.all(e.map((function(e){return Promise.resolve(e.getItems(Re({query:a,refresh:i,state:s.getState()},l))).then((function(t){return function(e,t,n){if(o=e,Boolean(null==o?void 0:o.execute)){var r="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(Ae(Object.keys(n.context).map((function(e){var t;return null===(t=n.context[e])||void 0===t?void 0:t.__algoliaSearchParameters}))))):{};return _e(_e({},e),{},{requests:e.queries.map((function(n){return{query:"algolia"===e.requesterId?_e(_e({},n),{},{params:_e(_e({},r),n.params)}):n,sourceId:t,transformResponse:e.transformResponse}}))})}var o;return{items:e,sourceId:t}}(t,e.sourceId,s.getState())}))}))).then(je).then((function(t){return function(e,t,n){return t.map((function(t){var r,o=e.filter((function(e){return e.sourceId===t.sourceId})),a=o.map((function(e){return e.items})),i=o[0].transformResponse,s=i?i({results:r=a,hits:r.map((function(e){return e.hits})).filter(Boolean),facetHits:r.map((function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map((function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}}))})).filter(Boolean)}):a;return t.onResolve({source:t,results:a,items:s,state:n.getState()}),s.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:s}}))}(t,e,s)})).then((function(e){return function(e){var t=e.props,n=e.state,r=e.collections.reduce((function(e,t){return Se(Se({},e),{},ke({},t.source.sourceId,Se(Se({},t.source),{},{getItems:function(){return v(t.items)}})))}),{}),o=t.plugins.reduce((function(e,t){return t.reshape?t.reshape(e):e}),{sourcesBySourceId:r,state:n}).sourcesBySourceId;return v(t.reshape({sourcesBySourceId:o,sources:Object.values(o),state:n})).filter(Boolean).map((function(e){return{source:e,items:e.getItems()}}))}({collections:e,props:o,state:s.getState()})}))})))).then((function(e){var n;p("idle"),c(e);var d=o.shouldPanelOpen({state:s.getState()});u(null!==(n=r.isOpen)&&void 0!==n?n:o.openOnFocus&&!a&&d||d);var f=oe(s.getState());if(null!==s.getState().activeItemId&&f){var m=f.item,h=f.itemInputValue,g=f.itemUrl,y=f.source;y.onActive(Re({event:t,item:m,itemInputValue:h,itemUrl:g,refresh:i,source:y,state:s.getState()},l))}})).finally((function(){p("idle"),Be&&o.environment.clearTimeout(Be)}));return s.pendingRequests.add(y)}function Ue(e){return Ue="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ue(e)}var He=["event","props","refresh","store"];function Ve(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function qe(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function at(e){var t=e.props,n=e.refresh,r=e.store,o=ot(e,Ge),a=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some((function(t){return(n=t)===(r=e.target)||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return nt({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},ot(e,Ye))},getRootProps:function(e){return nt({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){return e.inputElement,nt({action:"",noValidate:!0,role:"search",onSubmit:function(a){var i;a.preventDefault(),t.onSubmit(nt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(a){var i;a.preventDefault(),t.onReset(nt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},ot(e,Qe))},getLabelProps:function(e){var n=e||{},r=n.sourceIndex,o=ot(n,Xe);return nt({htmlFor:"".concat(a(t.id,r),"-input"),id:"".concat(a(t.id,r),"-label")},o)},getInputProps:function(e){var a;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&$e(nt({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var s=e||{},l=(s.inputElement,s.maxLength),c=void 0===l?512:l,u=ot(s,Ze),d=oe(r.getState()),f=function(e){return Boolean(e&&e.match(ae))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),p=null!=d&&d.itemUrl&&!f?"go":"search";return nt({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?"".concat(t.id,"-item-").concat(r.getState().activeItemId):void 0,"aria-controls":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:r.getState().completion||r.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:p,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){$e(nt({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,He);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=n.environment.document.getElementById("".concat(n.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},s=function(){var e=oe(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,s=e.itemUrl,l=e.source;l.onActive(qe({event:t,item:n,itemInputValue:i,itemUrl:s,refresh:r,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?$e(qe({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),s(),setTimeout(i,0)})):(o.dispatch(t.key,{}),s(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=oe(o.getState()),c=l.item,u=l.itemInputValue,d=l.itemUrl,f=l.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(f.onSelect(qe({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(f.onSelect(qe({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return f.onSelect(qe({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:c,state:o.getState()});$e(qe({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then((function(){f.onSelect(qe({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a))}))}}}(nt({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:E,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},u)},getPanelProps:function(e){return nt({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.sourceIndex,o=ot(n,Je);return nt({role:"listbox","aria-labelledby":"".concat(a(t.id,r),"-label"),id:"".concat(a(t.id,r),"-list")},o)},getItemProps:function(e){var i=e.item,s=e.source,l=e.sourceIndex,c=ot(e,et);return nt({id:"".concat(a(t.id,l),"-item-").concat(i.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===i.__autocomplete_id,onMouseMove:function(e){if(i.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",i.__autocomplete_id);var t=oe(r.getState());if(null!==r.getState().activeItemId&&t){var a=t.item,s=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(nt({event:e,item:a,itemInputValue:s,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=s.getItemInputValue({item:i,state:r.getState()}),l=s.getItemUrl({item:i,state:r.getState()});(l?Promise.resolve():$e(nt({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){s.onSelect(nt({event:e,item:i,itemInputValue:a,itemUrl:l,refresh:n,source:s,state:r.getState()},o))}))}},c)}}}function it(e){return it="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},it(e)}function st(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function lt(e){for(var t=1;t0&&r.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},r.createElement("p",{className:"DocSearch-Help"},c,":"),r.createElement("ul",null,h.slice(0,3).reduce((function(e,t){return[].concat(u(e),[r.createElement("li",{key:t},r.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){o.setQuery(t.toLowerCase()+" "),o.refresh(),o.inputRef.current.focus()}},t))])}),[]))),o.getMissingResultsUrl&&r.createElement("p",{className:"DocSearch-Help"},"".concat(f," "),r.createElement("a",{href:o.getMissingResultsUrl({query:o.state.query}),target:"_blank",rel:"noopener noreferrer"},m)))}var zt=["hit","attribute","tagName"];function $t(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,n=e.attribute,o=e.tagName,i=void 0===o?"span":o,s=l(e,zt);return(0,r.createElement)(i,a(a({},s),{},{dangerouslySetInnerHTML:{__html:$t(t,"_snippetResult.".concat(n,".value"))||$t(t,n)}}))}function Ht(e){return e.collection&&0!==e.collection.items.length?r.createElement("section",{className:"DocSearch-Hits"},r.createElement("div",{className:"DocSearch-Hit-source"},e.title),r.createElement("ul",e.getListProps(),e.collection.items.map((function(t,n){return r.createElement(Vt,s({key:[e.title,t.objectID].join(":"),item:t,index:n},e))})))):null}function Vt(e){var t=e.item,n=e.index,o=e.renderIcon,a=e.renderAction,i=e.getItemProps,l=e.onItemClick,u=e.collection,d=e.hitComponent,f=c(r.useState(!1),2),p=f[0],m=f[1],h=c(r.useState(!1),2),g=h[0],y=h[1],b=r.useRef(null),v=d;return r.createElement("li",s({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",p&&"DocSearch-Hit--deleting",g&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){b.current&&b.current()}},i({item:t,source:u.source,onClick:function(e){l(t,e)}})),r.createElement(v,{hit:t},r.createElement("div",{className:"DocSearch-Hit-Container"},o({item:t,index:n}),t.hierarchy[t.type]&&"lvl1"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&r.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),r.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(Ut,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),r.createElement(Ut,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),a({item:t,runDeleteTransition:function(e){m(!0),b.current=e},runFavoriteTransition:function(e){y(!0),b.current=e}}))))}function qt(e,t,n){return e.reduce((function(e,r){var o=t(r);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(n||5)&&e[o].push(r),e}),{})}function Wt(e){return e}function Kt(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function Gt(){}var Yt=/(|<\/mark>)/g,Qt=RegExp(Yt.source);function Zt(e){var t,n,r=e;if(!r.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((r.__docsearch_parent?null===(t=r.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(n=e._highlightResult)||void 0===n||null===(n=n.hierarchy)||void 0===n?void 0:n.lvl0)||{}).value;return o&&Qt.test(o)?o.replace(Yt,""):o}function Xt(e){return r.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map((function(t){if(0===t.items.length)return null;var n=Zt(t.items[0]);return r.createElement(Ht,s({},e,{key:t.source.sourceId,title:n,collection:t,renderIcon:function(e){var n,o=e.item,a=e.index;return r.createElement(r.Fragment,null,o.__docsearch_parent&&r.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},o.__docsearch_parent!==(null===(n=t.items[a+1])||void 0===n?void 0:n.__docsearch_parent)?r.createElement("path",{d:"M8 6v21M20 27H8.3"}):r.createElement("path",{d:"M8 6v42M20 27H8.3"}))),r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Pt,{type:o.type})))},renderAction:function(){return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement(Tt,null))}}))})),e.resultsFooterComponent&&r.createElement("section",{className:"DocSearch-HitsFooter"},r.createElement(e.resultsFooterComponent,{state:e.state})))}var Jt=["translations"];function en(e){var t=e.translations,n=void 0===t?{}:t,o=l(e,Jt),a=n.recentSearchesTitle,i=void 0===a?"Recent":a,c=n.noRecentSearchesText,u=void 0===c?"No recent searches":c,d=n.saveRecentSearchButtonTitle,f=void 0===d?"Save this search":d,p=n.removeRecentSearchButtonTitle,m=void 0===p?"Remove this search from history":p,h=n.favoriteSearchesTitle,g=void 0===h?"Favorite":h,y=n.removeFavoriteSearchButtonTitle,b=void 0===y?"Remove this search from favorites":y;return"idle"===o.state.status&&!1===o.hasCollections?o.disableUserPersonalization?null:r.createElement("div",{className:"DocSearch-StartScreen"},r.createElement("p",{className:"DocSearch-Help"},u)):!1===o.hasCollections?null:r.createElement("div",{className:"DocSearch-Dropdown-Container"},r.createElement(Ht,s({},o,{title:i,collection:o.state.collections[0],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(At,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,a=e.runDeleteTransition;return r.createElement(r.Fragment,null,r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){o.favoriteSearches.add(t),o.recentSearches.remove(t),o.refresh()}))}},r.createElement(Rt,null))),r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:m,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),a((function(){o.recentSearches.remove(t),o.refresh()}))}},r.createElement(Ct,null))))}})),r.createElement(Ht,s({},o,{title:g,collection:o.state.collections[1],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Rt,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:b,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n((function(){o.favoriteSearches.remove(t),o.refresh()}))}},r.createElement(Ct,null)))}})))}var tn=["translations"],nn=r.memo((function(e){var t=e.translations,n=void 0===t?{}:t,o=l(e,tn);if("error"===o.state.status)return r.createElement(Mt,{translations:null==n?void 0:n.errorScreen});var a=o.state.collections.some((function(e){return e.items.length>0}));return o.state.query?!1===a?r.createElement(Bt,s({},o,{translations:null==n?void 0:n.noResultsScreen})):r.createElement(Xt,o):r.createElement(en,s({},o,{hasCollections:a,translations:null==n?void 0:n.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status})),rn=["translations"];function on(e){var t=e.translations,n=void 0===t?{}:t,o=l(e,rn),a=n.resetButtonTitle,i=void 0===a?"Clear the query":a,c=n.resetButtonAriaLabel,u=void 0===c?"Clear the query":c,d=n.cancelButtonText,f=void 0===d?"Cancel":d,p=n.cancelButtonAriaLabel,h=void 0===p?"Cancel":p,g=n.searchInputLabel,y=void 0===g?"Search":g,b=o.getFormProps({inputElement:o.inputRef.current}).onReset;return r.useEffect((function(){o.autoFocus&&o.inputRef.current&&o.inputRef.current.focus()}),[o.autoFocus,o.inputRef]),r.useEffect((function(){o.isFromSelection&&o.inputRef.current&&o.inputRef.current.select()}),[o.isFromSelection,o.inputRef]),r.createElement(r.Fragment,null,r.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:b},r.createElement("label",s({className:"DocSearch-MagnifierLabel"},o.getLabelProps()),r.createElement(m,null),r.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},y)),r.createElement("div",{className:"DocSearch-LoadingIndicator"},r.createElement(Ot,null)),r.createElement("input",s({className:"DocSearch-Input",ref:o.inputRef},o.getInputProps({inputElement:o.inputRef.current,autoFocus:o.autoFocus,maxLength:64}))),r.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":u,hidden:!o.state.query},r.createElement(Ct,null))),r.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":h,onClick:o.onClose},f))}var an=["_highlightResult","_snippetResult"];function sn(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=function(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}(t),a=o.getItem().slice(0,r);return{add:function(e){var t=e,n=(t._highlightResult,t._snippetResult,l(t,an)),i=a.findIndex((function(e){return e.objectID===n.objectID}));i>-1&&a.splice(i,1),a.unshift(n),a=a.slice(0,r),o.setItem(a)},remove:function(e){a=a.filter((function(t){return t.objectID!==e.objectID})),o.setItem(a)},getAll:function(){return a}}}function ln(e){const t=`algoliasearch-client-js-${e.key}`;let n;const r=()=>(void 0===n&&(n=e.localStorage||window.localStorage),n),o=()=>JSON.parse(r().getItem(t)||"{}"),a=e=>{r().setItem(t,JSON.stringify(e))};return{get:(t,n,r={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,n=o(),r=Object.fromEntries(Object.entries(n).filter((([,e])=>void 0!==e.timestamp)));if(a(r),!t)return;const i=Object.fromEntries(Object.entries(r).filter((([,e])=>{const n=(new Date).getTime();return!(e.timestamp+tPromise.all([e?e.value:n(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||r.miss(e)]))).then((([e])=>e)),set:(e,n)=>Promise.resolve().then((()=>{const a=o();return a[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:n},r().setItem(t,JSON.stringify(a)),n})),delete:e=>Promise.resolve().then((()=>{const n=o();delete n[JSON.stringify(e)],r().setItem(t,JSON.stringify(n))})),clear:()=>Promise.resolve().then((()=>{r().removeItem(t)}))}}function cn(e){const t=[...e.caches],n=t.shift();return void 0===n?{get:(e,t,n={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,n.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,r,o={miss:()=>Promise.resolve()})=>n.get(e,r,o).catch((()=>cn({caches:t}).get(e,r,o))),set:(e,r)=>n.set(e,r).catch((()=>cn({caches:t}).set(e,r))),delete:e=>n.delete(e).catch((()=>cn({caches:t}).delete(e))),clear:()=>n.clear().catch((()=>cn({caches:t}).clear()))}}function un(e={serializable:!0}){let t={};return{get(n,r,o={miss:()=>Promise.resolve()}){const a=JSON.stringify(n);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);const i=r(),s=o&&o.miss||(()=>Promise.resolve());return i.then((e=>s(e))).then((()=>i))},set:(n,r)=>(t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function dn(e){let t=e.length-1;for(;t>0;t--){const n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e}function fn(e,t){return t?(Object.keys(t).forEach((n=>{e[n]=t[n](e)})),e):e}function pn(e,...t){let n=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[n++])))}const mn={WithinQueryParameters:0,WithinHeaders:1};function hn(e,t){const n=e||{},r=n.data||{};return Object.keys(n).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(r[e]=n[e])})),{data:Object.entries(r).length>0?r:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}const gn={Read:1,Write:2,Any:3},yn=1,bn=3;function vn(e,t=yn){return{...e,status:t,lastUpdate:Date.now()}}function wn(e){return"string"==typeof e?{protocol:"https",url:e,accept:gn.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||gn.Any}}const Sn="GET",kn="POST";function xn(e,t,n,r){const o=[],a=function(e,t){if(e.method===Sn||void 0===e.data&&void 0===t.data)return;const n=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(n)}(n,r),i=function(e,t){const n={...e.headers,...t.headers},r={};return Object.keys(n).forEach((e=>{const t=n[e];r[e.toLowerCase()]=t})),r}(e,r),s=n.method,l=n.method!==Sn?{}:{...n.data,...r.data},c={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...r.queryParameters};let u=0;const d=(t,l)=>{const f=t.pop();if(void 0===f)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:An(o)};const p={data:a,headers:i,method:s,url:_n(f,n.path,c),connectTimeout:l(u,e.timeouts.connect),responseTimeout:l(u,r.timeout)},m=e=>{const n={request:p,response:e,host:f,triesLeft:t.length};return o.push(n),n},h={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(n){const r=m(n);return n.isTimedOut&&u++,Promise.all([e.logger.info("Retryable failure",Cn(r)),e.hostsCache.set(f,vn(f,n.isTimedOut?bn:2))]).then((()=>d(t,l)))},onFail(e){throw m(e),function({content:e,status:t},n){let r=e;try{r=JSON.parse(e).message}catch(e){}return function(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}(r,t,n)}(e,An(o))}};return e.requester.send(p).then((e=>((e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&!~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e))(e,h)))};return function(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(vn(t))))))).then((e=>{const n=e.filter((e=>function(e){return e.status===yn||Date.now()-e.lastUpdate>12e4}(e))),r=e.filter((e=>function(e){return e.status===bn&&Date.now()-e.lastUpdate<=12e4}(e))),o=[...n,...r];return{getTimeout:(e,t)=>(0===r.length&&0===e?1:r.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>wn(e))):t}}))}(e.hostsCache,t).then((e=>d([...e.statelessHosts].reverse(),e.getTimeout)))}function En(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const n=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(n)&&(t.value=`${t.value}${n}`),t}};return t}function _n(e,t,n){const r=On(n);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return r.length&&(o+=`?${r}`),o}function On(e){return Object.keys(e).map((t=>{return pn("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n})).join("&")}function An(e){return e.map((e=>Cn(e)))}function Cn(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const Tn=e=>{const t=e.appId,n=function(e,t,n){const r={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:()=>e===mn.WithinHeaders?r:{},queryParameters:()=>e===mn.WithinQueryParameters?r:{}}}(void 0!==e.authMode?e.authMode:mn.WithinHeaders,t,e.apiKey),r=function(e){const{hostsCache:t,logger:n,requester:r,requestsCache:o,responsesCache:a,timeouts:i,userAgent:s,hosts:l,queryParameters:c,headers:u}=e,d={hostsCache:t,logger:n,requester:r,requestsCache:o,responsesCache:a,timeouts:i,userAgent:s,headers:u,queryParameters:c,hosts:l.map((e=>wn(e))),read(e,t){const n=hn(t,d.timeouts.read),r=()=>xn(d,d.hosts.filter((e=>!!(e.accept&gn.Read))),e,n);if(!0!==(void 0!==n.cacheable?n.cacheable:e.cacheable))return r();const o={request:e,mappedRequestOptions:n,transporter:{queryParameters:d.queryParameters,headers:d.headers}};return d.responsesCache.get(o,(()=>d.requestsCache.get(o,(()=>d.requestsCache.set(o,r()).then((e=>Promise.all([d.requestsCache.delete(o),e])),(e=>Promise.all([d.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>d.responsesCache.set(o,e)})},write:(e,t)=>xn(d,d.hosts.filter((e=>!!(e.accept&gn.Write))),e,hn(t,d.timeouts.write))};return d}({hosts:[{url:`${t}-dsn.algolia.net`,accept:gn.Read},{url:`${t}.algolia.net`,accept:gn.Write}].concat(dn([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...n.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...n.queryParameters(),...e.queryParameters}}),o={transporter:r,appId:t,addAlgoliaAgent(e,t){r.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([r.requestsCache.clear(),r.responsesCache.clear()]).then((()=>{}))};return fn(o,e.methods)},jn=e=>(t,n)=>t.method===Sn?e.transporter.read(t,n):e.transporter.write(t,n),Pn=e=>(t,n={})=>fn({transporter:e.transporter,appId:e.appId,indexName:t},n.methods),In=e=>(t,n)=>{const r=t.map((e=>({...e,params:On(e.params||{})})));return e.transporter.read({method:kn,path:"1/indexes/*/queries",data:{requests:r},cacheable:!0},n)},Nn=e=>(t,n)=>Promise.all(t.map((t=>{const{facetName:r,facetQuery:o,...a}=t.params;return Pn(e)(t.indexName,{methods:{searchForFacetValues:Dn}}).searchForFacetValues(r,o,{...n,...a})}))),Rn=e=>(t,n,r)=>e.transporter.read({method:kn,path:pn("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:n},cacheable:!0},r),Ln=e=>(t,n)=>e.transporter.read({method:kn,path:pn("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n),Dn=e=>(t,n,r)=>e.transporter.read({method:kn,path:pn("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},r),Mn=1,Fn=2,Bn=3;function zn(e,t,n){const r={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>n.setRequestHeader(t,e.headers[t])));const r=(e,r)=>setTimeout((()=>{n.abort(),t({status:0,content:r,isTimedOut:!0})}),1e3*e),o=r(e.connectTimeout,"Connection timeout");let a;n.onreadystatechange=()=>{n.readyState>n.OPENED&&void 0===a&&(clearTimeout(o),a=r(e.responseTimeout,"Socket timeout"))},n.onerror=()=>{0===n.status&&(clearTimeout(o),clearTimeout(a),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=()=>{clearTimeout(o),clearTimeout(a),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))},logger:(o=Bn,{debug:(e,t)=>(Mn>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Fn>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:un(),requestsCache:un({serializable:!1}),hostsCache:cn({caches:[ln({key:`4.19.1-${e}`}),un()]}),userAgent:En("4.19.1").add({segment:"Browser",version:"lite"}),authMode:mn.WithinQueryParameters};var o;return Tn({...r,...n,methods:{search:In,searchForFacetValues:Nn,multipleQueries:In,multipleSearchForFacetValues:Nn,customRequest:jn,initIndex:e=>t=>Pn(e)(t,{methods:{search:Ln,searchForFacetValues:Dn,findAnswers:Rn}})}})}zn.version="4.19.1";var $n=["footer","searchBox"];function Un(e){var t=e.appId,n=e.apiKey,o=e.indexName,i=e.placeholder,u=void 0===i?"Search docs":i,d=e.searchParameters,f=e.maxResultsPerGroup,p=e.onClose,m=void 0===p?Gt:p,h=e.transformItems,g=void 0===h?Wt:h,y=e.hitComponent,b=void 0===y?_t:y,v=e.resultsFooterComponent,w=void 0===v?function(){return null}:v,S=e.navigator,k=e.initialScrollY,x=void 0===k?0:k,E=e.transformSearchClient,_=void 0===E?Wt:E,O=e.disableUserPersonalization,A=void 0!==O&&O,C=e.initialQuery,T=void 0===C?"":C,j=e.translations,P=void 0===j?{}:j,I=e.getMissingResultsUrl,N=e.insights,R=void 0!==N&&N,L=P.footer,D=P.searchBox,M=l(P,$n),F=c(r.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),B=F[0],z=F[1],$=r.useRef(null),U=r.useRef(null),H=r.useRef(null),V=r.useRef(null),q=r.useRef(null),W=r.useRef(10),K=r.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,G=r.useRef(T||K).current,Y=function(e,t,n){return r.useMemo((function(){var r=zn(e,t);return r.addAlgoliaAgent("docsearch","3.6.1"),!1===/docsearch.js \(.*\)/.test(r.transporter.userAgent.value)&&r.addAlgoliaAgent("docsearch-react","3.6.1"),n(r)}),[e,t,n])}(t,n,_),Q=r.useRef(sn({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(o),limit:10})).current,Z=r.useRef(sn({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(o),limit:0===Q.getAll().length?7:4})).current,X=r.useCallback((function(e){if(!A){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===Q.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&Z.add(t)}}),[Q,Z,A]),J=r.useCallback((function(e){if(B.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,n={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};B.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(n)}}),[B.context.algoliaInsightsPlugin]),ee=r.useMemo((function(){return St({id:"docsearch",defaultActiveItemId:0,placeholder:u,openOnFocus:!0,initialState:{query:G,context:{searchSuggestions:[]}},insights:R,navigator:S,onStateChange:function(e){z(e.state)},getSources:function(e){var r=e.query,i=e.state,s=e.setContext,l=e.setStatus;if(!r)return A?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,n=e.event;X(t),Kt(n)||m()},getItemUrl:function(e){return e.item.url},getItems:function(){return Z.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,n=e.event;X(t),Kt(n)||m()},getItemUrl:function(e){return e.item.url},getItems:function(){return Q.getAll()}}];var c=Boolean(R);return Y.search([{query:r,indexName:o,params:a({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(W.current),"hierarchy.lvl2:".concat(W.current),"hierarchy.lvl3:".concat(W.current),"hierarchy.lvl4:".concat(W.current),"hierarchy.lvl5:".concat(W.current),"hierarchy.lvl6:".concat(W.current),"content:".concat(W.current)],snippetEllipsisText:"\u2026",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:c},d)}]).catch((function(e){throw"RetryError"===e.name&&l("error"),e})).then((function(e){var r=e.results[0],l=r.hits,u=r.nbHits,d=qt(l,(function(e){return Zt(e)}),f);i.context.searchSuggestions.length0&&(re(),q.current&&q.current.focus())}),[G,re]),r.useEffect((function(){function e(){if(U.current){var e=.01*window.innerHeight;U.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),r.createElement("div",s({ref:$},ne({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===B.status&&"DocSearch-Container--Stalled","error"===B.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&m()}}),r.createElement("div",{className:"DocSearch-Modal",ref:U},r.createElement("header",{className:"DocSearch-SearchBar",ref:H},r.createElement(on,s({},ee,{state:B,autoFocus:0===G.length,inputRef:q,isFromSelection:Boolean(G)&&G===K,translations:D,onClose:m}))),r.createElement("div",{className:"DocSearch-Dropdown",ref:V},r.createElement(nn,s({},ee,{indexName:o,state:B,hitComponent:b,resultsFooterComponent:w,disableUserPersonalization:A,recentSearches:Z,favoriteSearches:Q,inputRef:q,translations:M,getMissingResultsUrl:I,onItemClick:function(e,t){J(e),X(e),Kt(t)||m()}}))),r.createElement("footer",{className:"DocSearch-Footer"},r.createElement(Et,{translations:L}))))}function Hn(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}},9579:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(3696),o=n(2540);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},1915:(e,t,n)=>{"use strict";var r=n(3696),o=n(7470),a=n(9005),i=n(9941),s=n(4784),l=n(6655);const c=[n(9869),n(6268),n(8912),n(7729)];var u=n(7577),d=n(9519),f=n(3971),p=n(2540);function m(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(7854),g=n(7032),y=n(883),b=n(7412),v=n(3715),w=n(577),S=n(9984),k=n(8721),x=n(5994),E=n(689);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(h.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function O(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,x.Ks)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function A(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(h.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:S.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(O,{}),(0,p.jsx)(_,{}),(0,p.jsx)(E.A,{tag:k.C,locale:e}),(0,p.jsx)(h.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const C=new Map;var T=n(9579),j=n(3765),P=n(4395);function I(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,P.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),I("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,f.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class L extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const D=L,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,p.jsx)(D,{location:e,children:K})}function Y(){return(0,p.jsx)(V.A,{children:(0,p.jsx)(j.l,{children:(0,p.jsxs)(T.x,{children:[(0,p.jsxs)(m,{children:[(0,p.jsx)(H,{}),(0,p.jsx)(A,{}),(0,p.jsx)(U,{}),(0,p.jsx)(G,{})]}),(0,p.jsx)(W,{})]})})})}var Q=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(7991);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,f.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Q).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),R(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(a.vd,{children:(0,p.jsx)(oe,{children:(0,p.jsx)(Y,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};R(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},3765:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(3696),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"introduction","docs":[{"id":"api/deprecation","path":"/docs/api/deprecation","sidebar":"api"},{"id":"api/rest","path":"/docs/api/rest","sidebar":"api"},{"id":"community","path":"/docs/community","sidebar":"docsSidebar"},{"id":"contribution","path":"/docs/contribution","sidebar":"docsSidebar"},{"id":"faq","path":"/docs/faq","sidebar":"docsSidebar"},{"id":"guides/announcements","path":"/docs/guides/announcements","sidebar":"docsSidebar"},{"id":"guides/cdisplayex","path":"/docs/guides/cdisplayex","sidebar":"docsSidebar"},{"id":"guides/chunky","path":"/docs/guides/chunky","sidebar":"docsSidebar"},{"id":"guides/cli","path":"/docs/guides/cli","sidebar":"docsSidebar"},{"id":"guides/collections","path":"/docs/guides/collections","sidebar":"docsSidebar"},{"id":"guides/desktop","path":"/docs/guides/desktop","sidebar":"docsSidebar"},{"id":"guides/duplicate-files","path":"/docs/guides/duplicate-files","sidebar":"docsSidebar"},{"id":"guides/duplicate-pages","path":"/docs/guides/duplicate-pages","sidebar":"docsSidebar"},{"id":"guides/edit-metadata","path":"/docs/guides/edit-metadata","sidebar":"docsSidebar"},{"id":"guides/image-formats","path":"/docs/guides/image-formats","sidebar":"docsSidebar"},{"id":"guides/import-books","path":"/docs/guides/import-books","sidebar":"docsSidebar"},{"id":"guides/kobo","path":"/docs/guides/kobo","sidebar":"docsSidebar"},{"id":"guides/libraries","path":"/docs/guides/libraries","sidebar":"docsSidebar"},{"id":"guides/local-artwork-assets","path":"/docs/guides/local-artwork-assets","sidebar":"docsSidebar"},{"id":"guides/mihon","path":"/docs/guides/mihon","sidebar":"docsSidebar"},{"id":"guides/oneshots","path":"/docs/guides/oneshots","sidebar":"docsSidebar"},{"id":"guides/opds","path":"/docs/guides/opds","sidebar":"docsSidebar"},{"id":"guides/panels","path":"/docs/guides/panels","sidebar":"docsSidebar"},{"id":"guides/paperback","path":"/docs/guides/paperback","sidebar":"docsSidebar"},{"id":"guides/read-progress","path":"/docs/guides/read-progress","sidebar":"docsSidebar"},{"id":"guides/readlists","path":"/docs/guides/readlists","sidebar":"docsSidebar"},{"id":"guides/scan-analysis-refresh","path":"/docs/guides/scan-analysis-refresh","sidebar":"docsSidebar"},{"id":"guides/search","path":"/docs/guides/search","sidebar":"docsSidebar"},{"id":"guides/server-settings","path":"/docs/guides/server-settings","sidebar":"docsSidebar"},{"id":"guides/theme","path":"/docs/guides/theme","sidebar":"docsSidebar"},{"id":"guides/trash","path":"/docs/guides/trash","sidebar":"docsSidebar"},{"id":"guides/user-accounts","path":"/docs/guides/user-accounts","sidebar":"docsSidebar"},{"id":"guides/webreader","path":"/docs/guides/webreader","sidebar":"docsSidebar"},{"id":"guides/webui","path":"/docs/guides/webui","sidebar":"docsSidebar"},{"id":"installation/configuration","path":"/docs/installation/configuration","sidebar":"docsSidebar"},{"id":"installation/desktop","path":"/docs/installation/desktop","sidebar":"docsSidebar"},{"id":"installation/docker","path":"/docs/installation/docker","sidebar":"docsSidebar"},{"id":"installation/gdrive","path":"/docs/installation/gdrive","sidebar":"docsSidebar"},{"id":"installation/https","path":"/docs/installation/https","sidebar":"docsSidebar"},{"id":"installation/jar","path":"/docs/installation/jar","sidebar":"docsSidebar"},{"id":"installation/ms-store","path":"/docs/installation/ms-store","sidebar":"docsSidebar"},{"id":"installation/oauth2","path":"/docs/installation/oauth2","sidebar":"docsSidebar"},{"id":"installation/thirdparty","path":"/docs/installation/thirdparty","sidebar":"docsSidebar"},{"id":"introduction","path":"/docs/introduction","sidebar":"docsSidebar"},{"id":"/category/installation","path":"/docs/category/installation","sidebar":"docsSidebar"},{"id":"/category/official-methods","path":"/docs/category/official-methods","sidebar":"docsSidebar"},{"id":"/category/guides","path":"/docs/category/guides","sidebar":"docsSidebar"},{"id":"/category/readers","path":"/docs/category/readers","sidebar":"docsSidebar"}],"draftIds":[],"sidebars":{"docsSidebar":{"link":{"path":"/docs/introduction","label":"introduction"}},"api":{"link":{"path":"/docs/api/rest","label":"REST API"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.5.2"}}}');var c=n(2540);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function f(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},5291:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(3696),o=n(6655),a=n(7854),i=n(5994),s=n(3969),l=n(580),c=n(2540);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(f,{children:(0,c.jsxs)(h,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const m=e=>(0,c.jsx)(p,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??m)(e)}return e??null}}},6655:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},7854:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(3696);var r=n(9005),o=n(2540);function a(e){return(0,o.jsx)(r.mg,{...e})}},3587:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(3696),o=n(9941),a=n(5994),i=n(7032),s=n(2616),l=n(6655),c=n(2041),u=n(883),d=n(2540);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:S}=v,k=v.future.experimental_router,{withBaseUrl:x}=(0,u.hH)(),E=(0,c.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const O=f||p;const A=(0,s.A)(O),C=O?.replace("pathname://","");let T=void 0!==C?(j=C,y&&(e=>e.startsWith("/"))(j)?x(j):j):void 0;var j;"hash"===k&&T?.startsWith("./")&&(T=T?.slice(1)),T&&A&&(T=(0,a.Ks)(T,{trailingSlash:w,baseUrl:S}));const P=(0,r.useRef)(!1),I=n?o.k2:o.N_,N=l.A.canUseIntersectionObserver,R=(0,r.useRef)(),L=()=>{P.current||null==T||(window.docusaurus.preload(T),P.current=!0)};(0,r.useEffect)((()=>(!N&&A&&l.A.canUseDOM&&null!=T&&window.docusaurus.prefetch(T),()=>{N&&R.current&&R.current.disconnect()})),[R,T,N,A]);const D=T?.startsWith("#")??!1,M=!b.target||"_self"===b.target,F=!T||!A||!M||D&&"hash"!==k;g||!D&&F||E.collectLink(T),b.id&&E.collectAnchor(b.id);const B={};return F?(0,d.jsx)("a",{ref:_,href:T,...O&&!A&&{target:"_blank",rel:"noopener noreferrer"},...b,...B}):(0,d.jsx)(I,{...b,onMouseEnter:L,onTouchStart:L,innerRef:e=>{_.current=e,N&&e&&A&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),R.current.observe(e))},to:T,...n&&{isActive:h,activeClassName:m},...B})}const p=r.forwardRef(f)},6590:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(3696),o=n(2540);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},8287:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},2616:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},883:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(3696),o=n(7032),a=n(2616);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2041:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(3696);n(2540);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},7032:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(3696),o=n(3765);function a(){return(0,r.useContext)(o.o)}},6681:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(3696),o=n(9579);function a(){return(0,r.useContext)(o.o)}},4395:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(3696);const o=n(6655).A.canUseDOM?r.useLayoutEffect:r.useEffect},6745:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(3696),o=n(580);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},7991:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},580:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(3696),o=n(2540);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},9092:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>v,g1:()=>b});var r=n(3696),o=n(4548),a=n(8287),i=n(7412),s=n(4243),l=n(5198),c=n(2540);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(u(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return(0,c.jsx)(p.Provider,{value:n,children:t})}function g(e){let{children:t}=e;return(0,c.jsx)(h,{children:t})}function y(){const e=(0,r.useContext)(p);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o.Gy)(),[t]=y();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},5667:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>i});var r=n(4548),o=n(9092);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},2827:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(3696),o=n(5198),a=n(2540);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},2454:(e,t,n)=>{"use strict";n.d(t,{$S:()=>m,B5:()=>_,Nr:()=>p,OF:()=>S,QB:()=>E,Vd:()=>k,Y:()=>v,cC:()=>f,d1:()=>O,fW:()=>x,w8:()=>y});var r=n(3696),o=n(9519),a=n(3971),i=n(4548),s=n(4379),l=n(4544),c=n(9092),u=n(4435),d=n(2827);function f(e){const t=(0,u.r)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function m(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,s.ys)(e,t),g=(e,t)=>e.some((e=>y(e,t)));function y(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||g(e.items,t))}function b(e,t){switch(e.type){case"category":return y(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||y(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function S(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,l.sb)([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function E(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.v)(i),sidebarName:l,sidebarItems:c}}function O(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!p(e)))}},4435:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(3696),o=n(5198),a=n(2540);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},4548:(e,t,n)=>{"use strict";n.d(t,{zK:()=>y,vT:()=>p,gk:()=>m,Gy:()=>d,HW:()=>b,ht:()=>f,r7:()=>g,jh:()=>h});var r=n(9519),o=n(7032),a=n(8287);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>{try{return function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function h(e){return f(e).versions}function g(e){const t=f(e);return s(t)}function y(e){const t=f(e),{pathname:n}=(0,r.zy)();return c(t,n)}function b(e){const t=f(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8912:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(7671),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6268:(e,t,n)=>{"use strict";var r=n(7663),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(5968),n(442)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1381:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(3696);var r=n(1750),o=n(6590),a=n(7412),i=n(3587),s=n(2041);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_JmGV",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_pMLv"};var c=n(2540);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:f}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const p=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",f?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},9016:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(3696);const r={iconExternalLink:"iconExternalLink_nPrP"};var o=n(2540);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},3969:(e,t,n)=>{"use strict";n.d(t,{A:()=>Ot});var r=n(3696),o=n(1750),a=n(5291),i=n(3715),s=n(9519),l=n(6590),c=n(2432),u=n(2540);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=p();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(3237),y=n(9984);const b={skipToContent:"skipToContent_oPtH"};function v(){return(0,u.jsx)(h,{className:b.skipToContent})}var w=n(7412),S=n(3043);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const x={closeButton:"closeButton_J5rP"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",x.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_bSb_"};function O(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_zJRd",announcementBarPlaceholder:"announcementBarPlaceholder_NpUd",announcementBarClose:"announcementBarClose_Jjdj",announcementBarContent:"announcementBarContent_t7IR"};function C(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,S.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(O,{className:A.announcementBarContent}),a&&(0,u.jsx)(E,{onClick:n,className:A.announcementBarClose})]})}var T=n(5974),j=n(766);var P=n(5198),I=n(5454);const N=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,T.M)(),t=(0,I.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,P.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(N.Provider,{value:n,children:t})}function L(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new P.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,I.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:L(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(2363),B=n(6681);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_ki11",toggleButton:"toggleButton_MMFG",darkToggleIcon:"darkToggleIcon_U96C",lightToggleIcon:"lightToggleIcon_lgto",toggleButtonDisabled:"toggleButtonDisabled_Uw7m"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,B.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(z,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const V=r.memo(H),q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_m8pZ"};function W(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.G)();return r?null:(0,u.jsx)(V,{className:t,buttonClassName:"dark"===n?q.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var K=n(699);function G(){return(0,u.jsx)(K.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,T.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(G,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(Y,{})]})}var Z=n(3587),X=n(883),J=n(2616);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9016);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Ay)(r),f=(0,X.Ay)(t),p=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),m=a&&o&&!(0,J.A)(o),h=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,m&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?p:o,...c,...h}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...c,...h})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(51),se=n(4379),le=n(7032);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_MJ1i"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Fe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),p()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(Fe,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,u.jsx)(r,{...n})}var me=n(577);function he(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_kvP7";var ye=n(8325),be=n(5044),ve=n(7854);const we="q";function Se(){const{withBaseUrl:e}=(0,X.hH)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=function(){const{siteConfig:{themeConfig:e}}=(0,le.A)();return e}();return(0,r.useCallback)((r=>{const o=new URL(r);if(ee(t,o.href))return r;const a=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(a,n))}),[e,t,n])}var ke=n(8721),xe=n(5667);function Ee(){return[`language:${(0,le.A)().i18n.currentLocale}`,function(){const e=(0,xe.v)();return[ke.C,...e]}().map((e=>`docusaurus_tag:${e}`))]}const _e={button:{buttonText:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Oe=null;function Ae(e){let{hit:t,children:n}=e;return(0,u.jsx)(Z.A,{to:t.url,children:n})}function Ce(e){let{state:t,onClose:n}=e;const o=function(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,le.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${we}=${encodeURIComponent(t)}`),[e,n])}();return(0,u.jsx)(Z.A,{to:o(t.query),onClick:n,children:(0,u.jsx)(l.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Te(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,le.A)(),l=Se(),c=Ee(),d=a.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,p={...a.searchParameters,facetFilters:f},m=(0,s.W6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[y,b]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),S=(0,r.useCallback)((()=>Oe?Promise.resolve():Promise.all([n.e(9714).then(n.bind(n,9714)),Promise.all([n.e(1869),n.e(8973)]).then(n.bind(n,8973)),Promise.all([n.e(1869),n.e(9074)]).then(n.bind(n,9074))]).then((e=>{let[{DocSearchModal:t}]=e;Oe=t}))),[]),k=(0,r.useCallback)((()=>{if(!h.current){const e=document.createElement("div");h.current=e,document.body.insertBefore(e,document.body.firstChild)}}),[]),x=(0,r.useCallback)((()=>{k(),S().then((()=>b(!0)))}),[S,k]),E=(0,r.useCallback)((()=>{b(!1),g.current?.focus()}),[]),_=(0,r.useCallback)((e=>{"f"===e.key&&(e.metaKey||e.ctrlKey)||(e.preventDefault(),w(e.key),x())}),[x]),O=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;ee(o,t)?window.location.href=t:m.push(t)}}).current,A=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,C=(0,r.useMemo)((()=>e=>(0,u.jsx)(Ce,{...e,onClose:E})),[E]),T=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return(0,be.E8)({isOpen:y,onOpen:x,onClose:E,onInput:_,searchButtonRef:g}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ve.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(be.Bc,{onTouchStart:S,onFocus:S,onMouseOver:S,onClick:x,ref:g,translations:_e.button}),y&&Oe&&h.current&&(0,ye.createPortal)((0,u.jsx)(Oe,{onClose:E,initialScrollY:window.scrollY,initialQuery:v,navigator:O,transformItems:A,hitComponent:Ae,transformSearchClient:T,...a.searchPagePath&&{resultsFooterComponent:C},...a,searchParameters:p,placeholder:_e.placeholder,translations:_e.modal}),h.current)]})}function je(){const{siteConfig:e}=(0,le.A)();return(0,u.jsx)(Te,{...e.themeConfig.algolia})}const Pe={navbarSearchContainer:"navbarSearchContainer_bzqh"};function Ie(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,Pe.navbarSearchContainer),children:t})}var Ne=n(4548),Re=n(2454);var Le=n(9092);function De(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const Me={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),f=(0,me.o)(),{search:p,hash:m}=(0,s.zy)(),h=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(pe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(he,{className:ge}),g]}),items:h})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Ie,{className:n,children:(0,u.jsx)(je,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Ne.zK)(r),i=(0,Re.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Ne.zK)(r),i=(0,Re.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,Re.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),f=(0,Ne.zK)(n),p=(0,Ne.jh)(n),{savePreferredVersionName:m}=(0,Le.g1)(n),h=[...o,...p.map((function(e){const t=De(e,f);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>m(e.name)}})),...a],g=(0,Re.Vd)(n)[0],y=t&&h.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,b=t&&h.length>1?void 0:De(g,f).path;return h.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,u.jsx)(pe,{...i,mobile:t,label:y,to:b,items:h,isActive:r?()=>!1:void 0})}};function Fe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Me[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Be(){const e=(0,T.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Fe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function ze(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function $e(){const e=0===(0,w.p)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(ze,{onClick:()=>t.hide()}),t.content]})}function Ue(){const e=(0,T.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Q,{}),primaryMenu:(0,u.jsx)(Be,{}),secondaryMenu:(0,u.jsx)($e,{})}):null}const He={navbarHideable:"navbarHideable_hhpl",navbarHidden:"navbarHidden_nmcs"};function Ve(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function qe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.p)(),i=(0,T.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,j.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[He.navbarHideable,!d&&He.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ve,{onClick:i.toggle}),(0,u.jsx)(Ue,{})]})}var We=n(5994);const Ke={errorBoundaryError:"errorBoundaryError_WE6Q",errorBoundaryFallback:"errorBoundaryFallback_bdJX"};function Ge(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Ye(e){let{error:t}=e;const n=(0,We.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Ke.errorBoundaryError,children:n})}class Qe extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Ze="right";function Xe(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Je(){const{toggle:e,shown:t}=(0,T.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Xe,{})})}const et={colorModeToggle:"colorModeToggle_Hewu"};function tt(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Qe,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Fe,{...e})},t)))})}function nt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function rt(){const e=(0,T.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Ze)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(nt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Je,{}),(0,u.jsx)(G,{}),(0,u.jsx)(tt,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(tt,{items:r}),(0,u.jsx)(W,{className:et.colorModeToggle}),!o&&(0,u.jsx)(Ie,{children:(0,u.jsx)(je,{})})]})})}function ot(){return(0,u.jsx)(qe,{children:(0,u.jsx)(rt,{})})}function at(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.Ay)(n),l=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function it(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(at,{item:t})},t.href??t.to)}function st(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(it,{item:e},t)))})]})}function lt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(st,{column:e},t)))})}function ct(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function ut(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(at,{item:t})}function dt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(ut,{item:e}),t.length!==n+1&&(0,u.jsx)(ct,{})]},n)))})})}function ft(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(lt,{columns:t}):(0,u.jsx)(dt,{links:t})}var pt=n(448);const mt={footerLogoLink:"footerLogoLink_tutC"};function ht(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(pt.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function gt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:mt.footerLogoLink,target:t.target,children:(0,u.jsx)(ht,{logo:t})}):(0,u.jsx)(ht,{logo:t})}function yt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function bt(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function vt(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(bt,{style:o,links:n&&n.length>0&&(0,u.jsx)(ft,{links:n}),logo:r&&(0,u.jsx)(gt,{logo:r}),copyright:t&&(0,u.jsx)(yt,{copyright:t})})}const wt=r.memo(vt),St=(0,P.fM)([F.a,S.o,j.Tv,Le.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(I.y_,{children:(0,u.jsx)(T.e,{children:(0,u.jsx)(R,{children:t})})})}]);function kt(e){let{children:t}=e;return(0,u.jsx)(St,{children:t})}var xt=n(1381);function Et(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(xt.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Ge,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Ye,{error:t})})]})})})}const _t={mainWrapper:"mainWrapper_MB5r"};function Ot(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,y.J)(),(0,u.jsxs)(kt,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(C,{}),(0,u.jsx)(ot,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,_t.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Et,{...e}),children:t})}),!n&&(0,u.jsx)(wt,{})]})}},699:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(3696);var r=n(3587),o=n(883),a=n(7032),i=n(7412),s=n(448),l=n(2540);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...f}=e,p=(0,o.Ay)(s?.href||"/"),m=n?"":t,h=s?.alt??m;return(0,l.jsxs)(r.A,{to:p,...f,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},689:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(3696);var r=n(7854),o=n(2540);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},448:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(3696),o=n(1750),a=n(6681),i=n(2363);const s={themedComponent:"themedComponent_siVc","themedComponent--light":"themedComponent--light_hHel","themedComponent--dark":"themedComponent--dark_yETr"};var l=n(2540);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},51:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>c});var r=n(3696),o=n(6655),a=n(4395),i=n(7683),s=n(2540);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return f(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function m(e){if(!o.A.canUseDOM)return e?u:d}function h(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(h,{...n,collapsed:l}):null}function y(e){let{lazy:t,...n}=e;const r=t?g:h;return(0,s.jsx)(r,{...n})}},3043:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>m});var r=n(3696),o=n(6681),a=n(4243),i=n(5198),s=n(7412),l=n(2540);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),f=e=>c.set(String(e)),p=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&f(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(p.Provider,{value:n,children:t})}function h(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},2363:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>g});var r=n(3696),o=n(6655),a=n(5198),i=n(4243),s=n(7412),l=n(2540);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,m=e=>o.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),h=e=>{d.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5974:(e,t,n)=>{"use strict";n.d(t,{e:()=>p,M:()=>m});var r=n(3696),o=n(5454),a=n(2575),i=n(9519),s=n(5198);function l(e){!function(e){const t=(0,i.W6)(),n=(0,s._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(7412),u=n(2540);const d=r.createContext(void 0);function f(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[i,s]=(0,r.useState)(!1);l((()=>{if(i)return s(!1),!1}));const u=(0,r.useCallback)((()=>{s((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&s(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function p(e){let{children:t}=e;const n=f();return(0,u.jsx)(d.Provider,{value:n,children:t})}function m(){const e=r.useContext(d);if(void 0===e)throw new s.dV("NavbarMobileSidebarProvider");return e}},5454:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(3696),o=n(5198),a=n(2540);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9984:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(3696);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},2575:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(3696),o=n(6655);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},3237:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},7683:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},4544:(e,t,n)=>{"use strict";function r(e){return Array.from(new Set(e))}function o(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{$z:()=>o,sb:()=>r})},3715:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>u,Jx:()=>p});var r=n(3696),o=n(1750),a=n(7854),i=n(6745),s=n(883),l=n(7032);var c=n(2540);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.hH)(),f=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,c.jsx)("meta",{property:"og:image",content:f}),f&&(0,c.jsx)("meta",{name:"twitter:image",content:f}),i]})}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function p(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,o.A)(r,a),children:t})}},5198:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(3696),o=n(4395),a=n(2540);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},4379:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(3696),o=n(7577),a=n(7032);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},766:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>c,gk:()=>p});var r=n(3696),o=n(6655),a=n(6681),i=(n(4395),n(5198)),s=n(2540);const l=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},8721:(e,t,n)=>{"use strict";n.d(t,{C:()=>r});const r="default"},4243:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(3696);const r=JSON.parse('{"N":"localStorage","M":""}'),o=r.N;function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const o=i(t?.persistence);return null===o?l:{get:()=>{try{return o.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=o.getItem(n);o.setItem(n,e),a({key:n,oldValue:t,newValue:e,storage:o})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=o.getItem(n);o.removeItem(n),a({key:n,oldValue:e,newValue:null,storage:o})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===o&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},577:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(7032),o=n(9519),a=n(5994);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.Ks)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},2432:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(3696),o=n(9519),a=n(5198);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},7412:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(7032);function o(){return(0,r.A)().siteConfig.themeConfig}},69:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(2856);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},5563:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},5994:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(4629);t.LU="__blog-post-container";var o=n(69);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2856);var i=n(5563);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2856:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},7577:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(3696);var r=n(7303),o=n.n(r),a=n(4054);const i={"0058b4c6":[()=>n.e(849).then(n.t.bind(n,6164,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",6164],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,8968)),"@theme/BlogTagsListPage",8968],"01dfd4e6":[()=>n.e(757).then(n.bind(n,6720)),"@site/docs/guides/server-settings.md",6720],"03c48fcb":[()=>n.e(9424).then(n.bind(n,9002)),"@site/docs/guides/collections.md",9002],"0480b142":[()=>n.e(8070).then(n.bind(n,633)),"@site/docs/faq.md",633],"08fb5848":[()=>n.e(3008).then(n.bind(n,985)),"@site/blog/2023-03-21-prepare-v1.md?truncated=true",985],"0920ba86":[()=>n.e(9225).then(n.bind(n,9325)),"@site/docs/guides/user-accounts.md",9325],"09b40582":[()=>n.e(4427).then(n.t.bind(n,9137,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-upgrade-3c3.json",9137],"0bf9748d":[()=>n.e(2531).then(n.bind(n,2339)),"@site/docs/guides/scan-analysis-refresh.md",2339],"0c5c2428":[()=>n.e(6820).then(n.bind(n,2655)),"@site/docs/installation/jar.md",2655],"14eb3368":[()=>Promise.all([n.e(1869),n.e(6969)]).then(n.bind(n,6790)),"@theme/DocCategoryGeneratedIndexPage",6790],17896441:[()=>Promise.all([n.e(1869),n.e(3829),n.e(8401)]).then(n.bind(n,5067)),"@theme/DocItem",5067],"1bb85636":[()=>n.e(3054).then(n.bind(n,15)),"@site/docs/guides/chunky.md",15],"1df93b7f":[()=>Promise.all([n.e(1869),n.e(4583)]).then(n.bind(n,3693)),"@site/src/pages/index.tsx",3693],"1ec3b236":[()=>n.e(832).then(n.bind(n,9805)),"@site/docs/guides/cli.md",9805],"206b31bb":[()=>n.e(6897).then(n.bind(n,2298)),"@site/docs/guides/oneshots.md",2298],24227623:[()=>n.e(7311).then(n.bind(n,4531)),"@site/docs/guides/read-progress.md",4531],"2b8f2de1":[()=>n.e(7769).then(n.bind(n,4537)),"@site/docs/guides/opds.md",4537],"33e67961":[()=>n.e(2579).then(n.bind(n,5214)),"@site/docs/guides/kobo.md",5214],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"3a2db09e":[()=>n.e(8121).then(n.t.bind(n,8070,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",8070],"416fe654":[()=>n.e(5216).then(n.bind(n,4975)),"@site/docs/contribution.md",4975],"42bd1a18":[()=>n.e(4714).then(n.t.bind(n,2271,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-komga-99f.json",2271],"45fa992b":[()=>n.e(3195).then(n.bind(n,8372)),"@site/blog/2023-11-29-ebooks.md",8372],"49136dfa":[()=>n.e(3259).then(n.bind(n,6673)),"@site/docs/guides/import-books.md",6673],"4c25ac78":[()=>n.e(7994).then(n.bind(n,317)),"@site/docs/guides/edit-metadata.md",317],"4cc4731f":[()=>n.e(3390).then(n.bind(n,7255)),"@site/docs/installation/thirdparty.md",7255],"4cff09f6":[()=>n.e(3021).then(n.t.bind(n,4918,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-guides-015.json",4918],"55519d27":[()=>n.e(577).then(n.bind(n,2428)),"@site/docs/guides/libraries.md",2428],"5592dbb1":[()=>n.e(4689).then(n.bind(n,8695)),"@site/docs/guides/desktop.md",8695],"579f2db1":[()=>n.e(839).then(n.t.bind(n,1863,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-official-methods-d39.json",1863],"58903ab2":[()=>n.e(983).then(n.bind(n,9986)),"@site/docs/installation/desktop.md",9986],"5e95c892":[()=>n.e(9647).then(n.bind(n,415)),"@theme/DocsRoot",415],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5ef0e9d6":[()=>n.e(911).then(n.bind(n,392)),"@site/docs/community.md",392],"607df45e":[()=>n.e(8368).then(n.bind(n,5143)),"@site/docs/installation/gdrive.md",5143],"621db11d":[()=>Promise.all([n.e(1869),n.e(8697),n.e(4212)]).then(n.bind(n,1336)),"@theme/Blog/Pages/BlogAuthorsListPage",1336],"634dddf1":[()=>n.e(625).then(n.bind(n,4176)),"@site/blog/2023-11-29-ebooks.md?truncated=true",4176],"674e178f":[()=>n.e(205).then(n.bind(n,3499)),"@site/docs/guides/cdisplayex.md",3499],"6875c492":[()=>Promise.all([n.e(1869),n.e(3829),n.e(8697),n.e(4813)]).then(n.bind(n,6139)),"@theme/BlogTagsPostsPage",6139],"74bb4bec":[()=>n.e(6324).then(n.bind(n,6076)),"@site/blog/2023-12-15-ebooks-drop2.md?truncated=true",6076],"767395cb":[()=>n.e(4103).then(n.bind(n,7439)),"@site/docs/installation/https.md",7439],"7d6e8713":[()=>n.e(7526).then(n.bind(n,2718)),"@site/docs/guides/webreader.md",2718],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],"8badb5d4":[()=>n.e(5109).then(n.bind(n,6191)),"@site/docs/guides/image-formats.md",6191],"8cd3f15d":[()=>n.e(3895).then(n.t.bind(n,829,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-breaking-change-01f.json",829],"97c4f258":[()=>n.e(1057).then(n.bind(n,340)),"@site/docs/installation/configuration.md",340],"98ce5054":[()=>n.e(5628).then(n.bind(n,6407)),"@site/docs/guides/local-artwork-assets.md",6407],"9e4087bc":[()=>n.e(2711).then(n.bind(n,5441)),"@theme/BlogArchivePage",5441],a09c2993:[()=>n.e(5899).then(n.bind(n,549)),"@site/docs/introduction.md",549],a22ccb60:[()=>n.e(1598).then(n.bind(n,8176)),"@site/docs/api/deprecation.md",8176],a624e12b:[()=>n.e(1130).then(n.bind(n,4511)),"@site/docs/installation/oauth2.md",4511],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(3829),n.e(8697),n.e(7643)]).then(n.bind(n,9270)),"@theme/BlogListPage",9270],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,3970)),"@theme/DocVersionRoot",3970],a86b3a3d:[()=>n.e(8145).then(n.t.bind(n,1600,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-readers-ce7.json",1600],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,543)),"@theme/DocRoot",543],a981d65e:[()=>n.e(8792).then(n.bind(n,9185)),"@site/docs/guides/trash.md",9185],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],ac07380c:[()=>n.e(3962).then(n.bind(n,2416)),"@site/docs/installation/docker.md",2416],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],b242fde9:[()=>n.e(7549).then(n.bind(n,2840)),"@site/docs/guides/duplicate-files.md",2840],b94207ad:[()=>n.e(1982).then(n.bind(n,8264)),"@site/docs/installation/ms-store.md",8264],b94d24b4:[()=>n.e(4940).then(n.bind(n,299)),"@site/docs/guides/announcements.md",299],c15d9823:[()=>n.e(8146).then(n.t.bind(n,9328,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",9328],c2d7cd96:[()=>n.e(9091).then(n.bind(n,895)),"@site/docs/guides/search.md",895],c777247d:[()=>n.e(8688).then(n.bind(n,8416)),"@site/docs/guides/mihon.md",8416],c8d8dd9d:[()=>n.e(685).then(n.bind(n,6240)),"@site/blog/2023-12-15-ebooks-drop2.md",6240],ca683365:[()=>n.e(3372).then(n.bind(n,9802)),"@site/docs/guides/theme.md",9802],ccc49370:[()=>Promise.all([n.e(1869),n.e(3829),n.e(8697),n.e(3249)]).then(n.bind(n,9612)),"@theme/BlogPostPage",9612],d135d818:[()=>n.e(4569).then(n.bind(n,499)),"@site/docs/guides/duplicate-pages.md",499],d6e0cd3c:[()=>n.e(6225).then(n.bind(n,2680)),"@site/docs/guides/webui.md",2680],d86518ca:[()=>n.e(303).then(n.bind(n,782)),"@site/docs/guides/paperback.md",782],df8142cd:[()=>n.e(1915).then(n.bind(n,3654)),"@site/docs/api/rest.md",3654],e1862fee:[()=>n.e(3993).then(n.bind(n,372)),"@site/blog/2023-03-21-prepare-v1.md",372],e41126ef:[()=>n.e(3147).then(n.bind(n,7166)),"@site/docs/guides/readlists.md",7166],ebc1cc14:[()=>n.e(6119).then(n.bind(n,3244)),"@site/docs/guides/panels.md",3244],ef8b811a:[()=>n.e(8947).then(n.t.bind(n,6600,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-790.json",6600],f12d36e3:[()=>n.e(5545).then(n.t.bind(n,3608,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-installation-a8b.json",3608],f81c1134:[()=>n.e(8130).then(n.t.bind(n,7735,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",7735]};var s=n(2540);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(7991),u=n(580);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(3431).then(n.bind(n,3431)),modules:["@theme/NotFound"],webpack:()=>[3431],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},f=[],p=[],m=(0,c.A)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),o().Map({loading:l,loader:d,modules:f,webpack:()=>p,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const f=[{path:"/blog",component:d("/blog","8ba"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/authors",component:d("/blog/authors","0b7"),exact:!0},{path:"/blog/ebook-drop2",component:d("/blog/ebook-drop2","62d"),exact:!0},{path:"/blog/ebook-support",component:d("/blog/ebook-support","f34"),exact:!0},{path:"/blog/prepare-v1",component:d("/blog/prepare-v1","e30"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/breaking-change",component:d("/blog/tags/breaking-change","f62"),exact:!0},{path:"/blog/tags/komga",component:d("/blog/tags/komga","85a"),exact:!0},{path:"/blog/tags/upgrade",component:d("/blog/tags/upgrade","306"),exact:!0},{path:"/docs",component:d("/docs","3f9"),routes:[{path:"/docs",component:d("/docs","f04"),routes:[{path:"/docs",component:d("/docs","356"),routes:[{path:"/docs/api/deprecation",component:d("/docs/api/deprecation","4c7"),exact:!0,sidebar:"api"},{path:"/docs/api/rest",component:d("/docs/api/rest","cd9"),exact:!0,sidebar:"api"},{path:"/docs/category/guides",component:d("/docs/category/guides","04e"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/category/installation",component:d("/docs/category/installation","73d"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/category/official-methods",component:d("/docs/category/official-methods","a26"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/category/readers",component:d("/docs/category/readers","43d"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/community",component:d("/docs/community","a28"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/contribution",component:d("/docs/contribution","82e"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/faq",component:d("/docs/faq","861"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/announcements",component:d("/docs/guides/announcements","7ac"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/cdisplayex",component:d("/docs/guides/cdisplayex","a8b"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/chunky",component:d("/docs/guides/chunky","e3f"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/cli",component:d("/docs/guides/cli","cce"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/collections",component:d("/docs/guides/collections","73d"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/desktop",component:d("/docs/guides/desktop","9fd"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/duplicate-files",component:d("/docs/guides/duplicate-files","1fb"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/duplicate-pages",component:d("/docs/guides/duplicate-pages","8d0"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/edit-metadata",component:d("/docs/guides/edit-metadata","75c"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/image-formats",component:d("/docs/guides/image-formats","41b"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/import-books",component:d("/docs/guides/import-books","9e8"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/kobo",component:d("/docs/guides/kobo","c2a"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/libraries",component:d("/docs/guides/libraries","410"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/local-artwork-assets",component:d("/docs/guides/local-artwork-assets","459"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/mihon",component:d("/docs/guides/mihon","5b8"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/oneshots",component:d("/docs/guides/oneshots","873"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/opds",component:d("/docs/guides/opds","17b"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/panels",component:d("/docs/guides/panels","eb7"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/paperback",component:d("/docs/guides/paperback","e5f"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/read-progress",component:d("/docs/guides/read-progress","08d"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/readlists",component:d("/docs/guides/readlists","e55"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/scan-analysis-refresh",component:d("/docs/guides/scan-analysis-refresh","85a"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/search",component:d("/docs/guides/search","a82"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/server-settings",component:d("/docs/guides/server-settings","afc"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/theme",component:d("/docs/guides/theme","545"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/trash",component:d("/docs/guides/trash","7fa"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/user-accounts",component:d("/docs/guides/user-accounts","4de"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/webreader",component:d("/docs/guides/webreader","1b6"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/webui",component:d("/docs/guides/webui","dbf"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/configuration",component:d("/docs/installation/configuration","0f5"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/desktop",component:d("/docs/installation/desktop","6af"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/docker",component:d("/docs/installation/docker","500"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/gdrive",component:d("/docs/installation/gdrive","3e5"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/https",component:d("/docs/installation/https","b6a"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/jar",component:d("/docs/installation/jar","c56"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/ms-store",component:d("/docs/installation/ms-store","66f"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/oauth2",component:d("/docs/installation/oauth2","2d8"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/thirdparty",component:d("/docs/installation/thirdparty","2f5"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/introduction",component:d("/docs/introduction","5a5"),exact:!0,sidebar:"docsSidebar"}]}]}]},{path:"/",component:d("/","e5f"),exact:!0},{path:"*",component:d("*")}]},6941:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>O,yJ:()=>p,sC:()=>C,AO:()=>f});var r=n(8102);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;f--){var p=i[f];"."===p?a(i,f):".."===p?(a(i,f),d++):d&&(a(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(6143);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function p(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,h(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(4271),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=p(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},9134:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},9869:(e,t,n)=>{"use strict";n.r(t)},7729:(e,t,n)=>{"use strict";n.r(t)},7671:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},7314:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i{!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(Prism)},2246:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},5968:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++o;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=f.substring(m+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),y&&b.push.apply(b,i([y])),"string"==typeof c?s.splice.apply(s,[l,1].concat(b)):c.content=b}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},442:(e,t,n)=>{var r={"./prism-bash":7314,"./prism-diff":7867,"./prism-json":2246};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=442},362:(e,t,n)=>{"use strict";var r=n(6441);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},2688:(e,t,n)=>{e.exports=n(362)()},6441:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},6067:(e,t,n)=>{"use strict";var r=n(3696),o=n(1434);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n