From 893e231402058d725072f74fecab0e77fd8c7501 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 07:59:45 +0000 Subject: [PATCH] deploy: 959534414be0f385b673267dba1a758355e47ee8 --- 404.html | 8 ++++---- ...dfd4e6.ace6c751.js => 01dfd4e6.9071b305.js} | 2 +- ...c48fcb.73255a20.js => 03c48fcb.03a40293.js} | 2 +- ...80b142.f99394b7.js => 0480b142.8daa3dad.js} | 2 +- ...fb5848.f9024997.js => 08fb5848.883b1683.js} | 2 +- ...20ba86.7a57e411.js => 0920ba86.ef5fb0ab.js} | 2 +- ...f9748d.eb1b7092.js => 0bf9748d.425b2712.js} | 2 +- ...5c2428.e21d0c9c.js => 0c5c2428.2d8a6d71.js} | 2 +- ...b85636.cb145131.js => 1bb85636.b6683509.js} | 2 +- ...c3b236.8c365432.js => 1ec3b236.af6d82d2.js} | 2 +- ...6b31bb.b478a073.js => 206b31bb.93e58909.js} | 2 +- ...227623.df0cfc76.js => 24227623.2e43610c.js} | 2 +- ...088eef.49422631.js => 25088eef.3c7f2dba.js} | 2 +- ...8f2de1.e1e76bcb.js => 2b8f2de1.b2dc2f34.js} | 2 +- ...da2baf.e85a2ebd.js => 3fda2baf.19165ef5.js} | 2 +- ...6fe654.bda03071.js => 416fe654.3e769577.js} | 2 +- assets/js/45fa992b.3b628fc8.js | 1 + ...136dfa.27434ed4.js => 49136dfa.5f9bc6aa.js} | 2 +- ...25ac78.be325156.js => 4c25ac78.abdca75c.js} | 2 +- ...c4731f.f00d7adf.js => 4cc4731f.1711eeac.js} | 2 +- ...7428db.1027eee5.js => 4e7428db.291c22c5.js} | 2 +- ...519d27.1804b50f.js => 55519d27.3e834a74.js} | 2 +- ...92dbb1.cb2bec82.js => 5592dbb1.9452bf16.js} | 2 +- ...903ab2.09129091.js => 58903ab2.a6850f2f.js} | 2 +- ...80a3fb.1415f59d.js => 5e80a3fb.beeb7f42.js} | 2 +- ...f0e9d6.ffe1dc32.js => 5ef0e9d6.1595fc32.js} | 2 +- ...7df45e.2d1ba688.js => 607df45e.8d7b923f.js} | 2 +- assets/js/634dddf1.86763aaa.js | 1 + ...4e178f.5566d969.js => 674e178f.5ee49348.js} | 2 +- ...7395cb.688dd66f.js => 767395cb.4ae0a904.js} | 2 +- ...6e8713.1fe4bd77.js => 7d6e8713.0562cf1d.js} | 2 +- ...a97648.601938c9.js => 7da97648.5d984c68.js} | 2 +- assets/js/814f3328.12058411.js | 1 + assets/js/814f3328.44afc25f.js | 1 - ...adb5d4.e81f3e19.js => 8badb5d4.72e51a63.js} | 2 +- ...c4f258.d0fb7eee.js => 97c4f258.7aad953f.js} | 2 +- ...ce5054.4579cb37.js => 98ce5054.8bdb722c.js} | 2 +- ...9c2993.e2e7b80e.js => a09c2993.02311474.js} | 2 +- ...2ccb60.3d7e0a71.js => a22ccb60.467254e0.js} | 2 +- ...24e12b.5e81790c.js => a624e12b.c667710d.js} | 2 +- assets/js/a7023ddc.c34d5503.js | 1 + assets/js/a7023ddc.cac3ed1a.js | 1 - ...81d65e.91f674d3.js => a981d65e.695a9752.js} | 2 +- ...07380c.50529831.js => ac07380c.0dc3b2bc.js} | 2 +- ...42fde9.79fa1d41.js => b242fde9.e9887d31.js} | 2 +- ...b675dd.0c7375a6.js => b2b675dd.4e5b87a0.js} | 2 +- assets/js/b2f554cd.2a4bfae1.js | 1 - assets/js/b2f554cd.bac27463.js | 1 + ...4207ad.976378f7.js => b94207ad.556c1521.js} | 2 +- ...4d24b4.84c6960a.js => b94d24b4.a56463b0.js} | 2 +- ...d7cd96.f0683237.js => c2d7cd96.c61d0161.js} | 2 +- ...683365.af1f4fa3.js => ca683365.8b2ababf.js} | 2 +- ...35d818.5e9c25b3.js => d135d818.289aad93.js} | 2 +- ...e0cd3c.4e08fa38.js => d6e0cd3c.27973669.js} | 2 +- ...6518ca.6c0ca6bc.js => d86518ca.4c017adf.js} | 2 +- ...8142cd.83faade5.js => df8142cd.adcd83bc.js} | 2 +- ...862fee.b97b22f7.js => e1862fee.7fbf0a95.js} | 2 +- ...1126ef.ffac3367.js => e41126ef.e4b0b1e3.js} | 2 +- ...c1cc14.5536558a.js => ebc1cc14.4f413112.js} | 2 +- assets/js/main.83279a84.js | 2 -- assets/js/main.c05197f8.js | 2 ++ ...ICENSE.txt => main.c05197f8.js.LICENSE.txt} | 0 assets/js/runtime~main.00c84926.js | 1 - assets/js/runtime~main.fcd0361e.js | 1 + blog/archive/index.html | 10 +++++----- blog/atom.xml | 16 +++++++++++++++- blog/ebook-support/index.html | 18 ++++++++++++++++++ blog/feed.json | 16 ++++++++++++++++ blog/index.html | 10 +++++----- blog/prepare-v1/index.html | 10 +++++----- blog/rss.xml | 12 +++++++++++- blog/tags/breaking-change/index.html | 10 +++++----- blog/tags/index.html | 10 +++++----- blog/tags/komga/index.html | 12 ++++++------ blog/tags/upgrade/index.html | 12 ++++++------ docs/api/deprecation/index.html | 10 +++++----- docs/api/rest/index.html | 10 +++++----- docs/category/guides/index.html | 8 ++++---- docs/category/installation/index.html | 8 ++++---- docs/category/official-methods/index.html | 8 ++++---- docs/category/readers/index.html | 8 ++++---- docs/community/index.html | 10 +++++----- docs/contribution/index.html | 10 +++++----- docs/faq/index.html | 10 +++++----- docs/guides/announcements/index.html | 10 +++++----- docs/guides/cdisplayex/index.html | 10 +++++----- docs/guides/chunky/index.html | 10 +++++----- docs/guides/cli/index.html | 10 +++++----- docs/guides/collections/index.html | 10 +++++----- docs/guides/desktop/index.html | 10 +++++----- docs/guides/duplicate-files/index.html | 10 +++++----- docs/guides/duplicate-pages/index.html | 10 +++++----- docs/guides/edit-metadata/index.html | 10 +++++----- docs/guides/image-formats/index.html | 10 +++++----- docs/guides/import-books/index.html | 10 +++++----- docs/guides/libraries/index.html | 10 +++++----- docs/guides/local-artwork-assets/index.html | 10 +++++----- docs/guides/oneshots/index.html | 10 +++++----- docs/guides/opds/index.html | 10 +++++----- docs/guides/panels/index.html | 10 +++++----- docs/guides/paperback/index.html | 10 +++++----- docs/guides/read-progress/index.html | 10 +++++----- docs/guides/readlists/index.html | 10 +++++----- docs/guides/scan-analysis-refresh/index.html | 10 +++++----- docs/guides/search/index.html | 10 +++++----- docs/guides/server-settings/index.html | 10 +++++----- docs/guides/tachiyomi/index.html | 10 +++++----- docs/guides/theme/index.html | 10 +++++----- docs/guides/trash/index.html | 10 +++++----- docs/guides/user-accounts/index.html | 10 +++++----- docs/guides/webreader/index.html | 10 +++++----- docs/guides/webui/index.html | 10 +++++----- docs/installation/configuration/index.html | 10 +++++----- docs/installation/desktop/index.html | 10 +++++----- docs/installation/docker/index.html | 10 +++++----- docs/installation/gdrive/index.html | 10 +++++----- docs/installation/https/index.html | 10 +++++----- docs/installation/jar/index.html | 10 +++++----- docs/installation/ms-store/index.html | 10 +++++----- docs/installation/oauth2/index.html | 10 +++++----- docs/installation/thirdparty/index.html | 10 +++++----- docs/introduction/index.html | 10 +++++----- index.html | 8 ++++---- sitemap.xml | 2 +- 124 files changed, 395 insertions(+), 335 deletions(-) rename assets/js/{01dfd4e6.ace6c751.js => 01dfd4e6.9071b305.js} (98%) rename assets/js/{03c48fcb.73255a20.js => 03c48fcb.03a40293.js} (99%) rename assets/js/{0480b142.f99394b7.js => 0480b142.8daa3dad.js} (99%) rename assets/js/{08fb5848.f9024997.js => 08fb5848.883b1683.js} (52%) rename assets/js/{0920ba86.7a57e411.js => 0920ba86.ef5fb0ab.js} (98%) rename assets/js/{0bf9748d.eb1b7092.js => 0bf9748d.425b2712.js} (99%) rename assets/js/{0c5c2428.e21d0c9c.js => 0c5c2428.2d8a6d71.js} (98%) rename assets/js/{1bb85636.cb145131.js => 1bb85636.b6683509.js} (99%) rename assets/js/{1ec3b236.8c365432.js => 1ec3b236.af6d82d2.js} (98%) rename assets/js/{206b31bb.b478a073.js => 206b31bb.93e58909.js} (99%) rename assets/js/{24227623.df0cfc76.js => 24227623.2e43610c.js} (98%) rename assets/js/{25088eef.49422631.js => 25088eef.3c7f2dba.js} (78%) rename assets/js/{2b8f2de1.e1e76bcb.js => 2b8f2de1.b2dc2f34.js} (99%) rename assets/js/{3fda2baf.e85a2ebd.js => 3fda2baf.19165ef5.js} (86%) rename assets/js/{416fe654.bda03071.js => 416fe654.3e769577.js} (99%) create mode 100644 assets/js/45fa992b.3b628fc8.js rename assets/js/{49136dfa.27434ed4.js => 49136dfa.5f9bc6aa.js} (98%) rename assets/js/{4c25ac78.be325156.js => 4c25ac78.abdca75c.js} (99%) rename assets/js/{4cc4731f.f00d7adf.js => 4cc4731f.1711eeac.js} (99%) rename assets/js/{4e7428db.1027eee5.js => 4e7428db.291c22c5.js} (88%) rename assets/js/{55519d27.1804b50f.js => 55519d27.3e834a74.js} (99%) rename assets/js/{5592dbb1.cb2bec82.js => 5592dbb1.9452bf16.js} (96%) rename assets/js/{58903ab2.09129091.js => 58903ab2.a6850f2f.js} (98%) rename assets/js/{5e80a3fb.1415f59d.js => 5e80a3fb.beeb7f42.js} (78%) rename assets/js/{5ef0e9d6.ffe1dc32.js => 5ef0e9d6.1595fc32.js} (98%) rename assets/js/{607df45e.2d1ba688.js => 607df45e.8d7b923f.js} (98%) create mode 100644 assets/js/634dddf1.86763aaa.js rename assets/js/{674e178f.5566d969.js => 674e178f.5ee49348.js} (99%) rename assets/js/{767395cb.688dd66f.js => 767395cb.4ae0a904.js} (98%) rename assets/js/{7d6e8713.1fe4bd77.js => 7d6e8713.0562cf1d.js} (99%) rename assets/js/{7da97648.601938c9.js => 7da97648.5d984c68.js} (98%) create mode 100644 assets/js/814f3328.12058411.js delete mode 100644 assets/js/814f3328.44afc25f.js rename assets/js/{8badb5d4.e81f3e19.js => 8badb5d4.72e51a63.js} (98%) rename assets/js/{97c4f258.d0fb7eee.js => 97c4f258.7aad953f.js} (99%) rename assets/js/{98ce5054.4579cb37.js => 98ce5054.8bdb722c.js} (98%) rename assets/js/{a09c2993.e2e7b80e.js => a09c2993.02311474.js} (98%) rename assets/js/{a22ccb60.3d7e0a71.js => a22ccb60.467254e0.js} (98%) rename assets/js/{a624e12b.5e81790c.js => a624e12b.c667710d.js} (99%) create mode 100644 assets/js/a7023ddc.c34d5503.js delete mode 100644 assets/js/a7023ddc.cac3ed1a.js rename assets/js/{a981d65e.91f674d3.js => a981d65e.695a9752.js} (99%) rename assets/js/{ac07380c.50529831.js => ac07380c.0dc3b2bc.js} (99%) rename assets/js/{b242fde9.79fa1d41.js => b242fde9.e9887d31.js} (98%) rename assets/js/{b2b675dd.0c7375a6.js => b2b675dd.4e5b87a0.js} (77%) delete mode 100644 assets/js/b2f554cd.2a4bfae1.js create mode 100644 assets/js/b2f554cd.bac27463.js rename assets/js/{b94207ad.976378f7.js => b94207ad.556c1521.js} (96%) rename assets/js/{b94d24b4.84c6960a.js => b94d24b4.a56463b0.js} (98%) rename assets/js/{c2d7cd96.f0683237.js => c2d7cd96.c61d0161.js} (99%) rename assets/js/{ca683365.af1f4fa3.js => ca683365.8b2ababf.js} (98%) rename assets/js/{d135d818.5e9c25b3.js => d135d818.289aad93.js} (99%) rename assets/js/{d6e0cd3c.4e08fa38.js => d6e0cd3c.27973669.js} (98%) rename assets/js/{d86518ca.6c0ca6bc.js => d86518ca.4c017adf.js} (99%) rename assets/js/{df8142cd.83faade5.js => df8142cd.adcd83bc.js} (98%) rename assets/js/{e1862fee.b97b22f7.js => e1862fee.7fbf0a95.js} (52%) rename assets/js/{e41126ef.ffac3367.js => e41126ef.e4b0b1e3.js} (98%) rename assets/js/{ebc1cc14.5536558a.js => ebc1cc14.4f413112.js} (99%) delete mode 100644 assets/js/main.83279a84.js create mode 100644 assets/js/main.c05197f8.js rename assets/js/{main.83279a84.js.LICENSE.txt => main.c05197f8.js.LICENSE.txt} (100%) delete mode 100644 assets/js/runtime~main.00c84926.js create mode 100644 assets/js/runtime~main.fcd0361e.js create mode 100644 blog/ebook-support/index.html diff --git a/404.html b/404.html index 93948393..2cefc341 100644 --- a/404.html +++ b/404.html @@ -6,13 +6,13 @@ 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.

- - + + \ No newline at end of file diff --git a/assets/js/01dfd4e6.ace6c751.js b/assets/js/01dfd4e6.9071b305.js similarity index 98% rename from assets/js/01dfd4e6.ace6c751.js rename to assets/js/01dfd4e6.9071b305.js index f9bef859..18c62f2e 100644 --- a/assets/js/01dfd4e6.ace6c751.js +++ b/assets/js/01dfd4e6.9071b305.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7694],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>g});var n=r(7294);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,a=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(r),p=s,g=u["".concat(l,".").concat(p)]||u[p]||m[p]||a;return r?n.createElement(g,o(o({ref:t},d),{},{components:r})):n.createElement(g,o({ref:t},d))}));function g(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var a=r.length,o=new Array(a);o[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:s,o[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(7462),s=(r(7294),r(3905));const a={},o="Server settings & management",i={unversionedId:"guides/server-settings",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/server-settings.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"User accounts",permalink:"/docs/guides/user-accounts"},next:{title:"Read progress",permalink:"/docs/guides/read-progress"}},l={},c=[{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}],d={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,s.kt)(u,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"server-settings--management"},"Server settings & management"),(0,s.kt)("p",null,"The ",(0,s.kt)("em",{parentName:"p"},"Server Settings > Server")," screen allows for more configuration of your server."),(0,s.kt)("h2",{id:"server-settings"},"Server Settings"),(0,s.kt)("p",null,"This section allows to configure some server-wide options."),(0,s.kt)("img",{src:"/assets/media/guides/server-settings/server-settings.png",style:{maxHeight:"600px"},alt:"Server Settings"}),(0,s.kt)("h4",{id:"delete-empty-collections-after-scan"},"Delete empty collections after scan"),(0,s.kt)("p",null,"Indicate whether Komga should delete empty collections after a scan."),(0,s.kt)("h4",{id:"delete-empty-read-lists-after-scan"},"Delete empty read lists after scan"),(0,s.kt)("p",null,"Indicate whether Komga should delete empty read lists after a scan."),(0,s.kt)("h4",{id:"task-threads"},"Task threads"),(0,s.kt)("p",null,"The number of threads dedicated to the processing of background tasks."),(0,s.kt)("h4",{id:"remember-me-duration"},"Remember Me duration"),(0,s.kt)("p",null,"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."),(0,s.kt)("h4",{id:"regenerate-the-rememberme-key"},"Regenerate the RememberMe key"),(0,s.kt)("p",null,"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."),(0,s.kt)("h4",{id:"server-port"},"Server Port"),(0,s.kt)("p",null,"Port to listen to for the API and web interface."),(0,s.kt)("p",null,"This takes precedence over the ",(0,s.kt)("inlineCode",{parentName:"p"},"server.port")," configuration key."),(0,s.kt)("h4",{id:"base-url"},"Base URL"),(0,s.kt)("p",null,"Base URL, useful if you need to reverse proxy with a subfolder."),(0,s.kt)("p",null,"This takes precedence over the ",(0,s.kt)("inlineCode",{parentName:"p"},"server.servlet.context-path")," configuration key."),(0,s.kt)("h2",{id:"server-management"},"Server Management"),(0,s.kt)("p",null,"This sections allows some administrative actions for your server."),(0,s.kt)("img",{src:"/assets/media/guides/server-settings/server-management.png",style:{maxHeight:"300px"},alt:"Server Management"}))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7694],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>g});var n=r(7294);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,a=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(r),p=s,g=u["".concat(l,".").concat(p)]||u[p]||m[p]||a;return r?n.createElement(g,o(o({ref:t},d),{},{components:r})):n.createElement(g,o({ref:t},d))}));function g(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var a=r.length,o=new Array(a);o[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:s,o[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(7462),s=(r(7294),r(3905));const a={},o="Server settings & management",i={unversionedId:"guides/server-settings",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/server-settings.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"User accounts",permalink:"/docs/guides/user-accounts"},next:{title:"Read progress",permalink:"/docs/guides/read-progress"}},l={},c=[{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}],d={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,s.kt)(u,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"server-settings--management"},"Server settings & management"),(0,s.kt)("p",null,"The ",(0,s.kt)("em",{parentName:"p"},"Server Settings > Server")," screen allows for more configuration of your server."),(0,s.kt)("h2",{id:"server-settings"},"Server Settings"),(0,s.kt)("p",null,"This section allows to configure some server-wide options."),(0,s.kt)("img",{src:"/assets/media/guides/server-settings/server-settings.png",style:{maxHeight:"600px"},alt:"Server Settings"}),(0,s.kt)("h4",{id:"delete-empty-collections-after-scan"},"Delete empty collections after scan"),(0,s.kt)("p",null,"Indicate whether Komga should delete empty collections after a scan."),(0,s.kt)("h4",{id:"delete-empty-read-lists-after-scan"},"Delete empty read lists after scan"),(0,s.kt)("p",null,"Indicate whether Komga should delete empty read lists after a scan."),(0,s.kt)("h4",{id:"task-threads"},"Task threads"),(0,s.kt)("p",null,"The number of threads dedicated to the processing of background tasks."),(0,s.kt)("h4",{id:"remember-me-duration"},"Remember Me duration"),(0,s.kt)("p",null,"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."),(0,s.kt)("h4",{id:"regenerate-the-rememberme-key"},"Regenerate the RememberMe key"),(0,s.kt)("p",null,"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."),(0,s.kt)("h4",{id:"server-port"},"Server Port"),(0,s.kt)("p",null,"Port to listen to for the API and web interface."),(0,s.kt)("p",null,"This takes precedence over the ",(0,s.kt)("inlineCode",{parentName:"p"},"server.port")," configuration key."),(0,s.kt)("h4",{id:"base-url"},"Base URL"),(0,s.kt)("p",null,"Base URL, useful if you need to reverse proxy with a subfolder."),(0,s.kt)("p",null,"This takes precedence over the ",(0,s.kt)("inlineCode",{parentName:"p"},"server.servlet.context-path")," configuration key."),(0,s.kt)("h2",{id:"server-management"},"Server Management"),(0,s.kt)("p",null,"This sections allows some administrative actions for your server."),(0,s.kt)("img",{src:"/assets/media/guides/server-settings/server-management.png",style:{maxHeight:"300px"},alt:"Server Management"}))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/03c48fcb.73255a20.js b/assets/js/03c48fcb.03a40293.js similarity index 99% rename from assets/js/03c48fcb.73255a20.js rename to assets/js/03c48fcb.03a40293.js index e5ff75aa..62b4e24f 100644 --- a/assets/js/03c48fcb.73255a20.js +++ b/assets/js/03c48fcb.03a40293.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5037],{3905:(e,t,l)=>{l.d(t,{Zo:()=>d,kt:()=>m});var i=l(7294);function o(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function n(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,i)}return l}function c(e){for(var t=1;t=0||(o[l]=e[l]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(o[l]=e[l])}return o}var r=i.createContext({}),a=function(e){var t=i.useContext(r),l=t;return e&&(l="function"==typeof e?e(t):c(c({},t),e)),l},d=function(e){var t=a(e.components);return i.createElement(r.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(e,t){var l=e.components,o=e.mdxType,n=e.originalType,r=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=a(l),g=o,m=u["".concat(r,".").concat(g)]||u[g]||p[g]||n;return l?i.createElement(m,c(c({ref:t},d),{},{components:l})):i.createElement(m,c({ref:t},d))}));function m(e,t){var l=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=l.length,c=new Array(n);c[0]=g;var s={};for(var r in t)hasOwnProperty.call(t,r)&&(s[r]=t[r]);s.originalType=e,s[u]="string"==typeof e?e:o,c[1]=s;for(var a=2;a{l.r(t),l.d(t,{assets:()=>r,contentTitle:()=>c,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>a});var i=l(7462),o=(l(7294),l(3905));const n={},c="Collections",s={unversionedId:"guides/collections",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/collections.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read progress",permalink:"/docs/guides/read-progress"},next:{title:"Read lists",permalink:"/docs/guides/readlists"}},r={},a=[{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}],d={toc:a},u="wrapper";function p(e){let{components:t,...l}=e;return(0,o.kt)(u,(0,i.Z)({},d,l,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"collections"},"Collections"),(0,o.kt)("p",null,'Collections let you gather related series together. For example, you might add all the Batman series together in a "Batman" collection.'),(0,o.kt)("h2",{id:"adding-series-to-a-collection"},"Adding series to a collection"),(0,o.kt)("p",null,"You can add a Series to a collection from the action menu icon ",(0,o.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,o.kt)("em",{parentName:"p"},"Add to collection"),"."),(0,o.kt)("p",null,"You can also select multiple series, and click on ",(0,o.kt)("em",{parentName:"p"},"Add to collection"),"."),(0,o.kt)("img",{src:"/assets/media/guides/collections/multiselect-add-collection.png",style:{maxHeight:"80px"}}),(0,o.kt)("p",null,"A dialog will show up, where you can either add series to an existing collection, or create a new collection."),(0,o.kt)("img",{src:"/assets/media/guides/collections/add-collection-dialog.png",style:{maxHeight:"300px"}}),(0,o.kt)("h2",{id:"finding-the-collections"},"Finding the Collections"),(0,o.kt)("p",null,"Collections can be discovered or viewed in three ways:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Series details screen"),(0,o.kt)("li",{parentName:"ol"},'Viewing the libraries "By Collection"'),(0,o.kt)("li",{parentName:"ol"},"Searching in the search bar")),(0,o.kt)("h3",{id:"series-details-screen"},"Series details screen"),(0,o.kt)("p",null,"When viewing the details screen for a specific series that belongs to a collection, the collection will be displayed in a collapsible panel."),(0,o.kt)("img",{src:"/assets/media/guides/collections/series-collection-collapsed.png",style:{maxHeight:"300px"}}),(0,o.kt)("p",null,"Click on the panel to expand it and see the content of the collection."),(0,o.kt)("img",{src:"/assets/media/guides/collections/series-collection-expanded.png",style:{maxHeight:"300px"}}),(0,o.kt)("h3",{id:"viewing-the-libraries-by-collection"},'Viewing the libraries "By Collection"'),(0,o.kt)("p",null,'Only show collections that exist in the library. Opening a collection goes to the "collection details" screen (see below).'),(0,o.kt)("img",{src:"/assets/media/guides/collections/browse-collections.png",style:{maxHeight:"100px"}}),(0,o.kt)("h2",{id:"collection-details"},"Collection details"),(0,o.kt)("p",null,"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."),(0,o.kt)("h3",{id:"collection-ordering"},"Collection ordering"),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"Either click on the edit button on the collection card."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-card.png",style:{maxHeight:"300px"}}),(0,o.kt)("p",null,"Or click on the edit button from the collection details screen."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-button.png",style:{maxHeight:"60px"}}),(0,o.kt)("p",null,"A dialog will show up, where you can edit the collection's ordering."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-dialog.png",style:{maxHeight:"300px"}}),(0,o.kt)("p",null,"A manually ordered collection will be showing as such in the collection details screen."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-manual-ordering.png",style:{maxHeight:"50px"}}),(0,o.kt)("h3",{id:"edit-collection-elements"},"Edit collection elements"),(0,o.kt)("p",null,"From the collection details screen you can edit the elements composing a collection. To do so, click on the corresponding button in the toolbar."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-elements-button.png",style:{maxHeight:"80px"}}),(0,o.kt)("p",null,"The series cards will show two extra elements:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"a delete button, to remove the series from the collection"),(0,o.kt)("li",{parentName:"ul"},"a grip handle, which let you drag and drop series to reorder them (only available when the collection is manually ordered)")),(0,o.kt)("p",null,"Once you are done with your changes, click the tick in the top bar. Click the cross to discard your changes."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-elements.png",style:{maxHeight:"400px"}}),(0,o.kt)("h2",{id:"deleting-a-collection"},"Deleting a collection"),(0,o.kt)("p",null,"To delete a collection, look for the action menu icon ",(0,o.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,o.kt)("em",{parentName:"p"},"Delete"),"."),(0,o.kt)("p",null,"This will not delete the items in the collection, nor your media files."))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5037],{3905:(e,t,l)=>{l.d(t,{Zo:()=>d,kt:()=>m});var i=l(7294);function o(e,t,l){return t in e?Object.defineProperty(e,t,{value:l,enumerable:!0,configurable:!0,writable:!0}):e[t]=l,e}function n(e,t){var l=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),l.push.apply(l,i)}return l}function c(e){for(var t=1;t=0||(o[l]=e[l]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,l)&&(o[l]=e[l])}return o}var r=i.createContext({}),a=function(e){var t=i.useContext(r),l=t;return e&&(l="function"==typeof e?e(t):c(c({},t),e)),l},d=function(e){var t=a(e.components);return i.createElement(r.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(e,t){var l=e.components,o=e.mdxType,n=e.originalType,r=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=a(l),g=o,m=u["".concat(r,".").concat(g)]||u[g]||p[g]||n;return l?i.createElement(m,c(c({ref:t},d),{},{components:l})):i.createElement(m,c({ref:t},d))}));function m(e,t){var l=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=l.length,c=new Array(n);c[0]=g;var s={};for(var r in t)hasOwnProperty.call(t,r)&&(s[r]=t[r]);s.originalType=e,s[u]="string"==typeof e?e:o,c[1]=s;for(var a=2;a{l.r(t),l.d(t,{assets:()=>r,contentTitle:()=>c,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>a});var i=l(7462),o=(l(7294),l(3905));const n={},c="Collections",s={unversionedId:"guides/collections",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/collections.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read progress",permalink:"/docs/guides/read-progress"},next:{title:"Read lists",permalink:"/docs/guides/readlists"}},r={},a=[{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}],d={toc:a},u="wrapper";function p(e){let{components:t,...l}=e;return(0,o.kt)(u,(0,i.Z)({},d,l,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"collections"},"Collections"),(0,o.kt)("p",null,'Collections let you gather related series together. For example, you might add all the Batman series together in a "Batman" collection.'),(0,o.kt)("h2",{id:"adding-series-to-a-collection"},"Adding series to a collection"),(0,o.kt)("p",null,"You can add a Series to a collection from the action menu icon ",(0,o.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,o.kt)("em",{parentName:"p"},"Add to collection"),"."),(0,o.kt)("p",null,"You can also select multiple series, and click on ",(0,o.kt)("em",{parentName:"p"},"Add to collection"),"."),(0,o.kt)("img",{src:"/assets/media/guides/collections/multiselect-add-collection.png",style:{maxHeight:"80px"}}),(0,o.kt)("p",null,"A dialog will show up, where you can either add series to an existing collection, or create a new collection."),(0,o.kt)("img",{src:"/assets/media/guides/collections/add-collection-dialog.png",style:{maxHeight:"300px"}}),(0,o.kt)("h2",{id:"finding-the-collections"},"Finding the Collections"),(0,o.kt)("p",null,"Collections can be discovered or viewed in three ways:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Series details screen"),(0,o.kt)("li",{parentName:"ol"},'Viewing the libraries "By Collection"'),(0,o.kt)("li",{parentName:"ol"},"Searching in the search bar")),(0,o.kt)("h3",{id:"series-details-screen"},"Series details screen"),(0,o.kt)("p",null,"When viewing the details screen for a specific series that belongs to a collection, the collection will be displayed in a collapsible panel."),(0,o.kt)("img",{src:"/assets/media/guides/collections/series-collection-collapsed.png",style:{maxHeight:"300px"}}),(0,o.kt)("p",null,"Click on the panel to expand it and see the content of the collection."),(0,o.kt)("img",{src:"/assets/media/guides/collections/series-collection-expanded.png",style:{maxHeight:"300px"}}),(0,o.kt)("h3",{id:"viewing-the-libraries-by-collection"},'Viewing the libraries "By Collection"'),(0,o.kt)("p",null,'Only show collections that exist in the library. Opening a collection goes to the "collection details" screen (see below).'),(0,o.kt)("img",{src:"/assets/media/guides/collections/browse-collections.png",style:{maxHeight:"100px"}}),(0,o.kt)("h2",{id:"collection-details"},"Collection details"),(0,o.kt)("p",null,"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."),(0,o.kt)("h3",{id:"collection-ordering"},"Collection ordering"),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"Either click on the edit button on the collection card."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-card.png",style:{maxHeight:"300px"}}),(0,o.kt)("p",null,"Or click on the edit button from the collection details screen."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-button.png",style:{maxHeight:"60px"}}),(0,o.kt)("p",null,"A dialog will show up, where you can edit the collection's ordering."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-dialog.png",style:{maxHeight:"300px"}}),(0,o.kt)("p",null,"A manually ordered collection will be showing as such in the collection details screen."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-manual-ordering.png",style:{maxHeight:"50px"}}),(0,o.kt)("h3",{id:"edit-collection-elements"},"Edit collection elements"),(0,o.kt)("p",null,"From the collection details screen you can edit the elements composing a collection. To do so, click on the corresponding button in the toolbar."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-elements-button.png",style:{maxHeight:"80px"}}),(0,o.kt)("p",null,"The series cards will show two extra elements:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"a delete button, to remove the series from the collection"),(0,o.kt)("li",{parentName:"ul"},"a grip handle, which let you drag and drop series to reorder them (only available when the collection is manually ordered)")),(0,o.kt)("p",null,"Once you are done with your changes, click the tick in the top bar. Click the cross to discard your changes."),(0,o.kt)("img",{src:"/assets/media/guides/collections/collection-edit-elements.png",style:{maxHeight:"400px"}}),(0,o.kt)("h2",{id:"deleting-a-collection"},"Deleting a collection"),(0,o.kt)("p",null,"To delete a collection, look for the action menu icon ",(0,o.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,o.kt)("em",{parentName:"p"},"Delete"),"."),(0,o.kt)("p",null,"This will not delete the items in the collection, nor your media files."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0480b142.f99394b7.js b/assets/js/0480b142.8daa3dad.js similarity index 99% rename from assets/js/0480b142.f99394b7.js rename to assets/js/0480b142.8daa3dad.js index cb657d50..e2e38ecf 100644 --- a/assets/js/0480b142.f99394b7.js +++ b/assets/js/0480b142.8daa3dad.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[836],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var o=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=o.createContext({}),p=function(e){var t=o.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=p(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=p(a),u=r,h=d["".concat(s,".").concat(u)]||d[u]||c[u]||n;return a?o.createElement(h,i(i({ref:t},m),{},{components:a})):o.createElement(h,i({ref:t},m))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,i=new Array(n);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>n,metadata:()=>l,toc:()=>p});var o=a(7462),r=(a(7294),a(3905));const n={},i="Frequently Asked Questions",l={unversionedId:"faq",id:"faq",title:"Frequently Asked Questions",description:"I forgot my password",source:"@site/docs/faq.md",sourceDirName:".",slug:"/faq",permalink:"/docs/faq",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/faq.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Community",permalink:"/docs/community"}},s={},p=[{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}],m={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,o.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"frequently-asked-questions"},"Frequently Asked Questions"),(0,r.kt)("h2",{id:"i-forgot-my-password"},"I forgot my password"),(0,r.kt)("p",null,"Either ask an admin to reset your password, or use the ",(0,r.kt)("a",{parentName:"p",href:"/docs/guides/cli#reset-password-for-a-user"},"Command Line Interface")," to reset it by yourself."),(0,r.kt)("h2",{id:"where-can-i-find-the-log-files"},"Where can I find the log files?"),(0,r.kt)("p",null,"By default (if you haven't changed the configuration), log files are located:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"on the Windows app: ",(0,r.kt)("inlineCode",{parentName:"li"},"%LOCALAPPDATA%/Komga/logs/komga.log")),(0,r.kt)("li",{parentName:"ul"},"on the macOS app: ",(0,r.kt)("inlineCode",{parentName:"li"},"~/Library/Logs/Komga/komga.log")),(0,r.kt)("li",{parentName:"ul"},"on Windows: ",(0,r.kt)("inlineCode",{parentName:"li"},"%USERPROFILE%/.komga/komga.log")),(0,r.kt)("li",{parentName:"ul"},"on macOS or Unix: ",(0,r.kt)("inlineCode",{parentName:"li"},"~/.komga/komga.log")),(0,r.kt)("li",{parentName:"ul"},"on Docker: in the directory you mounted as ",(0,r.kt)("inlineCode",{parentName:"li"},"/config"),", in a subdirectory called ",(0,r.kt)("inlineCode",{parentName:"li"},"logs"))),(0,r.kt)("h2",{id:"how-to-enable-debug-or-trace-logs"},"How to enable DEBUG or TRACE logs?"),(0,r.kt)("h3",{id:"via-an-applicationyml"},"Via an ",(0,r.kt)("inlineCode",{parentName:"h3"},"application.yml")),(0,r.kt)("p",null,"Add the following key in your ",(0,r.kt)("inlineCode",{parentName:"p"},"application.yml"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"logging.level.org.gotson.komga: DEBUG\n")),(0,r.kt)("p",null,"or"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"logging.level.org.gotson.komga: TRACE\n")),(0,r.kt)("h3",{id:"using-the-jar-via-the-command-line"},"Using the ",(0,r.kt)("inlineCode",{parentName:"h3"},"jar")," via the command line"),(0,r.kt)("p",null,"Start the ",(0,r.kt)("inlineCode",{parentName:"p"},"jar")," with the following option:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=DEBUG\n")),(0,r.kt)("p",null,"or"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=TRACE\n")),(0,r.kt)("h3",{id:"using-docker"},"Using Docker"),(0,r.kt)("p",null,"Add the following environment variable:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"LOGGING_LEVEL_ORG_GOTSON_KOMGA=DEBUG\n")),(0,r.kt)("p",null,"or"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"LOGGING_LEVEL_ORG_GOTSON_KOMGA=TRACE\n")),(0,r.kt)("h2",{id:"komga-seems-slow-how-can-i-check-whats-going-on"},"Komga seems slow, how can I check what's going on?"),(0,r.kt)("p",null,"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."),(0,r.kt)("video",{controls:!0,width:"250"},(0,r.kt)("source",{src:"/assets/media/faq/server-activity.webm",type:"video/webm"}),"Sorry, your browser doesn't support embedded videos."),(0,r.kt)("h2",{id:"the-memory-consumption-is-huge"},"The memory consumption is huge"),(0,r.kt)("p",null,"TL;DR: The operating system ",(0,r.kt)("em",{parentName:"p"},"does not")," report the real memory usage of the application, so don't look at those figures."),(0,r.kt)("p",null,"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,r.kt)("em",{parentName:"p"},"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."),(0,r.kt)("p",null,"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."),(0,r.kt)("p",null,"To increase or limit the maximum memory, see ",(0,r.kt)("a",{parentName:"p",href:"/docs/installation/jar#increase-memory-limit"},"here")," (jar) and ",(0,r.kt)("a",{parentName:"p",href:"/docs/installation/docker#increase-memory-limit"},"here")," (Docker)."),(0,r.kt)("h2",{id:"how-can-i-sync-reading-progress-with-tracker-websites"},"How can I sync reading progress with tracker websites?"),(0,r.kt)("p",null,"Komga does not support this outside the box."),(0,r.kt)("p",null,"You can try ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/MALSync/MALSync"},"MAL-Sync")," which integrates with Komga and works with MyAnimeList, Kitsu, Anilist and others."),(0,r.kt)("h2",{id:"webreader-double-pages-are-not-showing-as-single-page"},"Webreader double pages are not showing as single page"),(0,r.kt)("p",null,"The double pages feature of the webreader requires image sizes to be available. This feature was added in v",(0,r.kt)("inlineCode",{parentName:"p"},"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."),(0,r.kt)("h2",{id:"media-type-applicationx-7z-compressed-is-not-supported"},"Media type application/x-7z-compressed is not supported"),(0,r.kt)("p",null,"Your files are compressed using 7zip, which is not supported. Extract your archives and compress them again using the ",(0,r.kt)("inlineCode",{parentName:"p"},"zip")," format."),(0,r.kt)("h2",{id:"my-booksseries-show-a-different-name-than-the-filesfolders"},"My books/series show a different name than the files/folders"),(0,r.kt)("p",null,"Komga automatically import metadata from ",(0,r.kt)("inlineCode",{parentName:"p"},"EPUB")," files and from ",(0,r.kt)("inlineCode",{parentName:"p"},"ComicInfo.xml")," for ",(0,r.kt)("inlineCode",{parentName:"p"},"cbz"),"/",(0,r.kt)("inlineCode",{parentName:"p"},"cbr"),". The imported metadata will override the file/folder name."),(0,r.kt)("h2",{id:"this-server-has-already-been-claimed"},"This server has already been claimed"),(0,r.kt)("p",null,"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,r.kt)("inlineCode",{parentName:"p"},"claim")," profile as Komga will generate a default user."),(0,r.kt)("p",null,"You can solve the issue by deleting the database. By default it is located in ",(0,r.kt)("inlineCode",{parentName:"p"},"~/.komga/database.sqlite"),". ",(0,r.kt)("inlineCode",{parentName:"p"},"~")," is your home directory on Unix, and your User profile on Windows."),(0,r.kt)("h2",{id:"how-can-i-move-a-library-to-a-different-folder"},"How can I move a library to a different folder?"),(0,r.kt)("p",null,"You can follow those steps:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Make sure ",(0,r.kt)("a",{parentName:"li",href:"/docs/guides/libraries#compute-hash-for-files"},"File Hashing")," is enabled on the library."),(0,r.kt)("li",{parentName:"ol"},"Disable ",(0,r.kt)("a",{parentName:"li",href:"/docs/guides/trash#automatically-empty-trash"},"automatically emptying the trash")," for the library."),(0,r.kt)("li",{parentName:"ol"},"Perform a scan on the library and let all tasks finish. This will ensure all files are hashed."),(0,r.kt)("li",{parentName:"ol"},"Stop Komga."),(0,r.kt)("li",{parentName:"ol"},"Move/copy the files to the new folder."),(0,r.kt)("li",{parentName:"ol"},"Start Komga."),(0,r.kt)("li",{parentName:"ol"},"Edit the library and choose the new folder as the library root directory."),(0,r.kt)("li",{parentName:"ol"},"A scan will be triggered automatically after saving the library. The scan could take some time depending on the size of the library."),(0,r.kt)("li",{parentName:"ol"},"Once the scan is finished, the series and books should have been matched with the files in the new folder.")),(0,r.kt)("h2",{id:"scan-doesnt-pick-up-new-files-under-mergerfs"},"Scan doesn't pick up new files under mergerfs"),(0,r.kt)("p",null,"Add ",(0,r.kt)("inlineCode",{parentName:"p"},"func.getattr=newest")," to the options in your ",(0,r.kt)("inlineCode",{parentName:"p"},"/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. "),(0,r.kt)("p",null,"Example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"/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")),(0,r.kt)("h2",{id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available"},"Docker on Raspberry PI arm32: No monotonic clock was available"),(0,r.kt)("p",null,"If you encounter the following message when starting the container:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-log"},"OpenJDK Server VM warning: No monotonic clock was available - timed services may be adversely affected if the time-of-day clock changes\n")),(0,r.kt)("p",null,"Your host system needs to have installed:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Docker version ",(0,r.kt)("inlineCode",{parentName:"li"},"19.03.9")," or newer"),(0,r.kt)("li",{parentName:"ul"},"libseccomp version ",(0,r.kt)("inlineCode",{parentName:"li"},"2.4.2")," or newer")))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[836],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>h});var o=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=o.createContext({}),p=function(e){var t=o.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=p(e.components);return o.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=p(a),u=r,h=d["".concat(s,".").concat(u)]||d[u]||c[u]||n;return a?o.createElement(h,i(i({ref:t},m),{},{components:a})):o.createElement(h,i({ref:t},m))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,i=new Array(n);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var p=2;p{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>n,metadata:()=>l,toc:()=>p});var o=a(7462),r=(a(7294),a(3905));const n={},i="Frequently Asked Questions",l={unversionedId:"faq",id:"faq",title:"Frequently Asked Questions",description:"I forgot my password",source:"@site/docs/faq.md",sourceDirName:".",slug:"/faq",permalink:"/docs/faq",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/faq.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Community",permalink:"/docs/community"}},s={},p=[{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}],m={toc:p},d="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,o.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"frequently-asked-questions"},"Frequently Asked Questions"),(0,r.kt)("h2",{id:"i-forgot-my-password"},"I forgot my password"),(0,r.kt)("p",null,"Either ask an admin to reset your password, or use the ",(0,r.kt)("a",{parentName:"p",href:"/docs/guides/cli#reset-password-for-a-user"},"Command Line Interface")," to reset it by yourself."),(0,r.kt)("h2",{id:"where-can-i-find-the-log-files"},"Where can I find the log files?"),(0,r.kt)("p",null,"By default (if you haven't changed the configuration), log files are located:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"on the Windows app: ",(0,r.kt)("inlineCode",{parentName:"li"},"%LOCALAPPDATA%/Komga/logs/komga.log")),(0,r.kt)("li",{parentName:"ul"},"on the macOS app: ",(0,r.kt)("inlineCode",{parentName:"li"},"~/Library/Logs/Komga/komga.log")),(0,r.kt)("li",{parentName:"ul"},"on Windows: ",(0,r.kt)("inlineCode",{parentName:"li"},"%USERPROFILE%/.komga/komga.log")),(0,r.kt)("li",{parentName:"ul"},"on macOS or Unix: ",(0,r.kt)("inlineCode",{parentName:"li"},"~/.komga/komga.log")),(0,r.kt)("li",{parentName:"ul"},"on Docker: in the directory you mounted as ",(0,r.kt)("inlineCode",{parentName:"li"},"/config"),", in a subdirectory called ",(0,r.kt)("inlineCode",{parentName:"li"},"logs"))),(0,r.kt)("h2",{id:"how-to-enable-debug-or-trace-logs"},"How to enable DEBUG or TRACE logs?"),(0,r.kt)("h3",{id:"via-an-applicationyml"},"Via an ",(0,r.kt)("inlineCode",{parentName:"h3"},"application.yml")),(0,r.kt)("p",null,"Add the following key in your ",(0,r.kt)("inlineCode",{parentName:"p"},"application.yml"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"logging.level.org.gotson.komga: DEBUG\n")),(0,r.kt)("p",null,"or"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"logging.level.org.gotson.komga: TRACE\n")),(0,r.kt)("h3",{id:"using-the-jar-via-the-command-line"},"Using the ",(0,r.kt)("inlineCode",{parentName:"h3"},"jar")," via the command line"),(0,r.kt)("p",null,"Start the ",(0,r.kt)("inlineCode",{parentName:"p"},"jar")," with the following option:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=DEBUG\n")),(0,r.kt)("p",null,"or"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=TRACE\n")),(0,r.kt)("h3",{id:"using-docker"},"Using Docker"),(0,r.kt)("p",null,"Add the following environment variable:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"LOGGING_LEVEL_ORG_GOTSON_KOMGA=DEBUG\n")),(0,r.kt)("p",null,"or"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"LOGGING_LEVEL_ORG_GOTSON_KOMGA=TRACE\n")),(0,r.kt)("h2",{id:"komga-seems-slow-how-can-i-check-whats-going-on"},"Komga seems slow, how can I check what's going on?"),(0,r.kt)("p",null,"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."),(0,r.kt)("video",{controls:!0,width:"250"},(0,r.kt)("source",{src:"/assets/media/faq/server-activity.webm",type:"video/webm"}),"Sorry, your browser doesn't support embedded videos."),(0,r.kt)("h2",{id:"the-memory-consumption-is-huge"},"The memory consumption is huge"),(0,r.kt)("p",null,"TL;DR: The operating system ",(0,r.kt)("em",{parentName:"p"},"does not")," report the real memory usage of the application, so don't look at those figures."),(0,r.kt)("p",null,"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,r.kt)("em",{parentName:"p"},"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."),(0,r.kt)("p",null,"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."),(0,r.kt)("p",null,"To increase or limit the maximum memory, see ",(0,r.kt)("a",{parentName:"p",href:"/docs/installation/jar#increase-memory-limit"},"here")," (jar) and ",(0,r.kt)("a",{parentName:"p",href:"/docs/installation/docker#increase-memory-limit"},"here")," (Docker)."),(0,r.kt)("h2",{id:"how-can-i-sync-reading-progress-with-tracker-websites"},"How can I sync reading progress with tracker websites?"),(0,r.kt)("p",null,"Komga does not support this outside the box."),(0,r.kt)("p",null,"You can try ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/MALSync/MALSync"},"MAL-Sync")," which integrates with Komga and works with MyAnimeList, Kitsu, Anilist and others."),(0,r.kt)("h2",{id:"webreader-double-pages-are-not-showing-as-single-page"},"Webreader double pages are not showing as single page"),(0,r.kt)("p",null,"The double pages feature of the webreader requires image sizes to be available. This feature was added in v",(0,r.kt)("inlineCode",{parentName:"p"},"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."),(0,r.kt)("h2",{id:"media-type-applicationx-7z-compressed-is-not-supported"},"Media type application/x-7z-compressed is not supported"),(0,r.kt)("p",null,"Your files are compressed using 7zip, which is not supported. Extract your archives and compress them again using the ",(0,r.kt)("inlineCode",{parentName:"p"},"zip")," format."),(0,r.kt)("h2",{id:"my-booksseries-show-a-different-name-than-the-filesfolders"},"My books/series show a different name than the files/folders"),(0,r.kt)("p",null,"Komga automatically import metadata from ",(0,r.kt)("inlineCode",{parentName:"p"},"EPUB")," files and from ",(0,r.kt)("inlineCode",{parentName:"p"},"ComicInfo.xml")," for ",(0,r.kt)("inlineCode",{parentName:"p"},"cbz"),"/",(0,r.kt)("inlineCode",{parentName:"p"},"cbr"),". The imported metadata will override the file/folder name."),(0,r.kt)("h2",{id:"this-server-has-already-been-claimed"},"This server has already been claimed"),(0,r.kt)("p",null,"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,r.kt)("inlineCode",{parentName:"p"},"claim")," profile as Komga will generate a default user."),(0,r.kt)("p",null,"You can solve the issue by deleting the database. By default it is located in ",(0,r.kt)("inlineCode",{parentName:"p"},"~/.komga/database.sqlite"),". ",(0,r.kt)("inlineCode",{parentName:"p"},"~")," is your home directory on Unix, and your User profile on Windows."),(0,r.kt)("h2",{id:"how-can-i-move-a-library-to-a-different-folder"},"How can I move a library to a different folder?"),(0,r.kt)("p",null,"You can follow those steps:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Make sure ",(0,r.kt)("a",{parentName:"li",href:"/docs/guides/libraries#compute-hash-for-files"},"File Hashing")," is enabled on the library."),(0,r.kt)("li",{parentName:"ol"},"Disable ",(0,r.kt)("a",{parentName:"li",href:"/docs/guides/trash#automatically-empty-trash"},"automatically emptying the trash")," for the library."),(0,r.kt)("li",{parentName:"ol"},"Perform a scan on the library and let all tasks finish. This will ensure all files are hashed."),(0,r.kt)("li",{parentName:"ol"},"Stop Komga."),(0,r.kt)("li",{parentName:"ol"},"Move/copy the files to the new folder."),(0,r.kt)("li",{parentName:"ol"},"Start Komga."),(0,r.kt)("li",{parentName:"ol"},"Edit the library and choose the new folder as the library root directory."),(0,r.kt)("li",{parentName:"ol"},"A scan will be triggered automatically after saving the library. The scan could take some time depending on the size of the library."),(0,r.kt)("li",{parentName:"ol"},"Once the scan is finished, the series and books should have been matched with the files in the new folder.")),(0,r.kt)("h2",{id:"scan-doesnt-pick-up-new-files-under-mergerfs"},"Scan doesn't pick up new files under mergerfs"),(0,r.kt)("p",null,"Add ",(0,r.kt)("inlineCode",{parentName:"p"},"func.getattr=newest")," to the options in your ",(0,r.kt)("inlineCode",{parentName:"p"},"/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. "),(0,r.kt)("p",null,"Example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell"},"/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")),(0,r.kt)("h2",{id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available"},"Docker on Raspberry PI arm32: No monotonic clock was available"),(0,r.kt)("p",null,"If you encounter the following message when starting the container:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-log"},"OpenJDK Server VM warning: No monotonic clock was available - timed services may be adversely affected if the time-of-day clock changes\n")),(0,r.kt)("p",null,"Your host system needs to have installed:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Docker version ",(0,r.kt)("inlineCode",{parentName:"li"},"19.03.9")," or newer"),(0,r.kt)("li",{parentName:"ul"},"libseccomp version ",(0,r.kt)("inlineCode",{parentName:"li"},"2.4.2")," or newer")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/08fb5848.f9024997.js b/assets/js/08fb5848.883b1683.js similarity index 52% rename from assets/js/08fb5848.f9024997.js rename to assets/js/08fb5848.883b1683.js index 9cc249b5..387ccf16 100644 --- a/assets/js/08fb5848.f9024997.js +++ b/assets/js/08fb5848.883b1683.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2865],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},g="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),g=p(r),m=a,d=g["".concat(u,".").concat(m)]||g[m]||c[m]||o;return r?n.createElement(d,i(i({ref:t},s),{},{components:r})):n.createElement(d,i({ref:t},s))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[g]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={slug:"prepare-v1",title:"Prepare for v1.0.0",authors:"gotson",tags:["breaking change","upgrade","komga"]},i=void 0,l={permalink:"/blog/prepare-v1",source:"@site/blog/2023-03-21-prepare-v1.md",title:"Prepare for v1.0.0",description:"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version.",date:"2023-03-21T00:00:00.000Z",formattedDate:"March 21, 2023",tags:[{label:"breaking change",permalink:"/blog/tags/breaking-change"},{label:"upgrade",permalink:"/blog/tags/upgrade"},{label:"komga",permalink:"/blog/tags/komga"}],readingTime:1.115,hasTruncateMarker:!1,authors:[{name:"gotson",title:"Developer of Komga",url:"https://github.com/gotson",imageURL:"https://github.com/gotson.png",key:"gotson"}],frontMatter:{slug:"prepare-v1",title:"Prepare for v1.0.0",authors:"gotson",tags:["breaking change","upgrade","komga"]}},u={authorsImageUrls:[void 0]},p=[{value:"Before upgrading",id:"before-upgrading",level:2},{value:"Breaking changes",id:"breaking-changes",level:2}],s={toc:p},g="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(g,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version."),(0,a.kt)("h2",{id:"before-upgrading"},"Before upgrading"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"If you run Docker, it is advisable to use the ",(0,a.kt)("inlineCode",{parentName:"li"},"0.x")," tag instead of ",(0,a.kt)("inlineCode",{parentName:"li"},"latest"),". You will be able to decide when you want to upgrade, especially if you are updating containers automatically."),(0,a.kt)("li",{parentName:"ul"},"Backup your ",(0,a.kt)("inlineCode",{parentName:"li"},"database.sqlite"),". You can find it in the configuration directory, by default:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"on Windows: ",(0,a.kt)("inlineCode",{parentName:"li"},"%USERPROFILE%/.komga/database.sqlite")),(0,a.kt)("li",{parentName:"ul"},"on Unix: ",(0,a.kt)("inlineCode",{parentName:"li"},"~/.komga/database.sqlite")),(0,a.kt)("li",{parentName:"ul"},"on Docker: in the directory you mounted as ",(0,a.kt)("inlineCode",{parentName:"li"},"/config"))))),(0,a.kt)("h2",{id:"breaking-changes"},"Breaking changes"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The minimum Java version required will be Java 17:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"If you run Komga using the ",(0,a.kt)("inlineCode",{parentName:"li"},"jar"),", you will need to make sure your Java version is sufficient by running ",(0,a.kt)("inlineCode",{parentName:"li"},"java -version"),"."),(0,a.kt)("li",{parentName:"ul"},"If you run Komga using Docker, you don't need to do anything."))),(0,a.kt)("li",{parentName:"ul"},"The hashing algorithm for files and pages will change. Previous hashes for files and pages will be deleted. On startup, if hashing is enabled, Komga will re-hash files and pages using the new algorithm."),(0,a.kt)("li",{parentName:"ul"},"The default port will be changed from ",(0,a.kt)("inlineCode",{parentName:"li"},"8080")," to ",(0,a.kt)("inlineCode",{parentName:"li"},"25600"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"If you use Docker, you will need to update your container or compose configuration to expose the new port."),(0,a.kt)("li",{parentName:"ul"},"You may need to adjust your reverse proxy settings."),(0,a.kt)("li",{parentName:"ul"},"You can still change the port ",(0,a.kt)("a",{parentName:"li",href:"/docs/installation/configuration#server_port--serverport-port"},"through configuration"),".")))))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2865],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},g="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),g=p(r),m=a,d=g["".concat(u,".").concat(m)]||g[m]||c[m]||o;return r?n.createElement(d,i(i({ref:t},s),{},{components:r})):n.createElement(d,i({ref:t},s))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[g]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={slug:"prepare-v1",title:"Prepare for v1.0.0",authors:"gotson",tags:["breaking change","upgrade","komga"]},i=void 0,l={permalink:"/blog/prepare-v1",source:"@site/blog/2023-03-21-prepare-v1.md",title:"Prepare for v1.0.0",description:"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version.",date:"2023-03-21T00:00:00.000Z",formattedDate:"March 21, 2023",tags:[{label:"breaking change",permalink:"/blog/tags/breaking-change"},{label:"upgrade",permalink:"/blog/tags/upgrade"},{label:"komga",permalink:"/blog/tags/komga"}],readingTime:1.115,hasTruncateMarker:!1,authors:[{name:"gotson",title:"Developer of Komga",url:"https://github.com/gotson",imageURL:"https://github.com/gotson.png",key:"gotson"}],frontMatter:{slug:"prepare-v1",title:"Prepare for v1.0.0",authors:"gotson",tags:["breaking change","upgrade","komga"]},prevItem:{title:"eBook support",permalink:"/blog/ebook-support"}},u={authorsImageUrls:[void 0]},p=[{value:"Before upgrading",id:"before-upgrading",level:2},{value:"Breaking changes",id:"breaking-changes",level:2}],s={toc:p},g="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(g,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version."),(0,a.kt)("h2",{id:"before-upgrading"},"Before upgrading"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"If you run Docker, it is advisable to use the ",(0,a.kt)("inlineCode",{parentName:"li"},"0.x")," tag instead of ",(0,a.kt)("inlineCode",{parentName:"li"},"latest"),". You will be able to decide when you want to upgrade, especially if you are updating containers automatically."),(0,a.kt)("li",{parentName:"ul"},"Backup your ",(0,a.kt)("inlineCode",{parentName:"li"},"database.sqlite"),". You can find it in the configuration directory, by default:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"on Windows: ",(0,a.kt)("inlineCode",{parentName:"li"},"%USERPROFILE%/.komga/database.sqlite")),(0,a.kt)("li",{parentName:"ul"},"on Unix: ",(0,a.kt)("inlineCode",{parentName:"li"},"~/.komga/database.sqlite")),(0,a.kt)("li",{parentName:"ul"},"on Docker: in the directory you mounted as ",(0,a.kt)("inlineCode",{parentName:"li"},"/config"))))),(0,a.kt)("h2",{id:"breaking-changes"},"Breaking changes"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The minimum Java version required will be Java 17:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"If you run Komga using the ",(0,a.kt)("inlineCode",{parentName:"li"},"jar"),", you will need to make sure your Java version is sufficient by running ",(0,a.kt)("inlineCode",{parentName:"li"},"java -version"),"."),(0,a.kt)("li",{parentName:"ul"},"If you run Komga using Docker, you don't need to do anything."))),(0,a.kt)("li",{parentName:"ul"},"The hashing algorithm for files and pages will change. Previous hashes for files and pages will be deleted. On startup, if hashing is enabled, Komga will re-hash files and pages using the new algorithm."),(0,a.kt)("li",{parentName:"ul"},"The default port will be changed from ",(0,a.kt)("inlineCode",{parentName:"li"},"8080")," to ",(0,a.kt)("inlineCode",{parentName:"li"},"25600"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"If you use Docker, you will need to update your container or compose configuration to expose the new port."),(0,a.kt)("li",{parentName:"ul"},"You may need to adjust your reverse proxy settings."),(0,a.kt)("li",{parentName:"ul"},"You can still change the port ",(0,a.kt)("a",{parentName:"li",href:"/docs/installation/configuration#server_port--serverport-port"},"through configuration"),".")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0920ba86.7a57e411.js b/assets/js/0920ba86.ef5fb0ab.js similarity index 98% rename from assets/js/0920ba86.7a57e411.js rename to assets/js/0920ba86.ef5fb0ab.js index 6aa3bb8a..99d56196 100644 --- a/assets/js/0920ba86.7a57e411.js +++ b/assets/js/0920ba86.ef5fb0ab.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2239],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var o=a.createContext({}),c=function(e){var t=a.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(o.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,s=e.originalType,o=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(r),g=n,m=d["".concat(o,".").concat(g)]||d[g]||p[g]||s;return r?a.createElement(m,i(i({ref:t},u),{},{components:r})):a.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=r.length,i=new Array(s);i[0]=g;var l={};for(var o in t)hasOwnProperty.call(t,o)&&(l[o]=t[o]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var a=r(7462),n=(r(7294),r(3905));const s={},i="User accounts",l={unversionedId:"guides/user-accounts",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/user-accounts.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",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={},c=[{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}],u={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"user-accounts"},"User accounts"),(0,n.kt)("p",null,"The administrator of a Komga server has the ability to create other User Accounts for that server."),(0,n.kt)("p",null,"You can manage Users in ",(0,n.kt)("em",{parentName:"p"},"Server Settings > Users"),"."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/users-management.png",style:{maxHeight:"300px"},alt:"Users management"}),(0,n.kt)("h2",{id:"creating-users"},"Creating Users"),(0,n.kt)("p",null,"You can add a user by clicking on the ",(0,n.kt)("em",{parentName:"p"},"+")," button."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/add-user.png",style:{maxHeight:"200px"},alt:"Add User"}),(0,n.kt)("p",null,"A dialog will show up. Fill in all the required information, and press ",(0,n.kt)("em",{parentName:"p"},"Add"),"."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/add-user-dialog.png",style:{maxHeight:"400px"},alt:"Add User Dialog"}),(0,n.kt)("h2",{id:"user-roles"},"User Roles"),(0,n.kt)("p",null,"Users can have different roles, giving them the ability to do certain things."),(0,n.kt)("h3",{id:"administrator"},"Administrator"),(0,n.kt)("p",null,"An administrator can perform all the management actions:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"add, edit, and delete libraries"),(0,n.kt)("li",{parentName:"ul"},"add, edit, and delete users"),(0,n.kt)("li",{parentName:"ul"},"add, edit, and delete collections"),(0,n.kt)("li",{parentName:"ul"},"edit series and book metadata"),(0,n.kt)("li",{parentName:"ul"},"manually scan, analyze and refresh metadata")),(0,n.kt)("h3",{id:"page-streaming"},"Page Streaming"),(0,n.kt)("p",null,"A user with this role will be able to stream individual pages, for example to read using the Webreader."),(0,n.kt)("h3",{id:"file-download"},"File Download"),(0,n.kt)("p",null,"A user with this role will be able to download the file of a book."),(0,n.kt)("h2",{id:"shared-libraries"},"Shared Libraries"),(0,n.kt)("p",null,"An administrator can limit what libraries users can access. This is done via the ",(0,n.kt)("em",{parentName:"p"},"Edit Restrictions")," button."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/edit-libraries.png",style:{maxHeight:"50px"},alt:"Edit Restrictions"}),(0,n.kt)("p",null,"Choose the libraries the user will be able to access, or select ",(0,n.kt)("em",{parentName:"p"},"All libraries")," for unrestricted access (default option)."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/edit-libraries-dialog.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),(0,n.kt)("h2",{id:"content-restrictions"},"Content Restrictions"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Content restriction is performed at series level, and will also apply to books, collections and reading lists. "),(0,n.kt)("h3",{id:"age-rating"},"Age Rating"),(0,n.kt)("p",null,"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."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/restriction-age-allow.png",style:{maxHeight:"400px"},alt:"Age Restriction Allow under"}),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/restriction-age-exclude.png",style:{maxHeight:"400px"},alt:"Age Restriction Exclude over"}),(0,n.kt)("h3",{id:"labels"},"Labels"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Labels are defined on Series:"),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/series-sharing.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),(0,n.kt)("h3",{id:"multiple-restrictions"},"Multiple restrictions"),(0,n.kt)("p",null,"When combining multiple restrictions, the following rules apply:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Exclusion rules have always priority over allow rules."),(0,n.kt)("li",{parentName:"ul"},"Allow rules apply with an ",(0,n.kt)("em",{parentName:"li"},"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.')),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/restrictions-dialog.png",style:{maxHeight:"400px"},alt:"Edit Restrictions"}),(0,n.kt)("h2",{id:"deleting-users"},"Deleting Users"),(0,n.kt)("admonition",{type:"danger"},(0,n.kt)("p",{parentName:"admonition"},"Deleting a user will remove all read progress for this user."),(0,n.kt)("p",{parentName:"admonition"},"This cannot be undone.")))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2239],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var o=a.createContext({}),c=function(e){var t=a.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(o.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,s=e.originalType,o=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(r),g=n,m=d["".concat(o,".").concat(g)]||d[g]||p[g]||s;return r?a.createElement(m,i(i({ref:t},u),{},{components:r})):a.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var s=r.length,i=new Array(s);i[0]=g;var l={};for(var o in t)hasOwnProperty.call(t,o)&&(l[o]=t[o]);l.originalType=e,l[d]="string"==typeof e?e:n,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var a=r(7462),n=(r(7294),r(3905));const s={},i="User accounts",l={unversionedId:"guides/user-accounts",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/user-accounts.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",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={},c=[{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}],u={toc:c},d="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"user-accounts"},"User accounts"),(0,n.kt)("p",null,"The administrator of a Komga server has the ability to create other User Accounts for that server."),(0,n.kt)("p",null,"You can manage Users in ",(0,n.kt)("em",{parentName:"p"},"Server Settings > Users"),"."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/users-management.png",style:{maxHeight:"300px"},alt:"Users management"}),(0,n.kt)("h2",{id:"creating-users"},"Creating Users"),(0,n.kt)("p",null,"You can add a user by clicking on the ",(0,n.kt)("em",{parentName:"p"},"+")," button."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/add-user.png",style:{maxHeight:"200px"},alt:"Add User"}),(0,n.kt)("p",null,"A dialog will show up. Fill in all the required information, and press ",(0,n.kt)("em",{parentName:"p"},"Add"),"."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/add-user-dialog.png",style:{maxHeight:"400px"},alt:"Add User Dialog"}),(0,n.kt)("h2",{id:"user-roles"},"User Roles"),(0,n.kt)("p",null,"Users can have different roles, giving them the ability to do certain things."),(0,n.kt)("h3",{id:"administrator"},"Administrator"),(0,n.kt)("p",null,"An administrator can perform all the management actions:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"add, edit, and delete libraries"),(0,n.kt)("li",{parentName:"ul"},"add, edit, and delete users"),(0,n.kt)("li",{parentName:"ul"},"add, edit, and delete collections"),(0,n.kt)("li",{parentName:"ul"},"edit series and book metadata"),(0,n.kt)("li",{parentName:"ul"},"manually scan, analyze and refresh metadata")),(0,n.kt)("h3",{id:"page-streaming"},"Page Streaming"),(0,n.kt)("p",null,"A user with this role will be able to stream individual pages, for example to read using the Webreader."),(0,n.kt)("h3",{id:"file-download"},"File Download"),(0,n.kt)("p",null,"A user with this role will be able to download the file of a book."),(0,n.kt)("h2",{id:"shared-libraries"},"Shared Libraries"),(0,n.kt)("p",null,"An administrator can limit what libraries users can access. This is done via the ",(0,n.kt)("em",{parentName:"p"},"Edit Restrictions")," button."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/edit-libraries.png",style:{maxHeight:"50px"},alt:"Edit Restrictions"}),(0,n.kt)("p",null,"Choose the libraries the user will be able to access, or select ",(0,n.kt)("em",{parentName:"p"},"All libraries")," for unrestricted access (default option)."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/edit-libraries-dialog.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),(0,n.kt)("h2",{id:"content-restrictions"},"Content Restrictions"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Content restriction is performed at series level, and will also apply to books, collections and reading lists. "),(0,n.kt)("h3",{id:"age-rating"},"Age Rating"),(0,n.kt)("p",null,"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."),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/restriction-age-allow.png",style:{maxHeight:"400px"},alt:"Age Restriction Allow under"}),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/restriction-age-exclude.png",style:{maxHeight:"400px"},alt:"Age Restriction Exclude over"}),(0,n.kt)("h3",{id:"labels"},"Labels"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Labels are defined on Series:"),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/series-sharing.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),(0,n.kt)("h3",{id:"multiple-restrictions"},"Multiple restrictions"),(0,n.kt)("p",null,"When combining multiple restrictions, the following rules apply:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Exclusion rules have always priority over allow rules."),(0,n.kt)("li",{parentName:"ul"},"Allow rules apply with an ",(0,n.kt)("em",{parentName:"li"},"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.')),(0,n.kt)("img",{src:"/assets/media/guides/user-accounts/restrictions-dialog.png",style:{maxHeight:"400px"},alt:"Edit Restrictions"}),(0,n.kt)("h2",{id:"deleting-users"},"Deleting Users"),(0,n.kt)("admonition",{type:"danger"},(0,n.kt)("p",{parentName:"admonition"},"Deleting a user will remove all read progress for this user."),(0,n.kt)("p",{parentName:"admonition"},"This cannot be undone.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0bf9748d.eb1b7092.js b/assets/js/0bf9748d.425b2712.js similarity index 99% rename from assets/js/0bf9748d.eb1b7092.js rename to assets/js/0bf9748d.425b2712.js index 3e014df4..140943d4 100644 --- a/assets/js/0bf9748d.eb1b7092.js +++ b/assets/js/0bf9748d.425b2712.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9847],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>c});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=i.createContext({}),d=function(e){var t=i.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},m=function(e){var t=d(e.components);return i.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),p=d(a),h=n,c=p["".concat(s,".").concat(h)]||p[h]||u[h]||l;return a?i.createElement(c,r(r({ref:t},m),{},{components:a})):i.createElement(c,r({ref:t},m))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,r=new Array(l);r[0]=h;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:n,r[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var i=a(7462),n=(a(7294),a(3905));const l={},r="Scanning, Analyzing and Refreshing Metadata",o={unversionedId:"guides/scan-analysis-refresh",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/scan-analysis-refresh.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Emptying Library Trash",permalink:"/docs/guides/trash"},next:{title:"Image Types",permalink:"/docs/guides/image-formats"}},s={},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}],m={toc:d},p="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,i.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"scanning-analyzing-and-refreshing-metadata"},"Scanning, Analyzing and Refreshing Metadata"),(0,n.kt)("p",null,"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."),(0,n.kt)("h2",{id:"scan-library-files"},"Scan Library Files"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"All files that have changed after a scan will be Analyzed."),(0,n.kt)("p",null,"You should Scan Library Files if you have:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added or deleted files or folders"),(0,n.kt)("li",{parentName:"ul"},"Renamed a file or folder"),(0,n.kt)("li",{parentName:"ul"},"Moved files or folders from one location to another")),(0,n.kt)("p",null,"By default, Komga will scan your libraries regularly."),(0,n.kt)("h3",{id:"deep-scan"},"Deep scan"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Trigger a Deep Scan if Komga is missing some books after a scan."),(0,n.kt)("h2",{id:"what-happens-during-a-scan"},"What happens during a Scan?"),(0,n.kt)("p",null,"Komga will generate a library representation of your files on disk. A Komga library does ",(0,n.kt)("em",{parentName:"p"},"not")," represent exactly your folder structure."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Komga will create a ",(0,n.kt)("em",{parentName:"li"},"Series")," for each subfolder of any library, whatever the depth of this subfolder in your directory structure"),(0,n.kt)("li",{parentName:"ul"},"Komga will create a ",(0,n.kt)("em",{parentName:"li"},"Book")," for each file found, and place it inside the ",(0,n.kt)("em",{parentName:"li"},"Series")," corresponding to the parent folder of the file")),(0,n.kt)("h2",{id:"analyze-books"},"Analyze books"),(0,n.kt)("p",null,"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."),(0,n.kt)("h3",{id:"what-happens-during-analysis"},"What happens during Analysis?"),(0,n.kt)("p",null,"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."),(0,n.kt)("h4",{id:"gather-media-properties"},"Gather media properties"),(0,n.kt)("p",null,"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:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Container: ZIP, RAR, EPUB, PDF, etc."),(0,n.kt)("li",{parentName:"ul"},"Images Format: JPEG, PNG, WEBP, etc.")),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"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."),(0,n.kt)("h4",{id:"generate-default-artwork"},"Generate default artwork"),(0,n.kt)("p",null,"During analysis, artwork will automatically be grabbed from a book file. The first page will be used for poster/thumbnail type purposes."),(0,n.kt)("h3",{id:"analyze-your-content"},"Analyze your content"),(0,n.kt)("p",null,"You can analyze content in multiple ways: for a book, for a series, or even for an entire Library."),(0,n.kt)("p",null,"Look for the action menu icon ",(0,n.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.kt)("em",{parentName:"p"},"Analyze"),"."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"Depending on the size of your Library, analysis may take a while.")),(0,n.kt)("h3",{id:"media-analysis-screen"},"Media Analysis screen"),(0,n.kt)("p",null,"You can check all the media for which the analysis did not succeed from the Media Analysis screen. You can access it from ",(0,n.kt)("em",{parentName:"p"},"Media Management > Media Analysis"),"."),(0,n.kt)("p",null,"It will show you all books with a status of:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Error: Komga could not analyze the book. If possible, there will be a comment to describe the error."),(0,n.kt)("li",{parentName:"ul"},"Unsupported: Komga does not support those files. The comment will give you more information.")),(0,n.kt)("a",{href:"/assets/media/guides/scan-analysis-refresh/media-analysis.png"},(0,n.kt)("img",{src:"/assets/media/guides/scan-analysis-refresh/media-analysis.png",style:{maxHeight:"400px"},alt:"Media Analysis"})),(0,n.kt)("h2",{id:"refresh-metadata"},"Refresh metadata"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"You should refresh a library or individual item if:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"You\u2019ve changed options for the library"),(0,n.kt)("li",{parentName:"ul"},'You\u2019ve added "local media assets" (such as artwork)')),(0,n.kt)("p",null,"Metadata is gathered from the following sources:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a local ",(0,n.kt)("inlineCode",{parentName:"li"},"ComicInfo.xml")," file located inside a CBZ or CBR"),(0,n.kt)("li",{parentName:"ul"},"the metadata of an EPUB file"),(0,n.kt)("li",{parentName:"ul"},"local media assets")),(0,n.kt)("p",null,"The metadata refresh is dependent of the options of the Library."),(0,n.kt)("h3",{id:"import-metadata-for-cbrcbz-containing-a-comicinfoxml-file"},"Import metadata for CBR/CBZ containing a ComicInfo.xml file"),(0,n.kt)("h4",{id:"book-metadata"},"Book metadata"),(0,n.kt)("p",null,"This will import the following elements from the ",(0,n.kt)("inlineCode",{parentName:"p"},"ComicInfo.xml")," file in Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Year"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Month"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"Day")," to form the ",(0,n.kt)("em",{parentName:"li"},"Release Date")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Writer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Penciller"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Inker"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Colorist"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Letterer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"CoverArtist"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Editor"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"Translator")," as ",(0,n.kt)("em",{parentName:"li"},"Authors")," with the according role. A value with multiple names separated by a ",(0,n.kt)("inlineCode",{parentName:"li"},",")," will be split in different authors."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Title"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Summary"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Number")," as their Komga equivalent"),(0,n.kt)("li",{parentName:"ul"},"Valid ",(0,n.kt)("inlineCode",{parentName:"li"},"Web")," links as a book link"),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"Tags")," element will be split by ",(0,n.kt)("inlineCode",{parentName:"li"},",")," and added to the book's ",(0,n.kt)("em",{parentName:"li"},"tags")),(0,n.kt)("li",{parentName:"ul"},"If the ",(0,n.kt)("inlineCode",{parentName:"li"},"GTIN")," element contains a valid ISBN, as the book's ",(0,n.kt)("em",{parentName:"li"},"ISBN"))),(0,n.kt)("h4",{id:"series-metadata"},"Series metadata"),(0,n.kt)("p",null,"This will import the following elements from the ",(0,n.kt)("inlineCode",{parentName:"p"},"ComicInfo.xml")," of the Series' books in Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"Series")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Volume")," elements will be used to overwrite the title of the Series, in the form ",(0,n.kt)("inlineCode",{parentName:"li"}," ()"),", or just ",(0,n.kt)("inlineCode",{parentName:"li"},"")," if the ",(0,n.kt)("inlineCode",{parentName:"li"},"Volume")," element is not present, if the ",(0,n.kt)("inlineCode",{parentName:"li"},"Volume")," is ",(0,n.kt)("inlineCode",{parentName:"li"},"1"),", or if ",(0,n.kt)("em",{parentName:"li"},"Append volume to series title")," is disabled. If multiple values are present, the most frequent value from all books will be used."),(0,n.kt)("li",{parentName:"ul"},"The various ",(0,n.kt)("inlineCode",{parentName:"li"},"AgeRating")," values will be converted to a number in Komga. The highest value from all books will be used."),(0,n.kt)("li",{parentName:"ul"},"The most frequent ",(0,n.kt)("inlineCode",{parentName:"li"},"Publisher")," value will be used as Komga's equivalent."),(0,n.kt)("li",{parentName:"ul"},"A ",(0,n.kt)("inlineCode",{parentName:"li"},"Manga")," element with the value ",(0,n.kt)("inlineCode",{parentName:"li"},"YesAndRightToLeft")," will mark the reading direction as ",(0,n.kt)("em",{parentName:"li"},"Right to left"),". The most frequent value from all books will be used."),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"Genre")," element will be split by ",(0,n.kt)("inlineCode",{parentName:"li"},","),". All genres from all books will be added to the Series."),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"LanguageISO")," element will be used as the Series' language. The most frequent value from all books will be used."),(0,n.kt)("li",{parentName:"ul"},"The highest value from ",(0,n.kt)("inlineCode",{parentName:"li"},"Count")," will be used as the total count of books.")),(0,n.kt)("h4",{id:"collections"},"Collections"),(0,n.kt)("p",null,"The ",(0,n.kt)("inlineCode",{parentName:"p"},"SeriesGroup")," element will be split by ",(0,n.kt)("inlineCode",{parentName:"p"},",")," and used to create collections with those names, or add the series to an existing collection if it exists."),(0,n.kt)("p",null,"If the ",(0,n.kt)("inlineCode",{parentName:"p"},"SeriesGroup")," element is set to different values in each book of the series, then each value of the elements will create a collection."),(0,n.kt)("h4",{id:"read-lists"},"Read lists"),(0,n.kt)("p",null,"The ",(0,n.kt)("inlineCode",{parentName:"p"},"AlternateSeries")," or ",(0,n.kt)("inlineCode",{parentName:"p"},"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."),(0,n.kt)("p",null,"If the ",(0,n.kt)("inlineCode",{parentName:"p"},"AlternateNumber")," element is set, it will be used to position the book in the read list."),(0,n.kt)("h5",{id:"storyarcnumber"},"StoryArcNumber"),(0,n.kt)("p",null,"If the ",(0,n.kt)("inlineCode",{parentName:"p"},"StoryArcNumber")," element is set, it will be used in conjunction with ",(0,n.kt)("inlineCode",{parentName:"p"},"StoryArc")," to position the book in the read list."),(0,n.kt)("p",null,"Both ",(0,n.kt)("inlineCode",{parentName:"p"},"StoryArc")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"StoryArcNumber")," elements can contain multiple values, separated by ",(0,n.kt)("inlineCode",{parentName:"p"},","),". Komga will do its best to match each pair:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"If both elements are set, but do not contain the same number of values, the extra values will not be used"),(0,n.kt)("li",{parentName:"ul"},"If there are invalid values, like blank strings or invalid numbers, the whole pair will be ignored")),(0,n.kt)("h3",{id:"import-metadata-from-epub-files"},"Import metadata from EPUB files"),(0,n.kt)("h4",{id:"book-metadata-1"},"Book metadata"),(0,n.kt)("p",null,"This will import the following fields from the Epub metadata in Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:title")," element as the ",(0,n.kt)("em",{parentName:"li"},"Title")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:description")," element as the ",(0,n.kt)("em",{parentName:"li"},"Summary")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:date")," element as the ",(0,n.kt)("em",{parentName:"li"},"Release date")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:identifier")," element as the ",(0,n.kt)("em",{parentName:"li"},"ISBN"),", if it is a valid ISBN"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:creator")," element as ",(0,n.kt)("em",{parentName:"li"},"Authors"),". The role will be imported either from the ",(0,n.kt)("inlineCode",{parentName:"li"},"opf:role")," property, or from a ",(0,n.kt)("inlineCode",{parentName:"li"},"meta")," element containing ",(0,n.kt)("inlineCode",{parentName:"li"},"role")," property and a ",(0,n.kt)("inlineCode",{parentName:"li"},"marc:relators")," scheme. A value with multiple names separated by a ",(0,n.kt)("inlineCode",{parentName:"li"},",")," will be split in different authors.")),(0,n.kt)("h4",{id:"series-metadata-1"},"Series metadata"),(0,n.kt)("p",null,"This will import the following fields from the Epub metadata in Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:publisher")," element as the ",(0,n.kt)("em",{parentName:"li"},"Publisher")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:language")," element as the ",(0,n.kt)("em",{parentName:"li"},"Language")),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"page-progression-direction")," property of the ",(0,n.kt)("inlineCode",{parentName:"li"},"spine")," element as the ",(0,n.kt)("em",{parentName:"li"},"Reading direction")),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"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.")),(0,n.kt)("h3",{id:"import-metadata-generated-by-mylar"},"Import metadata generated by Mylar"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://github.com/mylar3/mylar3"},"Mylar")," can generate a ",(0,n.kt)("inlineCode",{parentName:"p"},"series.json")," file inside your Series folders. This option will import the following fields into Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"name")," field will be used for the Series title. If the ",(0,n.kt)("inlineCode",{parentName:"li"},"volume")," field is set and is different from ",(0,n.kt)("inlineCode",{parentName:"li"},"1"),", then the ",(0,n.kt)("inlineCode",{parentName:"li"},"year")," field will be appended to the title, in the form ",(0,n.kt)("inlineCode",{parentName:"li"}," ()"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"status")," will be used to set the Series status."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"description_formatted")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"description_text")," will be used for the Series summary."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"publisher")," will be used for the Series publisher."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"age_rating")," will be used for the Series age rating."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"total_issues")," will be used for the total count of books.")),(0,n.kt)("h3",{id:"import-local-media-assets"},"Import local media assets"),(0,n.kt)("h4",{id:"local-artwork"},"Local artwork"),(0,n.kt)("p",null,"This will enable import for local artwork, check the ",(0,n.kt)("a",{parentName:"p",href:"local-artwork-assets"},"Local Artwork Assets")," section for more information."),(0,n.kt)("h3",{id:"import-isbn-within-barcode"},"Import ISBN within barcode"),(0,n.kt)("h4",{id:"isbn-barcode"},"ISBN barcode"),(0,n.kt)("p",null,"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."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9847],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>c});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=i.createContext({}),d=function(e){var t=i.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},m=function(e){var t=d(e.components);return i.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,s=e.parentName,m=o(e,["components","mdxType","originalType","parentName"]),p=d(a),h=n,c=p["".concat(s,".").concat(h)]||p[h]||u[h]||l;return a?i.createElement(c,r(r({ref:t},m),{},{components:a})):i.createElement(c,r({ref:t},m))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,r=new Array(l);r[0]=h;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:n,r[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var i=a(7462),n=(a(7294),a(3905));const l={},r="Scanning, Analyzing and Refreshing Metadata",o={unversionedId:"guides/scan-analysis-refresh",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/scan-analysis-refresh.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Emptying Library Trash",permalink:"/docs/guides/trash"},next:{title:"Image Types",permalink:"/docs/guides/image-formats"}},s={},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}],m={toc:d},p="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,i.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"scanning-analyzing-and-refreshing-metadata"},"Scanning, Analyzing and Refreshing Metadata"),(0,n.kt)("p",null,"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."),(0,n.kt)("h2",{id:"scan-library-files"},"Scan Library Files"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"All files that have changed after a scan will be Analyzed."),(0,n.kt)("p",null,"You should Scan Library Files if you have:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added or deleted files or folders"),(0,n.kt)("li",{parentName:"ul"},"Renamed a file or folder"),(0,n.kt)("li",{parentName:"ul"},"Moved files or folders from one location to another")),(0,n.kt)("p",null,"By default, Komga will scan your libraries regularly."),(0,n.kt)("h3",{id:"deep-scan"},"Deep scan"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Trigger a Deep Scan if Komga is missing some books after a scan."),(0,n.kt)("h2",{id:"what-happens-during-a-scan"},"What happens during a Scan?"),(0,n.kt)("p",null,"Komga will generate a library representation of your files on disk. A Komga library does ",(0,n.kt)("em",{parentName:"p"},"not")," represent exactly your folder structure."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Komga will create a ",(0,n.kt)("em",{parentName:"li"},"Series")," for each subfolder of any library, whatever the depth of this subfolder in your directory structure"),(0,n.kt)("li",{parentName:"ul"},"Komga will create a ",(0,n.kt)("em",{parentName:"li"},"Book")," for each file found, and place it inside the ",(0,n.kt)("em",{parentName:"li"},"Series")," corresponding to the parent folder of the file")),(0,n.kt)("h2",{id:"analyze-books"},"Analyze books"),(0,n.kt)("p",null,"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."),(0,n.kt)("h3",{id:"what-happens-during-analysis"},"What happens during Analysis?"),(0,n.kt)("p",null,"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."),(0,n.kt)("h4",{id:"gather-media-properties"},"Gather media properties"),(0,n.kt)("p",null,"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:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Container: ZIP, RAR, EPUB, PDF, etc."),(0,n.kt)("li",{parentName:"ul"},"Images Format: JPEG, PNG, WEBP, etc.")),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"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."),(0,n.kt)("h4",{id:"generate-default-artwork"},"Generate default artwork"),(0,n.kt)("p",null,"During analysis, artwork will automatically be grabbed from a book file. The first page will be used for poster/thumbnail type purposes."),(0,n.kt)("h3",{id:"analyze-your-content"},"Analyze your content"),(0,n.kt)("p",null,"You can analyze content in multiple ways: for a book, for a series, or even for an entire Library."),(0,n.kt)("p",null,"Look for the action menu icon ",(0,n.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.kt)("em",{parentName:"p"},"Analyze"),"."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"Depending on the size of your Library, analysis may take a while.")),(0,n.kt)("h3",{id:"media-analysis-screen"},"Media Analysis screen"),(0,n.kt)("p",null,"You can check all the media for which the analysis did not succeed from the Media Analysis screen. You can access it from ",(0,n.kt)("em",{parentName:"p"},"Media Management > Media Analysis"),"."),(0,n.kt)("p",null,"It will show you all books with a status of:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Error: Komga could not analyze the book. If possible, there will be a comment to describe the error."),(0,n.kt)("li",{parentName:"ul"},"Unsupported: Komga does not support those files. The comment will give you more information.")),(0,n.kt)("a",{href:"/assets/media/guides/scan-analysis-refresh/media-analysis.png"},(0,n.kt)("img",{src:"/assets/media/guides/scan-analysis-refresh/media-analysis.png",style:{maxHeight:"400px"},alt:"Media Analysis"})),(0,n.kt)("h2",{id:"refresh-metadata"},"Refresh metadata"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"You should refresh a library or individual item if:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"You\u2019ve changed options for the library"),(0,n.kt)("li",{parentName:"ul"},'You\u2019ve added "local media assets" (such as artwork)')),(0,n.kt)("p",null,"Metadata is gathered from the following sources:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"a local ",(0,n.kt)("inlineCode",{parentName:"li"},"ComicInfo.xml")," file located inside a CBZ or CBR"),(0,n.kt)("li",{parentName:"ul"},"the metadata of an EPUB file"),(0,n.kt)("li",{parentName:"ul"},"local media assets")),(0,n.kt)("p",null,"The metadata refresh is dependent of the options of the Library."),(0,n.kt)("h3",{id:"import-metadata-for-cbrcbz-containing-a-comicinfoxml-file"},"Import metadata for CBR/CBZ containing a ComicInfo.xml file"),(0,n.kt)("h4",{id:"book-metadata"},"Book metadata"),(0,n.kt)("p",null,"This will import the following elements from the ",(0,n.kt)("inlineCode",{parentName:"p"},"ComicInfo.xml")," file in Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Year"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Month"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"Day")," to form the ",(0,n.kt)("em",{parentName:"li"},"Release Date")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Writer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Penciller"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Inker"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Colorist"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Letterer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"CoverArtist"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Editor"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"Translator")," as ",(0,n.kt)("em",{parentName:"li"},"Authors")," with the according role. A value with multiple names separated by a ",(0,n.kt)("inlineCode",{parentName:"li"},",")," will be split in different authors."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Title"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Summary"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Number")," as their Komga equivalent"),(0,n.kt)("li",{parentName:"ul"},"Valid ",(0,n.kt)("inlineCode",{parentName:"li"},"Web")," links as a book link"),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"Tags")," element will be split by ",(0,n.kt)("inlineCode",{parentName:"li"},",")," and added to the book's ",(0,n.kt)("em",{parentName:"li"},"tags")),(0,n.kt)("li",{parentName:"ul"},"If the ",(0,n.kt)("inlineCode",{parentName:"li"},"GTIN")," element contains a valid ISBN, as the book's ",(0,n.kt)("em",{parentName:"li"},"ISBN"))),(0,n.kt)("h4",{id:"series-metadata"},"Series metadata"),(0,n.kt)("p",null,"This will import the following elements from the ",(0,n.kt)("inlineCode",{parentName:"p"},"ComicInfo.xml")," of the Series' books in Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"Series")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Volume")," elements will be used to overwrite the title of the Series, in the form ",(0,n.kt)("inlineCode",{parentName:"li"}," ()"),", or just ",(0,n.kt)("inlineCode",{parentName:"li"},"")," if the ",(0,n.kt)("inlineCode",{parentName:"li"},"Volume")," element is not present, if the ",(0,n.kt)("inlineCode",{parentName:"li"},"Volume")," is ",(0,n.kt)("inlineCode",{parentName:"li"},"1"),", or if ",(0,n.kt)("em",{parentName:"li"},"Append volume to series title")," is disabled. If multiple values are present, the most frequent value from all books will be used."),(0,n.kt)("li",{parentName:"ul"},"The various ",(0,n.kt)("inlineCode",{parentName:"li"},"AgeRating")," values will be converted to a number in Komga. The highest value from all books will be used."),(0,n.kt)("li",{parentName:"ul"},"The most frequent ",(0,n.kt)("inlineCode",{parentName:"li"},"Publisher")," value will be used as Komga's equivalent."),(0,n.kt)("li",{parentName:"ul"},"A ",(0,n.kt)("inlineCode",{parentName:"li"},"Manga")," element with the value ",(0,n.kt)("inlineCode",{parentName:"li"},"YesAndRightToLeft")," will mark the reading direction as ",(0,n.kt)("em",{parentName:"li"},"Right to left"),". The most frequent value from all books will be used."),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"Genre")," element will be split by ",(0,n.kt)("inlineCode",{parentName:"li"},","),". All genres from all books will be added to the Series."),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"LanguageISO")," element will be used as the Series' language. The most frequent value from all books will be used."),(0,n.kt)("li",{parentName:"ul"},"The highest value from ",(0,n.kt)("inlineCode",{parentName:"li"},"Count")," will be used as the total count of books.")),(0,n.kt)("h4",{id:"collections"},"Collections"),(0,n.kt)("p",null,"The ",(0,n.kt)("inlineCode",{parentName:"p"},"SeriesGroup")," element will be split by ",(0,n.kt)("inlineCode",{parentName:"p"},",")," and used to create collections with those names, or add the series to an existing collection if it exists."),(0,n.kt)("p",null,"If the ",(0,n.kt)("inlineCode",{parentName:"p"},"SeriesGroup")," element is set to different values in each book of the series, then each value of the elements will create a collection."),(0,n.kt)("h4",{id:"read-lists"},"Read lists"),(0,n.kt)("p",null,"The ",(0,n.kt)("inlineCode",{parentName:"p"},"AlternateSeries")," or ",(0,n.kt)("inlineCode",{parentName:"p"},"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."),(0,n.kt)("p",null,"If the ",(0,n.kt)("inlineCode",{parentName:"p"},"AlternateNumber")," element is set, it will be used to position the book in the read list."),(0,n.kt)("h5",{id:"storyarcnumber"},"StoryArcNumber"),(0,n.kt)("p",null,"If the ",(0,n.kt)("inlineCode",{parentName:"p"},"StoryArcNumber")," element is set, it will be used in conjunction with ",(0,n.kt)("inlineCode",{parentName:"p"},"StoryArc")," to position the book in the read list."),(0,n.kt)("p",null,"Both ",(0,n.kt)("inlineCode",{parentName:"p"},"StoryArc")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"StoryArcNumber")," elements can contain multiple values, separated by ",(0,n.kt)("inlineCode",{parentName:"p"},","),". Komga will do its best to match each pair:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"If both elements are set, but do not contain the same number of values, the extra values will not be used"),(0,n.kt)("li",{parentName:"ul"},"If there are invalid values, like blank strings or invalid numbers, the whole pair will be ignored")),(0,n.kt)("h3",{id:"import-metadata-from-epub-files"},"Import metadata from EPUB files"),(0,n.kt)("h4",{id:"book-metadata-1"},"Book metadata"),(0,n.kt)("p",null,"This will import the following fields from the Epub metadata in Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:title")," element as the ",(0,n.kt)("em",{parentName:"li"},"Title")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:description")," element as the ",(0,n.kt)("em",{parentName:"li"},"Summary")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:date")," element as the ",(0,n.kt)("em",{parentName:"li"},"Release date")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:identifier")," element as the ",(0,n.kt)("em",{parentName:"li"},"ISBN"),", if it is a valid ISBN"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:creator")," element as ",(0,n.kt)("em",{parentName:"li"},"Authors"),". The role will be imported either from the ",(0,n.kt)("inlineCode",{parentName:"li"},"opf:role")," property, or from a ",(0,n.kt)("inlineCode",{parentName:"li"},"meta")," element containing ",(0,n.kt)("inlineCode",{parentName:"li"},"role")," property and a ",(0,n.kt)("inlineCode",{parentName:"li"},"marc:relators")," scheme. A value with multiple names separated by a ",(0,n.kt)("inlineCode",{parentName:"li"},",")," will be split in different authors.")),(0,n.kt)("h4",{id:"series-metadata-1"},"Series metadata"),(0,n.kt)("p",null,"This will import the following fields from the Epub metadata in Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:publisher")," element as the ",(0,n.kt)("em",{parentName:"li"},"Publisher")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"dc:language")," element as the ",(0,n.kt)("em",{parentName:"li"},"Language")),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"page-progression-direction")," property of the ",(0,n.kt)("inlineCode",{parentName:"li"},"spine")," element as the ",(0,n.kt)("em",{parentName:"li"},"Reading direction")),(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"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.")),(0,n.kt)("h3",{id:"import-metadata-generated-by-mylar"},"Import metadata generated by Mylar"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://github.com/mylar3/mylar3"},"Mylar")," can generate a ",(0,n.kt)("inlineCode",{parentName:"p"},"series.json")," file inside your Series folders. This option will import the following fields into Komga:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The ",(0,n.kt)("inlineCode",{parentName:"li"},"name")," field will be used for the Series title. If the ",(0,n.kt)("inlineCode",{parentName:"li"},"volume")," field is set and is different from ",(0,n.kt)("inlineCode",{parentName:"li"},"1"),", then the ",(0,n.kt)("inlineCode",{parentName:"li"},"year")," field will be appended to the title, in the form ",(0,n.kt)("inlineCode",{parentName:"li"}," ()"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"status")," will be used to set the Series status."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"description_formatted")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"description_text")," will be used for the Series summary."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"publisher")," will be used for the Series publisher."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"age_rating")," will be used for the Series age rating."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"total_issues")," will be used for the total count of books.")),(0,n.kt)("h3",{id:"import-local-media-assets"},"Import local media assets"),(0,n.kt)("h4",{id:"local-artwork"},"Local artwork"),(0,n.kt)("p",null,"This will enable import for local artwork, check the ",(0,n.kt)("a",{parentName:"p",href:"local-artwork-assets"},"Local Artwork Assets")," section for more information."),(0,n.kt)("h3",{id:"import-isbn-within-barcode"},"Import ISBN within barcode"),(0,n.kt)("h4",{id:"isbn-barcode"},"ISBN barcode"),(0,n.kt)("p",null,"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."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0c5c2428.e21d0c9c.js b/assets/js/0c5c2428.2d8a6d71.js similarity index 98% rename from assets/js/0c5c2428.e21d0c9c.js rename to assets/js/0c5c2428.2d8a6d71.js index fa6f1cd2..c110f367 100644 --- a/assets/js/0c5c2428.e21d0c9c.js +++ b/assets/js/0c5c2428.2d8a6d71.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6236],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),m=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=m(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=m(n),d=r,f=c["".concat(p,".").concat(d)]||c[d]||u[d]||o;return n?a.createElement(f,i(i({ref:t},s),{},{components:n})):a.createElement(f,i({ref:t},s))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var m=2;m{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>m});var a=n(7462),r=(n(7294),n(3905));const o={},i="Run with the Jar file",l={unversionedId:"installation/jar",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/jar.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Run with Docker",permalink:"/docs/installation/docker"},next:{title:"Install via third-party integrations",permalink:"/docs/installation/thirdparty"}},p={},m=[{value:"Increase memory limit",id:"increase-memory-limit",level:2},{value:"Updating",id:"updating",level:2}],s={toc:m},c="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"run-with-the-jar-file"},"Run with the Jar file"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"You need Java version 17+ to run Komga. Check your version with ",(0,r.kt)("inlineCode",{parentName:"p"},"java -version"),".")),(0,r.kt)("p",null,"You can run Komga from the fat ",(0,r.kt)("inlineCode",{parentName:"p"},"jar")," file. You can download them in the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga/releases"},"releases")," section."),(0,r.kt)("p",null,"In order to run Komga, use the following command (replace ",(0,r.kt)("inlineCode",{parentName:"p"},"x.y.z")," with the actual version number):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"java -jar komga-x.y.z.jar\n")),(0,r.kt)("p",null,"Once Komga is started, you can access the ",(0,r.kt)("a",{parentName:"p",href:"../guides/webui"},"web interface"),"."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"On Windows, use ",(0,r.kt)("inlineCode",{parentName:"p"},"javaw")," instead of ",(0,r.kt)("inlineCode",{parentName:"p"},"java")," to launch Komga ",(0,r.kt)("em",{parentName:"p"},"without")," a command prompt window appearing.")),(0,r.kt)("h2",{id:"increase-memory-limit"},"Increase memory limit"),(0,r.kt)("p",null,"By default the ",(0,r.kt)("inlineCode",{parentName:"p"},"java")," process will be limited in the maximum amount of memory (RAM) it can use, usually 1gb. If you encounter some ",(0,r.kt)("inlineCode",{parentName:"p"},"OutOfMemoryException")," in the logs you probably need to increase the maximum memory Komga can use."),(0,r.kt)("p",null,"To do so, you can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"-Xmx")," command line flag, where ",(0,r.kt)("inlineCode",{parentName:"p"},"")," can be any amount like ",(0,r.kt)("inlineCode",{parentName:"p"},"2048m"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"4g")," etc. For example to run Komga with a maximum of 4gb of memory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"java -jar -Xmx4g komga-x.y.z.jar\n")),(0,r.kt)("h2",{id:"updating"},"Updating"),(0,r.kt)("p",null,"To update just stop Komga, then start it with the latest ",(0,r.kt)("inlineCode",{parentName:"p"},"jar"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6236],{3905:(e,t,n)=>{n.d(t,{Zo:()=>s,kt:()=>f});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),m=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=m(e.components);return a.createElement(p.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),c=m(n),d=r,f=c["".concat(p,".").concat(d)]||c[d]||u[d]||o;return n?a.createElement(f,i(i({ref:t},s),{},{components:n})):a.createElement(f,i({ref:t},s))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var m=2;m{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>m});var a=n(7462),r=(n(7294),n(3905));const o={},i="Run with the Jar file",l={unversionedId:"installation/jar",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/jar.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Run with Docker",permalink:"/docs/installation/docker"},next:{title:"Install via third-party integrations",permalink:"/docs/installation/thirdparty"}},p={},m=[{value:"Increase memory limit",id:"increase-memory-limit",level:2},{value:"Updating",id:"updating",level:2}],s={toc:m},c="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"run-with-the-jar-file"},"Run with the Jar file"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"You need Java version 17+ to run Komga. Check your version with ",(0,r.kt)("inlineCode",{parentName:"p"},"java -version"),".")),(0,r.kt)("p",null,"You can run Komga from the fat ",(0,r.kt)("inlineCode",{parentName:"p"},"jar")," file. You can download them in the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga/releases"},"releases")," section."),(0,r.kt)("p",null,"In order to run Komga, use the following command (replace ",(0,r.kt)("inlineCode",{parentName:"p"},"x.y.z")," with the actual version number):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"java -jar komga-x.y.z.jar\n")),(0,r.kt)("p",null,"Once Komga is started, you can access the ",(0,r.kt)("a",{parentName:"p",href:"../guides/webui"},"web interface"),"."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"On Windows, use ",(0,r.kt)("inlineCode",{parentName:"p"},"javaw")," instead of ",(0,r.kt)("inlineCode",{parentName:"p"},"java")," to launch Komga ",(0,r.kt)("em",{parentName:"p"},"without")," a command prompt window appearing.")),(0,r.kt)("h2",{id:"increase-memory-limit"},"Increase memory limit"),(0,r.kt)("p",null,"By default the ",(0,r.kt)("inlineCode",{parentName:"p"},"java")," process will be limited in the maximum amount of memory (RAM) it can use, usually 1gb. If you encounter some ",(0,r.kt)("inlineCode",{parentName:"p"},"OutOfMemoryException")," in the logs you probably need to increase the maximum memory Komga can use."),(0,r.kt)("p",null,"To do so, you can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"-Xmx")," command line flag, where ",(0,r.kt)("inlineCode",{parentName:"p"},"")," can be any amount like ",(0,r.kt)("inlineCode",{parentName:"p"},"2048m"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"4g")," etc. For example to run Komga with a maximum of 4gb of memory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"java -jar -Xmx4g komga-x.y.z.jar\n")),(0,r.kt)("h2",{id:"updating"},"Updating"),(0,r.kt)("p",null,"To update just stop Komga, then start it with the latest ",(0,r.kt)("inlineCode",{parentName:"p"},"jar"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1bb85636.cb145131.js b/assets/js/1bb85636.b6683509.js similarity index 99% rename from assets/js/1bb85636.cb145131.js rename to assets/js/1bb85636.b6683509.js index 6344b86d..d0b0768b 100644 --- a/assets/js/1bb85636.cb145131.js +++ b/assets/js/1bb85636.b6683509.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9844],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(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 i(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}var u=r.createContext({}),d=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=d(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),m=o,h=p["".concat(u,".").concat(m)]||p[m]||l[m]||a;return n?r.createElement(h,i(i({ref:t},c),{},{components:n})):r.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var r=n(7462),o=(n(7294),n(3905));const a={},i="Read with Chunky Reader (iPad)",s={unversionedId:"guides/chunky",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/chunky.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Panels on iOS",permalink:"/docs/guides/panels"},next:{title:"Theme",permalink:"/docs/guides/theme"}},u={},d=[{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}],c={toc:d},p="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"read-with-chunky-reader-ipad"},"Read with Chunky Reader (iPad)"),(0,o.kt)("admonition",{title:"Note",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"Chunky Reader does not work anymore with Komga 1.4.0+")),(0,o.kt)("h2",{id:"background"},"Background"),(0,o.kt)("p",null,"Thanks to Komga's OPDS support, you can use the ",(0,o.kt)("a",{parentName:"p",href:"https://apps.apple.com/app/id663567628"},"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."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Please note that Chunky Reader's OPDS support requires the in app purchase which costs $3.99 or the equivalent of your local currency.")),(0,o.kt)("h2",{id:"adding-your-komga-server-to-chunky"},"Adding your Komga server to Chunky"),(0,o.kt)("p",null,"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.kt)("inlineCode",{parentName:"p"},"/dashboard")," part which is added automatically when you log in, and then append ",(0,o.kt)("inlineCode",{parentName:"p"},"/opds/v1.2/catalog")," to the end of the URL and press return."),(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/safari-check1.png"}),(0,o.kt)("p",null,"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."),(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/safari-check2.png"}),(0,o.kt)("p",null,"Open Chunky Reader and click the cloud icon, circled in red in the screenshot below."),(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/cloud-symbol.png"}),(0,o.kt)("p",null,"In the pop up window, click the plus button, circled in red in the screenshot below."),(0,o.kt)("div",{class:"text--center"},(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/plus-button.png",width:"300"})),(0,o.kt)("p",null,'Now choose the green plus button next to "Calibre/Ubooquity/OPDS".'),(0,o.kt)("div",{class:"text--center"},(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/opds-option.png",width:"300"})),(0,o.kt)("p",null,"In this dialogue box, enter your ",(0,o.kt)("em",{parentName:"p"},"server address")," (paste from the earlier step if you copied it to clipboard), ",(0,o.kt)("em",{parentName:"p"},"username"),", and ",(0,o.kt)("em",{parentName:"p"},"password"),". Then click ",(0,o.kt)("em",{parentName:"p"},"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.kt)("em",{parentName:"p"},"All")," button in the bottom right of the menu."),(0,o.kt)("div",{class:"text--center"},(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/list-view.png",width:"300"})),(0,o.kt)("h2",{id:"limitations"},"Limitations"),(0,o.kt)("p",null,"Reading comics via Chunky Reader ",(0,o.kt)("strong",{parentName:"p"},"does not")," update the read progress. This means you will need to manually mark your comics as read via the web UI."))}l.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9844],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(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 i(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}var u=r.createContext({}),d=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=d(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",l={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),m=o,h=p["".concat(u,".").concat(m)]||p[m]||l[m]||a;return n?r.createElement(h,i(i({ref:t},c),{},{components:n})):r.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var r=n(7462),o=(n(7294),n(3905));const a={},i="Read with Chunky Reader (iPad)",s={unversionedId:"guides/chunky",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/chunky.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Panels on iOS",permalink:"/docs/guides/panels"},next:{title:"Theme",permalink:"/docs/guides/theme"}},u={},d=[{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}],c={toc:d},p="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"read-with-chunky-reader-ipad"},"Read with Chunky Reader (iPad)"),(0,o.kt)("admonition",{title:"Note",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"Chunky Reader does not work anymore with Komga 1.4.0+")),(0,o.kt)("h2",{id:"background"},"Background"),(0,o.kt)("p",null,"Thanks to Komga's OPDS support, you can use the ",(0,o.kt)("a",{parentName:"p",href:"https://apps.apple.com/app/id663567628"},"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."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Please note that Chunky Reader's OPDS support requires the in app purchase which costs $3.99 or the equivalent of your local currency.")),(0,o.kt)("h2",{id:"adding-your-komga-server-to-chunky"},"Adding your Komga server to Chunky"),(0,o.kt)("p",null,"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.kt)("inlineCode",{parentName:"p"},"/dashboard")," part which is added automatically when you log in, and then append ",(0,o.kt)("inlineCode",{parentName:"p"},"/opds/v1.2/catalog")," to the end of the URL and press return."),(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/safari-check1.png"}),(0,o.kt)("p",null,"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."),(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/safari-check2.png"}),(0,o.kt)("p",null,"Open Chunky Reader and click the cloud icon, circled in red in the screenshot below."),(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/cloud-symbol.png"}),(0,o.kt)("p",null,"In the pop up window, click the plus button, circled in red in the screenshot below."),(0,o.kt)("div",{class:"text--center"},(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/plus-button.png",width:"300"})),(0,o.kt)("p",null,'Now choose the green plus button next to "Calibre/Ubooquity/OPDS".'),(0,o.kt)("div",{class:"text--center"},(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/opds-option.png",width:"300"})),(0,o.kt)("p",null,"In this dialogue box, enter your ",(0,o.kt)("em",{parentName:"p"},"server address")," (paste from the earlier step if you copied it to clipboard), ",(0,o.kt)("em",{parentName:"p"},"username"),", and ",(0,o.kt)("em",{parentName:"p"},"password"),". Then click ",(0,o.kt)("em",{parentName:"p"},"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.kt)("em",{parentName:"p"},"All")," button in the bottom right of the menu."),(0,o.kt)("div",{class:"text--center"},(0,o.kt)("img",{src:"/assets/media/guides/chunky-setup/list-view.png",width:"300"})),(0,o.kt)("h2",{id:"limitations"},"Limitations"),(0,o.kt)("p",null,"Reading comics via Chunky Reader ",(0,o.kt)("strong",{parentName:"p"},"does not")," update the read progress. This means you will need to manually mark your comics as read via the web UI."))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1ec3b236.8c365432.js b/assets/js/1ec3b236.af6d82d2.js similarity index 98% rename from assets/js/1ec3b236.8c365432.js rename to assets/js/1ec3b236.af6d82d2.js index 4ba0fe7a..1ca1199c 100644 --- a/assets/js/1ec3b236.8c365432.js +++ b/assets/js/1ec3b236.af6d82d2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7021],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},c),{},{components:r})):n.createElement(f,l({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(7462),a=(r(7294),r(3905));const o={},l="Command Line Interface",i={unversionedId:"guides/cli",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/cli.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Announcements",permalink:"/docs/guides/announcements"},next:{title:"Contribution",permalink:"/docs/contribution"}},s={},u=[{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}],c={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"command-line-interface"},"Command Line Interface"),(0,a.kt)("p",null,"Komga offers a few commands available from the command line."),(0,a.kt)("h2",{id:"how-to-use"},"How to use?"),(0,a.kt)("p",null,"You just need to append the command to the command line. Note that Komga will still start and run as usual."),(0,a.kt)("h3",{id:"with-the-jar-file"},"With the ",(0,a.kt)("inlineCode",{parentName:"h3"},"jar")," file"),(0,a.kt)("p",null,"Example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"java -jar komga-x.y.z.jar --list-users\n")),(0,a.kt)("h3",{id:"with-docker-run"},"With docker run"),(0,a.kt)("p",null,"Example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"docker run ghcr.io/gotson/komga:latest --list-users\n")),(0,a.kt)("h3",{id:"with-docker-compose"},"With docker-compose"),(0,a.kt)("p",null,"You can override the ",(0,a.kt)("inlineCode",{parentName:"p"},"command"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"services:\n komga:\n image: gotson/komga:latest\n command: --newpassword=toto --reset=admin@example.org\n")),(0,a.kt)("h2",{id:"available-commands"},"Available commands"),(0,a.kt)("h3",{id:"list-users"},"List users"),(0,a.kt)("p",null,"Command: ",(0,a.kt)("inlineCode",{parentName:"p"},"--list-users")),(0,a.kt)("p",null,"This will output all the users configured in the database. The output will be shown in the console or the logs."),(0,a.kt)("p",null,"Example:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"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]")),(0,a.kt)("h3",{id:"reset-password-for-a-user"},"Reset password for a user"),(0,a.kt)("p",null,"Command: ",(0,a.kt)("inlineCode",{parentName:"p"},"--reset=user@domain.com --newpassword=YourNewPassword")),(0,a.kt)("p",null,"This will reset the password for the specified user."),(0,a.kt)("p",null,"Example:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"2023-08-02T13:50:42.998+08:00 INFO 2806 --- [ main] o.g.k.i.apprunner.PasswordResetRunner : Reset password for user: admin@example.org")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7021],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(f,l(l({ref:t},c),{},{components:r})):n.createElement(f,l({ref:t},c))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:a,l[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(7462),a=(r(7294),r(3905));const o={},l="Command Line Interface",i={unversionedId:"guides/cli",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/cli.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Announcements",permalink:"/docs/guides/announcements"},next:{title:"Contribution",permalink:"/docs/contribution"}},s={},u=[{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}],c={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"command-line-interface"},"Command Line Interface"),(0,a.kt)("p",null,"Komga offers a few commands available from the command line."),(0,a.kt)("h2",{id:"how-to-use"},"How to use?"),(0,a.kt)("p",null,"You just need to append the command to the command line. Note that Komga will still start and run as usual."),(0,a.kt)("h3",{id:"with-the-jar-file"},"With the ",(0,a.kt)("inlineCode",{parentName:"h3"},"jar")," file"),(0,a.kt)("p",null,"Example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"java -jar komga-x.y.z.jar --list-users\n")),(0,a.kt)("h3",{id:"with-docker-run"},"With docker run"),(0,a.kt)("p",null,"Example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"docker run ghcr.io/gotson/komga:latest --list-users\n")),(0,a.kt)("h3",{id:"with-docker-compose"},"With docker-compose"),(0,a.kt)("p",null,"You can override the ",(0,a.kt)("inlineCode",{parentName:"p"},"command"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"services:\n komga:\n image: gotson/komga:latest\n command: --newpassword=toto --reset=admin@example.org\n")),(0,a.kt)("h2",{id:"available-commands"},"Available commands"),(0,a.kt)("h3",{id:"list-users"},"List users"),(0,a.kt)("p",null,"Command: ",(0,a.kt)("inlineCode",{parentName:"p"},"--list-users")),(0,a.kt)("p",null,"This will output all the users configured in the database. The output will be shown in the console or the logs."),(0,a.kt)("p",null,"Example:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"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]")),(0,a.kt)("h3",{id:"reset-password-for-a-user"},"Reset password for a user"),(0,a.kt)("p",null,"Command: ",(0,a.kt)("inlineCode",{parentName:"p"},"--reset=user@domain.com --newpassword=YourNewPassword")),(0,a.kt)("p",null,"This will reset the password for the specified user."),(0,a.kt)("p",null,"Example:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"2023-08-02T13:50:42.998+08:00 INFO 2806 --- [ main] o.g.k.i.apprunner.PasswordResetRunner : Reset password for user: admin@example.org")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/206b31bb.b478a073.js b/assets/js/206b31bb.93e58909.js similarity index 99% rename from assets/js/206b31bb.b478a073.js rename to assets/js/206b31bb.93e58909.js index 24037933..16ee6c98 100644 --- a/assets/js/206b31bb.b478a073.js +++ b/assets/js/206b31bb.93e58909.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[1778],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>c});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),d=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=d(e.components);return a.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=d(n),m=o,c=h["".concat(s,".").concat(m)]||h[m]||u[m]||r;return n?a.createElement(c,i(i({ref:t},p),{},{components:n})):a.createElement(c,i({ref:t},p))}));function c(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:o,i[1]=l;for(var d=2;d{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var a=n(7462),o=(n(7294),n(3905));const r={},i="One-Shots",l={unversionedId:"guides/oneshots",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/oneshots.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Image Types",permalink:"/docs/guides/image-formats"},next:{title:"Edit Metadata",permalink:"/docs/guides/edit-metadata"}},s={},d=[{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}],p={toc:d},h="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(h,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"one-shots"},"One-Shots"),(0,o.kt)("h2",{id:"what-are-one-shots"},"What are One-Shots?"),(0,o.kt)("p",null,"One-Shots are series containing a single book. "),(0,o.kt)("p",null,"However not all series containing a single book are One-Shots. Here are some example of single book series that are not One-Shots:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"a series that has multiple books published, but only a single book is collected in Komga"),(0,o.kt)("li",{parentName:"ul"},"a series that currently has only 1 book published, but will have more in the future")),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"With One-Shots handling, this is not necessary anymore."),(0,o.kt)("p",null,"One-Shots are still composed of a series with a single book, but are handled slightly differently."),(0,o.kt)("h2",{id:"one-shots-handling"},"One-Shots handling"),(0,o.kt)("h3",{id:"configuration"},"Configuration"),(0,o.kt)("p",null,"You can enable One-Shots handling through ",(0,o.kt)("a",{parentName:"p",href:"/docs/guides/libraries#one-shots-directory"},"Library options"),"."),(0,o.kt)("h3",{id:"processing"},"Processing"),(0,o.kt)("p",null,"One-Shots are detected during the scan. Any directory for which the full path contains the configured ",(0,o.kt)("em",{parentName:"p"},"One-Shots directory")," will generate One-Shot series instead of standard Series."),(0,o.kt)("p",null,"Given the following directory structure, with ",(0,o.kt)("em",{parentName:"p"},"One-Shots directory")," configured to ",(0,o.kt)("inlineCode",{parentName:"p"},"_oneshots"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/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")),(0,o.kt)("p",null,"This will result in:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"2 regular series:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Space Adventures")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Super Duck")))),(0,o.kt)("li",{parentName:"ul"},"4 One-Shots:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Pluto Adventures")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"A oneshot")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Another oneshot")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Yet another oneshot"))))),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"One-Shots directory")," is checked against ",(0,o.kt)("strong",{parentName:"p"},"any part of the directory path"),":"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"_oneshots")," will match on:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"/data/books/Comics/_oneshots")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"/data/books/Comics/My weirdly named _oneshots"))))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To match only directories starting with the provided string, prefix ",(0,o.kt)("em",{parentName:"p"},"One-Shots directory")," with ",(0,o.kt)("inlineCode",{parentName:"p"},"/"),", like ",(0,o.kt)("inlineCode",{parentName:"p"},"/_oneshots")," ")),(0,o.kt)("h3",{id:"metadata"},"Metadata"),(0,o.kt)("p",null,"While the book metadata will be processed as usual, the series metadata for One-Shots will be handled slightly differently:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"the Mylar ",(0,o.kt)("inlineCode",{parentName:"li"},"series.json")," is ignored"),(0,o.kt)("li",{parentName:"ul"},"the local artwork is ignored. The one for the book is still processed as usual."),(0,o.kt)("li",{parentName:"ul"},"in addition, some metadata is set:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"the series title and summary are set from the one of the book"),(0,o.kt)("li",{parentName:"ul"},"the series status is set to ",(0,o.kt)("em",{parentName:"li"},"Ended")),(0,o.kt)("li",{parentName:"ul"},"the series total book count is set to 1")))),(0,o.kt)("h3",{id:"dashboard"},"Dashboard"),(0,o.kt)("p",null,"The Dashboard has specific handling for One-Shots:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"One-Shots are displayed in a new view that shows both series and book metadata fields"),(0,o.kt)("li",{parentName:"ul"},"when editing One-Shots metadata, a new dialog will allow to edit both book and series level metadata fields.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"If you edit multiple items and all are One-Shots, this dialog is also used."),(0,o.kt)("li",{parentName:"ul"},"If there is a mix of One-Shots and normal items (series or books), the regular dialog will be used instead.s"))),(0,o.kt)("li",{parentName:"ul"},"One-Shots can be added to both collections and readlists"),(0,o.kt)("li",{parentName:"ul"},"One-Shots will not show in the ",(0,o.kt)("em",{parentName:"li"},"Recently Added Series")," or ",(0,o.kt)("em",{parentName:"li"},"Recently Updated Series")," sections, but they will show in ",(0,o.kt)("em",{parentName:"li"},"Recently Added Books"),"."),(0,o.kt)("li",{parentName:"ul"},"Item card in Series views (when browsing libraries or collections):",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"will show an unread indicator in the top-right corner, instead of the number of unread books"),(0,o.kt)("li",{parentName:"ul"},"will display ",(0,o.kt)("em",{parentName:"li"},"One-shot")," at the bottom of the card instead of the number of books"))),(0,o.kt)("li",{parentName:"ul"},"Item card in Book views (when browsing readlists or recommended) will not display the Series name nor the book number"),(0,o.kt)("li",{parentName:"ul"},"the Series filter panel has a ",(0,o.kt)("em",{parentName:"li"},"One-shot")," filter"),(0,o.kt)("li",{parentName:"ul"},"One-Shots will not show in the Series picker dialog when importing books"),(0,o.kt)("li",{parentName:"ul"},"One-Shots will show only as books in the search bar and detailed search view")),(0,o.kt)("h3",{id:"rest-api"},"REST API"),(0,o.kt)("p",null,"One-Shots are still composed of a Series with a single Book, however both have a new ",(0,o.kt)("inlineCode",{parentName:"p"},"boolean")," attribute ",(0,o.kt)("inlineCode",{parentName:"p"},"oneshot")," which can be used in client applications to handle One-Shots differently."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[1778],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>c});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),d=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=d(e.components);return a.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),h=d(n),m=o,c=h["".concat(s,".").concat(m)]||h[m]||u[m]||r;return n?a.createElement(c,i(i({ref:t},p),{},{components:n})):a.createElement(c,i({ref:t},p))}));function c(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:o,i[1]=l;for(var d=2;d{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var a=n(7462),o=(n(7294),n(3905));const r={},i="One-Shots",l={unversionedId:"guides/oneshots",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/oneshots.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Image Types",permalink:"/docs/guides/image-formats"},next:{title:"Edit Metadata",permalink:"/docs/guides/edit-metadata"}},s={},d=[{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}],p={toc:d},h="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(h,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"one-shots"},"One-Shots"),(0,o.kt)("h2",{id:"what-are-one-shots"},"What are One-Shots?"),(0,o.kt)("p",null,"One-Shots are series containing a single book. "),(0,o.kt)("p",null,"However not all series containing a single book are One-Shots. Here are some example of single book series that are not One-Shots:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"a series that has multiple books published, but only a single book is collected in Komga"),(0,o.kt)("li",{parentName:"ul"},"a series that currently has only 1 book published, but will have more in the future")),(0,o.kt)("p",null,"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."),(0,o.kt)("p",null,"With One-Shots handling, this is not necessary anymore."),(0,o.kt)("p",null,"One-Shots are still composed of a series with a single book, but are handled slightly differently."),(0,o.kt)("h2",{id:"one-shots-handling"},"One-Shots handling"),(0,o.kt)("h3",{id:"configuration"},"Configuration"),(0,o.kt)("p",null,"You can enable One-Shots handling through ",(0,o.kt)("a",{parentName:"p",href:"/docs/guides/libraries#one-shots-directory"},"Library options"),"."),(0,o.kt)("h3",{id:"processing"},"Processing"),(0,o.kt)("p",null,"One-Shots are detected during the scan. Any directory for which the full path contains the configured ",(0,o.kt)("em",{parentName:"p"},"One-Shots directory")," will generate One-Shot series instead of standard Series."),(0,o.kt)("p",null,"Given the following directory structure, with ",(0,o.kt)("em",{parentName:"p"},"One-Shots directory")," configured to ",(0,o.kt)("inlineCode",{parentName:"p"},"_oneshots"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/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")),(0,o.kt)("p",null,"This will result in:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"2 regular series:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Space Adventures")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Super Duck")))),(0,o.kt)("li",{parentName:"ul"},"4 One-Shots:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Pluto Adventures")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"A oneshot")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Another oneshot")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("em",{parentName:"li"},"Yet another oneshot"))))),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"One-Shots directory")," is checked against ",(0,o.kt)("strong",{parentName:"p"},"any part of the directory path"),":"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"_oneshots")," will match on:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"/data/books/Comics/_oneshots")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"/data/books/Comics/My weirdly named _oneshots"))))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To match only directories starting with the provided string, prefix ",(0,o.kt)("em",{parentName:"p"},"One-Shots directory")," with ",(0,o.kt)("inlineCode",{parentName:"p"},"/"),", like ",(0,o.kt)("inlineCode",{parentName:"p"},"/_oneshots")," ")),(0,o.kt)("h3",{id:"metadata"},"Metadata"),(0,o.kt)("p",null,"While the book metadata will be processed as usual, the series metadata for One-Shots will be handled slightly differently:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"the Mylar ",(0,o.kt)("inlineCode",{parentName:"li"},"series.json")," is ignored"),(0,o.kt)("li",{parentName:"ul"},"the local artwork is ignored. The one for the book is still processed as usual."),(0,o.kt)("li",{parentName:"ul"},"in addition, some metadata is set:",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"the series title and summary are set from the one of the book"),(0,o.kt)("li",{parentName:"ul"},"the series status is set to ",(0,o.kt)("em",{parentName:"li"},"Ended")),(0,o.kt)("li",{parentName:"ul"},"the series total book count is set to 1")))),(0,o.kt)("h3",{id:"dashboard"},"Dashboard"),(0,o.kt)("p",null,"The Dashboard has specific handling for One-Shots:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"One-Shots are displayed in a new view that shows both series and book metadata fields"),(0,o.kt)("li",{parentName:"ul"},"when editing One-Shots metadata, a new dialog will allow to edit both book and series level metadata fields.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"If you edit multiple items and all are One-Shots, this dialog is also used."),(0,o.kt)("li",{parentName:"ul"},"If there is a mix of One-Shots and normal items (series or books), the regular dialog will be used instead.s"))),(0,o.kt)("li",{parentName:"ul"},"One-Shots can be added to both collections and readlists"),(0,o.kt)("li",{parentName:"ul"},"One-Shots will not show in the ",(0,o.kt)("em",{parentName:"li"},"Recently Added Series")," or ",(0,o.kt)("em",{parentName:"li"},"Recently Updated Series")," sections, but they will show in ",(0,o.kt)("em",{parentName:"li"},"Recently Added Books"),"."),(0,o.kt)("li",{parentName:"ul"},"Item card in Series views (when browsing libraries or collections):",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"will show an unread indicator in the top-right corner, instead of the number of unread books"),(0,o.kt)("li",{parentName:"ul"},"will display ",(0,o.kt)("em",{parentName:"li"},"One-shot")," at the bottom of the card instead of the number of books"))),(0,o.kt)("li",{parentName:"ul"},"Item card in Book views (when browsing readlists or recommended) will not display the Series name nor the book number"),(0,o.kt)("li",{parentName:"ul"},"the Series filter panel has a ",(0,o.kt)("em",{parentName:"li"},"One-shot")," filter"),(0,o.kt)("li",{parentName:"ul"},"One-Shots will not show in the Series picker dialog when importing books"),(0,o.kt)("li",{parentName:"ul"},"One-Shots will show only as books in the search bar and detailed search view")),(0,o.kt)("h3",{id:"rest-api"},"REST API"),(0,o.kt)("p",null,"One-Shots are still composed of a Series with a single Book, however both have a new ",(0,o.kt)("inlineCode",{parentName:"p"},"boolean")," attribute ",(0,o.kt)("inlineCode",{parentName:"p"},"oneshot")," which can be used in client applications to handle One-Shots differently."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/24227623.df0cfc76.js b/assets/js/24227623.2e43610c.js similarity index 98% rename from assets/js/24227623.df0cfc76.js rename to assets/js/24227623.2e43610c.js index cae523fd..37699ecf 100644 --- a/assets/js/24227623.df0cfc76.js +++ b/assets/js/24227623.2e43610c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2854],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>m});var a=t(7294);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);r&&(a=a.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,a)}return t}function s(e){for(var r=1;r=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var d=a.createContext({}),l=function(e){var r=a.useContext(d),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},p=function(e){var r=l(e.components);return a.createElement(d.Provider,{value:r},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return a.createElement(a.Fragment,{},r)}},g=a.forwardRef((function(e,r){var t=e.components,n=e.mdxType,o=e.originalType,d=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(t),g=n,m=c["".concat(d,".").concat(g)]||c[g]||u[g]||o;return t?a.createElement(m,s(s({ref:r},p),{},{components:t})):a.createElement(m,s({ref:r},p))}));function m(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var o=t.length,s=new Array(o);s[0]=g;var i={};for(var d in r)hasOwnProperty.call(r,d)&&(i[d]=r[d]);i.originalType=e,i[c]="string"==typeof e?e:n,s[1]=i;for(var l=2;l{t.r(r),t.d(r,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var a=t(7462),n=(t(7294),t(3905));const o={},s="Read progress",i={unversionedId:"guides/read-progress",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/read-progress.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Server settings & management",permalink:"/docs/guides/server-settings"},next:{title:"Collections",permalink:"/docs/guides/collections"}},d={},l=[{value:"Supported readers",id:"supported-readers",level:2},{value:"Webreader",id:"webreader",level:3},{value:"Tachiyomi",id:"tachiyomi",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}],p={toc:l},c="wrapper";function u(e){let{components:r,...t}=e;return(0,n.kt)(c,(0,a.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"read-progress"},"Read progress"),(0,n.kt)("p",null,"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately."),(0,n.kt)("h2",{id:"supported-readers"},"Supported readers"),(0,n.kt)("h3",{id:"webreader"},"Webreader"),(0,n.kt)("p",null,"The webreader can track the progress as you read:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"when you open a book that is in progress, the webreader will resume reading where you left it."),(0,n.kt)("li",{parentName:"ul"},"when you finish reading a book, the webreader will mark it as read.")),(0,n.kt)("h3",{id:"tachiyomi"},"Tachiyomi"),(0,n.kt)("p",null,"Tachiyomi can track progress of read books, using the Komga tracker. See ",(0,n.kt)("a",{parentName:"p",href:"tachiyomi#track-read-progress"},"here")," for more details."),(0,n.kt)("h3",{id:"cdisplayex"},"CDisplayEx"),(0,n.kt)("p",null,"CDisplayEx syncs read status and reading progress, See ",(0,n.kt)("a",{parentName:"p",href:"cdisplayex#reading-status"},"here"),"."),(0,n.kt)("h2",{id:"unread-and-in-progress-indicators"},"Unread and in progress indicators"),(0,n.kt)("p",null,"The book card will display read progress indicators:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Unread books will display an orange tick in the top right corner:")),(0,n.kt)("img",{src:"/assets/media/guides/read-progress/book-card-unread.png",style:{maxHeight:"300px"},alt:"Book card showing unread indicator"}),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"In progress books will display a progress bar at the bottom of the thumbnail:")),(0,n.kt)("img",{src:"/assets/media/guides/read-progress/book-card-inprogress.png",style:{maxHeight:"300px"},alt:"Book card showing reading progress"}),(0,n.kt)("p",null,"In addition, the series card will display the number of unread books in the top right corner:"),(0,n.kt)("img",{src:"/assets/media/guides/read-progress/series-card-unread-count.png",style:{maxHeight:"300px"},alt:"Series card showing unread count of books"}),(0,n.kt)("h2",{id:"marking-progress-manually"},"Marking progress manually"),(0,n.kt)("p",null,"You can mark books or series as read or unread manually. Look for the action menu icon ",(0,n.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.kt)("em",{parentName:"p"},"Mark as read")," or ",(0,n.kt)("em",{parentName:"p"},"Mark as unread"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2854],{3905:(e,r,t)=>{t.d(r,{Zo:()=>p,kt:()=>m});var a=t(7294);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);r&&(a=a.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,a)}return t}function s(e){for(var r=1;r=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var d=a.createContext({}),l=function(e){var r=a.useContext(d),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},p=function(e){var r=l(e.components);return a.createElement(d.Provider,{value:r},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return a.createElement(a.Fragment,{},r)}},g=a.forwardRef((function(e,r){var t=e.components,n=e.mdxType,o=e.originalType,d=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=l(t),g=n,m=c["".concat(d,".").concat(g)]||c[g]||u[g]||o;return t?a.createElement(m,s(s({ref:r},p),{},{components:t})):a.createElement(m,s({ref:r},p))}));function m(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var o=t.length,s=new Array(o);s[0]=g;var i={};for(var d in r)hasOwnProperty.call(r,d)&&(i[d]=r[d]);i.originalType=e,i[c]="string"==typeof e?e:n,s[1]=i;for(var l=2;l{t.r(r),t.d(r,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var a=t(7462),n=(t(7294),t(3905));const o={},s="Read progress",i={unversionedId:"guides/read-progress",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/read-progress.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Server settings & management",permalink:"/docs/guides/server-settings"},next:{title:"Collections",permalink:"/docs/guides/collections"}},d={},l=[{value:"Supported readers",id:"supported-readers",level:2},{value:"Webreader",id:"webreader",level:3},{value:"Tachiyomi",id:"tachiyomi",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}],p={toc:l},c="wrapper";function u(e){let{components:r,...t}=e;return(0,n.kt)(c,(0,a.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"read-progress"},"Read progress"),(0,n.kt)("p",null,"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately."),(0,n.kt)("h2",{id:"supported-readers"},"Supported readers"),(0,n.kt)("h3",{id:"webreader"},"Webreader"),(0,n.kt)("p",null,"The webreader can track the progress as you read:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"when you open a book that is in progress, the webreader will resume reading where you left it."),(0,n.kt)("li",{parentName:"ul"},"when you finish reading a book, the webreader will mark it as read.")),(0,n.kt)("h3",{id:"tachiyomi"},"Tachiyomi"),(0,n.kt)("p",null,"Tachiyomi can track progress of read books, using the Komga tracker. See ",(0,n.kt)("a",{parentName:"p",href:"tachiyomi#track-read-progress"},"here")," for more details."),(0,n.kt)("h3",{id:"cdisplayex"},"CDisplayEx"),(0,n.kt)("p",null,"CDisplayEx syncs read status and reading progress, See ",(0,n.kt)("a",{parentName:"p",href:"cdisplayex#reading-status"},"here"),"."),(0,n.kt)("h2",{id:"unread-and-in-progress-indicators"},"Unread and in progress indicators"),(0,n.kt)("p",null,"The book card will display read progress indicators:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Unread books will display an orange tick in the top right corner:")),(0,n.kt)("img",{src:"/assets/media/guides/read-progress/book-card-unread.png",style:{maxHeight:"300px"},alt:"Book card showing unread indicator"}),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"In progress books will display a progress bar at the bottom of the thumbnail:")),(0,n.kt)("img",{src:"/assets/media/guides/read-progress/book-card-inprogress.png",style:{maxHeight:"300px"},alt:"Book card showing reading progress"}),(0,n.kt)("p",null,"In addition, the series card will display the number of unread books in the top right corner:"),(0,n.kt)("img",{src:"/assets/media/guides/read-progress/series-card-unread-count.png",style:{maxHeight:"300px"},alt:"Series card showing unread count of books"}),(0,n.kt)("h2",{id:"marking-progress-manually"},"Marking progress manually"),(0,n.kt)("p",null,"You can mark books or series as read or unread manually. Look for the action menu icon ",(0,n.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.kt)("em",{parentName:"p"},"Mark as read")," or ",(0,n.kt)("em",{parentName:"p"},"Mark as unread"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/25088eef.49422631.js b/assets/js/25088eef.3c7f2dba.js similarity index 78% rename from assets/js/25088eef.49422631.js rename to assets/js/25088eef.3c7f2dba.js index cced11e2..b93c2496 100644 --- a/assets/js/25088eef.49422631.js +++ b/assets/js/25088eef.3c7f2dba.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[8315],{2233:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/upgrade","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Latest Komga announcements","blogTitle":"Announcements"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[8315],{2233:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/upgrade","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Latest Komga announcements","blogTitle":"Announcements"}')}}]); \ No newline at end of file diff --git a/assets/js/2b8f2de1.e1e76bcb.js b/assets/js/2b8f2de1.b2dc2f34.js similarity index 99% rename from assets/js/2b8f2de1.e1e76bcb.js rename to assets/js/2b8f2de1.b2dc2f34.js index 17455c0f..ba68564f 100644 --- a/assets/js/2b8f2de1.e1e76bcb.js +++ b/assets/js/2b8f2de1.b2dc2f34.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9925],{3905:(t,e,r)=>{r.d(e,{Zo:()=>s,kt:()=>k});var a=r(7294);function n(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,a)}return r}function l(t){for(var e=1;e=0||(n[r]=t[r]);return n}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(n[r]=t[r])}return n}var i=a.createContext({}),d=function(t){var e=a.useContext(i),r=e;return t&&(r="function"==typeof t?t(e):l(l({},e),t)),r},s=function(t){var e=d(t.components);return a.createElement(i.Provider,{value:e},t.children)},m="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},u=a.forwardRef((function(t,e){var r=t.components,n=t.mdxType,o=t.originalType,i=t.parentName,s=p(t,["components","mdxType","originalType","parentName"]),m=d(r),u=n,k=m["".concat(i,".").concat(u)]||m[u]||c[u]||o;return r?a.createElement(k,l(l({ref:e},s),{},{components:r})):a.createElement(k,l({ref:e},s))}));function k(t,e){var r=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var o=r.length,l=new Array(o);l[0]=u;var p={};for(var i in e)hasOwnProperty.call(e,i)&&(p[i]=e[i]);p.originalType=t,p[m]="string"==typeof t?t:n,l[1]=p;for(var d=2;d{r.r(e),r.d(e,{assets:()=>i,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>d});var a=r(7462),n=(r(7294),r(3905));const o={},l="Read with any OPDS reader",p={unversionedId:"guides/opds",id:"guides/opds",title:"Read with any OPDS reader",description:"Komga should work with any OPDS reader, unfortunately most readers badly implement the OPDS protocol.",source:"@site/docs/guides/opds.md",sourceDirName:"guides",slug:"/guides/opds",permalink:"/docs/guides/opds",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/opds.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with CDisplayEx",permalink:"/docs/guides/cdisplayex"},next:{title:"Read with Panels on iOS",permalink:"/docs/guides/panels"}},i={},d=[],s={toc:d},m="wrapper";function c(t){let{components:e,...r}=t;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"read-with-any-opds-reader"},"Read with any OPDS reader"),(0,n.kt)("p",null,"Komga should work with any OPDS reader, unfortunately most readers badly implement the OPDS protocol."),(0,n.kt)("p",null,"Komga supports OPDS v1 and v2, the URL should be configured accordingly:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"OPDS v1: ",(0,n.kt)("inlineCode",{parentName:"li"},"http(s)://your-server(:25600)(/baseUrl)/opds/v1.2/catalog")),(0,n.kt)("li",{parentName:"ul"},"OPDS v2: ",(0,n.kt)("inlineCode",{parentName:"li"},"http(s)://your-server(:25600)(/baseUrl)/opds/v2/catalog"))),(0,n.kt)("p",null,"Here is a list of reader applications that have been tested:"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"OS"),(0,n.kt)("th",{parentName:"tr",align:null},"App name"),(0,n.kt)("th",{parentName:"tr",align:"center"},"Status"),(0,n.kt)("th",{parentName:"tr",align:"center"},"OpenSearch support"),(0,n.kt)("th",{parentName:"tr",align:"center"},"Page streaming support"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Android"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://play.google.com/store/apps/details?id=org.geometerplus.zlibrary.ui.android"},"FBReader: Favorite Book Reader")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u274c Can't download CBR/CBZ, only PDF. PDF only supported in Premium version. Does not remember password."),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Android"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://play.google.com/store/apps/details?id=com.flyersoft.moonreader"},"Moon+ Reader")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u2714\ufe0f"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Android"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://play.google.com/store/apps/details?id=com.foobnix.pdf.reader"},"Librera")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u2714\ufe0f"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Android"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://play.google.com/store/apps/details?id=com.obreey.reader"},"PocketBook")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u274c Doesn't show CBR/CBZ"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"iOS"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"http://kybook-reader.com/"},"KyBook 3")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u2714\ufe0f"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("strong",{parentName:"td"},"Yes")),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"iOS"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://panels.app/"},"Panels")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u2714\ufe0f"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("strong",{parentName:"td"},"OPDS PSE 1.0")," (v2.8.0+)",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"OPDS PSE 1.1")," (v2.9.7+)")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"iPadOS"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://apps.apple.com/us/app/chunky-comic-reader/id663567628"},"Chunky Comic Reader")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u274c Does not work anymore with Komga 1.4.0+"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("strong",{parentName:"td"},"OPDS PSE 1.0"))))),(0,n.kt)("p",null,"The OPDS v1 feed also supports:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"OpenSearch functionality, to search by ",(0,n.kt)("inlineCode",{parentName:"li"},"Series")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://anansi-project.github.io/docs/opds-pse/intro"},"OPDS Page Streaming Extension 1.2"))))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9925],{3905:(t,e,r)=>{r.d(e,{Zo:()=>s,kt:()=>k});var a=r(7294);function n(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function o(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,a)}return r}function l(t){for(var e=1;e=0||(n[r]=t[r]);return n}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(n[r]=t[r])}return n}var i=a.createContext({}),d=function(t){var e=a.useContext(i),r=e;return t&&(r="function"==typeof t?t(e):l(l({},e),t)),r},s=function(t){var e=d(t.components);return a.createElement(i.Provider,{value:e},t.children)},m="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},u=a.forwardRef((function(t,e){var r=t.components,n=t.mdxType,o=t.originalType,i=t.parentName,s=p(t,["components","mdxType","originalType","parentName"]),m=d(r),u=n,k=m["".concat(i,".").concat(u)]||m[u]||c[u]||o;return r?a.createElement(k,l(l({ref:e},s),{},{components:r})):a.createElement(k,l({ref:e},s))}));function k(t,e){var r=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var o=r.length,l=new Array(o);l[0]=u;var p={};for(var i in e)hasOwnProperty.call(e,i)&&(p[i]=e[i]);p.originalType=t,p[m]="string"==typeof t?t:n,l[1]=p;for(var d=2;d{r.r(e),r.d(e,{assets:()=>i,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>d});var a=r(7462),n=(r(7294),r(3905));const o={},l="Read with any OPDS reader",p={unversionedId:"guides/opds",id:"guides/opds",title:"Read with any OPDS reader",description:"Komga should work with any OPDS reader, unfortunately most readers badly implement the OPDS protocol.",source:"@site/docs/guides/opds.md",sourceDirName:"guides",slug:"/guides/opds",permalink:"/docs/guides/opds",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/opds.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with CDisplayEx",permalink:"/docs/guides/cdisplayex"},next:{title:"Read with Panels on iOS",permalink:"/docs/guides/panels"}},i={},d=[],s={toc:d},m="wrapper";function c(t){let{components:e,...r}=t;return(0,n.kt)(m,(0,a.Z)({},s,r,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"read-with-any-opds-reader"},"Read with any OPDS reader"),(0,n.kt)("p",null,"Komga should work with any OPDS reader, unfortunately most readers badly implement the OPDS protocol."),(0,n.kt)("p",null,"Komga supports OPDS v1 and v2, the URL should be configured accordingly:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"OPDS v1: ",(0,n.kt)("inlineCode",{parentName:"li"},"http(s)://your-server(:25600)(/baseUrl)/opds/v1.2/catalog")),(0,n.kt)("li",{parentName:"ul"},"OPDS v2: ",(0,n.kt)("inlineCode",{parentName:"li"},"http(s)://your-server(:25600)(/baseUrl)/opds/v2/catalog"))),(0,n.kt)("p",null,"Here is a list of reader applications that have been tested:"),(0,n.kt)("table",null,(0,n.kt)("thead",{parentName:"table"},(0,n.kt)("tr",{parentName:"thead"},(0,n.kt)("th",{parentName:"tr",align:null},"OS"),(0,n.kt)("th",{parentName:"tr",align:null},"App name"),(0,n.kt)("th",{parentName:"tr",align:"center"},"Status"),(0,n.kt)("th",{parentName:"tr",align:"center"},"OpenSearch support"),(0,n.kt)("th",{parentName:"tr",align:"center"},"Page streaming support"))),(0,n.kt)("tbody",{parentName:"table"},(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Android"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://play.google.com/store/apps/details?id=org.geometerplus.zlibrary.ui.android"},"FBReader: Favorite Book Reader")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u274c Can't download CBR/CBZ, only PDF. PDF only supported in Premium version. Does not remember password."),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Android"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://play.google.com/store/apps/details?id=com.flyersoft.moonreader"},"Moon+ Reader")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u2714\ufe0f"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Android"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://play.google.com/store/apps/details?id=com.foobnix.pdf.reader"},"Librera")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u2714\ufe0f"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"Android"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://play.google.com/store/apps/details?id=com.obreey.reader"},"PocketBook")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u274c Doesn't show CBR/CBZ"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"iOS"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"http://kybook-reader.com/"},"KyBook 3")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u2714\ufe0f"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("strong",{parentName:"td"},"Yes")),(0,n.kt)("td",{parentName:"tr",align:"center"},"No")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"iOS"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://panels.app/"},"Panels")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u2714\ufe0f"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("strong",{parentName:"td"},"OPDS PSE 1.0")," (v2.8.0+)",(0,n.kt)("br",null),(0,n.kt)("strong",{parentName:"td"},"OPDS PSE 1.1")," (v2.9.7+)")),(0,n.kt)("tr",{parentName:"tbody"},(0,n.kt)("td",{parentName:"tr",align:null},"iPadOS"),(0,n.kt)("td",{parentName:"tr",align:null},(0,n.kt)("a",{parentName:"td",href:"https://apps.apple.com/us/app/chunky-comic-reader/id663567628"},"Chunky Comic Reader")),(0,n.kt)("td",{parentName:"tr",align:"center"},"\u274c Does not work anymore with Komga 1.4.0+"),(0,n.kt)("td",{parentName:"tr",align:"center"},"No"),(0,n.kt)("td",{parentName:"tr",align:"center"},(0,n.kt)("strong",{parentName:"td"},"OPDS PSE 1.0"))))),(0,n.kt)("p",null,"The OPDS v1 feed also supports:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"OpenSearch functionality, to search by ",(0,n.kt)("inlineCode",{parentName:"li"},"Series")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://anansi-project.github.io/docs/opds-pse/intro"},"OPDS Page Streaming Extension 1.2"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3fda2baf.e85a2ebd.js b/assets/js/3fda2baf.19165ef5.js similarity index 86% rename from assets/js/3fda2baf.e85a2ebd.js rename to assets/js/3fda2baf.19165ef5.js index a8dd5d80..dab4225a 100644 --- a/assets/js/3fda2baf.e85a2ebd.js +++ b/assets/js/3fda2baf.19165ef5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7547],{1621:e=>{e.exports=JSON.parse('{"label":"upgrade","permalink":"/blog/tags/upgrade","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7547],{1621:e=>{e.exports=JSON.parse('{"label":"upgrade","permalink":"/blog/tags/upgrade","allTagsPath":"/blog/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/416fe654.bda03071.js b/assets/js/416fe654.3e769577.js similarity index 99% rename from assets/js/416fe654.bda03071.js rename to assets/js/416fe654.3e769577.js index 04de4096..8bd7ec5d 100644 --- a/assets/js/416fe654.bda03071.js +++ b/assets/js/416fe654.3e769577.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7214],{3905:(t,e,o)=>{o.d(e,{Zo:()=>c,kt:()=>g});var n=o(7294);function r(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}function a(t,e){var o=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),o.push.apply(o,n)}return o}function i(t){for(var e=1;e=0||(r[o]=t[o]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,o)&&(r[o]=t[o])}return r}var l=n.createContext({}),p=function(t){var e=n.useContext(l),o=e;return t&&(o="function"==typeof t?t(e):i(i({},e),t)),o},c=function(t){var e=p(t.components);return n.createElement(l.Provider,{value:e},t.children)},u="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var o=t.components,r=t.mdxType,a=t.originalType,l=t.parentName,c=s(t,["components","mdxType","originalType","parentName"]),u=p(o),h=r,g=u["".concat(l,".").concat(h)]||u[h]||m[h]||a;return o?n.createElement(g,i(i({ref:e},c),{},{components:o})):n.createElement(g,i({ref:e},c))}));function g(t,e){var o=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var a=o.length,i=new Array(a);i[0]=h;var s={};for(var l in e)hasOwnProperty.call(e,l)&&(s[l]=e[l]);s.originalType=t,s[u]="string"==typeof t?t:r,i[1]=s;for(var p=2;p{o.r(e),o.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=o(7462),r=(o(7294),o(3905));const a={},i="Contribution",s={unversionedId:"contribution",id:"contribution",title:"Contribution",description:"Code",source:"@site/docs/contribution.md",sourceDirName:".",slug:"/contribution",permalink:"/docs/contribution",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/contribution.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Command Line Interface",permalink:"/docs/guides/cli"},next:{title:"Community",permalink:"/docs/community"}},l={},p=[{value:"Code",id:"code",level:2},{value:"Application",id:"application",level:3},{value:"Tachiyomi Extension",id:"tachiyomi-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}],c={toc:p},u="wrapper";function m(t){let{components:e,...o}=t;return(0,r.kt)(u,(0,n.Z)({},c,o,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"contribution"},"Contribution"),(0,r.kt)("h2",{id:"code"},"Code"),(0,r.kt)("p",null,"Skilled at code? Know how to improve something or you generally want to support the creation of the app?"),(0,r.kt)("h3",{id:"application"},"Application"),(0,r.kt)("p",null,"The main application: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga"},"gotson/komga")," ",(0,r.kt)("img",{parentName:"p",src:"https://img.shields.io/github/issues/gotson/komga?style=social",alt:"GitHub issues"})),(0,r.kt)("h3",{id:"tachiyomi-extension"},"Tachiyomi Extension"),(0,r.kt)("p",null,"The official Komga extension for Tachiyomi: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/tachiyomiorg/tachiyomi-extensions/tree/master/src/all/komga"},"tachiyomiorg/tachiyomi-extensions")),(0,r.kt)("h3",{id:"website"},"Website"),(0,r.kt)("p",null,"The repository that hosts this very website you're reading on now: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga-website"},"gotson/komga-website")),(0,r.kt)("h2",{id:"translation"},"Translation"),(0,r.kt)("a",{href:"https://hosted.weblate.org/engage/komga/"},(0,r.kt)("img",{src:"https://hosted.weblate.org/widgets/komga/-/svg-badge.svg",alt:"Translation status"})),(0,r.kt)("p",null,"Want to help translate the app to your language? You can easily help by utilizing a service we use called ",(0,r.kt)("strong",{parentName:"p"},"Weblate"),"."),(0,r.kt)("p",null,"Visit our translation project ",(0,r.kt)("a",{parentName:"p",href:"https://hosted.weblate.org/engage/komga/"},"here"),"."),(0,r.kt)("h4",{id:"helpful-links"},"Helpful links"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.weblate.org/en/latest/user/translating.html"},"Translators guide")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.weblate.org/en/latest/user/profile.html#secondary-languages"},"Secondary-languages")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.weblate.org/en/latest/user/profile.html#subscriptions"},"Subscriptions"))),(0,r.kt)("h4",{id:"project-status"},"Project status"),(0,r.kt)("a",{href:"https://hosted.weblate.org/engage/komga/"},(0,r.kt)("img",{src:"https://hosted.weblate.org/widgets/komga/-/horizontal-auto.svg",alt:"Translation status"})),(0,r.kt)("h2",{id:"donation"},"Donation"),(0,r.kt)("p",null,"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:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://opencollective.com/komga"},"Open Collective")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://ko-fi.com/gotson"},"Ko-Fi")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/sponsors/gotson"},"Github Sponsors"))),(0,r.kt)("h2",{id:"sponsors"},"Sponsors"),(0,r.kt)("br",null),(0,r.kt)("a",{href:"https://www.jetbrains.com/?from=Komga",target:"_blank",rel:"noopener"},(0,r.kt)("img",{src:"/assets/media/sponsors/sponsors-jetbrains.png",style:{maxHeight:"100px"}})))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7214],{3905:(t,e,o)=>{o.d(e,{Zo:()=>c,kt:()=>g});var n=o(7294);function r(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}function a(t,e){var o=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),o.push.apply(o,n)}return o}function i(t){for(var e=1;e=0||(r[o]=t[o]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,o)&&(r[o]=t[o])}return r}var l=n.createContext({}),p=function(t){var e=n.useContext(l),o=e;return t&&(o="function"==typeof t?t(e):i(i({},e),t)),o},c=function(t){var e=p(t.components);return n.createElement(l.Provider,{value:e},t.children)},u="mdxType",m={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},h=n.forwardRef((function(t,e){var o=t.components,r=t.mdxType,a=t.originalType,l=t.parentName,c=s(t,["components","mdxType","originalType","parentName"]),u=p(o),h=r,g=u["".concat(l,".").concat(h)]||u[h]||m[h]||a;return o?n.createElement(g,i(i({ref:e},c),{},{components:o})):n.createElement(g,i({ref:e},c))}));function g(t,e){var o=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var a=o.length,i=new Array(a);i[0]=h;var s={};for(var l in e)hasOwnProperty.call(e,l)&&(s[l]=e[l]);s.originalType=t,s[u]="string"==typeof t?t:r,i[1]=s;for(var p=2;p{o.r(e),o.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=o(7462),r=(o(7294),o(3905));const a={},i="Contribution",s={unversionedId:"contribution",id:"contribution",title:"Contribution",description:"Code",source:"@site/docs/contribution.md",sourceDirName:".",slug:"/contribution",permalink:"/docs/contribution",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/contribution.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Command Line Interface",permalink:"/docs/guides/cli"},next:{title:"Community",permalink:"/docs/community"}},l={},p=[{value:"Code",id:"code",level:2},{value:"Application",id:"application",level:3},{value:"Tachiyomi Extension",id:"tachiyomi-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}],c={toc:p},u="wrapper";function m(t){let{components:e,...o}=t;return(0,r.kt)(u,(0,n.Z)({},c,o,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"contribution"},"Contribution"),(0,r.kt)("h2",{id:"code"},"Code"),(0,r.kt)("p",null,"Skilled at code? Know how to improve something or you generally want to support the creation of the app?"),(0,r.kt)("h3",{id:"application"},"Application"),(0,r.kt)("p",null,"The main application: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga"},"gotson/komga")," ",(0,r.kt)("img",{parentName:"p",src:"https://img.shields.io/github/issues/gotson/komga?style=social",alt:"GitHub issues"})),(0,r.kt)("h3",{id:"tachiyomi-extension"},"Tachiyomi Extension"),(0,r.kt)("p",null,"The official Komga extension for Tachiyomi: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/tachiyomiorg/tachiyomi-extensions/tree/master/src/all/komga"},"tachiyomiorg/tachiyomi-extensions")),(0,r.kt)("h3",{id:"website"},"Website"),(0,r.kt)("p",null,"The repository that hosts this very website you're reading on now: ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga-website"},"gotson/komga-website")),(0,r.kt)("h2",{id:"translation"},"Translation"),(0,r.kt)("a",{href:"https://hosted.weblate.org/engage/komga/"},(0,r.kt)("img",{src:"https://hosted.weblate.org/widgets/komga/-/svg-badge.svg",alt:"Translation status"})),(0,r.kt)("p",null,"Want to help translate the app to your language? You can easily help by utilizing a service we use called ",(0,r.kt)("strong",{parentName:"p"},"Weblate"),"."),(0,r.kt)("p",null,"Visit our translation project ",(0,r.kt)("a",{parentName:"p",href:"https://hosted.weblate.org/engage/komga/"},"here"),"."),(0,r.kt)("h4",{id:"helpful-links"},"Helpful links"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.weblate.org/en/latest/user/translating.html"},"Translators guide")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.weblate.org/en/latest/user/profile.html#secondary-languages"},"Secondary-languages")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.weblate.org/en/latest/user/profile.html#subscriptions"},"Subscriptions"))),(0,r.kt)("h4",{id:"project-status"},"Project status"),(0,r.kt)("a",{href:"https://hosted.weblate.org/engage/komga/"},(0,r.kt)("img",{src:"https://hosted.weblate.org/widgets/komga/-/horizontal-auto.svg",alt:"Translation status"})),(0,r.kt)("h2",{id:"donation"},"Donation"),(0,r.kt)("p",null,"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:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://opencollective.com/komga"},"Open Collective")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://ko-fi.com/gotson"},"Ko-Fi")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/sponsors/gotson"},"Github Sponsors"))),(0,r.kt)("h2",{id:"sponsors"},"Sponsors"),(0,r.kt)("br",null),(0,r.kt)("a",{href:"https://www.jetbrains.com/?from=Komga",target:"_blank",rel:"noopener"},(0,r.kt)("img",{src:"/assets/media/sponsors/sponsors-jetbrains.png",style:{maxHeight:"100px"}})))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/45fa992b.3b628fc8.js b/assets/js/45fa992b.3b628fc8.js new file mode 100644 index 00000000..46e7f36d --- /dev/null +++ b/assets/js/45fa992b.3b628fc8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6155],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function s(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(r),g=o,d=m["".concat(l,".").concat(g)]||m[g]||c[g]||n;return r?a.createElement(d,s(s({ref:t},u),{},{components:r})):a.createElement(d,s({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,s=new Array(n);s[0]=g;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[m]="string"==typeof e?e:o,s[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var a=r(7462),o=(r(7294),r(3905));const n={slug:"ebook-support",title:"eBook support",authors:"gotson",tags:["upgrade","komga"]},s=void 0,i={permalink:"/blog/ebook-support",source:"@site/blog/2023-11-29-ebooks.md",title:"eBook support",description:"Version 1.8.0 is bringing a long awaited feature: proper eBook support!",date:"2023-11-29T00:00:00.000Z",formattedDate:"November 29, 2023",tags:[{label:"upgrade",permalink:"/blog/tags/upgrade"},{label:"komga",permalink:"/blog/tags/komga"}],readingTime:1.37,hasTruncateMarker:!1,authors:[{name:"gotson",title:"Developer of Komga",url:"https://github.com/gotson",imageURL:"https://github.com/gotson.png",key:"gotson"}],frontMatter:{slug:"ebook-support",title:"eBook support",authors:"gotson",tags:["upgrade","komga"]},nextItem:{title:"Prepare for v1.0.0",permalink:"/blog/prepare-v1"}},l={authorsImageUrls:[void 0]},p=[{value:"What you need to know",id:"what-you-need-to-know",level:2},{value:"Other recent changes you may have missed",id:"other-recent-changes-you-may-have-missed",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Version ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga/releases/tag/1.8.0"},"1.8.0")," is bringing a long awaited feature: ",(0,o.kt)("strong",{parentName:"p"},"proper eBook support!")),(0,o.kt)("p",null,"Github issue ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga/issues/221"},"#221")," has been opened for more than 3 years, and has finally been tackled."),(0,o.kt)("h2",{id:"what-you-need-to-know"},"What you need to know"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"eBooks behave like any other book in Komga, in regards to series or metadata. You can even mix comic books and ebooks in the same series."),(0,o.kt)("li",{parentName:"ul"},"only EPUB format is supported. Other formats will not be supported in the future."),(0,o.kt)("li",{parentName:"ul"},"existing EPUB files will be re-analyzed. If you had image-only EPUB, those may not be compatible anymore with third-party clients."),(0,o.kt)("li",{parentName:"ul"},"the web EPUB reader is a very first version, and ",(0,o.kt)("strong",{parentName:"li"},"does not support saving progress"),". Read progress saving and restore will come in a future release."),(0,o.kt)("li",{parentName:"ul"},"any book in Komga can be read with ",(0,o.kt)("a",{parentName:"li",href:"https://readium.org/webpub-manifest/"},"WebPub")," compatible clients."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"There will be issues"),". EPUB is a complex format, and many EPUB files are not properly built. Raise issues ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/gotson/komga/issues/new/choose"},"on Github")," for support.")),(0,o.kt)("h2",{id:"other-recent-changes-you-may-have-missed"},"Other recent changes you may have missed"),(0,o.kt)("p",null,"In case you haven't kept up with the release notes since version 1.0.0, here are the most significant changes:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Komga is now available as a ",(0,o.kt)("a",{parentName:"li",href:"./docs/installation/desktop"},"desktop app"),", and is available in the ",(0,o.kt)("a",{parentName:"li",href:"./docs/installation/ms-store"},"Microsoft Store")),(0,o.kt)("li",{parentName:"ul"},"Multiple settings are now configurable from the ",(0,o.kt)("a",{parentName:"li",href:"./docs/guides/server-settings"},"Server Settings")," screen. You may need to cleanup your configuration file and remove deprecated entries."),(0,o.kt)("li",{parentName:"ul"},"Thumbnails size can now be configured in Server Settings."),(0,o.kt)("li",{parentName:"ul"},"Background task management has been revamped, and now supports proper parallel executions (configurable in Server Settings)."),(0,o.kt)("li",{parentName:"ul"},"Komga now has support for ",(0,o.kt)("a",{parentName:"li",href:"./docs/guides/oneshots"},"One-Shots"),"."),(0,o.kt)("li",{parentName:"ul"},"a ",(0,o.kt)("a",{parentName:"li",href:"./docs/guides/cli"},"Command Line Interface")," was added to update forgotten password for the admin account.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/49136dfa.27434ed4.js b/assets/js/49136dfa.5f9bc6aa.js similarity index 98% rename from assets/js/49136dfa.27434ed4.js rename to assets/js/49136dfa.5f9bc6aa.js index 70b28e18..ecf70b50 100644 --- a/assets/js/49136dfa.27434ed4.js +++ b/assets/js/49136dfa.5f9bc6aa.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[473],{3905:(e,t,o)=>{o.d(t,{Zo:()=>p,kt:()=>f});var i=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,i)}return o}function l(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=i.createContext({}),c=function(e){var t=i.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},p=function(e){var t=c(e.components);return i.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var o=e.components,r=e.mdxType,n=e.originalType,s=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),u=c(o),m=r,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||n;return o?i.createElement(f,l(l({ref:t},p),{},{components:o})):i.createElement(f,l({ref:t},p))}));function f(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=o.length,l=new Array(n);l[0]=m;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[u]="string"==typeof e?e:r,l[1]=a;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=o(7462),r=(o(7294),o(3905));const n={},l="Import Books",a={unversionedId:"guides/import-books",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/import-books.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Full Text Search",permalink:"/docs/guides/search"},next:{title:"Duplicate Files",permalink:"/docs/guides/duplicate-files"}},s={},c=[{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}],p={toc:c},u="wrapper";function d(e){let{components:t,...o}=e;return(0,r.kt)(u,(0,i.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"import-books"},"Import Books"),(0,r.kt)("p",null,"Komga lets you import files that are outside your existing libraries directly into existing series folder (from the ",(0,r.kt)("em",{parentName:"p"},"Import > Books")," screen)."),(0,r.kt)("h2",{id:"scan-for-books"},"Scan for books"),(0,r.kt)("p",null,"Start by choosing a folder to scan for eligible books, and click ",(0,r.kt)("em",{parentName:"p"},"Scan"),"."),(0,r.kt)("img",{src:"/assets/media/guides/import-books/book-import-scan.png",style:{maxHeight:" 400px"},alt:"Scan for books"}),(0,r.kt)("p",null,"Komga will display a list of all files eligible for import."),(0,r.kt)("h2",{id:"select-destination-series"},"Select destination series"),(0,r.kt)("p",null,"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,r.kt)("em",{parentName:"p"},"Select Series")," button."),(0,r.kt)("img",{src:"/assets/media/guides/import-books/book-import-pick-series.png",style:{maxHeight:" 400px"},alt:"Select series"}),(0,r.kt)("h2",{id:"check-book-details"},"Check book details"),(0,r.kt)("p",null,"For each book, you can:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"display the book details: format, number of pages, and detailed page list"),(0,r.kt)("li",{parentName:"ul"},"browse the book pages"),(0,r.kt)("li",{parentName:"ul"},"change the destination file name")),(0,r.kt)("p",null,"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:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"display the details of both books side by side"),(0,r.kt)("li",{parentName:"ul"},"browse both books side by side")),(0,r.kt)("img",{src:"/assets/media/guides/import-books/book-import-buttons.png",style:{maxHeight:" 400px"},alt:"Book actions"}),(0,r.kt)("h2",{id:"finalize-the-import"},"Finalize the import"),(0,r.kt)("p",null,"Komga will import only the selected files (checkbox on the left)."),(0,r.kt)("p",null,"You can decide to:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"move the files: files will be moved from their location, effectively deleting the original file."),(0,r.kt)("li",{parentName:"ul"},"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.")),(0,r.kt)("p",null,"Cick ",(0,r.kt)("em",{parentName:"p"},"Import")," to start the import process."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[473],{3905:(e,t,o)=>{o.d(t,{Zo:()=>p,kt:()=>f});var i=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,i)}return o}function l(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var s=i.createContext({}),c=function(e){var t=i.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},p=function(e){var t=c(e.components);return i.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var o=e.components,r=e.mdxType,n=e.originalType,s=e.parentName,p=a(e,["components","mdxType","originalType","parentName"]),u=c(o),m=r,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||n;return o?i.createElement(f,l(l({ref:t},p),{},{components:o})):i.createElement(f,l({ref:t},p))}));function f(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=o.length,l=new Array(n);l[0]=m;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a[u]="string"==typeof e?e:r,l[1]=a;for(var c=2;c{o.r(t),o.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=o(7462),r=(o(7294),o(3905));const n={},l="Import Books",a={unversionedId:"guides/import-books",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/import-books.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Full Text Search",permalink:"/docs/guides/search"},next:{title:"Duplicate Files",permalink:"/docs/guides/duplicate-files"}},s={},c=[{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}],p={toc:c},u="wrapper";function d(e){let{components:t,...o}=e;return(0,r.kt)(u,(0,i.Z)({},p,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"import-books"},"Import Books"),(0,r.kt)("p",null,"Komga lets you import files that are outside your existing libraries directly into existing series folder (from the ",(0,r.kt)("em",{parentName:"p"},"Import > Books")," screen)."),(0,r.kt)("h2",{id:"scan-for-books"},"Scan for books"),(0,r.kt)("p",null,"Start by choosing a folder to scan for eligible books, and click ",(0,r.kt)("em",{parentName:"p"},"Scan"),"."),(0,r.kt)("img",{src:"/assets/media/guides/import-books/book-import-scan.png",style:{maxHeight:" 400px"},alt:"Scan for books"}),(0,r.kt)("p",null,"Komga will display a list of all files eligible for import."),(0,r.kt)("h2",{id:"select-destination-series"},"Select destination series"),(0,r.kt)("p",null,"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,r.kt)("em",{parentName:"p"},"Select Series")," button."),(0,r.kt)("img",{src:"/assets/media/guides/import-books/book-import-pick-series.png",style:{maxHeight:" 400px"},alt:"Select series"}),(0,r.kt)("h2",{id:"check-book-details"},"Check book details"),(0,r.kt)("p",null,"For each book, you can:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"display the book details: format, number of pages, and detailed page list"),(0,r.kt)("li",{parentName:"ul"},"browse the book pages"),(0,r.kt)("li",{parentName:"ul"},"change the destination file name")),(0,r.kt)("p",null,"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:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"display the details of both books side by side"),(0,r.kt)("li",{parentName:"ul"},"browse both books side by side")),(0,r.kt)("img",{src:"/assets/media/guides/import-books/book-import-buttons.png",style:{maxHeight:" 400px"},alt:"Book actions"}),(0,r.kt)("h2",{id:"finalize-the-import"},"Finalize the import"),(0,r.kt)("p",null,"Komga will import only the selected files (checkbox on the left)."),(0,r.kt)("p",null,"You can decide to:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"move the files: files will be moved from their location, effectively deleting the original file."),(0,r.kt)("li",{parentName:"ul"},"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.")),(0,r.kt)("p",null,"Cick ",(0,r.kt)("em",{parentName:"p"},"Import")," to start the import process."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4c25ac78.be325156.js b/assets/js/4c25ac78.abdca75c.js similarity index 99% rename from assets/js/4c25ac78.be325156.js rename to assets/js/4c25ac78.abdca75c.js index b070208b..1ebb191d 100644 --- a/assets/js/4c25ac78.be325156.js +++ b/assets/js/4c25ac78.abdca75c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2727],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>p});var i=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=i.createContext({}),d=function(e){var t=i.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},m=function(e){var t=d(e.components);return i.createElement(o.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,o=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),u=d(a),h=r,p=u["".concat(o,".").concat(h)]||u[h]||c[h]||n;return a?i.createElement(p,l(l({ref:t},m),{},{components:a})):i.createElement(p,l({ref:t},m))}));function p(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,l=new Array(n);l[0]=h;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[u]="string"==typeof e?e:r,l[1]=s;for(var d=2;d{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>c,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var i=a(7462),r=(a(7294),a(3905));const n={},l="Edit Metadata",s={unversionedId:"guides/edit-metadata",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/edit-metadata.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"One-Shots",permalink:"/docs/guides/oneshots"},next:{title:"Local Artwork Assets",permalink:"/docs/guides/local-artwork-assets"}},o={},d=[{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}],m={toc:d},u="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(u,(0,i.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"edit-metadata"},"Edit Metadata"),(0,r.kt)("p",null,"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."),(0,r.kt)("p",null,"You may wish to customize or change the information associated with a library item."),(0,r.kt)("h2",{id:"the-edit-screen"},"The Edit Screen"),(0,r.kt)("h3",{id:"opening-the-edit-screen"},"Opening the Edit Screen"),(0,r.kt)("p",null,"The edit screen for an item can be accessed in several ways, depending on where you are."),(0,r.kt)("h4",{id:"from-the-item-card"},"From the Item Card"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Hover over the item card"),(0,r.kt)("li",{parentName:"ol"},"Click the ",(0,r.kt)("img",{src:"/assets/media/guides/edit-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," icon")),(0,r.kt)("h4",{id:"from-the-item-details"},"From the Item Details"),(0,r.kt)("p",null,"When viewing the details for a Library item, click the ",(0,r.kt)("img",{src:"/assets/media/guides/edit-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," button in the top actionbar."),(0,r.kt)("h3",{id:"edit-screen-details"},"Edit Screen Details"),(0,r.kt)("p",null,"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."),(0,r.kt)("h4",{id:"edit-screen-for-series"},"Edit Screen for Series"),(0,r.kt)("h5",{id:"general"},"General"),(0,r.kt)("p",null,"The General screen allows you to edit details such as the title, sort title, summary, and more."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-series-general-2.png",style:{maxHeight:"300px"}}),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-series-general-2.png",style:{maxHeight:"300px"}}),(0,r.kt)("h5",{id:"tags"},"Tags"),(0,r.kt)("p",null,"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."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-series-tags.png",style:{maxHeight:"300px"}}),(0,r.kt)("h4",{id:"edit-screen-for-books"},"Edit Screen for Books"),(0,r.kt)("h5",{id:"general-1"},"General"),(0,r.kt)("p",null,"The General screen allows you to edit details such as the title, number, summary, and more."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-book-general.png",style:{maxHeight:"300px"}}),(0,r.kt)("h5",{id:"authors"},"Authors"),(0,r.kt)("p",null,"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."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-book-authors.png",style:{maxHeight:"300px"}}),(0,r.kt)("h5",{id:"tags-1"},"Tags"),(0,r.kt)("p",null,"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."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-book-tags.png",style:{maxHeight:"300px"}}),(0,r.kt)("h2",{id:"using-the-edit-screen"},"Using the Edit Screen"),(0,r.kt)("h3",{id:"editing-standard-fields-tags-or-authors"},"Editing Standard Fields, Tags or Authors"),(0,r.kt)("h3",{id:"changing-fields"},"Changing Fields"),(0,r.kt)("p",null,"To edit the details for a particular piece of metadata:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Choose the tab of category you want to change on the left, then click the detail field"),(0,r.kt)("li",{parentName:"ul"},"Type or paste the changes"),(0,r.kt)("li",{parentName:"ul"},"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.")),(0,r.kt)("p",null,"To remove an item, click the ",(0,r.kt)("inlineCode",{parentName:"p"},"X")," next to the entry."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/author-chip.png",style:{maxHeight:"80px"}}),(0,r.kt)("h3",{id:"locking-and-unlocking"},"Locking And Unlocking"),(0,r.kt)("p",null,"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:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Edit the field and it will lock automatically"),(0,r.kt)("li",{parentName:"ul"},"Click the lock icon to either lock or unlock the field"),(0,r.kt)("li",{parentName:"ul"},"A field is locked when the lock icon is colored orange")),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/locked-field.png",style:{maxHeight:"80px"}}),(0,r.kt)("h3",{id:"sort-titles"},"Sort Titles"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"Sort Title")," field lets you control how items are sorted alphabetically. The ",(0,r.kt)("inlineCode",{parentName:"p"},"Title")," field is what will be displayed, but the ",(0,r.kt)("inlineCode",{parentName:"p"},"Sort Title")," field is used for sorting."),(0,r.kt)("p",null,'For example, if you want to ignore the article ("The") for your series like "The Boys":'),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},'Find the "The Boys" series and open the Edit Details screen'),(0,r.kt)("li",{parentName:"ul"},"Click in the ",(0,r.kt)("inlineCode",{parentName:"li"},"Sort Title"),' and type "Boys (The)" then ',(0,r.kt)("inlineCode",{parentName:"li"},"Save Changes"))),(0,r.kt)("p",null,'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,r.kt)("inlineCode",{parentName:"p"},"Sort Title")," field."),(0,r.kt)("h3",{id:"sort-numbers"},"Sort Numbers"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"Sort Number")," field lets you control how items are sorted within a series. The ",(0,r.kt)("inlineCode",{parentName:"p"},"Number")," field is what will be displayed, but the ",(0,r.kt)("inlineCode",{parentName:"p"},"Sort Number")," field is used for sorting."),(0,r.kt)("p",null,'For example, if you have a "2015 Special" that is between book 24 and 25:'),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"set the ",(0,r.kt)("inlineCode",{parentName:"li"},"Number"),' to "2015 Special"'),(0,r.kt)("li",{parentName:"ul"},"set the ",(0,r.kt)("inlineCode",{parentName:"li"},"Sort Number"),' to "24.5"')),(0,r.kt)("p",null,'The result is that the special book will appear between book 24 and 25, and will show "2015 Special" as its number.'))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2727],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>p});var i=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=i.createContext({}),d=function(e){var t=i.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},m=function(e){var t=d(e.components);return i.createElement(o.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},h=i.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,o=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),u=d(a),h=r,p=u["".concat(o,".").concat(h)]||u[h]||c[h]||n;return a?i.createElement(p,l(l({ref:t},m),{},{components:a})):i.createElement(p,l({ref:t},m))}));function p(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,l=new Array(n);l[0]=h;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[u]="string"==typeof e?e:r,l[1]=s;for(var d=2;d{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>c,frontMatter:()=>n,metadata:()=>s,toc:()=>d});var i=a(7462),r=(a(7294),a(3905));const n={},l="Edit Metadata",s={unversionedId:"guides/edit-metadata",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/edit-metadata.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"One-Shots",permalink:"/docs/guides/oneshots"},next:{title:"Local Artwork Assets",permalink:"/docs/guides/local-artwork-assets"}},o={},d=[{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}],m={toc:d},u="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(u,(0,i.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"edit-metadata"},"Edit Metadata"),(0,r.kt)("p",null,"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."),(0,r.kt)("p",null,"You may wish to customize or change the information associated with a library item."),(0,r.kt)("h2",{id:"the-edit-screen"},"The Edit Screen"),(0,r.kt)("h3",{id:"opening-the-edit-screen"},"Opening the Edit Screen"),(0,r.kt)("p",null,"The edit screen for an item can be accessed in several ways, depending on where you are."),(0,r.kt)("h4",{id:"from-the-item-card"},"From the Item Card"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Hover over the item card"),(0,r.kt)("li",{parentName:"ol"},"Click the ",(0,r.kt)("img",{src:"/assets/media/guides/edit-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," icon")),(0,r.kt)("h4",{id:"from-the-item-details"},"From the Item Details"),(0,r.kt)("p",null,"When viewing the details for a Library item, click the ",(0,r.kt)("img",{src:"/assets/media/guides/edit-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," button in the top actionbar."),(0,r.kt)("h3",{id:"edit-screen-details"},"Edit Screen Details"),(0,r.kt)("p",null,"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."),(0,r.kt)("h4",{id:"edit-screen-for-series"},"Edit Screen for Series"),(0,r.kt)("h5",{id:"general"},"General"),(0,r.kt)("p",null,"The General screen allows you to edit details such as the title, sort title, summary, and more."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-series-general-2.png",style:{maxHeight:"300px"}}),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-series-general-2.png",style:{maxHeight:"300px"}}),(0,r.kt)("h5",{id:"tags"},"Tags"),(0,r.kt)("p",null,"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."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-series-tags.png",style:{maxHeight:"300px"}}),(0,r.kt)("h4",{id:"edit-screen-for-books"},"Edit Screen for Books"),(0,r.kt)("h5",{id:"general-1"},"General"),(0,r.kt)("p",null,"The General screen allows you to edit details such as the title, number, summary, and more."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-book-general.png",style:{maxHeight:"300px"}}),(0,r.kt)("h5",{id:"authors"},"Authors"),(0,r.kt)("p",null,"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."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-book-authors.png",style:{maxHeight:"300px"}}),(0,r.kt)("h5",{id:"tags-1"},"Tags"),(0,r.kt)("p",null,"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."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/edit-book-tags.png",style:{maxHeight:"300px"}}),(0,r.kt)("h2",{id:"using-the-edit-screen"},"Using the Edit Screen"),(0,r.kt)("h3",{id:"editing-standard-fields-tags-or-authors"},"Editing Standard Fields, Tags or Authors"),(0,r.kt)("h3",{id:"changing-fields"},"Changing Fields"),(0,r.kt)("p",null,"To edit the details for a particular piece of metadata:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Choose the tab of category you want to change on the left, then click the detail field"),(0,r.kt)("li",{parentName:"ul"},"Type or paste the changes"),(0,r.kt)("li",{parentName:"ul"},"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.")),(0,r.kt)("p",null,"To remove an item, click the ",(0,r.kt)("inlineCode",{parentName:"p"},"X")," next to the entry."),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/author-chip.png",style:{maxHeight:"80px"}}),(0,r.kt)("h3",{id:"locking-and-unlocking"},"Locking And Unlocking"),(0,r.kt)("p",null,"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:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Edit the field and it will lock automatically"),(0,r.kt)("li",{parentName:"ul"},"Click the lock icon to either lock or unlock the field"),(0,r.kt)("li",{parentName:"ul"},"A field is locked when the lock icon is colored orange")),(0,r.kt)("img",{src:"/assets/media/guides/edit-metadata/locked-field.png",style:{maxHeight:"80px"}}),(0,r.kt)("h3",{id:"sort-titles"},"Sort Titles"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"Sort Title")," field lets you control how items are sorted alphabetically. The ",(0,r.kt)("inlineCode",{parentName:"p"},"Title")," field is what will be displayed, but the ",(0,r.kt)("inlineCode",{parentName:"p"},"Sort Title")," field is used for sorting."),(0,r.kt)("p",null,'For example, if you want to ignore the article ("The") for your series like "The Boys":'),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},'Find the "The Boys" series and open the Edit Details screen'),(0,r.kt)("li",{parentName:"ul"},"Click in the ",(0,r.kt)("inlineCode",{parentName:"li"},"Sort Title"),' and type "Boys (The)" then ',(0,r.kt)("inlineCode",{parentName:"li"},"Save Changes"))),(0,r.kt)("p",null,'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,r.kt)("inlineCode",{parentName:"p"},"Sort Title")," field."),(0,r.kt)("h3",{id:"sort-numbers"},"Sort Numbers"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"Sort Number")," field lets you control how items are sorted within a series. The ",(0,r.kt)("inlineCode",{parentName:"p"},"Number")," field is what will be displayed, but the ",(0,r.kt)("inlineCode",{parentName:"p"},"Sort Number")," field is used for sorting."),(0,r.kt)("p",null,'For example, if you have a "2015 Special" that is between book 24 and 25:'),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"set the ",(0,r.kt)("inlineCode",{parentName:"li"},"Number"),' to "2015 Special"'),(0,r.kt)("li",{parentName:"ul"},"set the ",(0,r.kt)("inlineCode",{parentName:"li"},"Sort Number"),' to "24.5"')),(0,r.kt)("p",null,'The result is that the special book will appear between book 24 and 25, and will show "2015 Special" as its number.'))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4cc4731f.f00d7adf.js b/assets/js/4cc4731f.1711eeac.js similarity index 99% rename from assets/js/4cc4731f.f00d7adf.js rename to assets/js/4cc4731f.1711eeac.js index b739978e..1a5b04b9 100644 --- a/assets/js/4cc4731f.f00d7adf.js +++ b/assets/js/4cc4731f.1711eeac.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[1169],{3905:(t,e,a)=>{a.d(e,{Zo:()=>u,kt:()=>h});var n=a(7294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function r(t){for(var e=1;e=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var s=n.createContext({}),p=function(t){var e=n.useContext(s),a=e;return t&&(a="function"==typeof t?t(e):r(r({},e),t)),a},u=function(t){var e=p(t.components);return n.createElement(s.Provider,{value:e},t.children)},d="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,o=t.originalType,s=t.parentName,u=i(t,["components","mdxType","originalType","parentName"]),d=p(a),m=l,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||o;return a?n.createElement(h,r(r({ref:e},u),{},{components:a})):n.createElement(h,r({ref:e},u))}));function h(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var o=a.length,r=new Array(o);r[0]=m;var i={};for(var s in e)hasOwnProperty.call(e,s)&&(i[s]=e[s]);i.originalType=t,i[d]="string"==typeof t?t:l,r[1]=i;for(var p=2;p{a.r(e),a.d(e,{assets:()=>s,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=a(7462),l=(a(7294),a(3905));const o={},r="Install via third-party integrations",i={unversionedId:"installation/thirdparty",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/thirdparty.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Run with the Jar file",permalink:"/docs/installation/jar"},next:{title:"Configuration options",permalink:"/docs/installation/configuration"}},s={},p=[{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}],u={toc:p},d="wrapper";function c(t){let{components:e,...a}=t;return(0,l.kt)(d,(0,n.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"install-via-third-party-integrations"},"Install via third-party integrations"),(0,l.kt)("admonition",{title:"Warning",type:"caution"},(0,l.kt)("p",{parentName:"admonition"},"Those methods are not officially supported, if you encounter installation issues please contact the respective authors.")),(0,l.kt)("h2",{id:"windows-installer-and-updater"},"Windows Installer and Updater"),(0,l.kt)("p",null,"A ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/losslesspng/SetUpKomgaJava"},"Powershell script")," to get up and running with Komga."),(0,l.kt)("h2",{id:"scoop-windows"},"Scoop (Windows)"),(0,l.kt)("p",null,"Komga is available in ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/ScoopInstaller/Scoop"},"Scoop"),"'s ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/ScoopInstaller/Extras"},"extras")," bucket."),(0,l.kt)("h3",{id:"installation"},"Installation"),(0,l.kt)("p",null,"You need Scoop to use this installation method. Instruction to install Scoop can be found ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/ScoopInstaller/Scoop#installation"},"here"),"."),(0,l.kt)("h4",{id:"1-skip-if-jdk-is-installed-install-jdk"},"1. (Skip if JDK is installed) Install JDK"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop bucket add java")," and then run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop install java/temurin-lts-jdk"),"."),(0,l.kt)("h4",{id:"2-install-komga"},"2. Install Komga"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop bucket add extras")," and then run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop install komga"),"."),(0,l.kt)("h3",{id:"manage"},"Manage"),(0,l.kt)("h4",{id:"run"},"Run"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"komga"),"."),(0,l.kt)("p",null,"Note: Default config dir is ",(0,l.kt)("inlineCode",{parentName:"p"},"%USERPROFILE%\\scoop\\apps\\komga\\current\\config")),(0,l.kt)("h4",{id:"update"},"Update"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop update komga"),"."),(0,l.kt)("h4",{id:"uninstall"},"Uninstall"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop uninstall komga")),(0,l.kt)("h2",{id:"aur---arch-user-repository"},"AUR - Arch User Repository"),(0,l.kt)("p",null,"Komga is available as an ",(0,l.kt)("a",{parentName:"p",href:"https://aur.archlinux.org/packages/komga/"},"AUR")," package."),(0,l.kt)("h3",{id:"installation-1"},"Installation"),(0,l.kt)("p",null,"It can be installed using ",(0,l.kt)("inlineCode",{parentName:"p"},"yay -S komga")," (or any other AUR package manager)."),(0,l.kt)("h3",{id:"run-1"},"Run"),(0,l.kt)("p",null,"Just run ",(0,l.kt)("inlineCode",{parentName:"p"},"komga"),"."),(0,l.kt)("h2",{id:"qnap"},"QNAP"),(0,l.kt)("p",null,"Komga is available as a ",(0,l.kt)("a",{parentName:"p",href:"https://www.qnapclub.eu/en/qpkg/853"},"QPKG"),"."),(0,l.kt)("h2",{id:"freenas"},"FreeNAS"),(0,l.kt)("p",null,"There is a ",(0,l.kt)("a",{parentName:"p",href:"https://blog.tommyku.com/blog/deploying-komga-on-freenas-jail/"},"tutorial")," to install Komga on FreeNAS jail."),(0,l.kt)("h2",{id:"yunohost"},"YunoHost"),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://install-app.yunohost.org/?app=komga"},(0,l.kt)("img",{parentName:"a",src:"https://install-app.yunohost.org/install-with-yunohost.svg",alt:"Install Komga with YunoHost"}))),(0,l.kt)("h2",{id:"truenas-scale"},"TrueNAS SCALE"),(0,l.kt)("admonition",{type:"caution"},(0,l.kt)("p",{parentName:"admonition"},"SCALE is still in beta")),(0,l.kt)("p",null,"There is a ",(0,l.kt)("a",{parentName:"p",href:"https://truecharts.org/manual/Quick-Start%20Guides/01-Open-Apps/"},"tutorial")," to install Truecharts on TrueNAS SCALE. Follow steps 1-4 to add TrueCharts to SCALE.\nIn order to create komga you need to find it under the TrueCharts apps in SCALE.\nScale needs access to ip range of: 172.16.0.0/16 in order to deploy.\nKeep all defaults and change: "),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"Enter a name with lowercase letters."),(0,l.kt)("li",{parentName:"ol"},'Change the update type to "Rolling Update:Create new pods and then kill old ones"'),(0,l.kt)("li",{parentName:"ol"},"Next"),(0,l.kt)("li",{parentName:"ol"},"You can change the node port to whatever you prefer, this is the port you will be accessing komga over. "),(0,l.kt)("li",{parentName:"ol"},"This is the Komga Data source, add what you need. "),(0,l.kt)("li",{parentName:"ol"},"Next"),(0,l.kt)("li",{parentName:"ol"},"Next"),(0,l.kt)("li",{parentName:"ol"},"Choose the container resources (I chose default), Next."),(0,l.kt)("li",{parentName:"ol"},"I left this at disabled, Next."),(0,l.kt)("li",{parentName:"ol"},"Install Komga and let it run.\nOnce its installed click portal and you now have komga setup in SCALE.")))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[1169],{3905:(t,e,a)=>{a.d(e,{Zo:()=>u,kt:()=>h});var n=a(7294);function l(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function r(t){for(var e=1;e=0||(l[a]=t[a]);return l}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(l[a]=t[a])}return l}var s=n.createContext({}),p=function(t){var e=n.useContext(s),a=e;return t&&(a="function"==typeof t?t(e):r(r({},e),t)),a},u=function(t){var e=p(t.components);return n.createElement(s.Provider,{value:e},t.children)},d="mdxType",c={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,l=t.mdxType,o=t.originalType,s=t.parentName,u=i(t,["components","mdxType","originalType","parentName"]),d=p(a),m=l,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||o;return a?n.createElement(h,r(r({ref:e},u),{},{components:a})):n.createElement(h,r({ref:e},u))}));function h(t,e){var a=arguments,l=e&&e.mdxType;if("string"==typeof t||l){var o=a.length,r=new Array(o);r[0]=m;var i={};for(var s in e)hasOwnProperty.call(e,s)&&(i[s]=e[s]);i.originalType=t,i[d]="string"==typeof t?t:l,r[1]=i;for(var p=2;p{a.r(e),a.d(e,{assets:()=>s,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var n=a(7462),l=(a(7294),a(3905));const o={},r="Install via third-party integrations",i={unversionedId:"installation/thirdparty",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/thirdparty.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Run with the Jar file",permalink:"/docs/installation/jar"},next:{title:"Configuration options",permalink:"/docs/installation/configuration"}},s={},p=[{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}],u={toc:p},d="wrapper";function c(t){let{components:e,...a}=t;return(0,l.kt)(d,(0,n.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"install-via-third-party-integrations"},"Install via third-party integrations"),(0,l.kt)("admonition",{title:"Warning",type:"caution"},(0,l.kt)("p",{parentName:"admonition"},"Those methods are not officially supported, if you encounter installation issues please contact the respective authors.")),(0,l.kt)("h2",{id:"windows-installer-and-updater"},"Windows Installer and Updater"),(0,l.kt)("p",null,"A ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/losslesspng/SetUpKomgaJava"},"Powershell script")," to get up and running with Komga."),(0,l.kt)("h2",{id:"scoop-windows"},"Scoop (Windows)"),(0,l.kt)("p",null,"Komga is available in ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/ScoopInstaller/Scoop"},"Scoop"),"'s ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/ScoopInstaller/Extras"},"extras")," bucket."),(0,l.kt)("h3",{id:"installation"},"Installation"),(0,l.kt)("p",null,"You need Scoop to use this installation method. Instruction to install Scoop can be found ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/ScoopInstaller/Scoop#installation"},"here"),"."),(0,l.kt)("h4",{id:"1-skip-if-jdk-is-installed-install-jdk"},"1. (Skip if JDK is installed) Install JDK"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop bucket add java")," and then run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop install java/temurin-lts-jdk"),"."),(0,l.kt)("h4",{id:"2-install-komga"},"2. Install Komga"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop bucket add extras")," and then run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop install komga"),"."),(0,l.kt)("h3",{id:"manage"},"Manage"),(0,l.kt)("h4",{id:"run"},"Run"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"komga"),"."),(0,l.kt)("p",null,"Note: Default config dir is ",(0,l.kt)("inlineCode",{parentName:"p"},"%USERPROFILE%\\scoop\\apps\\komga\\current\\config")),(0,l.kt)("h4",{id:"update"},"Update"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop update komga"),"."),(0,l.kt)("h4",{id:"uninstall"},"Uninstall"),(0,l.kt)("p",null,"Run ",(0,l.kt)("inlineCode",{parentName:"p"},"scoop uninstall komga")),(0,l.kt)("h2",{id:"aur---arch-user-repository"},"AUR - Arch User Repository"),(0,l.kt)("p",null,"Komga is available as an ",(0,l.kt)("a",{parentName:"p",href:"https://aur.archlinux.org/packages/komga/"},"AUR")," package."),(0,l.kt)("h3",{id:"installation-1"},"Installation"),(0,l.kt)("p",null,"It can be installed using ",(0,l.kt)("inlineCode",{parentName:"p"},"yay -S komga")," (or any other AUR package manager)."),(0,l.kt)("h3",{id:"run-1"},"Run"),(0,l.kt)("p",null,"Just run ",(0,l.kt)("inlineCode",{parentName:"p"},"komga"),"."),(0,l.kt)("h2",{id:"qnap"},"QNAP"),(0,l.kt)("p",null,"Komga is available as a ",(0,l.kt)("a",{parentName:"p",href:"https://www.qnapclub.eu/en/qpkg/853"},"QPKG"),"."),(0,l.kt)("h2",{id:"freenas"},"FreeNAS"),(0,l.kt)("p",null,"There is a ",(0,l.kt)("a",{parentName:"p",href:"https://blog.tommyku.com/blog/deploying-komga-on-freenas-jail/"},"tutorial")," to install Komga on FreeNAS jail."),(0,l.kt)("h2",{id:"yunohost"},"YunoHost"),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://install-app.yunohost.org/?app=komga"},(0,l.kt)("img",{parentName:"a",src:"https://install-app.yunohost.org/install-with-yunohost.svg",alt:"Install Komga with YunoHost"}))),(0,l.kt)("h2",{id:"truenas-scale"},"TrueNAS SCALE"),(0,l.kt)("admonition",{type:"caution"},(0,l.kt)("p",{parentName:"admonition"},"SCALE is still in beta")),(0,l.kt)("p",null,"There is a ",(0,l.kt)("a",{parentName:"p",href:"https://truecharts.org/manual/Quick-Start%20Guides/01-Open-Apps/"},"tutorial")," to install Truecharts on TrueNAS SCALE. Follow steps 1-4 to add TrueCharts to SCALE.\nIn order to create komga you need to find it under the TrueCharts apps in SCALE.\nScale needs access to ip range of: 172.16.0.0/16 in order to deploy.\nKeep all defaults and change: "),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"Enter a name with lowercase letters."),(0,l.kt)("li",{parentName:"ol"},'Change the update type to "Rolling Update:Create new pods and then kill old ones"'),(0,l.kt)("li",{parentName:"ol"},"Next"),(0,l.kt)("li",{parentName:"ol"},"You can change the node port to whatever you prefer, this is the port you will be accessing komga over. "),(0,l.kt)("li",{parentName:"ol"},"This is the Komga Data source, add what you need. "),(0,l.kt)("li",{parentName:"ol"},"Next"),(0,l.kt)("li",{parentName:"ol"},"Next"),(0,l.kt)("li",{parentName:"ol"},"Choose the container resources (I chose default), Next."),(0,l.kt)("li",{parentName:"ol"},"I left this at disabled, Next."),(0,l.kt)("li",{parentName:"ol"},"Install Komga and let it run.\nOnce its installed click portal and you now have komga setup in SCALE.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4e7428db.1027eee5.js b/assets/js/4e7428db.291c22c5.js similarity index 88% rename from assets/js/4e7428db.1027eee5.js rename to assets/js/4e7428db.291c22c5.js index e1f18c5e..9e119ea2 100644 --- a/assets/js/4e7428db.1027eee5.js +++ b/assets/js/4e7428db.291c22c5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9835],{7821:a=>{a.exports=JSON.parse('{"label":"komga","permalink":"/blog/tags/komga","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9835],{7821:a=>{a.exports=JSON.parse('{"label":"komga","permalink":"/blog/tags/komga","allTagsPath":"/blog/tags","count":2}')}}]); \ No newline at end of file diff --git a/assets/js/55519d27.1804b50f.js b/assets/js/55519d27.3e834a74.js similarity index 99% rename from assets/js/55519d27.1804b50f.js rename to assets/js/55519d27.3e834a74.js index 94eb848d..388f1447 100644 --- a/assets/js/55519d27.1804b50f.js +++ b/assets/js/55519d27.3e834a74.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4114],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var i=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=i.createContext({}),c=function(e){var t=i.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return i.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=c(a),m=r,h=p["".concat(s,".").concat(m)]||p[m]||u[m]||n;return a?i.createElement(h,o(o({ref:t},d),{},{components:a})):i.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,o=new Array(n);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,o[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var i=a(7462),r=(a(7294),a(3905));const n={},o="Libraries",l={unversionedId:"guides/libraries",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/libraries.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Desktop Application",permalink:"/docs/guides/desktop"},next:{title:"Emptying Library Trash",permalink:"/docs/guides/trash"}},s={},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}],d={toc:c},p="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(p,(0,i.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"libraries"},"Libraries"),(0,r.kt)("p",null,"You can separate content in different libraries, a library is a group of books. Libraries access can also be restricted to specific users."),(0,r.kt)("p",null,"Each library has a root folder, and no library can share any part of their path."),(0,r.kt)("p",null,"For example if you have a library with a root path of ",(0,r.kt)("inlineCode",{parentName:"p"},"/books/mangas"),", you can't create a library with a root path of ",(0,r.kt)("inlineCode",{parentName:"p"},"/books"),", because the two root paths would overlap. You can however create a library with a root path of ",(0,r.kt)("inlineCode",{parentName:"p"},"/books/comics"),"."),(0,r.kt)("h2",{id:"creating-libraries"},"Creating libraries"),(0,r.kt)("p",null,"From the web interface:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"click on the ",(0,r.kt)("em",{parentName:"li"},"+")," icon next to ",(0,r.kt)("em",{parentName:"li"},"Libraries")," in the sidebar ",(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add.png",style:{verticalAlign:"middle",maxHeight:"32px"}})),(0,r.kt)("li",{parentName:"ul"},"choose a ",(0,r.kt)("em",{parentName:"li"},"Name")," for your library"),(0,r.kt)("li",{parentName:"ul"},"click the ",(0,r.kt)("em",{parentName:"li"},"Browse")," button and select a root folder containing your books"),(0,r.kt)("li",{parentName:"ul"},"click ",(0,r.kt)("em",{parentName:"li"},"Add"))),(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add-dialog.png",style:{maxHeight:"300px"},alt:"Add Library Dialog"}),(0,r.kt)("p",null,"You can also specify extra options."),(0,r.kt)("h3",{id:"scanner"},"Scanner"),(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add-scanner.png",style:{maxHeight:"400px"},alt:"Add Library Dialog Scanner"}),(0,r.kt)("h4",{id:"empty-trash-automatically-after-every-scan"},"Empty trash automatically after every scan"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/guides/trash#automatically-empty-trash"},"Emptying library trash"),"."),(0,r.kt)("h4",{id:"force-directory-modified-time"},"Force directory modified time"),(0,r.kt)("p",null,"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)."),(0,r.kt)("h4",{id:"scan-on-startup"},"Scan on startup"),(0,r.kt)("p",null,"If enabled, the library will be scanner when Komga starts."),(0,r.kt)("h4",{id:"scan-interval"},"Scan interval"),(0,r.kt)("p",null,"Choose to scan all of your libraries on a time-based interval. Choose the interval to use from the dropdown. Available frequencies:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"disabled"),(0,r.kt)("li",{parentName:"ul"},"hourly"),(0,r.kt)("li",{parentName:"ul"},"every 6 hours"),(0,r.kt)("li",{parentName:"ul"},"every 12 hours"),(0,r.kt)("li",{parentName:"ul"},"daily"),(0,r.kt)("li",{parentName:"ul"},"weekly")),(0,r.kt)("p",null,"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."),(0,r.kt)("h4",{id:"one-shots-directory"},"One-Shots directory"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/guides/oneshots"},"One-Shots"),"."),(0,r.kt)("h4",{id:"scan-for-these-file-types"},"Scan for these file types"),(0,r.kt)("p",null,"This will configure the scanner to only look for files with specific file extensions. Available types:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Comic Book archives: ",(0,r.kt)("inlineCode",{parentName:"li"},"cbz"),", ",(0,r.kt)("inlineCode",{parentName:"li"},"zip"),", ",(0,r.kt)("inlineCode",{parentName:"li"},"cbr"),", ",(0,r.kt)("inlineCode",{parentName:"li"},"rar")),(0,r.kt)("li",{parentName:"ul"},"PDF: ",(0,r.kt)("inlineCode",{parentName:"li"},"pdf")),(0,r.kt)("li",{parentName:"ul"},"Epub: ",(0,r.kt)("inlineCode",{parentName:"li"},"epub"))),(0,r.kt)("h4",{id:"directory-exclusions"},"Directory exclusions"),(0,r.kt)("p",null,"You can specify any pattern to exclude directory subtrees from the scan."),(0,r.kt)("p",null,"Any directory for which the full path contains any of the configured patterns will be ignored during the scan."),(0,r.kt)("p",null,"Patterns are checked against ",(0,r.kt)("strong",{parentName:"p"},"any part of the directory path"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"#recycle")," will match on:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/data/books/Comics/#recycle")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/data/books/Comics/My weirdly named #recycle comic"))))),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"To match only directories starting with the provided string, prefix the pattern with ",(0,r.kt)("inlineCode",{parentName:"p"},"/"),", like ",(0,r.kt)("inlineCode",{parentName:"p"},"/#recycle"))),(0,r.kt)("h3",{id:"options"},"Options"),(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add-options.png",style:{maxHeight:"500px"},alt:"Add Library Dialog Options"}),(0,r.kt)("h4",{id:"analysis"},"Analysis"),(0,r.kt)("h5",{id:"compute-hash-for-files"},"Compute hash for files"),(0,r.kt)("p",null,'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.'),(0,r.kt)("p",null,"This can consume lots of resources on large libraries or slow hardware."),(0,r.kt)("h5",{id:"compute-hash-for-pages"},"Compute hash for pages"),(0,r.kt)("p",null,"Komga will compute a filehash for the first and last 3 pages in each book (",(0,r.kt)("inlineCode",{parentName:"p"},"cbz")," only). Those are used to detect duplicate pages."),(0,r.kt)("p",null,"This can consume lots of resources on large libraries or slow hardware."),(0,r.kt)("h5",{id:"analyze-page-dimensions"},"Analyze page dimensions"),(0,r.kt)("p",null,"Komga will retrieve each page's dimensions (width and height). This is useful for:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"properly displaying landscape pages in the web reader, when using double pages"),(0,r.kt)("li",{parentName:"ul"},'comparing page dimensions in the "Import" dialog')),(0,r.kt)("p",null,"This can consume lots of resources on large libraries or slow hardware."),(0,r.kt)("h4",{id:"file-management"},"File management"),(0,r.kt)("h5",{id:"automatically-repair-incorrect-file-extensions"},"Automatically repair incorrect file extensions"),(0,r.kt)("p",null,"Files with an incorrect extension will be automatically renamed in the background. For example a ",(0,r.kt)("inlineCode",{parentName:"p"},"zip")," file with a ",(0,r.kt)("inlineCode",{parentName:"p"},".cbr")," extension will be renamed to ",(0,r.kt)("inlineCode",{parentName:"p"},".cbz"),"."),(0,r.kt)("h5",{id:"automatically-convert-to-cbz"},"Automatically convert to CBZ"),(0,r.kt)("p",null,"Books in ",(0,r.kt)("inlineCode",{parentName:"p"},"rar"),"/",(0,r.kt)("inlineCode",{parentName:"p"},"cbr")," format (RAR4 only) will be converted to ",(0,r.kt)("inlineCode",{parentName:"p"},"cbz")," automatically in the background. The ",(0,r.kt)("inlineCode",{parentName:"p"},"zip")," files are created with the ",(0,r.kt)("inlineCode",{parentName:"p"},"DEFLATE")," method without compression."),(0,r.kt)("h4",{id:"series-cover"},"Series cover"),(0,r.kt)("p",null,"Choose which book cover is used for the series."),(0,r.kt)("h3",{id:"metadata"},"Metadata"),(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add-metadata.png",style:{maxHeight:"600px"},alt:"Add Library Dialog Metadata"}),(0,r.kt)("p",null,"Check the ",(0,r.kt)("a",{parentName:"p",href:"/docs/guides/scan-analysis-refresh#refresh-metadata"},"Refresh Metadata")," section to know more about what they do."),(0,r.kt)("h2",{id:"edit-a-library"},"Edit a library"),(0,r.kt)("p",null,"To edit a library, look for the action menu icon ",(0,r.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,r.kt)("em",{parentName:"p"},"Edit"),"."),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"If you change the root folder of a library, and ",(0,r.kt)("strong",{parentName:"p"},"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,r.kt)("p",{parentName:"admonition"},"If you change the path ",(0,r.kt)("strong",{parentName:"p"},"for a parent directory of the current path"),", you will not lose your content."),(0,r.kt)("p",{parentName:"admonition"},"If you change the path ",(0,r.kt)("strong",{parentName:"p"},"for a child directory of the current path"),", you will lose part of your content.")),(0,r.kt)("h2",{id:"delete-a-library"},"Delete a library"),(0,r.kt)("p",null,"To delete a library, look for the action menu icon ",(0,r.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,r.kt)("em",{parentName:"p"},"Delete"),"."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"Deleting a library will remove all series and books contained in this library. Read progress for all those books will be deleted."),(0,r.kt)("p",{parentName:"admonition"},"Your media files will not be affected."),(0,r.kt)("p",{parentName:"admonition"},"This cannot be undone.")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4114],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var i=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=i.createContext({}),c=function(e){var t=i.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=c(e.components);return i.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},m=i.forwardRef((function(e,t){var a=e.components,r=e.mdxType,n=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=c(a),m=r,h=p["".concat(s,".").concat(m)]||p[m]||u[m]||n;return a?i.createElement(h,o(o({ref:t},d),{},{components:a})):i.createElement(h,o({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=a.length,o=new Array(n);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,o[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var i=a(7462),r=(a(7294),a(3905));const n={},o="Libraries",l={unversionedId:"guides/libraries",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/libraries.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Desktop Application",permalink:"/docs/guides/desktop"},next:{title:"Emptying Library Trash",permalink:"/docs/guides/trash"}},s={},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}],d={toc:c},p="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(p,(0,i.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"libraries"},"Libraries"),(0,r.kt)("p",null,"You can separate content in different libraries, a library is a group of books. Libraries access can also be restricted to specific users."),(0,r.kt)("p",null,"Each library has a root folder, and no library can share any part of their path."),(0,r.kt)("p",null,"For example if you have a library with a root path of ",(0,r.kt)("inlineCode",{parentName:"p"},"/books/mangas"),", you can't create a library with a root path of ",(0,r.kt)("inlineCode",{parentName:"p"},"/books"),", because the two root paths would overlap. You can however create a library with a root path of ",(0,r.kt)("inlineCode",{parentName:"p"},"/books/comics"),"."),(0,r.kt)("h2",{id:"creating-libraries"},"Creating libraries"),(0,r.kt)("p",null,"From the web interface:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"click on the ",(0,r.kt)("em",{parentName:"li"},"+")," icon next to ",(0,r.kt)("em",{parentName:"li"},"Libraries")," in the sidebar ",(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add.png",style:{verticalAlign:"middle",maxHeight:"32px"}})),(0,r.kt)("li",{parentName:"ul"},"choose a ",(0,r.kt)("em",{parentName:"li"},"Name")," for your library"),(0,r.kt)("li",{parentName:"ul"},"click the ",(0,r.kt)("em",{parentName:"li"},"Browse")," button and select a root folder containing your books"),(0,r.kt)("li",{parentName:"ul"},"click ",(0,r.kt)("em",{parentName:"li"},"Add"))),(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add-dialog.png",style:{maxHeight:"300px"},alt:"Add Library Dialog"}),(0,r.kt)("p",null,"You can also specify extra options."),(0,r.kt)("h3",{id:"scanner"},"Scanner"),(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add-scanner.png",style:{maxHeight:"400px"},alt:"Add Library Dialog Scanner"}),(0,r.kt)("h4",{id:"empty-trash-automatically-after-every-scan"},"Empty trash automatically after every scan"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/guides/trash#automatically-empty-trash"},"Emptying library trash"),"."),(0,r.kt)("h4",{id:"force-directory-modified-time"},"Force directory modified time"),(0,r.kt)("p",null,"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)."),(0,r.kt)("h4",{id:"scan-on-startup"},"Scan on startup"),(0,r.kt)("p",null,"If enabled, the library will be scanner when Komga starts."),(0,r.kt)("h4",{id:"scan-interval"},"Scan interval"),(0,r.kt)("p",null,"Choose to scan all of your libraries on a time-based interval. Choose the interval to use from the dropdown. Available frequencies:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"disabled"),(0,r.kt)("li",{parentName:"ul"},"hourly"),(0,r.kt)("li",{parentName:"ul"},"every 6 hours"),(0,r.kt)("li",{parentName:"ul"},"every 12 hours"),(0,r.kt)("li",{parentName:"ul"},"daily"),(0,r.kt)("li",{parentName:"ul"},"weekly")),(0,r.kt)("p",null,"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."),(0,r.kt)("h4",{id:"one-shots-directory"},"One-Shots directory"),(0,r.kt)("p",null,"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/guides/oneshots"},"One-Shots"),"."),(0,r.kt)("h4",{id:"scan-for-these-file-types"},"Scan for these file types"),(0,r.kt)("p",null,"This will configure the scanner to only look for files with specific file extensions. Available types:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Comic Book archives: ",(0,r.kt)("inlineCode",{parentName:"li"},"cbz"),", ",(0,r.kt)("inlineCode",{parentName:"li"},"zip"),", ",(0,r.kt)("inlineCode",{parentName:"li"},"cbr"),", ",(0,r.kt)("inlineCode",{parentName:"li"},"rar")),(0,r.kt)("li",{parentName:"ul"},"PDF: ",(0,r.kt)("inlineCode",{parentName:"li"},"pdf")),(0,r.kt)("li",{parentName:"ul"},"Epub: ",(0,r.kt)("inlineCode",{parentName:"li"},"epub"))),(0,r.kt)("h4",{id:"directory-exclusions"},"Directory exclusions"),(0,r.kt)("p",null,"You can specify any pattern to exclude directory subtrees from the scan."),(0,r.kt)("p",null,"Any directory for which the full path contains any of the configured patterns will be ignored during the scan."),(0,r.kt)("p",null,"Patterns are checked against ",(0,r.kt)("strong",{parentName:"p"},"any part of the directory path"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"#recycle")," will match on:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/data/books/Comics/#recycle")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/data/books/Comics/My weirdly named #recycle comic"))))),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"To match only directories starting with the provided string, prefix the pattern with ",(0,r.kt)("inlineCode",{parentName:"p"},"/"),", like ",(0,r.kt)("inlineCode",{parentName:"p"},"/#recycle"))),(0,r.kt)("h3",{id:"options"},"Options"),(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add-options.png",style:{maxHeight:"500px"},alt:"Add Library Dialog Options"}),(0,r.kt)("h4",{id:"analysis"},"Analysis"),(0,r.kt)("h5",{id:"compute-hash-for-files"},"Compute hash for files"),(0,r.kt)("p",null,'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.'),(0,r.kt)("p",null,"This can consume lots of resources on large libraries or slow hardware."),(0,r.kt)("h5",{id:"compute-hash-for-pages"},"Compute hash for pages"),(0,r.kt)("p",null,"Komga will compute a filehash for the first and last 3 pages in each book (",(0,r.kt)("inlineCode",{parentName:"p"},"cbz")," only). Those are used to detect duplicate pages."),(0,r.kt)("p",null,"This can consume lots of resources on large libraries or slow hardware."),(0,r.kt)("h5",{id:"analyze-page-dimensions"},"Analyze page dimensions"),(0,r.kt)("p",null,"Komga will retrieve each page's dimensions (width and height). This is useful for:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"properly displaying landscape pages in the web reader, when using double pages"),(0,r.kt)("li",{parentName:"ul"},'comparing page dimensions in the "Import" dialog')),(0,r.kt)("p",null,"This can consume lots of resources on large libraries or slow hardware."),(0,r.kt)("h4",{id:"file-management"},"File management"),(0,r.kt)("h5",{id:"automatically-repair-incorrect-file-extensions"},"Automatically repair incorrect file extensions"),(0,r.kt)("p",null,"Files with an incorrect extension will be automatically renamed in the background. For example a ",(0,r.kt)("inlineCode",{parentName:"p"},"zip")," file with a ",(0,r.kt)("inlineCode",{parentName:"p"},".cbr")," extension will be renamed to ",(0,r.kt)("inlineCode",{parentName:"p"},".cbz"),"."),(0,r.kt)("h5",{id:"automatically-convert-to-cbz"},"Automatically convert to CBZ"),(0,r.kt)("p",null,"Books in ",(0,r.kt)("inlineCode",{parentName:"p"},"rar"),"/",(0,r.kt)("inlineCode",{parentName:"p"},"cbr")," format (RAR4 only) will be converted to ",(0,r.kt)("inlineCode",{parentName:"p"},"cbz")," automatically in the background. The ",(0,r.kt)("inlineCode",{parentName:"p"},"zip")," files are created with the ",(0,r.kt)("inlineCode",{parentName:"p"},"DEFLATE")," method without compression."),(0,r.kt)("h4",{id:"series-cover"},"Series cover"),(0,r.kt)("p",null,"Choose which book cover is used for the series."),(0,r.kt)("h3",{id:"metadata"},"Metadata"),(0,r.kt)("img",{src:"/assets/media/guides/libraries/library-add-metadata.png",style:{maxHeight:"600px"},alt:"Add Library Dialog Metadata"}),(0,r.kt)("p",null,"Check the ",(0,r.kt)("a",{parentName:"p",href:"/docs/guides/scan-analysis-refresh#refresh-metadata"},"Refresh Metadata")," section to know more about what they do."),(0,r.kt)("h2",{id:"edit-a-library"},"Edit a library"),(0,r.kt)("p",null,"To edit a library, look for the action menu icon ",(0,r.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,r.kt)("em",{parentName:"p"},"Edit"),"."),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"If you change the root folder of a library, and ",(0,r.kt)("strong",{parentName:"p"},"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,r.kt)("p",{parentName:"admonition"},"If you change the path ",(0,r.kt)("strong",{parentName:"p"},"for a parent directory of the current path"),", you will not lose your content."),(0,r.kt)("p",{parentName:"admonition"},"If you change the path ",(0,r.kt)("strong",{parentName:"p"},"for a child directory of the current path"),", you will lose part of your content.")),(0,r.kt)("h2",{id:"delete-a-library"},"Delete a library"),(0,r.kt)("p",null,"To delete a library, look for the action menu icon ",(0,r.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,r.kt)("em",{parentName:"p"},"Delete"),"."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"Deleting a library will remove all series and books contained in this library. Read progress for all those books will be deleted."),(0,r.kt)("p",{parentName:"admonition"},"Your media files will not be affected."),(0,r.kt)("p",{parentName:"admonition"},"This cannot be undone.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5592dbb1.cb2bec82.js b/assets/js/5592dbb1.9452bf16.js similarity index 96% rename from assets/js/5592dbb1.cb2bec82.js rename to assets/js/5592dbb1.9452bf16.js index 0bc7e27a..dcc1c580 100644 --- a/assets/js/5592dbb1.cb2bec82.js +++ b/assets/js/5592dbb1.9452bf16.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[8336],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(r),m=o,f=u["".concat(l,".").concat(m)]||u[m]||d[m]||i;return r?n.createElement(f,a(a({ref:t},c),{},{components:r})):n.createElement(f,a({ref:t},c))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[u]="string"==typeof e?e:o,a[1]=p;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const i={},a="Desktop Application",p={unversionedId:"guides/desktop",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/desktop.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Accessing the web interface",permalink:"/docs/guides/webui"},next:{title:"Libraries",permalink:"/docs/guides/libraries"}},l={},s=[],c={toc:s},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"desktop-application"},"Desktop Application"),(0,o.kt)("p",null,"The Desktop application runs in your menu bar / tray icon:"),(0,o.kt)("img",{src:"/assets/media/guides/desktop/desktop-menu.png",style:{maxHeight:"200px"},alt:"Desktop application menu"}),(0,o.kt)("p",null,"From the menu you can:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Open Komga: this will open the ",(0,o.kt)("a",{parentName:"li",href:"./webui"},"web interface"),"."),(0,o.kt)("li",{parentName:"ul"},"Show log file: this will open a file explorer at the location of the log file."),(0,o.kt)("li",{parentName:"ul"},"Open configuration directory: this will open a file explorer at the location of the configuration directory."),(0,o.kt)("li",{parentName:"ul"},"Quit Komga: this will stop Komga and exit the application.")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[8336],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(r),m=o,f=u["".concat(l,".").concat(m)]||u[m]||d[m]||i;return r?n.createElement(f,a(a({ref:t},c),{},{components:r})):n.createElement(f,a({ref:t},c))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[u]="string"==typeof e?e:o,a[1]=p;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const i={},a="Desktop Application",p={unversionedId:"guides/desktop",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/desktop.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Accessing the web interface",permalink:"/docs/guides/webui"},next:{title:"Libraries",permalink:"/docs/guides/libraries"}},l={},s=[],c={toc:s},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"desktop-application"},"Desktop Application"),(0,o.kt)("p",null,"The Desktop application runs in your menu bar / tray icon:"),(0,o.kt)("img",{src:"/assets/media/guides/desktop/desktop-menu.png",style:{maxHeight:"200px"},alt:"Desktop application menu"}),(0,o.kt)("p",null,"From the menu you can:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Open Komga: this will open the ",(0,o.kt)("a",{parentName:"li",href:"./webui"},"web interface"),"."),(0,o.kt)("li",{parentName:"ul"},"Show log file: this will open a file explorer at the location of the log file."),(0,o.kt)("li",{parentName:"ul"},"Open configuration directory: this will open a file explorer at the location of the configuration directory."),(0,o.kt)("li",{parentName:"ul"},"Quit Komga: this will stop Komga and exit the application.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/58903ab2.09129091.js b/assets/js/58903ab2.a6850f2f.js similarity index 98% rename from assets/js/58903ab2.09129091.js rename to assets/js/58903ab2.a6850f2f.js index 9c2ae4ec..6590c257 100644 --- a/assets/js/58903ab2.09129091.js +++ b/assets/js/58903ab2.a6850f2f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6399],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=s(n),f=r,h=d["".concat(p,".").concat(f)]||d[f]||u[f]||o;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=f;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const o={},i="Install the Desktop application",l={unversionedId:"installation/desktop",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/desktop.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install from the Microsoft Store",permalink:"/docs/installation/ms-store"},next:{title:"Run with Docker",permalink:"/docs/installation/docker"}},p={},s=[{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}],c={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"install-the-desktop-application"},"Install the Desktop application"),(0,r.kt)("p",null,"You can install Komga from the ",(0,r.kt)("a",{parentName:"p",href:"https://download.komga.org"},"Download page"),". Just follow the instructions on the page."),(0,r.kt)("p",null,"The desktop application is available for Windows, macOS and Linux."),(0,r.kt)("h2",{id:"updating"},"Updating"),(0,r.kt)("p",null,"The application will automatically update itself when a new version is available."),(0,r.kt)("h3",{id:"windows"},"Windows"),(0,r.kt)("p",null,"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."),(0,r.kt)("h3",{id:"macos"},"macOS"),(0,r.kt)("p",null,"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."),(0,r.kt)("h3",{id:"linux"},"Linux"),(0,r.kt)("p",null,"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."),(0,r.kt)("h2",{id:"read-next"},"Read next"),(0,r.kt)("p",null,"Check the ",(0,r.kt)("a",{parentName:"p",href:"../guides/desktop"},"Desktop Application")," page."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6399],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=s(n),f=r,h=d["".concat(p,".").concat(f)]||d[f]||u[f]||o;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=f;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const o={},i="Install the Desktop application",l={unversionedId:"installation/desktop",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/desktop.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install from the Microsoft Store",permalink:"/docs/installation/ms-store"},next:{title:"Run with Docker",permalink:"/docs/installation/docker"}},p={},s=[{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}],c={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"install-the-desktop-application"},"Install the Desktop application"),(0,r.kt)("p",null,"You can install Komga from the ",(0,r.kt)("a",{parentName:"p",href:"https://download.komga.org"},"Download page"),". Just follow the instructions on the page."),(0,r.kt)("p",null,"The desktop application is available for Windows, macOS and Linux."),(0,r.kt)("h2",{id:"updating"},"Updating"),(0,r.kt)("p",null,"The application will automatically update itself when a new version is available."),(0,r.kt)("h3",{id:"windows"},"Windows"),(0,r.kt)("p",null,"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."),(0,r.kt)("h3",{id:"macos"},"macOS"),(0,r.kt)("p",null,"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."),(0,r.kt)("h3",{id:"linux"},"Linux"),(0,r.kt)("p",null,"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."),(0,r.kt)("h2",{id:"read-next"},"Read next"),(0,r.kt)("p",null,"Check the ",(0,r.kt)("a",{parentName:"p",href:"../guides/desktop"},"Desktop Application")," page."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5e80a3fb.1415f59d.js b/assets/js/5e80a3fb.beeb7f42.js similarity index 78% rename from assets/js/5e80a3fb.1415f59d.js rename to assets/js/5e80a3fb.beeb7f42.js index 04c2a5eb..10b76269 100644 --- a/assets/js/5e80a3fb.1415f59d.js +++ b/assets/js/5e80a3fb.beeb7f42.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5370],{6072:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/komga","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Latest Komga announcements","blogTitle":"Announcements"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5370],{6072:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/komga","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Latest Komga announcements","blogTitle":"Announcements"}')}}]); \ No newline at end of file diff --git a/assets/js/5ef0e9d6.ffe1dc32.js b/assets/js/5ef0e9d6.1595fc32.js similarity index 98% rename from assets/js/5ef0e9d6.ffe1dc32.js rename to assets/js/5ef0e9d6.1595fc32.js index 6ae94e6f..72ce39d5 100644 --- a/assets/js/5ef0e9d6.ffe1dc32.js +++ b/assets/js/5ef0e9d6.1595fc32.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9880],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>g});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var c=r.createContext({}),u=function(e){var t=r.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=u(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),s=u(a),d=n,g=s["".concat(c,".").concat(d)]||s[d]||p[d]||o;return a?r.createElement(g,i(i({ref:t},m),{},{components:a})):r.createElement(g,i({ref:t},m))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(7462),n=(a(7294),a(3905));const o={},i="Community",l={unversionedId:"community",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/community.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Contribution",permalink:"/docs/contribution"},next:{title:"Frequently Asked Questions",permalink:"/docs/faq"}},c={},u=[{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}],m={toc:u},s="wrapper";function p(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"community"},"Community"),(0,n.kt)("p",null,"This page lists community applications or tools that can be used alongside Komga."),(0,n.kt)("h2",{id:"komf"},"Komf"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/Snd-R/komf"},"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.")),(0,n.kt)("h2",{id:"kurp"},"Kurp"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/Snd-R/kurp"},"Komga and Kavita upscaling reverse proxy"),". Reverse proxy that intercepts image requests and applies upscaling. Other requests are transparently proxied without noticable delay")),(0,n.kt)("h2",{id:"manga-manager"},"Manga Manager"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/MangaManagerORG/Manga-Manager"},"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.")),(0,n.kt)("h2",{id:"komi"},"KoMI"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://github.com/edwinbadillo/KoMI"},"KoMI")," is a user script that adds buttons in the series page to perform metadata matching with online sources."),(0,n.kt)("h2",{id:"mylar-league"},"Mylar League"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/flips22/mylar-league"},"Mylar League")," is a collection of various tools to aid in the integration of mylar and komga with leagueofcomicgeeks.com.")))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9880],{3905:(e,t,a)=>{a.d(t,{Zo:()=>m,kt:()=>g});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var c=r.createContext({}),u=function(e){var t=r.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=u(e.components);return r.createElement(c.Provider,{value:t},e.children)},s="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),s=u(a),d=n,g=s["".concat(c,".").concat(d)]||s[d]||p[d]||o;return a?r.createElement(g,i(i({ref:t},m),{},{components:a})):r.createElement(g,i({ref:t},m))}));function g(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[s]="string"==typeof e?e:n,i[1]=l;for(var u=2;u{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=a(7462),n=(a(7294),a(3905));const o={},i="Community",l={unversionedId:"community",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/community.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Contribution",permalink:"/docs/contribution"},next:{title:"Frequently Asked Questions",permalink:"/docs/faq"}},c={},u=[{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}],m={toc:u},s="wrapper";function p(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,r.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"community"},"Community"),(0,n.kt)("p",null,"This page lists community applications or tools that can be used alongside Komga."),(0,n.kt)("h2",{id:"komf"},"Komf"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/Snd-R/komf"},"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.")),(0,n.kt)("h2",{id:"kurp"},"Kurp"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/Snd-R/kurp"},"Komga and Kavita upscaling reverse proxy"),". Reverse proxy that intercepts image requests and applies upscaling. Other requests are transparently proxied without noticable delay")),(0,n.kt)("h2",{id:"manga-manager"},"Manga Manager"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/MangaManagerORG/Manga-Manager"},"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.")),(0,n.kt)("h2",{id:"komi"},"KoMI"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://github.com/edwinbadillo/KoMI"},"KoMI")," is a user script that adds buttons in the series page to perform metadata matching with online sources."),(0,n.kt)("h2",{id:"mylar-league"},"Mylar League"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://github.com/flips22/mylar-league"},"Mylar League")," is a collection of various tools to aid in the integration of mylar and komga with leagueofcomicgeeks.com.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/607df45e.2d1ba688.js b/assets/js/607df45e.8d7b923f.js similarity index 98% rename from assets/js/607df45e.2d1ba688.js rename to assets/js/607df45e.8d7b923f.js index 374fbabb..754bf14b 100644 --- a/assets/js/607df45e.2d1ba688.js +++ b/assets/js/607df45e.8d7b923f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9112],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={},i="Google Drive and rclone",l={unversionedId:"installation/gdrive",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/gdrive.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Social login",permalink:"/docs/installation/oauth2"},next:{title:"Guides",permalink:"/docs/category/guides"}},c={},s=[],p={toc:s},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"google-drive-and-rclone"},"Google Drive and rclone"),(0,o.kt)("p",null,"If your books are stored on Google Drive, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/plexdrive/plexdrive"},"Plexdrive")," or ",(0,o.kt)("a",{parentName:"p",href:"https://rclone.org/"},"rclone")," to make them accessible to Komga."),(0,o.kt)("p",null,"You will need to configure your library to ",(0,o.kt)("a",{parentName:"p",href:"/docs/guides/libraries#force-directory-modified-time"},"force the directory modified time"),"."),(0,o.kt)("p",null,"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):"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-shell"},"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")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9112],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={},i="Google Drive and rclone",l={unversionedId:"installation/gdrive",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/gdrive.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Social login",permalink:"/docs/installation/oauth2"},next:{title:"Guides",permalink:"/docs/category/guides"}},c={},s=[],p={toc:s},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"google-drive-and-rclone"},"Google Drive and rclone"),(0,o.kt)("p",null,"If your books are stored on Google Drive, you can use ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/plexdrive/plexdrive"},"Plexdrive")," or ",(0,o.kt)("a",{parentName:"p",href:"https://rclone.org/"},"rclone")," to make them accessible to Komga."),(0,o.kt)("p",null,"You will need to configure your library to ",(0,o.kt)("a",{parentName:"p",href:"/docs/guides/libraries#force-directory-modified-time"},"force the directory modified time"),"."),(0,o.kt)("p",null,"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):"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-shell"},"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")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/634dddf1.86763aaa.js b/assets/js/634dddf1.86763aaa.js new file mode 100644 index 00000000..5854b9ce --- /dev/null +++ b/assets/js/634dddf1.86763aaa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5862],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});var a=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function s(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),m=p(r),g=o,d=m["".concat(l,".").concat(g)]||m[g]||c[g]||n;return r?a.createElement(d,s(s({ref:t},u),{},{components:r})):a.createElement(d,s({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,s=new Array(n);s[0]=g;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[m]="string"==typeof e?e:o,s[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var a=r(7462),o=(r(7294),r(3905));const n={slug:"ebook-support",title:"eBook support",authors:"gotson",tags:["upgrade","komga"]},s=void 0,i={permalink:"/blog/ebook-support",source:"@site/blog/2023-11-29-ebooks.md",title:"eBook support",description:"Version 1.8.0 is bringing a long awaited feature: proper eBook support!",date:"2023-11-29T00:00:00.000Z",formattedDate:"November 29, 2023",tags:[{label:"upgrade",permalink:"/blog/tags/upgrade"},{label:"komga",permalink:"/blog/tags/komga"}],readingTime:1.37,hasTruncateMarker:!1,authors:[{name:"gotson",title:"Developer of Komga",url:"https://github.com/gotson",imageURL:"https://github.com/gotson.png",key:"gotson"}],frontMatter:{slug:"ebook-support",title:"eBook support",authors:"gotson",tags:["upgrade","komga"]},nextItem:{title:"Prepare for v1.0.0",permalink:"/blog/prepare-v1"}},l={authorsImageUrls:[void 0]},p=[{value:"What you need to know",id:"what-you-need-to-know",level:2},{value:"Other recent changes you may have missed",id:"other-recent-changes-you-may-have-missed",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Version ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga/releases/tag/1.8.0"},"1.8.0")," is bringing a long awaited feature: ",(0,o.kt)("strong",{parentName:"p"},"proper eBook support!")),(0,o.kt)("p",null,"Github issue ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga/issues/221"},"#221")," has been opened for more than 3 years, and has finally been tackled."),(0,o.kt)("h2",{id:"what-you-need-to-know"},"What you need to know"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"eBooks behave like any other book in Komga, in regards to series or metadata. You can even mix comic books and ebooks in the same series."),(0,o.kt)("li",{parentName:"ul"},"only EPUB format is supported. Other formats will not be supported in the future."),(0,o.kt)("li",{parentName:"ul"},"existing EPUB files will be re-analyzed. If you had image-only EPUB, those may not be compatible anymore with third-party clients."),(0,o.kt)("li",{parentName:"ul"},"the web EPUB reader is a very first version, and ",(0,o.kt)("strong",{parentName:"li"},"does not support saving progress"),". Read progress saving and restore will come in a future release."),(0,o.kt)("li",{parentName:"ul"},"any book in Komga can be read with ",(0,o.kt)("a",{parentName:"li",href:"https://readium.org/webpub-manifest/"},"WebPub")," compatible clients."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"There will be issues"),". EPUB is a complex format, and many EPUB files are not properly built. Raise issues ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/gotson/komga/issues/new/choose"},"on Github")," for support.")),(0,o.kt)("h2",{id:"other-recent-changes-you-may-have-missed"},"Other recent changes you may have missed"),(0,o.kt)("p",null,"In case you haven't kept up with the release notes since version 1.0.0, here are the most significant changes:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Komga is now available as a ",(0,o.kt)("a",{parentName:"li",href:"./docs/installation/desktop"},"desktop app"),", and is available in the ",(0,o.kt)("a",{parentName:"li",href:"./docs/installation/ms-store"},"Microsoft Store")),(0,o.kt)("li",{parentName:"ul"},"Multiple settings are now configurable from the ",(0,o.kt)("a",{parentName:"li",href:"./docs/guides/server-settings"},"Server Settings")," screen. You may need to cleanup your configuration file and remove deprecated entries."),(0,o.kt)("li",{parentName:"ul"},"Thumbnails size can now be configured in Server Settings."),(0,o.kt)("li",{parentName:"ul"},"Background task management has been revamped, and now supports proper parallel executions (configurable in Server Settings)."),(0,o.kt)("li",{parentName:"ul"},"Komga now has support for ",(0,o.kt)("a",{parentName:"li",href:"./docs/guides/oneshots"},"One-Shots"),"."),(0,o.kt)("li",{parentName:"ul"},"a ",(0,o.kt)("a",{parentName:"li",href:"./docs/guides/cli"},"Command Line Interface")," was added to update forgotten password for the admin account.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/674e178f.5566d969.js b/assets/js/674e178f.5ee49348.js similarity index 99% rename from assets/js/674e178f.5566d969.js rename to assets/js/674e178f.5ee49348.js index a0f9b23b..ba38ed2a 100644 --- a/assets/js/674e178f.5566d969.js +++ b/assets/js/674e178f.5ee49348.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5203],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=p(n),m=o,h=c["".concat(l,".").concat(m)]||c[m]||u[m]||r;return n?a.createElement(h,i(i({ref:t},d),{},{components:n})):a.createElement(h,i({ref:t},d))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const r={},i="Read with CDisplayEx",s={unversionedId:"guides/cdisplayex",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/cdisplayex.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Paperback",permalink:"/docs/guides/paperback"},next:{title:"Read with any OPDS reader",permalink:"/docs/guides/opds"}},l={},p=[{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}],d={toc:p},c="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"read-with-cdisplayex"},"Read with CDisplayEx"),(0,o.kt)("p",null,"The premium version of ",(0,o.kt)("a",{parentName:"p",href:"https://www.cdisplayex.com/mobile/"},"CDisplayEx")," for Android allows you to connect\nto Komga using the ",(0,o.kt)("a",{parentName:"p",href:"../api/rest#authenticating"},"REST API"),"."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"If you have disabled the ",(0,o.kt)("a",{parentName:"p",href:"libraries#analyze-page-dimensions"},"page dimensions analysis")," option, re-enable it,\nit is necessary to open books with CDisplayEx.")),(0,o.kt)("h2",{id:"add-a-new-location"},"Add a new location"),(0,o.kt)("p",null,"On the home page, use the big ",(0,o.kt)("strong",{parentName:"p"},"+")," 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."),(0,o.kt)("p",null,"You can specify an ",(0,o.kt)("strong",{parentName:"p"},"IP Address")," or a ",(0,o.kt)("strong",{parentName:"p"},"host name")," to identify the remote server.\nHere are some examples: ",(0,o.kt)("inlineCode",{parentName:"p"},"192.168.1.12, computer.local, demo.komga.org, user.host.net/komga")),(0,o.kt)("p",null,"Enter your ",(0,o.kt)("strong",{parentName:"p"},"username")," and ",(0,o.kt)("strong",{parentName:"p"},"password"),"."),(0,o.kt)("p",null,"Specify a ",(0,o.kt)("strong",{parentName:"p"},"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.kt)("strong",{parentName:"p"},"SSL")," option."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"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.")),(0,o.kt)("p",null,"The application uses a ",(0,o.kt)("strong",{parentName:"p"},"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.kt)("strong",{parentName:"p"},"path")," blank."),(0,o.kt)("p",null,"Add a ",(0,o.kt)("strong",{parentName:"p"},"description")," and leave the other options checked."),(0,o.kt)("p",null,"Now press the ",(0,o.kt)("strong",{parentName:"p"},"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."),(0,o.kt)("h2",{id:"nested-folders"},"Nested folders"),(0,o.kt)("p",null,"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."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To see a thumbnail on the folder and to display statistical information,\nyou must activate the thumbnail option: ",(0,o.kt)("a",{parentName:"p",href:"https://www.cdisplayex.com/mobile/settings/#show-a-thumbnail-on-folders"},"Show a thumbnail on folders"))),(0,o.kt)("h2",{id:"library"},"Library"),(0,o.kt)("p",null,"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."),(0,o.kt)("h2",{id:"reading-status"},"Reading status"),(0,o.kt)("p",null,"Reading status and read progress are synced at different times when you use the app."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"When you sync location manually. (Make a long press on the location and start the synchronization)"),(0,o.kt)("li",{parentName:"ul"},"When you browse or refresh a series folder from a location."),(0,o.kt)("li",{parentName:"ul"},"When you open and close a book."),(0,o.kt)("li",{parentName:"ul"},"When the app goes into the background while a book is open.")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5203],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=p(n),m=o,h=c["".concat(l,".").concat(m)]||c[m]||u[m]||r;return n?a.createElement(h,i(i({ref:t},d),{},{components:n})):a.createElement(h,i({ref:t},d))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const r={},i="Read with CDisplayEx",s={unversionedId:"guides/cdisplayex",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/cdisplayex.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Paperback",permalink:"/docs/guides/paperback"},next:{title:"Read with any OPDS reader",permalink:"/docs/guides/opds"}},l={},p=[{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}],d={toc:p},c="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"read-with-cdisplayex"},"Read with CDisplayEx"),(0,o.kt)("p",null,"The premium version of ",(0,o.kt)("a",{parentName:"p",href:"https://www.cdisplayex.com/mobile/"},"CDisplayEx")," for Android allows you to connect\nto Komga using the ",(0,o.kt)("a",{parentName:"p",href:"../api/rest#authenticating"},"REST API"),"."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"If you have disabled the ",(0,o.kt)("a",{parentName:"p",href:"libraries#analyze-page-dimensions"},"page dimensions analysis")," option, re-enable it,\nit is necessary to open books with CDisplayEx.")),(0,o.kt)("h2",{id:"add-a-new-location"},"Add a new location"),(0,o.kt)("p",null,"On the home page, use the big ",(0,o.kt)("strong",{parentName:"p"},"+")," 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."),(0,o.kt)("p",null,"You can specify an ",(0,o.kt)("strong",{parentName:"p"},"IP Address")," or a ",(0,o.kt)("strong",{parentName:"p"},"host name")," to identify the remote server.\nHere are some examples: ",(0,o.kt)("inlineCode",{parentName:"p"},"192.168.1.12, computer.local, demo.komga.org, user.host.net/komga")),(0,o.kt)("p",null,"Enter your ",(0,o.kt)("strong",{parentName:"p"},"username")," and ",(0,o.kt)("strong",{parentName:"p"},"password"),"."),(0,o.kt)("p",null,"Specify a ",(0,o.kt)("strong",{parentName:"p"},"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.kt)("strong",{parentName:"p"},"SSL")," option."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"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.")),(0,o.kt)("p",null,"The application uses a ",(0,o.kt)("strong",{parentName:"p"},"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.kt)("strong",{parentName:"p"},"path")," blank."),(0,o.kt)("p",null,"Add a ",(0,o.kt)("strong",{parentName:"p"},"description")," and leave the other options checked."),(0,o.kt)("p",null,"Now press the ",(0,o.kt)("strong",{parentName:"p"},"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."),(0,o.kt)("h2",{id:"nested-folders"},"Nested folders"),(0,o.kt)("p",null,"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."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To see a thumbnail on the folder and to display statistical information,\nyou must activate the thumbnail option: ",(0,o.kt)("a",{parentName:"p",href:"https://www.cdisplayex.com/mobile/settings/#show-a-thumbnail-on-folders"},"Show a thumbnail on folders"))),(0,o.kt)("h2",{id:"library"},"Library"),(0,o.kt)("p",null,"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."),(0,o.kt)("h2",{id:"reading-status"},"Reading status"),(0,o.kt)("p",null,"Reading status and read progress are synced at different times when you use the app."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"When you sync location manually. (Make a long press on the location and start the synchronization)"),(0,o.kt)("li",{parentName:"ul"},"When you browse or refresh a series folder from a location."),(0,o.kt)("li",{parentName:"ul"},"When you open and close a book."),(0,o.kt)("li",{parentName:"ul"},"When the app goes into the background while a book is open.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/767395cb.688dd66f.js b/assets/js/767395cb.4ae0a904.js similarity index 98% rename from assets/js/767395cb.688dd66f.js rename to assets/js/767395cb.4ae0a904.js index f9895677..9415571f 100644 --- a/assets/js/767395cb.688dd66f.js +++ b/assets/js/767395cb.4ae0a904.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3526],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),l=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(r),m=o,y=c["".concat(p,".").concat(m)]||c[m]||d[m]||a;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={},i="Expose your server",s={unversionedId:"installation/https",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/https.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Configuration options",permalink:"/docs/installation/configuration"},next:{title:"Social login",permalink:"/docs/installation/oauth2"}},p={},l=[{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}],u={toc:l},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"expose-your-server"},"Expose your server"),(0,o.kt)("h2",{id:"https"},"HTTPS"),(0,o.kt)("p",null,"If you want to open your Komga server outside your local network, it is strongly advised to secure it with ",(0,o.kt)("inlineCode",{parentName:"p"},"https")," (especially due to the use of http basic authentication)."),(0,o.kt)("p",null,"Spring Boot supports ",(0,o.kt)("inlineCode",{parentName:"p"},"https")," out of the box, but you will have to configure it, and ",(0,o.kt)("inlineCode",{parentName:"p"},"https")," is most useful only with valid certificates (not self-signed), which most people don't readily have available."),(0,o.kt)("p",null,"I recommend using ",(0,o.kt)("a",{parentName:"p",href:"https://caddyserver.com/"},"Caddy")," as a reverse proxy, as it supports the automatic generation of ",(0,o.kt)("a",{parentName:"p",href:"https://letsencrypt.org/"},"Let's Encrypt")," certificates."),(0,o.kt)("h2",{id:"reverse-proxy"},"Reverse proxy"),(0,o.kt)("p",null,"Here are some sample configuration on how to configure reverse proxy for Komga."),(0,o.kt)("h3",{id:"caddy-v1"},"Caddy (v1)"),(0,o.kt)("p",null,"Without a base URL configured in Komga, using a subdomain:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"komga.yourdomain.com {\n proxy / http://your-komga-server:25600 {\n transparent\n }\n}\n")),(0,o.kt)("p",null,"With a base URL configured in Komga:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"yourdomain.com {\n proxy /komga http://your-komga-server:25600 {\n transparent\n }\n}\n")),(0,o.kt)("h3",{id:"caddy-v2"},"Caddy (v2)"),(0,o.kt)("p",null,"Without a base URL configured in Komga, using a subdomain:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"komga.yourdomain.com {\n reverse_proxy http://your-komga-server:25600\n}\n")),(0,o.kt)("p",null,"With a base URL configured in Komga:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"yourdomain.com {\n reverse_proxy /komga/* http://your-komga-server:25600\n}\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3526],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),l=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=l(r),m=o,y=c["".concat(p,".").concat(m)]||c[m]||d[m]||a;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={},i="Expose your server",s={unversionedId:"installation/https",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/https.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Configuration options",permalink:"/docs/installation/configuration"},next:{title:"Social login",permalink:"/docs/installation/oauth2"}},p={},l=[{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}],u={toc:l},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"expose-your-server"},"Expose your server"),(0,o.kt)("h2",{id:"https"},"HTTPS"),(0,o.kt)("p",null,"If you want to open your Komga server outside your local network, it is strongly advised to secure it with ",(0,o.kt)("inlineCode",{parentName:"p"},"https")," (especially due to the use of http basic authentication)."),(0,o.kt)("p",null,"Spring Boot supports ",(0,o.kt)("inlineCode",{parentName:"p"},"https")," out of the box, but you will have to configure it, and ",(0,o.kt)("inlineCode",{parentName:"p"},"https")," is most useful only with valid certificates (not self-signed), which most people don't readily have available."),(0,o.kt)("p",null,"I recommend using ",(0,o.kt)("a",{parentName:"p",href:"https://caddyserver.com/"},"Caddy")," as a reverse proxy, as it supports the automatic generation of ",(0,o.kt)("a",{parentName:"p",href:"https://letsencrypt.org/"},"Let's Encrypt")," certificates."),(0,o.kt)("h2",{id:"reverse-proxy"},"Reverse proxy"),(0,o.kt)("p",null,"Here are some sample configuration on how to configure reverse proxy for Komga."),(0,o.kt)("h3",{id:"caddy-v1"},"Caddy (v1)"),(0,o.kt)("p",null,"Without a base URL configured in Komga, using a subdomain:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"komga.yourdomain.com {\n proxy / http://your-komga-server:25600 {\n transparent\n }\n}\n")),(0,o.kt)("p",null,"With a base URL configured in Komga:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"yourdomain.com {\n proxy /komga http://your-komga-server:25600 {\n transparent\n }\n}\n")),(0,o.kt)("h3",{id:"caddy-v2"},"Caddy (v2)"),(0,o.kt)("p",null,"Without a base URL configured in Komga, using a subdomain:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"komga.yourdomain.com {\n reverse_proxy http://your-komga-server:25600\n}\n")),(0,o.kt)("p",null,"With a base URL configured in Komga:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"yourdomain.com {\n reverse_proxy /komga/* http://your-komga-server:25600\n}\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7d6e8713.1fe4bd77.js b/assets/js/7d6e8713.0562cf1d.js similarity index 99% rename from assets/js/7d6e8713.1fe4bd77.js rename to assets/js/7d6e8713.0562cf1d.js index bd69031b..aff58923 100644 --- a/assets/js/7d6e8713.1fe4bd77.js +++ b/assets/js/7d6e8713.0562cf1d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3620],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var r=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var a=e.components,i=e.mdxType,n=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=d(a),g=i,h=p["".concat(s,".").concat(g)]||p[g]||c[g]||n;return a?r.createElement(h,l(l({ref:t},u),{},{components:a})):r.createElement(h,l({ref:t},u))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=a.length,l=new Array(n);l[0]=g;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:i,l[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>c,frontMatter:()=>n,metadata:()=>o,toc:()=>d});var r=a(7462),i=(a(7294),a(3905));const n={},l="Read with the Webreader",o={unversionedId:"guides/webreader",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/webreader.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Readers",permalink:"/docs/category/readers"},next:{title:"Read with Tachiyomi",permalink:"/docs/guides/tachiyomi"}},s={},d=[{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}],u={toc:d},p="wrapper";function c(e){let{components:t,...a}=e;return(0,i.kt)(p,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"read-with-the-webreader"},"Read with the Webreader"),(0,i.kt)("p",null,"Komga has an integrated Webreader packed with features."),(0,i.kt)("p",null,"To start reading a book, you can click on the read button either on the book card, or on the book details screen."),(0,i.kt)("img",{src:"/assets/media/guides/webreader/book-card.png",style:{maxHeight:"300px"},alt:"Book Card Read Button"}),(0,i.kt)("img",{src:"/assets/media/guides/webreader/read-button.png",style:{maxHeight:"300px"},alt:"Book Details read button"}),(0,i.kt)("p",null,"Here is an overview of the Webreader's interface."),(0,i.kt)("a",{href:"/assets/media/guides/webreader/reader.png"},(0,i.kt)("img",{src:"/assets/media/guides/webreader/reader.png",alt:"Webreader overview"})),(0,i.kt)("h2",{id:"settings"},"Settings"),(0,i.kt)("p",null,"The Webreader can be configured in various ways from the settings dialog."),(0,i.kt)("img",{src:"/assets/media/guides/webreader/reader-settings.png",style:{maxHeight:"400px"},alt:"Webreader settings"}),(0,i.kt)("h3",{id:"general"},"General"),(0,i.kt)("h4",{id:"reading-mode"},"Reading mode"),(0,i.kt)("p",null,"Four reading modes are available:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Left to right"),(0,i.kt)("li",{parentName:"ul"},"Right to left"),(0,i.kt)("li",{parentName:"ul"},"Vertical"),(0,i.kt)("li",{parentName:"ul"},"Webtoon: displays all the pages in a continuous vertical strip")),(0,i.kt)("p",null,"The Webreader will automatically use the ",(0,i.kt)("em",{parentName:"p"},"Reading direction")," specified in the Book metadata."),(0,i.kt)("h4",{id:"animate-page-transitions"},"Animate page transitions"),(0,i.kt)("p",null,"If enable, a smooth transition will be used to switch between pages."),(0,i.kt)("h4",{id:"gestures"},"Gestures"),(0,i.kt)("p",null,"Touch gestures are available in the Page reader only (Left to right, Right to left, Vertical), and can be disabled if necessary."),(0,i.kt)("h3",{id:"display"},"Display"),(0,i.kt)("h4",{id:"background-color"},"Background color"),(0,i.kt)("p",null,"You can choose the background color of the reader between white and black."),(0,i.kt)("h3",{id:"reader-specific-options-paged-reader"},"Reader specific options: Paged reader"),(0,i.kt)("h4",{id:"scale-type"},"Scale type"),(0,i.kt)("p",null,"Four scale types are available:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Fit to screen"),(0,i.kt)("li",{parentName:"ul"},"Fit to width"),(0,i.kt)("li",{parentName:"ul"},"Fit to height"),(0,i.kt)("li",{parentName:"ul"},"Original")),(0,i.kt)("h4",{id:"double-pages"},"Double pages"),(0,i.kt)("p",null,"When enabled, the Webreader will display two pages on the same screen, like an open book, with the following exceptions:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The first and last page will always be shown as a single page"),(0,i.kt)("li",{parentName:"ul"},"If a page has a landscape orientation (width > height), it will be show as a single page")),(0,i.kt)("h2",{id:"thumbnails-explorer"},"Thumbnails explorer"),(0,i.kt)("p",null,"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."),(0,i.kt)("img",{src:"/assets/media/guides/webreader/thumbnails-explorer.png",alt:"Thumbnails explorer"}),(0,i.kt)("h2",{id:"help-dialog"},"Help dialog"),(0,i.kt)("p",null,"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."))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3620],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var r=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=r.createContext({}),d=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=d(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var a=e.components,i=e.mdxType,n=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=d(a),g=i,h=p["".concat(s,".").concat(g)]||p[g]||c[g]||n;return a?r.createElement(h,l(l({ref:t},u),{},{components:a})):r.createElement(h,l({ref:t},u))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=a.length,l=new Array(n);l[0]=g;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:i,l[1]=o;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>c,frontMatter:()=>n,metadata:()=>o,toc:()=>d});var r=a(7462),i=(a(7294),a(3905));const n={},l="Read with the Webreader",o={unversionedId:"guides/webreader",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/webreader.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Readers",permalink:"/docs/category/readers"},next:{title:"Read with Tachiyomi",permalink:"/docs/guides/tachiyomi"}},s={},d=[{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}],u={toc:d},p="wrapper";function c(e){let{components:t,...a}=e;return(0,i.kt)(p,(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"read-with-the-webreader"},"Read with the Webreader"),(0,i.kt)("p",null,"Komga has an integrated Webreader packed with features."),(0,i.kt)("p",null,"To start reading a book, you can click on the read button either on the book card, or on the book details screen."),(0,i.kt)("img",{src:"/assets/media/guides/webreader/book-card.png",style:{maxHeight:"300px"},alt:"Book Card Read Button"}),(0,i.kt)("img",{src:"/assets/media/guides/webreader/read-button.png",style:{maxHeight:"300px"},alt:"Book Details read button"}),(0,i.kt)("p",null,"Here is an overview of the Webreader's interface."),(0,i.kt)("a",{href:"/assets/media/guides/webreader/reader.png"},(0,i.kt)("img",{src:"/assets/media/guides/webreader/reader.png",alt:"Webreader overview"})),(0,i.kt)("h2",{id:"settings"},"Settings"),(0,i.kt)("p",null,"The Webreader can be configured in various ways from the settings dialog."),(0,i.kt)("img",{src:"/assets/media/guides/webreader/reader-settings.png",style:{maxHeight:"400px"},alt:"Webreader settings"}),(0,i.kt)("h3",{id:"general"},"General"),(0,i.kt)("h4",{id:"reading-mode"},"Reading mode"),(0,i.kt)("p",null,"Four reading modes are available:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Left to right"),(0,i.kt)("li",{parentName:"ul"},"Right to left"),(0,i.kt)("li",{parentName:"ul"},"Vertical"),(0,i.kt)("li",{parentName:"ul"},"Webtoon: displays all the pages in a continuous vertical strip")),(0,i.kt)("p",null,"The Webreader will automatically use the ",(0,i.kt)("em",{parentName:"p"},"Reading direction")," specified in the Book metadata."),(0,i.kt)("h4",{id:"animate-page-transitions"},"Animate page transitions"),(0,i.kt)("p",null,"If enable, a smooth transition will be used to switch between pages."),(0,i.kt)("h4",{id:"gestures"},"Gestures"),(0,i.kt)("p",null,"Touch gestures are available in the Page reader only (Left to right, Right to left, Vertical), and can be disabled if necessary."),(0,i.kt)("h3",{id:"display"},"Display"),(0,i.kt)("h4",{id:"background-color"},"Background color"),(0,i.kt)("p",null,"You can choose the background color of the reader between white and black."),(0,i.kt)("h3",{id:"reader-specific-options-paged-reader"},"Reader specific options: Paged reader"),(0,i.kt)("h4",{id:"scale-type"},"Scale type"),(0,i.kt)("p",null,"Four scale types are available:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Fit to screen"),(0,i.kt)("li",{parentName:"ul"},"Fit to width"),(0,i.kt)("li",{parentName:"ul"},"Fit to height"),(0,i.kt)("li",{parentName:"ul"},"Original")),(0,i.kt)("h4",{id:"double-pages"},"Double pages"),(0,i.kt)("p",null,"When enabled, the Webreader will display two pages on the same screen, like an open book, with the following exceptions:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The first and last page will always be shown as a single page"),(0,i.kt)("li",{parentName:"ul"},"If a page has a landscape orientation (width > height), it will be show as a single page")),(0,i.kt)("h2",{id:"thumbnails-explorer"},"Thumbnails explorer"),(0,i.kt)("p",null,"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."),(0,i.kt)("img",{src:"/assets/media/guides/webreader/thumbnails-explorer.png",alt:"Thumbnails explorer"}),(0,i.kt)("h2",{id:"help-dialog"},"Help dialog"),(0,i.kt)("p",null,"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."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7da97648.601938c9.js b/assets/js/7da97648.5d984c68.js similarity index 98% rename from assets/js/7da97648.601938c9.js rename to assets/js/7da97648.5d984c68.js index 6a8392e3..163a6b87 100644 --- a/assets/js/7da97648.601938c9.js +++ b/assets/js/7da97648.5d984c68.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5671],{3905:(e,t,i)=>{i.d(t,{Zo:()=>m,kt:()=>h});var r=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var c=r.createContext({}),l=function(e){var t=r.useContext(c),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},m=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(i),u=a,h=p["".concat(c,".").concat(u)]||p[u]||d[u]||n;return i?r.createElement(h,o(o({ref:t},m),{},{components:i})):r.createElement(h,o({ref:t},m))}));function h(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=u;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var l=2;l{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>l});var r=i(7462),a=(i(7294),i(3905));const n={},o="Read with Tachiyomi",s={unversionedId:"guides/tachiyomi",id:"guides/tachiyomi",title:"Read with Tachiyomi",description:"Install and configure",source:"@site/docs/guides/tachiyomi.md",sourceDirName:"guides",slug:"/guides/tachiyomi",permalink:"/docs/guides/tachiyomi",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/tachiyomi.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with the Webreader",permalink:"/docs/guides/webreader"},next:{title:"Read with Paperback",permalink:"/docs/guides/paperback"}},c={},l=[{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:"Changelog and Compatibility",id:"changelog-and-compatibility",level:2}],m={toc:l},p="wrapper";function d(e){let{components:t,...i}=e;return(0,a.kt)(p,(0,r.Z)({},m,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"read-with-tachiyomi"},"Read with Tachiyomi"),(0,a.kt)("h2",{id:"install-and-configure"},"Install and configure"),(0,a.kt)("p",null,"Komga has an official extension for ",(0,a.kt)("a",{parentName:"p",href:"https://tachiyomi.org"},"Tachiyomi"),", available from within Tachiyomi's extension menu."),(0,a.kt)("p",null,"Once installed, the extension will let you configure up to 3 Komga servers."),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-extension-info.png",style:{maxHeight:"600px"},alt:"Tachiyomi extension info"}),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-configuration.png",style:{maxHeight:"600px"},alt:"Tachiyomi extension configuration"}),(0,a.kt)("p",null,"You will need to configure the extension with your ",(0,a.kt)("em",{parentName:"p"},"server address"),", ",(0,a.kt)("em",{parentName:"p"},"username")," and ",(0,a.kt)("em",{parentName:"p"},"password")," before you can use it."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Example server address: ",(0,a.kt)("inlineCode",{parentName:"p"},"http://my.server:25600(/baseUrl)")),(0,a.kt)("p",{parentName:"admonition"},(0,a.kt)("strong",{parentName:"p"},"Note that there is no trailing slash (",(0,a.kt)("inlineCode",{parentName:"strong"},"/"),")."))),(0,a.kt)("h2",{id:"browse"},"Browse"),(0,a.kt)("p",null,"You can browse series, use the filter menu, and search for series."),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-browse.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension browse"}),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-filters.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension filters"}),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-search.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension search"}),(0,a.kt)("h2",{id:"track-read-progress"},"Track read progress"),(0,a.kt)("p",null,"Tachiyomi starting from ",(0,a.kt)("inlineCode",{parentName:"p"},"0.12.1")," can keep your read progress in sync with your Komga server. Check the official Tachiyomi website for ",(0,a.kt)("a",{parentName:"p",href:"https://tachiyomi.org/help/guides/tracking/#what-is-tracking"},"instructions"),"."),(0,a.kt)("p",null,"Requirements:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Tachiyomi ",(0,a.kt)("inlineCode",{parentName:"li"},"0.12.1+")),(0,a.kt)("li",{parentName:"ul"},"Komga ",(0,a.kt)("inlineCode",{parentName:"li"},"0. 95.2+")),(0,a.kt)("li",{parentName:"ul"},"Tachiyomi Komga extension ",(0,a.kt)("inlineCode",{parentName:"li"},"1.2.24+"))),(0,a.kt)("h2",{id:"changelog-and-compatibility"},"Changelog and Compatibility"),(0,a.kt)("p",null,"Each version of the Komga extension need a specific version of the Komga server to work properly. Check the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/inorichi/tachiyomi-extensions/blob/master/src/all/komga/CHANGELOG.md"},"CHANGELOG")," for more information."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5671],{3905:(e,t,i)=>{i.d(t,{Zo:()=>m,kt:()=>h});var r=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var c=r.createContext({}),l=function(e){var t=r.useContext(c),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},m=function(e){var t=l(e.components);return r.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,c=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),p=l(i),u=a,h=p["".concat(c,".").concat(u)]||p[u]||d[u]||n;return i?r.createElement(h,o(o({ref:t},m),{},{components:i})):r.createElement(h,o({ref:t},m))}));function h(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=u;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:a,o[1]=s;for(var l=2;l{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>l});var r=i(7462),a=(i(7294),i(3905));const n={},o="Read with Tachiyomi",s={unversionedId:"guides/tachiyomi",id:"guides/tachiyomi",title:"Read with Tachiyomi",description:"Install and configure",source:"@site/docs/guides/tachiyomi.md",sourceDirName:"guides",slug:"/guides/tachiyomi",permalink:"/docs/guides/tachiyomi",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/tachiyomi.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with the Webreader",permalink:"/docs/guides/webreader"},next:{title:"Read with Paperback",permalink:"/docs/guides/paperback"}},c={},l=[{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:"Changelog and Compatibility",id:"changelog-and-compatibility",level:2}],m={toc:l},p="wrapper";function d(e){let{components:t,...i}=e;return(0,a.kt)(p,(0,r.Z)({},m,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"read-with-tachiyomi"},"Read with Tachiyomi"),(0,a.kt)("h2",{id:"install-and-configure"},"Install and configure"),(0,a.kt)("p",null,"Komga has an official extension for ",(0,a.kt)("a",{parentName:"p",href:"https://tachiyomi.org"},"Tachiyomi"),", available from within Tachiyomi's extension menu."),(0,a.kt)("p",null,"Once installed, the extension will let you configure up to 3 Komga servers."),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-extension-info.png",style:{maxHeight:"600px"},alt:"Tachiyomi extension info"}),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-configuration.png",style:{maxHeight:"600px"},alt:"Tachiyomi extension configuration"}),(0,a.kt)("p",null,"You will need to configure the extension with your ",(0,a.kt)("em",{parentName:"p"},"server address"),", ",(0,a.kt)("em",{parentName:"p"},"username")," and ",(0,a.kt)("em",{parentName:"p"},"password")," before you can use it."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Example server address: ",(0,a.kt)("inlineCode",{parentName:"p"},"http://my.server:25600(/baseUrl)")),(0,a.kt)("p",{parentName:"admonition"},(0,a.kt)("strong",{parentName:"p"},"Note that there is no trailing slash (",(0,a.kt)("inlineCode",{parentName:"strong"},"/"),")."))),(0,a.kt)("h2",{id:"browse"},"Browse"),(0,a.kt)("p",null,"You can browse series, use the filter menu, and search for series."),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-browse.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension browse"}),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-filters.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension filters"}),(0,a.kt)("img",{src:"/assets/media/guides/tachiyomi/tachiyomi-search.png",style:{maxHeight:"500px"},alt:"Tachiyomi extension search"}),(0,a.kt)("h2",{id:"track-read-progress"},"Track read progress"),(0,a.kt)("p",null,"Tachiyomi starting from ",(0,a.kt)("inlineCode",{parentName:"p"},"0.12.1")," can keep your read progress in sync with your Komga server. Check the official Tachiyomi website for ",(0,a.kt)("a",{parentName:"p",href:"https://tachiyomi.org/help/guides/tracking/#what-is-tracking"},"instructions"),"."),(0,a.kt)("p",null,"Requirements:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Tachiyomi ",(0,a.kt)("inlineCode",{parentName:"li"},"0.12.1+")),(0,a.kt)("li",{parentName:"ul"},"Komga ",(0,a.kt)("inlineCode",{parentName:"li"},"0. 95.2+")),(0,a.kt)("li",{parentName:"ul"},"Tachiyomi Komga extension ",(0,a.kt)("inlineCode",{parentName:"li"},"1.2.24+"))),(0,a.kt)("h2",{id:"changelog-and-compatibility"},"Changelog and Compatibility"),(0,a.kt)("p",null,"Each version of the Komga extension need a specific version of the Komga server to work properly. Check the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/inorichi/tachiyomi-extensions/blob/master/src/all/komga/CHANGELOG.md"},"CHANGELOG")," for more information."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/814f3328.12058411.js b/assets/js/814f3328.12058411.js new file mode 100644 index 00000000..fc3f180e --- /dev/null +++ b/assets/js/814f3328.12058411.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"eBook support","permalink":"/blog/ebook-support"},{"title":"Prepare for v1.0.0","permalink":"/blog/prepare-v1"}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.44afc25f.js b/assets/js/814f3328.44afc25f.js deleted file mode 100644 index feba272b..00000000 --- a/assets/js/814f3328.44afc25f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Prepare for v1.0.0","permalink":"/blog/prepare-v1"}]}')}}]); \ No newline at end of file diff --git a/assets/js/8badb5d4.e81f3e19.js b/assets/js/8badb5d4.72e51a63.js similarity index 98% rename from assets/js/8badb5d4.e81f3e19.js rename to assets/js/8badb5d4.72e51a63.js index e8e583f8..22860a15 100644 --- a/assets/js/8badb5d4.e81f3e19.js +++ b/assets/js/8badb5d4.72e51a63.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3562],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>g});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),d=s(n),c=r,g=d["".concat(p,".").concat(c)]||d[c]||u[c]||l;return n?a.createElement(g,o(o({ref:t},m),{},{components:n})):a.createElement(g,o({ref:t},m))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const l={},o="Image Types",i={unversionedId:"guides/image-formats",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/image-formats.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Scanning, Analyzing and Refreshing Metadata",permalink:"/docs/guides/scan-analysis-refresh"},next:{title:"One-Shots",permalink:"/docs/guides/oneshots"}},p={},s=[{value:"Decoding images",id:"decoding-images",level:2},{value:"Common types",id:"common-types",level:2},{value:"Advanced types",id:"advanced-types",level:2}],m={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"image-types"},"Image Types"),(0,r.kt)("h2",{id:"decoding-images"},"Decoding images"),(0,r.kt)("p",null,"Komga doesn't always need to decode images within your books. Image decoding is necessary in the following cases:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"thumbnail generation"),(0,r.kt)("li",{parentName:"ul"},"ISBN barcode detection"),(0,r.kt)("li",{parentName:"ul"},"analyze page dimensions"),(0,r.kt)("li",{parentName:"ul"},"on-the-fly page conversion")),(0,r.kt)("p",null,"If the client requesting a page can decode the format, Komga passes the raw image data without decoding."),(0,r.kt)("h2",{id:"common-types"},"Common types"),(0,r.kt)("p",null,"The following types are supported on every platform:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"JPEG"),(0,r.kt)("li",{parentName:"ul"},"PNG"),(0,r.kt)("li",{parentName:"ul"},"GIF"),(0,r.kt)("li",{parentName:"ul"},"WebP")),(0,r.kt)("h2",{id:"advanced-types"},"Advanced types"),(0,r.kt)("p",null,"More advanced types are supported on some platforms only, as they rely on native libraries for decoding."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Platform"),(0,r.kt)("th",{parentName:"tr",align:null},"JPEG XL (jxl)"),(0,r.kt)("th",{parentName:"tr",align:null},"AVIF / HEIF"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"macOS app"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Windows app"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f"),(0,r.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Docker amd64"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Docker arm64"),(0,r.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Docker arm"),(0,r.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,r.kt)("td",{parentName:"tr",align:null},"\u274c")))),(0,r.kt)("p",null,"When using the ",(0,r.kt)("inlineCode",{parentName:"p"},"jar"),", you will need to provide the native libraries yourself, and run Java with the correct arguments. You can check for more details ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/gotson/NightMonkeys#requirements"},"here"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3562],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>g});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,p=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),d=s(n),c=r,g=d["".concat(p,".").concat(c)]||d[c]||u[c]||l;return n?a.createElement(g,o(o({ref:t},m),{},{components:n})):a.createElement(g,o({ref:t},m))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:r,o[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>o,default:()=>u,frontMatter:()=>l,metadata:()=>i,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const l={},o="Image Types",i={unversionedId:"guides/image-formats",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/image-formats.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Scanning, Analyzing and Refreshing Metadata",permalink:"/docs/guides/scan-analysis-refresh"},next:{title:"One-Shots",permalink:"/docs/guides/oneshots"}},p={},s=[{value:"Decoding images",id:"decoding-images",level:2},{value:"Common types",id:"common-types",level:2},{value:"Advanced types",id:"advanced-types",level:2}],m={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"image-types"},"Image Types"),(0,r.kt)("h2",{id:"decoding-images"},"Decoding images"),(0,r.kt)("p",null,"Komga doesn't always need to decode images within your books. Image decoding is necessary in the following cases:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"thumbnail generation"),(0,r.kt)("li",{parentName:"ul"},"ISBN barcode detection"),(0,r.kt)("li",{parentName:"ul"},"analyze page dimensions"),(0,r.kt)("li",{parentName:"ul"},"on-the-fly page conversion")),(0,r.kt)("p",null,"If the client requesting a page can decode the format, Komga passes the raw image data without decoding."),(0,r.kt)("h2",{id:"common-types"},"Common types"),(0,r.kt)("p",null,"The following types are supported on every platform:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"JPEG"),(0,r.kt)("li",{parentName:"ul"},"PNG"),(0,r.kt)("li",{parentName:"ul"},"GIF"),(0,r.kt)("li",{parentName:"ul"},"WebP")),(0,r.kt)("h2",{id:"advanced-types"},"Advanced types"),(0,r.kt)("p",null,"More advanced types are supported on some platforms only, as they rely on native libraries for decoding."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Platform"),(0,r.kt)("th",{parentName:"tr",align:null},"JPEG XL (jxl)"),(0,r.kt)("th",{parentName:"tr",align:null},"AVIF / HEIF"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"macOS app"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Windows app"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f"),(0,r.kt)("td",{parentName:"tr",align:null},"\u274c")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Docker amd64"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Docker arm64"),(0,r.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,r.kt)("td",{parentName:"tr",align:null},"\u2714\ufe0f")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Docker arm"),(0,r.kt)("td",{parentName:"tr",align:null},"\u274c"),(0,r.kt)("td",{parentName:"tr",align:null},"\u274c")))),(0,r.kt)("p",null,"When using the ",(0,r.kt)("inlineCode",{parentName:"p"},"jar"),", you will need to provide the native libraries yourself, and run Java with the correct arguments. You can check for more details ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/gotson/NightMonkeys#requirements"},"here"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/97c4f258.d0fb7eee.js b/assets/js/97c4f258.7aad953f.js similarity index 99% rename from assets/js/97c4f258.d0fb7eee.js rename to assets/js/97c4f258.7aad953f.js index f84f1db3..97540ab7 100644 --- a/assets/js/97c4f258.d0fb7eee.js +++ b/assets/js/97c4f258.7aad953f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[305],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>k});var o=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=o.createContext({}),m=function(e){var t=o.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},d=function(e){var t=m(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=m(a),u=n,k=p["".concat(s,".").concat(u)]||p[u]||c[u]||i;return a?o.createElement(k,r(r({ref:t},d),{},{components:a})):o.createElement(k,r({ref:t},d))}));function k(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,r=new Array(i);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,r[1]=l;for(var m=2;m{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>m});var o=a(7462),n=(a(7294),a(3905));const i={},r="Configuration options",l={unversionedId:"installation/configuration",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/configuration.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install via third-party integrations",permalink:"/docs/installation/thirdparty"},next:{title:"Expose your server",permalink:"/docs/installation/https"}},s={},m=[{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}],d={toc:m},p="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,o.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"configuration-options"},"Configuration options"),(0,n.kt)("admonition",{type:"tip"},(0,n.kt)("p",{parentName:"admonition"},"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.kt)("p",{parentName:"admonition"},"The ",(0,n.kt)("inlineCode",{parentName:"p"},"application.yml")," file does not exist by default, you need to create one if you want to customize the configuration.")),(0,n.kt)("p",null,"Komga relies heavily on ",(0,n.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html"},"Spring Boot's configuration"),", leveraging ",(0,n.kt)("inlineCode",{parentName:"p"},"profiles")," and configuration ",(0,n.kt)("inlineCode",{parentName:"p"},"properties"),"."),(0,n.kt)("p",null,"The easiest way to configure is either via environment variables (a good fit for ",(0,n.kt)("inlineCode",{parentName:"p"},"docker")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"docker-compose"),") or by using an ",(0,n.kt)("inlineCode",{parentName:"p"},"application.yml")," file located in the configuration directory:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The Docker image will load any ",(0,n.kt)("inlineCode",{parentName:"li"},"application.yml")," file located in the ",(0,n.kt)("inlineCode",{parentName:"li"},"/config")," mounted folder."),(0,n.kt)("li",{parentName:"ul"},"The Jar will load any ",(0,n.kt)("inlineCode",{parentName:"li"},"application.yml")," file located in the ",(0,n.kt)("inlineCode",{parentName:"li"},"komga.config-dir")," directory (defaults to ",(0,n.kt)("inlineCode",{parentName:"li"},"~/.komga"),", ",(0,n.kt)("a",{parentName:"li",href:"#komga-configdir-komga-config-dir-directory"},"more details"),").")),(0,n.kt)("p",null,"Each configuration key can have a different format depending if it's from the environment variable, or from the ",(0,n.kt)("inlineCode",{parentName:"p"},"application.yml")," file. In the following section I will provide both format in the form ",(0,n.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT_VARIABLE")," / ",(0,n.kt)("inlineCode",{parentName:"p"},"application-property"),"."),(0,n.kt)("p",null,"You can also specify configuration via the command line, when launching the ",(0,n.kt)("inlineCode",{parentName:"p"},"jar"),". Use the ",(0,n.kt)("inlineCode",{parentName:"p"},"application-property")," form, and prefix with ",(0,n.kt)("inlineCode",{parentName:"p"},"--"),". For example:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-shell"},'java -jar komga.jar --server.servlet.context-path="/komga" --server.port=8443\n')),(0,n.kt)("h2",{id:"optional-configuration"},"Optional configuration"),(0,n.kt)("p",null,"You can use some optional configuration keys:"),(0,n.kt)("h4",{id:"komga_configdir--komgaconfig-dir-directory"},"KOMGA_CONFIGDIR / komga.config-dir: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"The Komga configuration directory. Will be used to store the logs, database, and any other file Komga needs."),(0,n.kt)("p",null,"Defaults to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"%LOCALAPPDATA%/Komga")," on the ",(0,n.kt)("em",{parentName:"li"},"Windows app"),". That folder is virtualized by Windows. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"~/Library/Application Support/Komga")," on the macOS app. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"~/.komga")," otherwise.")),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"~")," is your home directory on Unix, and your User profile on Windows."),(0,n.kt)("p",null,(0,n.kt)("em",{parentName:"p"},"When overriding this configuration, you need to use ",(0,n.kt)("inlineCode",{parentName:"em"},"${user.home}")," instead of ",(0,n.kt)("inlineCode",{parentName:"em"},"~")," (this is a specific Spring Boot variable).")),(0,n.kt)("h4",{id:"server_port--serverport-port"},"SERVER_PORT / server.port: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"Port to listen to for the API and web interface."),(0,n.kt)("p",null,"Can also be configured from the ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/server-settings#server-port"},"Server Settings"),"."),(0,n.kt)("p",null,"Defaults to ",(0,n.kt)("inlineCode",{parentName:"p"},"25600"),"."),(0,n.kt)("h4",{id:"server_servlet_context_path--serverservletcontext-path-baseurl"},"SERVER_SERVLET_CONTEXT_PATH / server.servlet.context-path: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"Base URL, useful if you need to reverse proxy with a subfolder."),(0,n.kt)("p",null,"Can also be configured from the ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/server-settings#base-url"},"Server Settings"),"."),(0,n.kt)("p",null,"Defaults to ",(0,n.kt)("inlineCode",{parentName:"p"},"/"),"."),(0,n.kt)("h4",{id:"server_servlet_session_timeout--serverservletsessiontimeout-duration"},"SERVER_SERVLET_SESSION_TIMEOUT / server.servlet.session.timeout: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"The duration after which an inactive session will expire. You can specify the timeunit, for example ",(0,n.kt)("inlineCode",{parentName:"p"},"14d")," for 14 days, or ",(0,n.kt)("inlineCode",{parentName:"p"},"24h")," for 24 hours. If no unit is set, seconds will be used."),(0,n.kt)("p",null,"Defaults to 30 minutes."),(0,n.kt)("h4",{id:"komga_libraries_scan_cron--komgalibraries-scan-cron-cron"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_LIBRARIES_SCAN_CRON / komga.libraries-scan-cron: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/libraries#scan-interval"},"Library options: scan interval"),"."),(0,n.kt)("h4",{id:"komga_libraries_scan_startup--komgalibraries-scan-startup-truefalse"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_LIBRARIES_SCAN_STARTUP / komga.libraries-scan-startup: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/libraries#scan-on-startup"},"Library options: scan on startup"),"."),(0,n.kt)("h4",{id:"komga_libraries_scan_directory_exclusions--komgalibraries-scan-directory-exclusions-exclusions"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_LIBRARIES_SCAN_DIRECTORY_EXCLUSIONS / komga.libraries-scan-directory-exclusions: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/libraries#directory-exclusions"},"Library options: directory exclusions"),"."),(0,n.kt)("h4",{id:"komga_rememberme_key--komgaremember-mekey-key"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_REMEMBERME_KEY / komga.remember-me.key: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to Server Settings."),(0,n.kt)("h4",{id:"komga_rememberme_validity--komgaremember-mevalidity-duration"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_REMEMBERME_VALIDITY / komga.remember-me.validity: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to Server Settings."),(0,n.kt)("h4",{id:"komga_sessiontimeout--komgasession-timeout-duration"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_SESSIONTIMEOUT / komga.session-timeout: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been replaced by ",(0,n.kt)("inlineCode",{parentName:"p"},"server.servlet.session.timeout"),"."),(0,n.kt)("h4",{id:"komga_database_file--komgadatabasefile-file-path"},"KOMGA_DATABASE_FILE / komga.database.file: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"File path for the SQLite database."),(0,n.kt)("p",null,"If you want to change the directory, it is advised to change ",(0,n.kt)("inlineCode",{parentName:"p"},"komga.config-dir")," instead."),(0,n.kt)("p",null,"Defaults to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"/config/database.sqlite")," for ",(0,n.kt)("em",{parentName:"li"},"Docker"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"\\${komga.config-dir}/database.sqlite")," otherwise.")),(0,n.kt)("h4",{id:"komga_cors_allowed_origins--komgacorsallowed-origins-origins"},"KOMGA_CORS_ALLOWED_ORIGINS / komga.cors.allowed-origins: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"A list of origins to allow for CORS."),(0,n.kt)("p",null,"Defaults to empty list."),(0,n.kt)("h4",{id:"komga_delete_empty_collections--komgadelete-empty-collections-truefalse"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_DELETE_EMPTY_COLLECTIONS / komga.delete-empty-collections: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to Server Settings."),(0,n.kt)("h4",{id:"komga_delete_empty_read_lists--komgadelete-empty-read-lists-truefalse"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_DELETE_EMPTY_READ_LISTS / komga.delete-empty-read-lists: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to Server Settings."),(0,n.kt)("h4",{id:"komga_oauth2_account_creation--komgaoauth2-account-creation-truefalse"},"KOMGA_OAUTH2_ACCOUNT_CREATION / komga.oauth2-account-creation: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Such users will be created with a random password, which the user can subsequently change from the ",(0,n.kt)("em",{parentName:"p"},"Account Settings")," page later on, for example to be able to connect using OPDS or Tachiyomi."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"It is recommended to enable this only with OAuth2 providers you control")),(0,n.kt)("p",null,"Defaults to ",(0,n.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,n.kt)("h4",{id:"komga_oidc_email_verification--komgaoidc-email-verification-truefalse"},"KOMGA_OIDC_EMAIL_VERIFICATION / komga.oidc-email-verification: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"A boolean indicating whether Komga should check whether the ",(0,n.kt)("inlineCode",{parentName:"p"},"email_verified")," claim is present and true in the OpenID Connect request."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"It is recommended to disable this only with OIDC providers that do not verify emails (like Azure AD)")),(0,n.kt)("p",null,"Defaults to ",(0,n.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,n.kt)("h4",{id:"logging_file_name--loggingfilename-logfile-name"},"LOGGING_FILE_NAME / logging.file.name: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"Name of the log file."),(0,n.kt)("p",null,"If you want to change the directory, it is advised to change ",(0,n.kt)("inlineCode",{parentName:"p"},"komga.config-dir")," instead."),(0,n.kt)("p",null,"Defaults to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"~/Library/Logs/Komga/komga.log")," for the ",(0,n.kt)("em",{parentName:"li"},"macOS app"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"/config/logs/komga.log")," for ",(0,n.kt)("em",{parentName:"li"},"Docker"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"\\${komga.config-dir}/komga.log")," otherwise.")),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"~")," is your home directory on Unix, and your User profile on Windows."),(0,n.kt)("p",null,(0,n.kt)("em",{parentName:"p"},"When overriding this configuration, you need to use ",(0,n.kt)("inlineCode",{parentName:"em"},"${user.home}")," instead of ",(0,n.kt)("inlineCode",{parentName:"em"},"~")," (this is a specific Spring Boot variable).")),(0,n.kt)("h4",{id:"komga_taskconsumers--komgatask-consumers-int"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_TASKCONSUMERS / komga.task-consumers: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been removed."),(0,n.kt)("h4",{id:"komga_taskconsumersmax--komgatask-consumers-max-int"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_TASKCONSUMERSMAX / komga.task-consumers-max: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been removed."),(0,n.kt)("h2",{id:"sample-configuration-file"},"Sample Configuration File"),(0,n.kt)("p",null,"Here is a sample ",(0,n.kt)("inlineCode",{parentName:"p"},"application.yml")," file in case you need to customize it. Keep only the lines you need."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-yaml"},"# 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")),(0,n.kt)("h2",{id:"database-performance"},"Database performance"),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"Use at your own risk!")),(0,n.kt)("p",null,"Some specific configuration keys are available to tweak the database performance."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-yaml"},"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")))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[305],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>k});var o=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,o)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=o.createContext({}),m=function(e){var t=o.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},d=function(e){var t=m(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=m(a),u=n,k=p["".concat(s,".").concat(u)]||p[u]||c[u]||i;return a?o.createElement(k,r(r({ref:t},d),{},{components:a})):o.createElement(k,r({ref:t},d))}));function k(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,r=new Array(i);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,r[1]=l;for(var m=2;m{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>m});var o=a(7462),n=(a(7294),a(3905));const i={},r="Configuration options",l={unversionedId:"installation/configuration",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/configuration.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install via third-party integrations",permalink:"/docs/installation/thirdparty"},next:{title:"Expose your server",permalink:"/docs/installation/https"}},s={},m=[{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}],d={toc:m},p="wrapper";function c(e){let{components:t,...a}=e;return(0,n.kt)(p,(0,o.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"configuration-options"},"Configuration options"),(0,n.kt)("admonition",{type:"tip"},(0,n.kt)("p",{parentName:"admonition"},"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.kt)("p",{parentName:"admonition"},"The ",(0,n.kt)("inlineCode",{parentName:"p"},"application.yml")," file does not exist by default, you need to create one if you want to customize the configuration.")),(0,n.kt)("p",null,"Komga relies heavily on ",(0,n.kt)("a",{parentName:"p",href:"https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html"},"Spring Boot's configuration"),", leveraging ",(0,n.kt)("inlineCode",{parentName:"p"},"profiles")," and configuration ",(0,n.kt)("inlineCode",{parentName:"p"},"properties"),"."),(0,n.kt)("p",null,"The easiest way to configure is either via environment variables (a good fit for ",(0,n.kt)("inlineCode",{parentName:"p"},"docker")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"docker-compose"),") or by using an ",(0,n.kt)("inlineCode",{parentName:"p"},"application.yml")," file located in the configuration directory:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The Docker image will load any ",(0,n.kt)("inlineCode",{parentName:"li"},"application.yml")," file located in the ",(0,n.kt)("inlineCode",{parentName:"li"},"/config")," mounted folder."),(0,n.kt)("li",{parentName:"ul"},"The Jar will load any ",(0,n.kt)("inlineCode",{parentName:"li"},"application.yml")," file located in the ",(0,n.kt)("inlineCode",{parentName:"li"},"komga.config-dir")," directory (defaults to ",(0,n.kt)("inlineCode",{parentName:"li"},"~/.komga"),", ",(0,n.kt)("a",{parentName:"li",href:"#komga-configdir-komga-config-dir-directory"},"more details"),").")),(0,n.kt)("p",null,"Each configuration key can have a different format depending if it's from the environment variable, or from the ",(0,n.kt)("inlineCode",{parentName:"p"},"application.yml")," file. In the following section I will provide both format in the form ",(0,n.kt)("inlineCode",{parentName:"p"},"ENVIRONMENT_VARIABLE")," / ",(0,n.kt)("inlineCode",{parentName:"p"},"application-property"),"."),(0,n.kt)("p",null,"You can also specify configuration via the command line, when launching the ",(0,n.kt)("inlineCode",{parentName:"p"},"jar"),". Use the ",(0,n.kt)("inlineCode",{parentName:"p"},"application-property")," form, and prefix with ",(0,n.kt)("inlineCode",{parentName:"p"},"--"),". For example:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-shell"},'java -jar komga.jar --server.servlet.context-path="/komga" --server.port=8443\n')),(0,n.kt)("h2",{id:"optional-configuration"},"Optional configuration"),(0,n.kt)("p",null,"You can use some optional configuration keys:"),(0,n.kt)("h4",{id:"komga_configdir--komgaconfig-dir-directory"},"KOMGA_CONFIGDIR / komga.config-dir: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"The Komga configuration directory. Will be used to store the logs, database, and any other file Komga needs."),(0,n.kt)("p",null,"Defaults to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"%LOCALAPPDATA%/Komga")," on the ",(0,n.kt)("em",{parentName:"li"},"Windows app"),". That folder is virtualized by Windows. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"~/Library/Application Support/Komga")," on the macOS app. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"~/.komga")," otherwise.")),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"~")," is your home directory on Unix, and your User profile on Windows."),(0,n.kt)("p",null,(0,n.kt)("em",{parentName:"p"},"When overriding this configuration, you need to use ",(0,n.kt)("inlineCode",{parentName:"em"},"${user.home}")," instead of ",(0,n.kt)("inlineCode",{parentName:"em"},"~")," (this is a specific Spring Boot variable).")),(0,n.kt)("h4",{id:"server_port--serverport-port"},"SERVER_PORT / server.port: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"Port to listen to for the API and web interface."),(0,n.kt)("p",null,"Can also be configured from the ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/server-settings#server-port"},"Server Settings"),"."),(0,n.kt)("p",null,"Defaults to ",(0,n.kt)("inlineCode",{parentName:"p"},"25600"),"."),(0,n.kt)("h4",{id:"server_servlet_context_path--serverservletcontext-path-baseurl"},"SERVER_SERVLET_CONTEXT_PATH / server.servlet.context-path: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"Base URL, useful if you need to reverse proxy with a subfolder."),(0,n.kt)("p",null,"Can also be configured from the ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/server-settings#base-url"},"Server Settings"),"."),(0,n.kt)("p",null,"Defaults to ",(0,n.kt)("inlineCode",{parentName:"p"},"/"),"."),(0,n.kt)("h4",{id:"server_servlet_session_timeout--serverservletsessiontimeout-duration"},"SERVER_SERVLET_SESSION_TIMEOUT / server.servlet.session.timeout: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"The duration after which an inactive session will expire. You can specify the timeunit, for example ",(0,n.kt)("inlineCode",{parentName:"p"},"14d")," for 14 days, or ",(0,n.kt)("inlineCode",{parentName:"p"},"24h")," for 24 hours. If no unit is set, seconds will be used."),(0,n.kt)("p",null,"Defaults to 30 minutes."),(0,n.kt)("h4",{id:"komga_libraries_scan_cron--komgalibraries-scan-cron-cron"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_LIBRARIES_SCAN_CRON / komga.libraries-scan-cron: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/libraries#scan-interval"},"Library options: scan interval"),"."),(0,n.kt)("h4",{id:"komga_libraries_scan_startup--komgalibraries-scan-startup-truefalse"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_LIBRARIES_SCAN_STARTUP / komga.libraries-scan-startup: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/libraries#scan-on-startup"},"Library options: scan on startup"),"."),(0,n.kt)("h4",{id:"komga_libraries_scan_directory_exclusions--komgalibraries-scan-directory-exclusions-exclusions"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_LIBRARIES_SCAN_DIRECTORY_EXCLUSIONS / komga.libraries-scan-directory-exclusions: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to ",(0,n.kt)("a",{parentName:"p",href:"/docs/guides/libraries#directory-exclusions"},"Library options: directory exclusions"),"."),(0,n.kt)("h4",{id:"komga_rememberme_key--komgaremember-mekey-key"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_REMEMBERME_KEY / komga.remember-me.key: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to Server Settings."),(0,n.kt)("h4",{id:"komga_rememberme_validity--komgaremember-mevalidity-duration"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_REMEMBERME_VALIDITY / komga.remember-me.validity: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to Server Settings."),(0,n.kt)("h4",{id:"komga_sessiontimeout--komgasession-timeout-duration"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_SESSIONTIMEOUT / komga.session-timeout: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been replaced by ",(0,n.kt)("inlineCode",{parentName:"p"},"server.servlet.session.timeout"),"."),(0,n.kt)("h4",{id:"komga_database_file--komgadatabasefile-file-path"},"KOMGA_DATABASE_FILE / komga.database.file: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"File path for the SQLite database."),(0,n.kt)("p",null,"If you want to change the directory, it is advised to change ",(0,n.kt)("inlineCode",{parentName:"p"},"komga.config-dir")," instead."),(0,n.kt)("p",null,"Defaults to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"/config/database.sqlite")," for ",(0,n.kt)("em",{parentName:"li"},"Docker"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"\\${komga.config-dir}/database.sqlite")," otherwise.")),(0,n.kt)("h4",{id:"komga_cors_allowed_origins--komgacorsallowed-origins-origins"},"KOMGA_CORS_ALLOWED_ORIGINS / komga.cors.allowed-origins: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"A list of origins to allow for CORS."),(0,n.kt)("p",null,"Defaults to empty list."),(0,n.kt)("h4",{id:"komga_delete_empty_collections--komgadelete-empty-collections-truefalse"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_DELETE_EMPTY_COLLECTIONS / komga.delete-empty-collections: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to Server Settings."),(0,n.kt)("h4",{id:"komga_delete_empty_read_lists--komgadelete-empty-read-lists-truefalse"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_DELETE_EMPTY_READ_LISTS / komga.delete-empty-read-lists: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been moved to Server Settings."),(0,n.kt)("h4",{id:"komga_oauth2_account_creation--komgaoauth2-account-creation-truefalse"},"KOMGA_OAUTH2_ACCOUNT_CREATION / komga.oauth2-account-creation: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Such users will be created with a random password, which the user can subsequently change from the ",(0,n.kt)("em",{parentName:"p"},"Account Settings")," page later on, for example to be able to connect using OPDS or Tachiyomi."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"It is recommended to enable this only with OAuth2 providers you control")),(0,n.kt)("p",null,"Defaults to ",(0,n.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,n.kt)("h4",{id:"komga_oidc_email_verification--komgaoidc-email-verification-truefalse"},"KOMGA_OIDC_EMAIL_VERIFICATION / komga.oidc-email-verification: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"A boolean indicating whether Komga should check whether the ",(0,n.kt)("inlineCode",{parentName:"p"},"email_verified")," claim is present and true in the OpenID Connect request."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"It is recommended to disable this only with OIDC providers that do not verify emails (like Azure AD)")),(0,n.kt)("p",null,"Defaults to ",(0,n.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,n.kt)("h4",{id:"logging_file_name--loggingfilename-logfile-name"},"LOGGING_FILE_NAME / logging.file.name: ",(0,n.kt)("inlineCode",{parentName:"h4"},"")),(0,n.kt)("p",null,"Name of the log file."),(0,n.kt)("p",null,"If you want to change the directory, it is advised to change ",(0,n.kt)("inlineCode",{parentName:"p"},"komga.config-dir")," instead."),(0,n.kt)("p",null,"Defaults to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"~/Library/Logs/Komga/komga.log")," for the ",(0,n.kt)("em",{parentName:"li"},"macOS app"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"/config/logs/komga.log")," for ",(0,n.kt)("em",{parentName:"li"},"Docker"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"\\${komga.config-dir}/komga.log")," otherwise.")),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"~")," is your home directory on Unix, and your User profile on Windows."),(0,n.kt)("p",null,(0,n.kt)("em",{parentName:"p"},"When overriding this configuration, you need to use ",(0,n.kt)("inlineCode",{parentName:"em"},"${user.home}")," instead of ",(0,n.kt)("inlineCode",{parentName:"em"},"~")," (this is a specific Spring Boot variable).")),(0,n.kt)("h4",{id:"komga_taskconsumers--komgatask-consumers-int"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_TASKCONSUMERS / komga.task-consumers: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been removed."),(0,n.kt)("h4",{id:"komga_taskconsumersmax--komgatask-consumers-max-int"},(0,n.kt)("del",{parentName:"h4"},"KOMGA_TASKCONSUMERSMAX / komga.task-consumers-max: ",(0,n.kt)("inlineCode",{parentName:"del"},""))),(0,n.kt)("p",null,"This has been removed."),(0,n.kt)("h2",{id:"sample-configuration-file"},"Sample Configuration File"),(0,n.kt)("p",null,"Here is a sample ",(0,n.kt)("inlineCode",{parentName:"p"},"application.yml")," file in case you need to customize it. Keep only the lines you need."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-yaml"},"# 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")),(0,n.kt)("h2",{id:"database-performance"},"Database performance"),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"Use at your own risk!")),(0,n.kt)("p",null,"Some specific configuration keys are available to tweak the database performance."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-yaml"},"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")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/98ce5054.4579cb37.js b/assets/js/98ce5054.8bdb722c.js similarity index 98% rename from assets/js/98ce5054.4579cb37.js rename to assets/js/98ce5054.8bdb722c.js index 58ba85c3..bfeae400 100644 --- a/assets/js/98ce5054.4579cb37.js +++ b/assets/js/98ce5054.8bdb722c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[8209],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(r),m=o,k=c["".concat(i,".").concat(m)]||c[m]||d[m]||a;return r?n.createElement(k,l(l({ref:t},u),{},{components:r})):n.createElement(k,l({ref:t},u))}));function k(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[c]="string"==typeof e?e:o,l[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const a={},l="Local Artwork Assets",s={unversionedId:"guides/local-artwork-assets",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/local-artwork-assets.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Edit Metadata",permalink:"/docs/guides/edit-metadata"},next:{title:"User accounts",permalink:"/docs/guides/user-accounts"}},i={},p=[{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}],u={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"local-artwork-assets"},"Local Artwork Assets"),(0,o.kt)("h2",{id:"supported-artwork-image-formats"},"Supported Artwork Image Formats"),(0,o.kt)("p",null,"There are a number of supported custom media items that need to be named correctly to be detected. The supported image file formats are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"jpg"),(0,o.kt)("li",{parentName:"ul"},"jpeg"),(0,o.kt)("li",{parentName:"ul"},"png"),(0,o.kt)("li",{parentName:"ul"},"webp"),(0,o.kt)("li",{parentName:"ul"},"tbn")),(0,o.kt)("h2",{id:"poster-artwork"},"Poster Artwork"),(0,o.kt)("p",null,"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."),(0,o.kt)("h4",{id:"books"},"Books"),(0,o.kt)("p",null,"Custom poster must have the same name as the book file:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Exact book name.ext"))),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"ext")," is the file extension."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/Series\n Book 10.cbz\n Book 10.jpg\n")),(0,o.kt)("p",null,"More than one poster image can be included. For multiple items to be scanned, they should be named as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Exact book name-X.ext"))),(0,o.kt)("p",null,"Where ",(0,o.kt)("inlineCode",{parentName:"p"},"-X")," is a number."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/Series\n Book 12.cbz\n Book 12-1.jpg\n Book 12-2.png\n")),(0,o.kt)("h4",{id:"series"},"Series"),(0,o.kt)("p",null,"Custom poster must be located in the Series directory and named as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"cover.ext")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"default.ext")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"folder.ext")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"series.ext")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"poster.ext"))),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"ext")," is the file extension."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/Series\n poster.jpg\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[8209],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>k});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),p=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(i.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(r),m=o,k=c["".concat(i,".").concat(m)]||c[m]||d[m]||a;return r?n.createElement(k,l(l({ref:t},u),{},{components:r})):n.createElement(k,l({ref:t},u))}));function k(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,l=new Array(a);l[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[c]="string"==typeof e?e:o,l[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const a={},l="Local Artwork Assets",s={unversionedId:"guides/local-artwork-assets",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/local-artwork-assets.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Edit Metadata",permalink:"/docs/guides/edit-metadata"},next:{title:"User accounts",permalink:"/docs/guides/user-accounts"}},i={},p=[{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}],u={toc:p},c="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"local-artwork-assets"},"Local Artwork Assets"),(0,o.kt)("h2",{id:"supported-artwork-image-formats"},"Supported Artwork Image Formats"),(0,o.kt)("p",null,"There are a number of supported custom media items that need to be named correctly to be detected. The supported image file formats are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"jpg"),(0,o.kt)("li",{parentName:"ul"},"jpeg"),(0,o.kt)("li",{parentName:"ul"},"png"),(0,o.kt)("li",{parentName:"ul"},"webp"),(0,o.kt)("li",{parentName:"ul"},"tbn")),(0,o.kt)("h2",{id:"poster-artwork"},"Poster Artwork"),(0,o.kt)("p",null,"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."),(0,o.kt)("h4",{id:"books"},"Books"),(0,o.kt)("p",null,"Custom poster must have the same name as the book file:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Exact book name.ext"))),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"ext")," is the file extension."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/Series\n Book 10.cbz\n Book 10.jpg\n")),(0,o.kt)("p",null,"More than one poster image can be included. For multiple items to be scanned, they should be named as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Exact book name-X.ext"))),(0,o.kt)("p",null,"Where ",(0,o.kt)("inlineCode",{parentName:"p"},"-X")," is a number."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/Series\n Book 12.cbz\n Book 12-1.jpg\n Book 12-2.png\n")),(0,o.kt)("h4",{id:"series"},"Series"),(0,o.kt)("p",null,"Custom poster must be located in the Series directory and named as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"cover.ext")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"default.ext")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"folder.ext")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"series.ext")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"poster.ext"))),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"ext")," is the file extension."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/Series\n poster.jpg\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a09c2993.e2e7b80e.js b/assets/js/a09c2993.02311474.js similarity index 98% rename from assets/js/a09c2993.e2e7b80e.js rename to assets/js/a09c2993.02311474.js index 7bae2bf6..4030dad0 100644 --- a/assets/js/a09c2993.e2e7b80e.js +++ b/assets/js/a09c2993.02311474.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4128],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),m=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=m(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=m(r),d=a,k=p["".concat(s,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(k,i(i({ref:t},c),{},{components:r})):n.createElement(k,i({ref:t},c))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:a,i[1]=l;for(var m=2;m{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>m});var n=r(7462),a=(r(7294),r(3905));const o={},i="Introduction",l={unversionedId:"introduction",id:"introduction",title:"Introduction",description:"What is Komga?",source:"@site/docs/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/docs/introduction",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/introduction.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",next:{title:"Installation",permalink:"/docs/category/installation"}},s={},m=[{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}],c={toc:m},p="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"introduction"},"Introduction"),(0,a.kt)("h2",{id:"what-is-komga"},"What is Komga?"),(0,a.kt)("p",null,"Komga is a media server for your comics, mangas, BDs, magazines and eBooks."),(0,a.kt)("p",null,"How it works:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Install and run Komga on a computer or NAS."),(0,a.kt)("li",{parentName:"ol"},"Add libraries by type of content and let Komga do the rest."),(0,a.kt)("li",{parentName:"ol"},"Use the web interface or any compatible client."),(0,a.kt)("li",{parentName:"ol"},"Enjoy your books!")),(0,a.kt)("h2",{id:"what-media-and-devices-work"},"What media and devices work?"),(0,a.kt)("h3",{id:"komga-supports-these-media-file-types"},"Komga supports these media file types"),(0,a.kt)("p",null,"Komga supports the following file types:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Comic book archives: ",(0,a.kt)("em",{parentName:"li"},"CBZ")," and ",(0,a.kt)("em",{parentName:"li"},"CBR")," (except RAR5 and solid archives)"),(0,a.kt)("li",{parentName:"ul"},"eBooks in ",(0,a.kt)("em",{parentName:"li"},"EPUB")," format"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("em",{parentName:"li"},"PDF")," files")),(0,a.kt)("h3",{id:"komga-server-compatibility"},"Komga server compatibility"),(0,a.kt)("p",null,"Komga can run on any system that can run Java or Docker:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Windows"),(0,a.kt)("li",{parentName:"ul"},"macOS"),(0,a.kt)("li",{parentName:"ul"},"Linux"),(0,a.kt)("li",{parentName:"ul"},"Many popular NAS devices such as QNAP, Synology and more")),(0,a.kt)("h2",{id:"demo"},"Demo"),(0,a.kt)("p",null,"A demonstration website is available at: ",(0,a.kt)("a",{parentName:"p",href:"https://demo.komga.org"},"https://demo.komga.org")),(0,a.kt)("p",null,"You can log in using the following credentials:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Login: ",(0,a.kt)("inlineCode",{parentName:"li"},"demo@komga.org")),(0,a.kt)("li",{parentName:"ul"},"Password: ",(0,a.kt)("inlineCode",{parentName:"li"},"komga-demo"))))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4128],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>k});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),m=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=m(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=m(r),d=a,k=p["".concat(s,".").concat(d)]||p[d]||u[d]||o;return r?n.createElement(k,i(i({ref:t},c),{},{components:r})):n.createElement(k,i({ref:t},c))}));function k(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:a,i[1]=l;for(var m=2;m{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>m});var n=r(7462),a=(r(7294),r(3905));const o={},i="Introduction",l={unversionedId:"introduction",id:"introduction",title:"Introduction",description:"What is Komga?",source:"@site/docs/introduction.md",sourceDirName:".",slug:"/introduction",permalink:"/docs/introduction",draft:!1,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/introduction.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",next:{title:"Installation",permalink:"/docs/category/installation"}},s={},m=[{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}],c={toc:m},p="wrapper";function u(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"introduction"},"Introduction"),(0,a.kt)("h2",{id:"what-is-komga"},"What is Komga?"),(0,a.kt)("p",null,"Komga is a media server for your comics, mangas, BDs, magazines and eBooks."),(0,a.kt)("p",null,"How it works:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Install and run Komga on a computer or NAS."),(0,a.kt)("li",{parentName:"ol"},"Add libraries by type of content and let Komga do the rest."),(0,a.kt)("li",{parentName:"ol"},"Use the web interface or any compatible client."),(0,a.kt)("li",{parentName:"ol"},"Enjoy your books!")),(0,a.kt)("h2",{id:"what-media-and-devices-work"},"What media and devices work?"),(0,a.kt)("h3",{id:"komga-supports-these-media-file-types"},"Komga supports these media file types"),(0,a.kt)("p",null,"Komga supports the following file types:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Comic book archives: ",(0,a.kt)("em",{parentName:"li"},"CBZ")," and ",(0,a.kt)("em",{parentName:"li"},"CBR")," (except RAR5 and solid archives)"),(0,a.kt)("li",{parentName:"ul"},"eBooks in ",(0,a.kt)("em",{parentName:"li"},"EPUB")," format"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("em",{parentName:"li"},"PDF")," files")),(0,a.kt)("h3",{id:"komga-server-compatibility"},"Komga server compatibility"),(0,a.kt)("p",null,"Komga can run on any system that can run Java or Docker:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Windows"),(0,a.kt)("li",{parentName:"ul"},"macOS"),(0,a.kt)("li",{parentName:"ul"},"Linux"),(0,a.kt)("li",{parentName:"ul"},"Many popular NAS devices such as QNAP, Synology and more")),(0,a.kt)("h2",{id:"demo"},"Demo"),(0,a.kt)("p",null,"A demonstration website is available at: ",(0,a.kt)("a",{parentName:"p",href:"https://demo.komga.org"},"https://demo.komga.org")),(0,a.kt)("p",null,"You can log in using the following credentials:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Login: ",(0,a.kt)("inlineCode",{parentName:"li"},"demo@komga.org")),(0,a.kt)("li",{parentName:"ul"},"Password: ",(0,a.kt)("inlineCode",{parentName:"li"},"komga-demo"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a22ccb60.3d7e0a71.js b/assets/js/a22ccb60.467254e0.js similarity index 98% rename from assets/js/a22ccb60.3d7e0a71.js rename to assets/js/a22ccb60.467254e0.js index 5e50c810..b4e388ce 100644 --- a/assets/js/a22ccb60.3d7e0a71.js +++ b/assets/js/a22ccb60.467254e0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9353],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,d=p(e,["components","mdxType","originalType","parentName"]),s=c(r),m=i,f=s["".concat(l,".").concat(m)]||s[m]||u[m]||a;return r?n.createElement(f,o(o({ref:t},d),{},{components:r})):n.createElement(f,o({ref:t},d))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[s]="string"==typeof e?e:i,o[1]=p;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>p,toc:()=>c});var n=r(7462),i=(r(7294),r(3905));const a={},o="Deprecation",p={unversionedId:"api/deprecation",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/api/deprecation.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"api",previous:{title:"REST API",permalink:"/docs/api/rest"}},l={},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}],d={toc:c},s="wrapper";function u(e){let{components:t,...r}=e;return(0,i.kt)(s,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"deprecation"},"Deprecation"),(0,i.kt)("h2",{id:"to-be-removed-in-200"},"To be removed in 2.0.0"),(0,i.kt)("p",null,"The following API endpoints will be removed in version ",(0,i.kt)("inlineCode",{parentName:"p"},"2.0.0"),"."),(0,i.kt)("h3",{id:"put-apiv1librarieslibraryid"},"PUT /api/v1/libraries/{libraryId}"),(0,i.kt)("p",null,"Deprecated since version: ",(0,i.kt)("inlineCode",{parentName:"p"},"1.3.0")),(0,i.kt)("p",null,"Use ",(0,i.kt)("inlineCode",{parentName:"p"},"PATCH /api/v1/libraries/{libraryId}")," instead, without any change needed. The ",(0,i.kt)("inlineCode",{parentName:"p"},"PUT")," endpoint redirects to the ",(0,i.kt)("inlineCode",{parentName:"p"},"PATCH")," endpoint internally."),(0,i.kt)("p",null,"The endpoint now accepts a partial DTO, and will only update fields that are present."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[9353],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,d=p(e,["components","mdxType","originalType","parentName"]),s=c(r),m=i,f=s["".concat(l,".").concat(m)]||s[m]||u[m]||a;return r?n.createElement(f,o(o({ref:t},d),{},{components:r})):n.createElement(f,o({ref:t},d))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[s]="string"==typeof e?e:i,o[1]=p;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>p,toc:()=>c});var n=r(7462),i=(r(7294),r(3905));const a={},o="Deprecation",p={unversionedId:"api/deprecation",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/api/deprecation.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"api",previous:{title:"REST API",permalink:"/docs/api/rest"}},l={},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}],d={toc:c},s="wrapper";function u(e){let{components:t,...r}=e;return(0,i.kt)(s,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"deprecation"},"Deprecation"),(0,i.kt)("h2",{id:"to-be-removed-in-200"},"To be removed in 2.0.0"),(0,i.kt)("p",null,"The following API endpoints will be removed in version ",(0,i.kt)("inlineCode",{parentName:"p"},"2.0.0"),"."),(0,i.kt)("h3",{id:"put-apiv1librarieslibraryid"},"PUT /api/v1/libraries/{libraryId}"),(0,i.kt)("p",null,"Deprecated since version: ",(0,i.kt)("inlineCode",{parentName:"p"},"1.3.0")),(0,i.kt)("p",null,"Use ",(0,i.kt)("inlineCode",{parentName:"p"},"PATCH /api/v1/libraries/{libraryId}")," instead, without any change needed. The ",(0,i.kt)("inlineCode",{parentName:"p"},"PUT")," endpoint redirects to the ",(0,i.kt)("inlineCode",{parentName:"p"},"PATCH")," endpoint internally."),(0,i.kt)("p",null,"The endpoint now accepts a partial DTO, and will only update fields that are present."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a624e12b.5e81790c.js b/assets/js/a624e12b.c667710d.js similarity index 99% rename from assets/js/a624e12b.5e81790c.js rename to assets/js/a624e12b.c667710d.js index de0948de..970c301b 100644 --- a/assets/js/a624e12b.5e81790c.js +++ b/assets/js/a624e12b.c667710d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3287],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var o=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=o.createContext({}),s=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=s(e.components);return o.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(n),h=a,m=u["".concat(p,".").concat(h)]||u[h]||d[h]||i;return n?o.createElement(m,r(r({ref:t},c),{},{components:n})):o.createElement(m,r({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,r=new Array(i);r[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:a,r[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var o=n(7462),a=(n(7294),n(3905));const i={},r="Social login",l={unversionedId:"installation/oauth2",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/oauth2.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Expose your server",permalink:"/docs/installation/https"},next:{title:"Google Drive and rclone",permalink:"/docs/installation/gdrive"}},p={},s=[{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}],c={toc:s},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"social-login"},"Social login"),(0,a.kt)("p",null,"Komga supports social login via ",(0,a.kt)("strong",{parentName:"p"},"OAuth2")," and ",(0,a.kt)("strong",{parentName:"p"},"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."),(0,a.kt)("p",null,"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,a.kt)("em",{parentName:"p"},"Client ID")," and ",(0,a.kt)("em",{parentName:"p"},"Client Secret"),". You will also need to configure a ",(0,a.kt)("em",{parentName:"p"},"Redirect URI")," in the application you created."),(0,a.kt)("p",null,"You can enable automatic account creation upon successful social login, see ",(0,a.kt)("a",{parentName:"p",href:"/docs/installation/configuration#komga-oauth2-account-creation-komga-oauth2-account-creation-true-false"},"here")," for more details."),(0,a.kt)("h2",{id:"guide-for-common-providers"},"Guide for common providers"),(0,a.kt)("p",null,"You can easily configure Google, Github, and Facebook without any complex configuration."),(0,a.kt)("h3",{id:"google"},"Google"),(0,a.kt)("p",null,"Follow the instructions on the ",(0,a.kt)("a",{parentName:"p",href:"https://developers.google.com/identity/protocols/OpenIDConnect"},"OpenID Connect page"),', starting in the section, "Setting up OAuth 2.0".'),(0,a.kt)("p",null,'When asked for a "Redirect URI", use ',(0,a.kt)("inlineCode",{parentName:"p"},"{baseUrl}/login/oauth2/code/google"),", where ",(0,a.kt)("inlineCode",{parentName:"p"},"baseUrl")," is your server's address."),(0,a.kt)("p",null,'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.'),(0,a.kt)("p",null,"Modify your ",(0,a.kt)("inlineCode",{parentName:"p"},"application.yml")," as below and replace the values in the ",(0,a.kt)("inlineCode",{parentName:"p"},"client-id")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"client-secret")," property with the OAuth 2.0 credentials you created earlier."),(0,a.kt)("p",null,"Sample configuration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: 1044613984fsf335-mnsdvkjy3yf98294unfmnvd8.apps.googleusercontent.com\n client-secret: jwhfkjhwefkn44t8vcxml3m\n")),(0,a.kt)("h3",{id:"facebook"},"Facebook"),(0,a.kt)("p",null,"Follow the ",(0,a.kt)("a",{parentName:"p",href:"https://developers.facebook.com/docs/development/register"},"instructions")," to create an App, and add the Facebook Login product."),(0,a.kt)("p",null,"In the ",(0,a.kt)("inlineCode",{parentName:"p"},"Valid OAuth Redirect URIs"),", use ",(0,a.kt)("inlineCode",{parentName:"p"},"{baseUrl}/login/oauth2/code/facebook"),", where ",(0,a.kt)("inlineCode",{parentName:"p"},"baseUrl")," is your server's address."),(0,a.kt)("p",null,"Modify your ",(0,a.kt)("inlineCode",{parentName:"p"},"application.yml")," as below and replace the values in the ",(0,a.kt)("inlineCode",{parentName:"p"},"client-id")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"client-secret")," property with the App ID and App Secret."),(0,a.kt)("p",null,"Sample configuration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"spring:\n security:\n oauth2:\n client:\n registration:\n facebook:\n client-id: 227581266063919\n client-secret: 47f03915334f49cdueru810069321964929\n")),(0,a.kt)("h3",{id:"github"},"Github"),(0,a.kt)("p",null,"Register a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/settings/applications/new"},"new application"),"."),(0,a.kt)("p",null,'For the "Authorization callback URL", use ',(0,a.kt)("inlineCode",{parentName:"p"},"{baseUrl}/login/oauth2/code/github"),", where ",(0,a.kt)("inlineCode",{parentName:"p"},"baseUrl")," is your server's address."),(0,a.kt)("p",null,"Generate a new Client Secret, you should now have a Client ID and Client Secret."),(0,a.kt)("p",null,"Modify your ",(0,a.kt)("inlineCode",{parentName:"p"},"application.yml")," as below and replace the values in the ",(0,a.kt)("inlineCode",{parentName:"p"},"client-id")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"client-secret")," property with the OAuth 2.0 credentials you created earlier."),(0,a.kt)("p",null,"Sample configuration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"spring:\n security:\n oauth2:\n client:\n registration:\n github:\n client-id: 62736jnfksui37384hnmsdnf\n client-secret: jhjgfy67363uhif762328938844940e3e8c8629c18f9\n scope: user:email\n")),(0,a.kt)("h2",{id:"advanced-configuration"},"Advanced configuration"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"Modify your ",(0,a.kt)("inlineCode",{parentName:"p"},"application.yml")," as below and replace the values in the ",(0,a.kt)("inlineCode",{parentName:"p"},"client-id")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"client-secret")," property with your credentials You will also need to update the various URIs in the ",(0,a.kt)("inlineCode",{parentName:"p"},"provider")," section."),(0,a.kt)("p",null,"You need to make sure that the users have an email setup, and that it has been marked as verified."),(0,a.kt)("p",null,"When configuring the client in your provider, you may need to input a redirect URI. Use the following: ",(0,a.kt)("inlineCode",{parentName:"p"},"{baseUrl}/login/oauth2/code/{registrationId}"),", where ",(0,a.kt)("inlineCode",{parentName:"p"},"baseUrl")," is your server's address, and ",(0,a.kt)("inlineCode",{parentName:"p"},"registrationId")," is the name of the configuration key (",(0,a.kt)("inlineCode",{parentName:"p"},"keycloak")," in the below example)."),(0,a.kt)("p",null,"There are 2 options to configure a provider, either set ",(0,a.kt)("inlineCode",{parentName:"p"},"issuer-uri")," or all of the following: ",(0,a.kt)("inlineCode",{parentName:"p"},"authorization-uri"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"token-uri"),",\n",(0,a.kt)("inlineCode",{parentName:"p"},"jwk-set-uri"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"user-info-uri"),". If your authentication server provides ",(0,a.kt)("inlineCode",{parentName:"p"},"issuer-uri"),", this option is preferred."),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"registration")," section contains a ",(0,a.kt)("inlineCode",{parentName:"p"},"provider")," option, this must be the same name as specified in the\n",(0,a.kt)("inlineCode",{parentName:"p"},"provider")," configuration. (In the example below, we've configured ",(0,a.kt)("inlineCode",{parentName:"p"},"provider")," with name ",(0,a.kt)("inlineCode",{parentName:"p"},"keycloak"),", so in the\n",(0,a.kt)("inlineCode",{parentName:"p"},"registration")," section we set ",(0,a.kt)("inlineCode",{parentName:"p"},"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."),(0,a.kt)("p",null,"Sample configuration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'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')))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3287],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var o=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=o.createContext({}),s=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=s(e.components);return o.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(n),h=a,m=u["".concat(p,".").concat(h)]||u[h]||d[h]||i;return n?o.createElement(m,r(r({ref:t},c),{},{components:n})):o.createElement(m,r({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,r=new Array(i);r[0]=h;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:a,r[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var o=n(7462),a=(n(7294),n(3905));const i={},r="Social login",l={unversionedId:"installation/oauth2",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/oauth2.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Expose your server",permalink:"/docs/installation/https"},next:{title:"Google Drive and rclone",permalink:"/docs/installation/gdrive"}},p={},s=[{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}],c={toc:s},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"social-login"},"Social login"),(0,a.kt)("p",null,"Komga supports social login via ",(0,a.kt)("strong",{parentName:"p"},"OAuth2")," and ",(0,a.kt)("strong",{parentName:"p"},"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."),(0,a.kt)("p",null,"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,a.kt)("em",{parentName:"p"},"Client ID")," and ",(0,a.kt)("em",{parentName:"p"},"Client Secret"),". You will also need to configure a ",(0,a.kt)("em",{parentName:"p"},"Redirect URI")," in the application you created."),(0,a.kt)("p",null,"You can enable automatic account creation upon successful social login, see ",(0,a.kt)("a",{parentName:"p",href:"/docs/installation/configuration#komga-oauth2-account-creation-komga-oauth2-account-creation-true-false"},"here")," for more details."),(0,a.kt)("h2",{id:"guide-for-common-providers"},"Guide for common providers"),(0,a.kt)("p",null,"You can easily configure Google, Github, and Facebook without any complex configuration."),(0,a.kt)("h3",{id:"google"},"Google"),(0,a.kt)("p",null,"Follow the instructions on the ",(0,a.kt)("a",{parentName:"p",href:"https://developers.google.com/identity/protocols/OpenIDConnect"},"OpenID Connect page"),', starting in the section, "Setting up OAuth 2.0".'),(0,a.kt)("p",null,'When asked for a "Redirect URI", use ',(0,a.kt)("inlineCode",{parentName:"p"},"{baseUrl}/login/oauth2/code/google"),", where ",(0,a.kt)("inlineCode",{parentName:"p"},"baseUrl")," is your server's address."),(0,a.kt)("p",null,'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.'),(0,a.kt)("p",null,"Modify your ",(0,a.kt)("inlineCode",{parentName:"p"},"application.yml")," as below and replace the values in the ",(0,a.kt)("inlineCode",{parentName:"p"},"client-id")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"client-secret")," property with the OAuth 2.0 credentials you created earlier."),(0,a.kt)("p",null,"Sample configuration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: 1044613984fsf335-mnsdvkjy3yf98294unfmnvd8.apps.googleusercontent.com\n client-secret: jwhfkjhwefkn44t8vcxml3m\n")),(0,a.kt)("h3",{id:"facebook"},"Facebook"),(0,a.kt)("p",null,"Follow the ",(0,a.kt)("a",{parentName:"p",href:"https://developers.facebook.com/docs/development/register"},"instructions")," to create an App, and add the Facebook Login product."),(0,a.kt)("p",null,"In the ",(0,a.kt)("inlineCode",{parentName:"p"},"Valid OAuth Redirect URIs"),", use ",(0,a.kt)("inlineCode",{parentName:"p"},"{baseUrl}/login/oauth2/code/facebook"),", where ",(0,a.kt)("inlineCode",{parentName:"p"},"baseUrl")," is your server's address."),(0,a.kt)("p",null,"Modify your ",(0,a.kt)("inlineCode",{parentName:"p"},"application.yml")," as below and replace the values in the ",(0,a.kt)("inlineCode",{parentName:"p"},"client-id")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"client-secret")," property with the App ID and App Secret."),(0,a.kt)("p",null,"Sample configuration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"spring:\n security:\n oauth2:\n client:\n registration:\n facebook:\n client-id: 227581266063919\n client-secret: 47f03915334f49cdueru810069321964929\n")),(0,a.kt)("h3",{id:"github"},"Github"),(0,a.kt)("p",null,"Register a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/settings/applications/new"},"new application"),"."),(0,a.kt)("p",null,'For the "Authorization callback URL", use ',(0,a.kt)("inlineCode",{parentName:"p"},"{baseUrl}/login/oauth2/code/github"),", where ",(0,a.kt)("inlineCode",{parentName:"p"},"baseUrl")," is your server's address."),(0,a.kt)("p",null,"Generate a new Client Secret, you should now have a Client ID and Client Secret."),(0,a.kt)("p",null,"Modify your ",(0,a.kt)("inlineCode",{parentName:"p"},"application.yml")," as below and replace the values in the ",(0,a.kt)("inlineCode",{parentName:"p"},"client-id")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"client-secret")," property with the OAuth 2.0 credentials you created earlier."),(0,a.kt)("p",null,"Sample configuration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"spring:\n security:\n oauth2:\n client:\n registration:\n github:\n client-id: 62736jnfksui37384hnmsdnf\n client-secret: jhjgfy67363uhif762328938844940e3e8c8629c18f9\n scope: user:email\n")),(0,a.kt)("h2",{id:"advanced-configuration"},"Advanced configuration"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"Modify your ",(0,a.kt)("inlineCode",{parentName:"p"},"application.yml")," as below and replace the values in the ",(0,a.kt)("inlineCode",{parentName:"p"},"client-id")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"client-secret")," property with your credentials You will also need to update the various URIs in the ",(0,a.kt)("inlineCode",{parentName:"p"},"provider")," section."),(0,a.kt)("p",null,"You need to make sure that the users have an email setup, and that it has been marked as verified."),(0,a.kt)("p",null,"When configuring the client in your provider, you may need to input a redirect URI. Use the following: ",(0,a.kt)("inlineCode",{parentName:"p"},"{baseUrl}/login/oauth2/code/{registrationId}"),", where ",(0,a.kt)("inlineCode",{parentName:"p"},"baseUrl")," is your server's address, and ",(0,a.kt)("inlineCode",{parentName:"p"},"registrationId")," is the name of the configuration key (",(0,a.kt)("inlineCode",{parentName:"p"},"keycloak")," in the below example)."),(0,a.kt)("p",null,"There are 2 options to configure a provider, either set ",(0,a.kt)("inlineCode",{parentName:"p"},"issuer-uri")," or all of the following: ",(0,a.kt)("inlineCode",{parentName:"p"},"authorization-uri"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"token-uri"),",\n",(0,a.kt)("inlineCode",{parentName:"p"},"jwk-set-uri"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"user-info-uri"),". If your authentication server provides ",(0,a.kt)("inlineCode",{parentName:"p"},"issuer-uri"),", this option is preferred."),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"registration")," section contains a ",(0,a.kt)("inlineCode",{parentName:"p"},"provider")," option, this must be the same name as specified in the\n",(0,a.kt)("inlineCode",{parentName:"p"},"provider")," configuration. (In the example below, we've configured ",(0,a.kt)("inlineCode",{parentName:"p"},"provider")," with name ",(0,a.kt)("inlineCode",{parentName:"p"},"keycloak"),", so in the\n",(0,a.kt)("inlineCode",{parentName:"p"},"registration")," section we set ",(0,a.kt)("inlineCode",{parentName:"p"},"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."),(0,a.kt)("p",null,"Sample configuration:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},'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')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a7023ddc.c34d5503.js b/assets/js/a7023ddc.c34d5503.js new file mode 100644 index 00000000..98bb7d72 --- /dev/null +++ b/assets/js/a7023ddc.c34d5503.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[1713],{3457:e=>{e.exports=JSON.parse('[{"label":"upgrade","permalink":"/blog/tags/upgrade","count":2},{"label":"komga","permalink":"/blog/tags/komga","count":2},{"label":"breaking change","permalink":"/blog/tags/breaking-change","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/a7023ddc.cac3ed1a.js b/assets/js/a7023ddc.cac3ed1a.js deleted file mode 100644 index e494943d..00000000 --- a/assets/js/a7023ddc.cac3ed1a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[1713],{3457:e=>{e.exports=JSON.parse('[{"label":"breaking change","permalink":"/blog/tags/breaking-change","count":1},{"label":"upgrade","permalink":"/blog/tags/upgrade","count":1},{"label":"komga","permalink":"/blog/tags/komga","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/a981d65e.91f674d3.js b/assets/js/a981d65e.695a9752.js similarity index 99% rename from assets/js/a981d65e.91f674d3.js rename to assets/js/a981d65e.695a9752.js index f386bb24..9be227a8 100644 --- a/assets/js/a981d65e.91f674d3.js +++ b/assets/js/a981d65e.695a9752.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5674],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>y});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),m=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=m(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),h=m(a),p=n,y=h["".concat(s,".").concat(p)]||h[p]||u[p]||i;return a?r.createElement(y,o(o({ref:t},c),{},{components:a})):r.createElement(y,o({ref:t},c))}));function y(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var m=2;m{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>m});var r=a(7462),n=(a(7294),a(3905));const i={},o="Emptying Library Trash",l={unversionedId:"guides/trash",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/trash.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Libraries",permalink:"/docs/guides/libraries"},next:{title:"Scanning, Analyzing and Refreshing Metadata",permalink:"/docs/guides/scan-analysis-refresh"}},s={},m=[{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}],c={toc:m},h="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"emptying-library-trash"},"Emptying Library Trash"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,'Items currently in the trash will be displayed with an "Unavailable" indicator.'),(0,n.kt)("img",{src:"/assets/media/guides/trash/unavailable-card.png",style:{maxHeight:"300px"},alt:"Unavailable indicator on card"}),(0,n.kt)("br",null),(0,n.kt)("br",null),(0,n.kt)("img",{src:"/assets/media/guides/trash/unavailable-details.png",style:{maxHeight:"300px"},alt:"Unavailable indicator on details view"}),(0,n.kt)("h2",{id:"file-hashes"},"File Hashes"),(0,n.kt)("p",null,"With the trash bin, you can move or rename files and folders without losing your metadata, read progress, or read lists and collections."),(0,n.kt)("p",null,"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,n.kt)("a",{parentName:"p",href:"/docs/installation/configuration"},"Configuration"),")."),(0,n.kt)("h2",{id:"automatically-empty-trash"},"Automatically Empty Trash"),(0,n.kt)("p",null,"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:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Open Komga web interface"),(0,n.kt)("li",{parentName:"ol"},"Edit the library for which you want to change the setting"),(0,n.kt)("li",{parentName:"ol"},"Enable the ",(0,n.kt)("em",{parentName:"li"},"Empty trash automatically after every scan")," option"),(0,n.kt)("li",{parentName:"ol"},"Save Changes")),(0,n.kt)("img",{src:"/assets/media/guides/trash/empty-trash-after-scan.png",style:{maxHeight:"300px"},alt:"Empty trash automatically after every scan option"}),(0,n.kt)("admonition",{type:"danger"},(0,n.kt)("p",{parentName:"admonition"},"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,n.kt)("p",{parentName:"admonition"},"It will also prevent folder and file moves between libraries.")),(0,n.kt)("h2",{id:"manually-empty-trash"},"Manually Empty Trash"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Look for the action menu icon ",(0,n.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.kt)("em",{parentName:"p"},"Empty Trash"),"."),(0,n.kt)("img",{src:"/assets/media/guides/trash/empty-trash-confirmation-dialog.png",style:{maxHeight:"250px"},alt:"Empty trash confirmation dialog"}))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5674],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>y});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var s=r.createContext({}),m=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},c=function(e){var t=m(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),h=m(a),p=n,y=h["".concat(s,".").concat(p)]||h[p]||u[p]||i;return a?r.createElement(y,o(o({ref:t},c),{},{components:a})):r.createElement(y,o({ref:t},c))}));function y(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:n,o[1]=l;for(var m=2;m{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>m});var r=a(7462),n=(a(7294),a(3905));const i={},o="Emptying Library Trash",l={unversionedId:"guides/trash",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/trash.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Libraries",permalink:"/docs/guides/libraries"},next:{title:"Scanning, Analyzing and Refreshing Metadata",permalink:"/docs/guides/scan-analysis-refresh"}},s={},m=[{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}],c={toc:m},h="wrapper";function u(e){let{components:t,...a}=e;return(0,n.kt)(h,(0,r.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"emptying-library-trash"},"Emptying Library Trash"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,'Items currently in the trash will be displayed with an "Unavailable" indicator.'),(0,n.kt)("img",{src:"/assets/media/guides/trash/unavailable-card.png",style:{maxHeight:"300px"},alt:"Unavailable indicator on card"}),(0,n.kt)("br",null),(0,n.kt)("br",null),(0,n.kt)("img",{src:"/assets/media/guides/trash/unavailable-details.png",style:{maxHeight:"300px"},alt:"Unavailable indicator on details view"}),(0,n.kt)("h2",{id:"file-hashes"},"File Hashes"),(0,n.kt)("p",null,"With the trash bin, you can move or rename files and folders without losing your metadata, read progress, or read lists and collections."),(0,n.kt)("p",null,"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,n.kt)("a",{parentName:"p",href:"/docs/installation/configuration"},"Configuration"),")."),(0,n.kt)("h2",{id:"automatically-empty-trash"},"Automatically Empty Trash"),(0,n.kt)("p",null,"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:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Open Komga web interface"),(0,n.kt)("li",{parentName:"ol"},"Edit the library for which you want to change the setting"),(0,n.kt)("li",{parentName:"ol"},"Enable the ",(0,n.kt)("em",{parentName:"li"},"Empty trash automatically after every scan")," option"),(0,n.kt)("li",{parentName:"ol"},"Save Changes")),(0,n.kt)("img",{src:"/assets/media/guides/trash/empty-trash-after-scan.png",style:{maxHeight:"300px"},alt:"Empty trash automatically after every scan option"}),(0,n.kt)("admonition",{type:"danger"},(0,n.kt)("p",{parentName:"admonition"},"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,n.kt)("p",{parentName:"admonition"},"It will also prevent folder and file moves between libraries.")),(0,n.kt)("h2",{id:"manually-empty-trash"},"Manually Empty Trash"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"Look for the action menu icon ",(0,n.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.kt)("em",{parentName:"p"},"Empty Trash"),"."),(0,n.kt)("img",{src:"/assets/media/guides/trash/empty-trash-confirmation-dialog.png",style:{maxHeight:"250px"},alt:"Empty trash confirmation dialog"}))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ac07380c.50529831.js b/assets/js/ac07380c.0dc3b2bc.js similarity index 99% rename from assets/js/ac07380c.50529831.js rename to assets/js/ac07380c.0dc3b2bc.js index fa1702b5..2bfb8689 100644 --- a/assets/js/ac07380c.50529831.js +++ b/assets/js/ac07380c.0dc3b2bc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4434],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},m=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=s(n),c=r,k=d["".concat(p,".").concat(c)]||d[c]||u[c]||o;return n?a.createElement(k,i(i({ref:t},m),{},{components:n})):a.createElement(k,i({ref:t},m))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const o={},i="Run with Docker",l={unversionedId:"installation/docker",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/docker.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install the Desktop application",permalink:"/docs/installation/desktop"},next:{title:"Run with the Jar file",permalink:"/docs/installation/jar"}},p={},s=[{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}],m={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"run-with-docker"},"Run with Docker"),(0,r.kt)("h2",{id:"registries"},"Registries"),(0,r.kt)("p",null,"The Docker images are published on:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://hub.docker.com/r/gotson/komga"},"DockerHub")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/gotson/komga/pkgs/container/komga"},"ghcr.io"))),(0,r.kt)("h2",{id:"version-tags"},"Version tags"),(0,r.kt)("p",null,"This image provides various versions that are available via tags."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"th"},"Tag")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"latest")),(0,r.kt)("td",{parentName:"tr",align:null},"latest commit")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"MAJOR.x")),(0,r.kt)("td",{parentName:"tr",align:null},"latest ",(0,r.kt)("inlineCode",{parentName:"td"},"MAJOR")," version, for example ",(0,r.kt)("inlineCode",{parentName:"td"},"0.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"x.y.z")),(0,r.kt)("td",{parentName:"tr",align:null},"version ",(0,r.kt)("inlineCode",{parentName:"td"},"x.y.z"))))),(0,r.kt)("h2",{id:"usage"},"Usage"),(0,r.kt)("p",null,"Here are some example snippets to help you get started creating a container."),(0,r.kt)("h3",{id:"docker"},"docker"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"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")),(0,r.kt)("p",null,"Then start the container:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"docker start komga\n")),(0,r.kt)("h3",{id:"docker-compose"},"docker-compose"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"---\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")),(0,r.kt)("h2",{id:"parameters"},"Parameters"),(0,r.kt)("p",null,"Container images are configured using parameters passed at runtime (such as those above).\nThese parameters are separated by a colon and indicate ",(0,r.kt)("inlineCode",{parentName:"p"},"external:internal")," respectively.\nFor example, ",(0,r.kt)("inlineCode",{parentName:"p"},"-p 8080:80")," would expose port ",(0,r.kt)("inlineCode",{parentName:"p"},"80")," from inside the container to be accessible from the host's IP on port ",(0,r.kt)("inlineCode",{parentName:"p"},"8080")," outside the container."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Parameter"),(0,r.kt)("th",{parentName:"tr",align:null},"Function"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"-p 25600")),(0,r.kt)("td",{parentName:"tr",align:null},"The port for the Komga APIs and web interface")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"--user: 1000:1000")),(0,r.kt)("td",{parentName:"tr",align:null},"User:Group identifier - see below for explanation")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"--mount type=bind,source=/path/to/config,target=/config")),(0,r.kt)("td",{parentName:"tr",align:null},"Database and Komga configurations")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"--mount type=bind,source=/path/to/data,target=/data")),(0,r.kt)("td",{parentName:"tr",align:null},"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,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"-e ENV_VAR=value")),(0,r.kt)("td",{parentName:"tr",align:null},"Any ",(0,r.kt)("a",{parentName:"td",href:"/docs/installation/configuration"},"configuration")," environment variable")))),(0,r.kt)("h2",{id:"user--group-identifiers"},"User / Group Identifiers"),(0,r.kt)("p",null,"When using volumes (",(0,r.kt)("inlineCode",{parentName:"p"},"-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."),(0,r.kt)("p",null,"Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic."),(0,r.kt)("p",null,"In this instance ",(0,r.kt)("inlineCode",{parentName:"p"},"UID=1000")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"GID=1000"),", to find yours use ",(0,r.kt)("inlineCode",{parentName:"p"},"id ")," as below:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ id \n uid=1000(jdoe) gid=1000(jdgroup) groups=1000(jdgroup)\n")),(0,r.kt)("h2",{id:"increase-memory-limit"},"Increase memory limit"),(0,r.kt)("p",null,"By default the ",(0,r.kt)("inlineCode",{parentName:"p"},"java")," process will be limited in the maximum amount of memory (RAM) it can use, usually 1gb. If you encounter some ",(0,r.kt)("inlineCode",{parentName:"p"},"OutOfMemoryException")," in the logs you probably need to increase the maximum memory Komga can use."),(0,r.kt)("p",null,"To do so, you can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"JAVA_TOOL_OPTIONS=-Xmx")," environment variable, where ",(0,r.kt)("inlineCode",{parentName:"p"},"")," can be any amount like ",(0,r.kt)("inlineCode",{parentName:"p"},"2048m"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"4g")," etc. For example to run Komga with a maximum of 4gb of memory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"JAVA_TOOL_OPTIONS=-Xmx4g\n")),(0,r.kt)("h2",{id:"support-info"},"Support info"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Shell access whilst the container is running: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker exec -it komga /bin/bash")),(0,r.kt)("li",{parentName:"ul"},"To monitor the logs of the container in realtime: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker logs -f komga"))),(0,r.kt)("h2",{id:"updating"},"Updating"),(0,r.kt)("p",null,"Below are the instructions for updating containers:"),(0,r.kt)("h3",{id:"via-docker-runcreate"},"Via Docker Run/Create"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Update the image: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker pull gotson/komga")),(0,r.kt)("li",{parentName:"ul"},"Stop the running container: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker stop komga")),(0,r.kt)("li",{parentName:"ul"},"Delete the container: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker rm komga")),(0,r.kt)("li",{parentName:"ul"},"Recreate a new container with the same docker create parameters as instructed above (if mapped correctly to a host folder, your ",(0,r.kt)("inlineCode",{parentName:"li"},"/config")," folder and settings will be preserved)"),(0,r.kt)("li",{parentName:"ul"},"Start the new container: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker start komga")),(0,r.kt)("li",{parentName:"ul"},"You can also remove the old dangling images: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker image prune"))),(0,r.kt)("h3",{id:"via-docker-compose"},"Via Docker Compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Update all images: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose pull"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"or update a single image: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose pull komga")))),(0,r.kt)("li",{parentName:"ul"},"Let compose update all containers as necessary: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose up -d"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"or update a single container: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose up -d komga")))),(0,r.kt)("li",{parentName:"ul"},"You can also remove the old dangling images: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker image prune"))),(0,r.kt)("h3",{id:"automatic-updates"},"Automatic updates"),(0,r.kt)("p",null,"You can use ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/containrrr/watchtower"},"Watchtower")," to automatically update your containers."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4434],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},m=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=s(n),c=r,k=d["".concat(p,".").concat(c)]||d[c]||u[c]||o;return n?a.createElement(k,i(i({ref:t},m),{},{components:n})):a.createElement(k,i({ref:t},m))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[d]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const o={},i="Run with Docker",l={unversionedId:"installation/docker",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/docker.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Install the Desktop application",permalink:"/docs/installation/desktop"},next:{title:"Run with the Jar file",permalink:"/docs/installation/jar"}},p={},s=[{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}],m={toc:s},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"run-with-docker"},"Run with Docker"),(0,r.kt)("h2",{id:"registries"},"Registries"),(0,r.kt)("p",null,"The Docker images are published on:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://hub.docker.com/r/gotson/komga"},"DockerHub")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/gotson/komga/pkgs/container/komga"},"ghcr.io"))),(0,r.kt)("h2",{id:"version-tags"},"Version tags"),(0,r.kt)("p",null,"This image provides various versions that are available via tags."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"th"},"Tag")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"latest")),(0,r.kt)("td",{parentName:"tr",align:null},"latest commit")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"MAJOR.x")),(0,r.kt)("td",{parentName:"tr",align:null},"latest ",(0,r.kt)("inlineCode",{parentName:"td"},"MAJOR")," version, for example ",(0,r.kt)("inlineCode",{parentName:"td"},"0.x"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"x.y.z")),(0,r.kt)("td",{parentName:"tr",align:null},"version ",(0,r.kt)("inlineCode",{parentName:"td"},"x.y.z"))))),(0,r.kt)("h2",{id:"usage"},"Usage"),(0,r.kt)("p",null,"Here are some example snippets to help you get started creating a container."),(0,r.kt)("h3",{id:"docker"},"docker"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"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")),(0,r.kt)("p",null,"Then start the container:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"docker start komga\n")),(0,r.kt)("h3",{id:"docker-compose"},"docker-compose"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"---\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")),(0,r.kt)("h2",{id:"parameters"},"Parameters"),(0,r.kt)("p",null,"Container images are configured using parameters passed at runtime (such as those above).\nThese parameters are separated by a colon and indicate ",(0,r.kt)("inlineCode",{parentName:"p"},"external:internal")," respectively.\nFor example, ",(0,r.kt)("inlineCode",{parentName:"p"},"-p 8080:80")," would expose port ",(0,r.kt)("inlineCode",{parentName:"p"},"80")," from inside the container to be accessible from the host's IP on port ",(0,r.kt)("inlineCode",{parentName:"p"},"8080")," outside the container."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Parameter"),(0,r.kt)("th",{parentName:"tr",align:null},"Function"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"-p 25600")),(0,r.kt)("td",{parentName:"tr",align:null},"The port for the Komga APIs and web interface")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"--user: 1000:1000")),(0,r.kt)("td",{parentName:"tr",align:null},"User:Group identifier - see below for explanation")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"--mount type=bind,source=/path/to/config,target=/config")),(0,r.kt)("td",{parentName:"tr",align:null},"Database and Komga configurations")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"--mount type=bind,source=/path/to/data,target=/data")),(0,r.kt)("td",{parentName:"tr",align:null},"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,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("inlineCode",{parentName:"td"},"-e ENV_VAR=value")),(0,r.kt)("td",{parentName:"tr",align:null},"Any ",(0,r.kt)("a",{parentName:"td",href:"/docs/installation/configuration"},"configuration")," environment variable")))),(0,r.kt)("h2",{id:"user--group-identifiers"},"User / Group Identifiers"),(0,r.kt)("p",null,"When using volumes (",(0,r.kt)("inlineCode",{parentName:"p"},"-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."),(0,r.kt)("p",null,"Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic."),(0,r.kt)("p",null,"In this instance ",(0,r.kt)("inlineCode",{parentName:"p"},"UID=1000")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"GID=1000"),", to find yours use ",(0,r.kt)("inlineCode",{parentName:"p"},"id ")," as below:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ id \n uid=1000(jdoe) gid=1000(jdgroup) groups=1000(jdgroup)\n")),(0,r.kt)("h2",{id:"increase-memory-limit"},"Increase memory limit"),(0,r.kt)("p",null,"By default the ",(0,r.kt)("inlineCode",{parentName:"p"},"java")," process will be limited in the maximum amount of memory (RAM) it can use, usually 1gb. If you encounter some ",(0,r.kt)("inlineCode",{parentName:"p"},"OutOfMemoryException")," in the logs you probably need to increase the maximum memory Komga can use."),(0,r.kt)("p",null,"To do so, you can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"JAVA_TOOL_OPTIONS=-Xmx")," environment variable, where ",(0,r.kt)("inlineCode",{parentName:"p"},"")," can be any amount like ",(0,r.kt)("inlineCode",{parentName:"p"},"2048m"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"4g")," etc. For example to run Komga with a maximum of 4gb of memory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-shell",metastring:"script",script:!0},"JAVA_TOOL_OPTIONS=-Xmx4g\n")),(0,r.kt)("h2",{id:"support-info"},"Support info"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Shell access whilst the container is running: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker exec -it komga /bin/bash")),(0,r.kt)("li",{parentName:"ul"},"To monitor the logs of the container in realtime: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker logs -f komga"))),(0,r.kt)("h2",{id:"updating"},"Updating"),(0,r.kt)("p",null,"Below are the instructions for updating containers:"),(0,r.kt)("h3",{id:"via-docker-runcreate"},"Via Docker Run/Create"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Update the image: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker pull gotson/komga")),(0,r.kt)("li",{parentName:"ul"},"Stop the running container: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker stop komga")),(0,r.kt)("li",{parentName:"ul"},"Delete the container: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker rm komga")),(0,r.kt)("li",{parentName:"ul"},"Recreate a new container with the same docker create parameters as instructed above (if mapped correctly to a host folder, your ",(0,r.kt)("inlineCode",{parentName:"li"},"/config")," folder and settings will be preserved)"),(0,r.kt)("li",{parentName:"ul"},"Start the new container: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker start komga")),(0,r.kt)("li",{parentName:"ul"},"You can also remove the old dangling images: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker image prune"))),(0,r.kt)("h3",{id:"via-docker-compose"},"Via Docker Compose"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Update all images: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose pull"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"or update a single image: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose pull komga")))),(0,r.kt)("li",{parentName:"ul"},"Let compose update all containers as necessary: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose up -d"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"or update a single container: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker-compose up -d komga")))),(0,r.kt)("li",{parentName:"ul"},"You can also remove the old dangling images: ",(0,r.kt)("inlineCode",{parentName:"li"},"docker image prune"))),(0,r.kt)("h3",{id:"automatic-updates"},"Automatic updates"),(0,r.kt)("p",null,"You can use ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/containrrr/watchtower"},"Watchtower")," to automatically update your containers."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b242fde9.79fa1d41.js b/assets/js/b242fde9.e9887d31.js similarity index 98% rename from assets/js/b242fde9.79fa1d41.js rename to assets/js/b242fde9.e9887d31.js index 4d0c8a49..b81e0d60 100644 --- a/assets/js/b242fde9.79fa1d41.js +++ b/assets/js/b242fde9.e9887d31.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5647],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(r),f=i,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||a;return r?n.createElement(m,l(l({ref:t},p),{},{components:r})):n.createElement(m,l({ref:t},p))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,l=new Array(a);l[0]=f;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:i,l[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=r(7462),i=(r(7294),r(3905));const a={},l="Duplicate Files",o={unversionedId:"guides/duplicate-files",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/duplicate-files.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Import Books",permalink:"/docs/guides/import-books"},next:{title:"Duplicate Pages",permalink:"/docs/guides/duplicate-pages"}},s={},c=[{value:"Browsing Duplicate Files",id:"browsing-duplicate-files",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,i.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"duplicate-files"},"Duplicate Files"),(0,i.kt)("p",null,"Komga can detect duplicate files among your books."),(0,i.kt)("p",null,"You need to enable ",(0,i.kt)("a",{parentName:"p",href:"libraries#compute-hash-for-files"},"file hashing")," for your libraries."),(0,i.kt)("p",null,"You can manage duplicate pages from ",(0,i.kt)("em",{parentName:"p"},"Server Settings > Duplicate Files"),"."),(0,i.kt)("h2",{id:"browsing-duplicate-files"},"Browsing Duplicate Files"),(0,i.kt)("p",null,"This screen will show all the duplicate files."),(0,i.kt)("img",{src:"/assets/media/guides/duplicate-files/duplicate-files.png",style:{maxHeight:" 400px"},alt:"Browse Duplicate Files"}),(0,i.kt)("p",null,"You can direcly delete a duplicate file by clicking on the trashcan icon."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5647],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(r),f=i,m=u["".concat(s,".").concat(f)]||u[f]||d[f]||a;return r?n.createElement(m,l(l({ref:t},p),{},{components:r})):n.createElement(m,l({ref:t},p))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,l=new Array(a);l[0]=f;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:i,l[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var n=r(7462),i=(r(7294),r(3905));const a={},l="Duplicate Files",o={unversionedId:"guides/duplicate-files",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/duplicate-files.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Import Books",permalink:"/docs/guides/import-books"},next:{title:"Duplicate Pages",permalink:"/docs/guides/duplicate-pages"}},s={},c=[{value:"Browsing Duplicate Files",id:"browsing-duplicate-files",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,i.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"duplicate-files"},"Duplicate Files"),(0,i.kt)("p",null,"Komga can detect duplicate files among your books."),(0,i.kt)("p",null,"You need to enable ",(0,i.kt)("a",{parentName:"p",href:"libraries#compute-hash-for-files"},"file hashing")," for your libraries."),(0,i.kt)("p",null,"You can manage duplicate pages from ",(0,i.kt)("em",{parentName:"p"},"Server Settings > Duplicate Files"),"."),(0,i.kt)("h2",{id:"browsing-duplicate-files"},"Browsing Duplicate Files"),(0,i.kt)("p",null,"This screen will show all the duplicate files."),(0,i.kt)("img",{src:"/assets/media/guides/duplicate-files/duplicate-files.png",style:{maxHeight:" 400px"},alt:"Browse Duplicate Files"}),(0,i.kt)("p",null,"You can direcly delete a duplicate file by clicking on the trashcan icon."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b2b675dd.0c7375a6.js b/assets/js/b2b675dd.4e5b87a0.js similarity index 77% rename from assets/js/b2b675dd.0c7375a6.js rename to assets/js/b2b675dd.4e5b87a0.js index f7909fd1..9386c776 100644 --- a/assets/js/b2b675dd.0c7375a6.js +++ b/assets/js/b2b675dd.4e5b87a0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[533],{8017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Latest Komga announcements","blogTitle":"Announcements"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[533],{8017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Latest Komga announcements","blogTitle":"Announcements"}')}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.2a4bfae1.js b/assets/js/b2f554cd.2a4bfae1.js deleted file mode 100644 index 383603bc..00000000 --- a/assets/js/b2f554cd.2a4bfae1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[1477],{10:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"prepare-v1","metadata":{"permalink":"/blog/prepare-v1","source":"@site/blog/2023-03-21-prepare-v1.md","title":"Prepare for v1.0.0","description":"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version.","date":"2023-03-21T00:00:00.000Z","formattedDate":"March 21, 2023","tags":[{"label":"breaking change","permalink":"/blog/tags/breaking-change"},{"label":"upgrade","permalink":"/blog/tags/upgrade"},{"label":"komga","permalink":"/blog/tags/komga"}],"readingTime":1.115,"hasTruncateMarker":false,"authors":[{"name":"gotson","title":"Developer of Komga","url":"https://github.com/gotson","imageURL":"https://github.com/gotson.png","key":"gotson"}],"frontMatter":{"slug":"prepare-v1","title":"Prepare for v1.0.0","authors":"gotson","tags":["breaking change","upgrade","komga"]}},"content":"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version.\\n\\n## Before upgrading\\n\\n- If you run Docker, it is advisable to use the `0.x` tag instead of `latest`. You will be able to decide when you want to upgrade, especially if you are updating containers automatically.\\n- Backup your `database.sqlite`. You can find it in the configuration directory, by default:\\n - on Windows: `%USERPROFILE%/.komga/database.sqlite`\\n - on Unix: `~/.komga/database.sqlite`\\n - on Docker: in the directory you mounted as `/config`\\n\\n## Breaking changes\\n\\n- The minimum Java version required will be Java 17:\\n - If you run Komga using the `jar`, you will need to make sure your Java version is sufficient by running `java -version`.\\n - If you run Komga using Docker, you don\'t need to do anything.\\n- The hashing algorithm for files and pages will change. Previous hashes for files and pages will be deleted. On startup, if hashing is enabled, Komga will re-hash files and pages using the new algorithm.\\n- The default port will be changed from `8080` to `25600`:\\n - If you use Docker, you will need to update your container or compose configuration to expose the new port.\\n - You may need to adjust your reverse proxy settings.\\n - You can still change the port [through configuration](/docs/installation/configuration#server_port--serverport-port)."}]}')}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.bac27463.js b/assets/js/b2f554cd.bac27463.js new file mode 100644 index 00000000..511d33af --- /dev/null +++ b/assets/js/b2f554cd.bac27463.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[1477],{10:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"ebook-support","metadata":{"permalink":"/blog/ebook-support","source":"@site/blog/2023-11-29-ebooks.md","title":"eBook support","description":"Version 1.8.0 is bringing a long awaited feature: proper eBook support!","date":"2023-11-29T00:00:00.000Z","formattedDate":"November 29, 2023","tags":[{"label":"upgrade","permalink":"/blog/tags/upgrade"},{"label":"komga","permalink":"/blog/tags/komga"}],"readingTime":1.37,"hasTruncateMarker":false,"authors":[{"name":"gotson","title":"Developer of Komga","url":"https://github.com/gotson","imageURL":"https://github.com/gotson.png","key":"gotson"}],"frontMatter":{"slug":"ebook-support","title":"eBook support","authors":"gotson","tags":["upgrade","komga"]},"nextItem":{"title":"Prepare for v1.0.0","permalink":"/blog/prepare-v1"}},"content":"Version [1.8.0](https://github.com/gotson/komga/releases/tag/1.8.0) is bringing a long awaited feature: **proper eBook support!**\\n\\nGithub issue [#221](https://github.com/gotson/komga/issues/221) has been opened for more than 3 years, and has finally been tackled.\\n\\n## What you need to know\\n\\n- eBooks behave like any other book in Komga, in regards to series or metadata. You can even mix comic books and ebooks in the same series.\\n- only EPUB format is supported. Other formats will not be supported in the future.\\n- existing EPUB files will be re-analyzed. If you had image-only EPUB, those may not be compatible anymore with third-party clients.\\n- the web EPUB reader is a very first version, and **does not support saving progress**. Read progress saving and restore will come in a future release.\\n- any book in Komga can be read with [WebPub](https://readium.org/webpub-manifest/) compatible clients.\\n- **There will be issues**. EPUB is a complex format, and many EPUB files are not properly built. Raise issues [on Github](https://github.com/gotson/komga/issues/new/choose) for support.\\n\\n## Other recent changes you may have missed\\n\\nIn case you haven\'t kept up with the release notes since version 1.0.0, here are the most significant changes:\\n- Komga is now available as a [desktop app](./docs/installation/desktop), and is available in the [Microsoft Store](./docs/installation/ms-store)\\n- Multiple settings are now configurable from the [Server Settings](./docs/guides/server-settings) screen. You may need to cleanup your configuration file and remove deprecated entries.\\n- Thumbnails size can now be configured in Server Settings.\\n- Background task management has been revamped, and now supports proper parallel executions (configurable in Server Settings).\\n- Komga now has support for [One-Shots](./docs/guides/oneshots).\\n- a [Command Line Interface](./docs/guides/cli) was added to update forgotten password for the admin account."},{"id":"prepare-v1","metadata":{"permalink":"/blog/prepare-v1","source":"@site/blog/2023-03-21-prepare-v1.md","title":"Prepare for v1.0.0","description":"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version.","date":"2023-03-21T00:00:00.000Z","formattedDate":"March 21, 2023","tags":[{"label":"breaking change","permalink":"/blog/tags/breaking-change"},{"label":"upgrade","permalink":"/blog/tags/upgrade"},{"label":"komga","permalink":"/blog/tags/komga"}],"readingTime":1.115,"hasTruncateMarker":false,"authors":[{"name":"gotson","title":"Developer of Komga","url":"https://github.com/gotson","imageURL":"https://github.com/gotson.png","key":"gotson"}],"frontMatter":{"slug":"prepare-v1","title":"Prepare for v1.0.0","authors":"gotson","tags":["breaking change","upgrade","komga"]},"prevItem":{"title":"eBook support","permalink":"/blog/ebook-support"}},"content":"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version.\\n\\n## Before upgrading\\n\\n- If you run Docker, it is advisable to use the `0.x` tag instead of `latest`. You will be able to decide when you want to upgrade, especially if you are updating containers automatically.\\n- Backup your `database.sqlite`. You can find it in the configuration directory, by default:\\n - on Windows: `%USERPROFILE%/.komga/database.sqlite`\\n - on Unix: `~/.komga/database.sqlite`\\n - on Docker: in the directory you mounted as `/config`\\n\\n## Breaking changes\\n\\n- The minimum Java version required will be Java 17:\\n - If you run Komga using the `jar`, you will need to make sure your Java version is sufficient by running `java -version`.\\n - If you run Komga using Docker, you don\'t need to do anything.\\n- The hashing algorithm for files and pages will change. Previous hashes for files and pages will be deleted. On startup, if hashing is enabled, Komga will re-hash files and pages using the new algorithm.\\n- The default port will be changed from `8080` to `25600`:\\n - If you use Docker, you will need to update your container or compose configuration to expose the new port.\\n - You may need to adjust your reverse proxy settings.\\n - You can still change the port [through configuration](/docs/installation/configuration#server_port--serverport-port)."}]}')}}]); \ No newline at end of file diff --git a/assets/js/b94207ad.976378f7.js b/assets/js/b94207ad.556c1521.js similarity index 96% rename from assets/js/b94207ad.976378f7.js rename to assets/js/b94207ad.556c1521.js index c55221cb..1562a375 100644 --- a/assets/js/b94207ad.976378f7.js +++ b/assets/js/b94207ad.556c1521.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4443],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),f=c(r),m=o,d=f["".concat(s,".").concat(m)]||f[m]||u[m]||a;return r?n.createElement(d,i(i({ref:t},p),{},{components:r})):n.createElement(d,i({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[f]="string"==typeof e?e:o,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const a={},i="Install from the Microsoft Store",l={unversionedId:"installation/ms-store",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/ms-store.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Official methods",permalink:"/docs/category/official-methods"},next:{title:"Install the Desktop application",permalink:"/docs/installation/desktop"}},s={},c=[{value:"Updating",id:"updating",level:2},{value:"Read next",id:"read-next",level:2}],p={toc:c},f="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(f,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"install-from-the-microsoft-store"},"Install from the Microsoft Store"),(0,o.kt)("p",null,"You can install Komga from the ",(0,o.kt)("a",{parentName:"p",href:"https://www.microsoft.com/store/apps/9N924KC4S4HG"},"Microsoft Store"),"."),(0,o.kt)("h2",{id:"updating"},"Updating"),(0,o.kt)("p",null,"The application will automatically update itself when a new version is available from the Microsoft Store."),(0,o.kt)("p",null,"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."),(0,o.kt)("h2",{id:"read-next"},"Read next"),(0,o.kt)("p",null,"Check the ",(0,o.kt)("a",{parentName:"p",href:"../guides/desktop"},"Desktop Application")," page."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4443],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),f=c(r),m=o,d=f["".concat(s,".").concat(m)]||f[m]||u[m]||a;return r?n.createElement(d,i(i({ref:t},p),{},{components:r})):n.createElement(d,i({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[f]="string"==typeof e?e:o,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(3905));const a={},i="Install from the Microsoft Store",l={unversionedId:"installation/ms-store",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/installation/ms-store.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Official methods",permalink:"/docs/category/official-methods"},next:{title:"Install the Desktop application",permalink:"/docs/installation/desktop"}},s={},c=[{value:"Updating",id:"updating",level:2},{value:"Read next",id:"read-next",level:2}],p={toc:c},f="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(f,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"install-from-the-microsoft-store"},"Install from the Microsoft Store"),(0,o.kt)("p",null,"You can install Komga from the ",(0,o.kt)("a",{parentName:"p",href:"https://www.microsoft.com/store/apps/9N924KC4S4HG"},"Microsoft Store"),"."),(0,o.kt)("h2",{id:"updating"},"Updating"),(0,o.kt)("p",null,"The application will automatically update itself when a new version is available from the Microsoft Store."),(0,o.kt)("p",null,"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."),(0,o.kt)("h2",{id:"read-next"},"Read next"),(0,o.kt)("p",null,"Check the ",(0,o.kt)("a",{parentName:"p",href:"../guides/desktop"},"Desktop Application")," page."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b94d24b4.84c6960a.js b/assets/js/b94d24b4.a56463b0.js similarity index 98% rename from assets/js/b94d24b4.84c6960a.js rename to assets/js/b94d24b4.a56463b0.js index 9e7bb4ee..de6fc5e1 100644 --- a/assets/js/b94d24b4.84c6960a.js +++ b/assets/js/b94d24b4.a56463b0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6826],{3905:(e,n,t)=>{t.d(n,{Zo:()=>l,kt:()=>f});var r=t(7294);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=r.createContext({}),u=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},l=function(e){var n=u(e.components);return r.createElement(s.Provider,{value:n},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=u(t),d=o,f=m["".concat(s,".").concat(d)]||m[d]||p[d]||a;return t?r.createElement(f,i(i({ref:n},l),{},{components:t})):r.createElement(f,i({ref:n},l))}));function f(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,i=new Array(a);i[0]=d;var c={};for(var s in n)hasOwnProperty.call(n,s)&&(c[s]=n[s]);c.originalType=e,c[m]="string"==typeof e?e:o,i[1]=c;for(var u=2;u{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var r=t(7462),o=(t(7294),t(3905));const a={},i="Announcements",c={unversionedId:"guides/announcements",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/announcements.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Theme",permalink:"/docs/guides/theme"},next:{title:"Command Line Interface",permalink:"/docs/guides/cli"}},s={},u=[],l={toc:u},m="wrapper";function p(e){let{components:n,...t}=e;return(0,o.kt)(m,(0,r.Z)({},l,t,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"announcements"},"Announcements"),(0,o.kt)("p",null,"Announcements from the ",(0,o.kt)("a",{parentName:"p",href:"/blog"},"Komga website")," will be shown inside the application."),(0,o.kt)("p",null,"An orange dot will indicate that some announcements are unread. From the ",(0,o.kt)("em",{parentName:"p"},"Announcements")," view, a user can mark announcements as read, which will clear the orange dot indicator."),(0,o.kt)("img",{src:"/assets/media/guides/announcements/announcements.png"}))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6826],{3905:(e,n,t)=>{t.d(n,{Zo:()=>l,kt:()=>f});var r=t(7294);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function i(e){for(var n=1;n=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=r.createContext({}),u=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},l=function(e){var n=u(e.components);return r.createElement(s.Provider,{value:n},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=u(t),d=o,f=m["".concat(s,".").concat(d)]||m[d]||p[d]||a;return t?r.createElement(f,i(i({ref:n},l),{},{components:t})):r.createElement(f,i({ref:n},l))}));function f(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,i=new Array(a);i[0]=d;var c={};for(var s in n)hasOwnProperty.call(n,s)&&(c[s]=n[s]);c.originalType=e,c[m]="string"==typeof e?e:o,i[1]=c;for(var u=2;u{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var r=t(7462),o=(t(7294),t(3905));const a={},i="Announcements",c={unversionedId:"guides/announcements",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/announcements.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Theme",permalink:"/docs/guides/theme"},next:{title:"Command Line Interface",permalink:"/docs/guides/cli"}},s={},u=[],l={toc:u},m="wrapper";function p(e){let{components:n,...t}=e;return(0,o.kt)(m,(0,r.Z)({},l,t,{components:n,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"announcements"},"Announcements"),(0,o.kt)("p",null,"Announcements from the ",(0,o.kt)("a",{parentName:"p",href:"/blog"},"Komga website")," will be shown inside the application."),(0,o.kt)("p",null,"An orange dot will indicate that some announcements are unread. From the ",(0,o.kt)("em",{parentName:"p"},"Announcements")," view, a user can mark announcements as read, which will clear the orange dot indicator."),(0,o.kt)("img",{src:"/assets/media/guides/announcements/announcements.png"}))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c2d7cd96.f0683237.js b/assets/js/c2d7cd96.c61d0161.js similarity index 99% rename from assets/js/c2d7cd96.f0683237.js rename to assets/js/c2d7cd96.c61d0161.js index ccd1de81..e4acfce8 100644 --- a/assets/js/c2d7cd96.f0683237.js +++ b/assets/js/c2d7cd96.c61d0161.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7972],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>N});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=i.createContext({}),m=function(e){var t=i.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},d=function(e){var t=m(e.components);return i.createElement(p.Provider,{value:t},e.children)},s="mdxType",k={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},u=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),s=m(a),u=n,N=s["".concat(p,".").concat(u)]||s[u]||k[u]||l;return a?i.createElement(N,r(r({ref:t},d),{},{components:a})):i.createElement(N,r({ref:t},d))}));function N(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,r=new Array(l);r[0]=u;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[s]="string"==typeof e?e:n,r[1]=o;for(var m=2;m{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var i=a(7462),n=(a(7294),a(3905));const l={},r="Full Text Search",o={unversionedId:"guides/search",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/search.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read lists",permalink:"/docs/guides/readlists"},next:{title:"Import Books",permalink:"/docs/guides/import-books"}},p={},m=[{value:"Series additional fields",id:"series-additional-fields",level:3},{value:"Book additional fields",id:"book-additional-fields",level:3}],d={toc:m},s="wrapper";function k(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,i.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"full-text-search"},"Full Text Search"),(0,n.kt)("p",null,"Komga leverages ",(0,n.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Full-text_search"},"Full Text Search")," (FTS hereafter) to provide relevant results from your libraries."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"FTS will order results by relevance"),(0,n.kt)("li",{parentName:"ul"},"FTS is case-insensitive"),(0,n.kt)("li",{parentName:"ul"},"When searching with CJK characters (Chinese, Japanese, Korean), a minimum of 2 characters is required."),(0,n.kt)("li",{parentName:"ul"},"The order of words is not important: ",(0,n.kt)("inlineCode",{parentName:"li"},"batman robin")," will match ",(0,n.kt)("inlineCode",{parentName:"li"},"Robin & Batman")),(0,n.kt)("li",{parentName:"ul"},"To search by words in order, enclose your search in ",(0,n.kt)("inlineCode",{parentName:"li"},'"'),": ",(0,n.kt)("inlineCode",{parentName:"li"},'"white knight"')," will not match ",(0,n.kt)("inlineCode",{parentName:"li"},"knight white")," nor ",(0,n.kt)("inlineCode",{parentName:"li"},"white and knight")),(0,n.kt)("li",{parentName:"ul"},"By default, the search will match the item title. For Books, the ISBN will also be matched by default."),(0,n.kt)("li",{parentName:"ul"},"You can use the ",(0,n.kt)("inlineCode",{parentName:"li"},"AND"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"OR")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"NOT")," operators (UPPERCASE) to build complex queries:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"batman NOT publisher:dc")," will match all ",(0,n.kt)("inlineCode",{parentName:"li"},"Batman")," series not published by ",(0,n.kt)("em",{parentName:"li"},"DC Comics")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"batman OR robin")," will match ",(0,n.kt)("inlineCode",{parentName:"li"},"Batman")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"Robin")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"batman AND (robin OR superman)")," will match ",(0,n.kt)("inlineCode",{parentName:"li"},"Superman & Batman")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Batman & Robin")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"writer:remender penciller:murphy")))),(0,n.kt)("li",{parentName:"ul"},"You can perform range queries using the ",(0,n.kt)("inlineCode",{parentName:"li"},"[a TO b]")," syntax. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"release_date:[1990 TO 2000]"),". Note that the matching is lexicographic, not numerical. You can also use wildcards: ",(0,n.kt)("inlineCode",{parentName:"li"},"release_date:[2010 TO *]"),".")),(0,n.kt)("p",null,"Some extra fields are available for search using the ",(0,n.kt)("inlineCode",{parentName:"p"},"field:search")," syntax, see after."),(0,n.kt)("h3",{id:"series-additional-fields"},"Series additional fields"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"publisher"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"publisher:vertigo")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"status"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Possible values: ",(0,n.kt)("inlineCode",{parentName:"li"},"ongoing"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"ended"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"hiatus"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"abandoned")),(0,n.kt)("li",{parentName:"ul"},"Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"status:hiatus")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"reading_direction"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Possible values: ",(0,n.kt)("inlineCode",{parentName:"li"},"left_to_right"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"right_to_left"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"vertical"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"webtoon")),(0,n.kt)("li",{parentName:"ul"},"Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"reading_direction:right_to_left")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"age_rating"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"age_rating:12")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"language"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"language:fr")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"tag")," will search any tag, whether it is set at Series or Book level. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"tag:action")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"series_tag")," will search series tags only"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"book_tag")," will search book tags only"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"genre"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"genre:action")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"author")," will search authors with any role. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"author:(sean murphy)"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"You can also search by specific role. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"writer:remender")),(0,n.kt)("li",{parentName:"ul"},"Possible role values are: ",(0,n.kt)("inlineCode",{parentName:"li"},"writer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"penciller"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"letterer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"inker"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"editor"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"cover"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"colorist")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"book_count"),", which is the number of books present in that Series. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"book_count:1")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"total_book_count"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"total_book_count:100")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"release_date")," will search by year released. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"release_date:1999")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"deleted")," will search soft-deleted series. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"deleted:true")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"deleted:false")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"complete")," will search complete series, ie series where the ",(0,n.kt)("em",{parentName:"li"},"total book counts")," (from metadata) is equals to the actual book counts (number of files). Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"complete:true")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"complete:false")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"sharing_label"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"sharing_label:kids"))),(0,n.kt)("h3",{id:"book-additional-fields"},"Book additional fields"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"tag")," will search any tag. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},'tag:"double pages"')),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"author")," will search authors with any role. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"author:(sean murphy)"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"You can also search by specific role. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"writer:remender")),(0,n.kt)("li",{parentName:"ul"},"Possible role values are: ",(0,n.kt)("inlineCode",{parentName:"li"},"writer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"penciller"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"letterer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"inker"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"editor"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"cover"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"colorist")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"release_date")," will search by year released. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"release_date:1999")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"status"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Possible values: ",(0,n.kt)("inlineCode",{parentName:"li"},"ready"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"unknown"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"error"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"unsupported"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"outdated")),(0,n.kt)("li",{parentName:"ul"},"Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"status:(error OR unsupported)")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"deleted")," will search soft-deleted books. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"deleted:true")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"deleted:false")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"oneshot")," will search for One-Shots only. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"oneshot:true")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"oneshot:false"))),(0,n.kt)("p",null,"Some additional Series fields will be available if the book is a One-Shot:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"publisher")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"status"),", which should always be ",(0,n.kt)("inlineCode",{parentName:"li"},"ended")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"reading_direction")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"age_rating")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"language")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"genre")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"sharing_label")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"complete"),", which will always be ",(0,n.kt)("inlineCode",{parentName:"li"},"true"))))}k.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[7972],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>N});var i=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=i.createContext({}),m=function(e){var t=i.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},d=function(e){var t=m(e.components);return i.createElement(p.Provider,{value:t},e.children)},s="mdxType",k={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},u=i.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),s=m(a),u=n,N=s["".concat(p,".").concat(u)]||s[u]||k[u]||l;return a?i.createElement(N,r(r({ref:t},d),{},{components:a})):i.createElement(N,r({ref:t},d))}));function N(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,r=new Array(l);r[0]=u;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[s]="string"==typeof e?e:n,r[1]=o;for(var m=2;m{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>o,toc:()=>m});var i=a(7462),n=(a(7294),a(3905));const l={},r="Full Text Search",o={unversionedId:"guides/search",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/search.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read lists",permalink:"/docs/guides/readlists"},next:{title:"Import Books",permalink:"/docs/guides/import-books"}},p={},m=[{value:"Series additional fields",id:"series-additional-fields",level:3},{value:"Book additional fields",id:"book-additional-fields",level:3}],d={toc:m},s="wrapper";function k(e){let{components:t,...a}=e;return(0,n.kt)(s,(0,i.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"full-text-search"},"Full Text Search"),(0,n.kt)("p",null,"Komga leverages ",(0,n.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Full-text_search"},"Full Text Search")," (FTS hereafter) to provide relevant results from your libraries."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"FTS will order results by relevance"),(0,n.kt)("li",{parentName:"ul"},"FTS is case-insensitive"),(0,n.kt)("li",{parentName:"ul"},"When searching with CJK characters (Chinese, Japanese, Korean), a minimum of 2 characters is required."),(0,n.kt)("li",{parentName:"ul"},"The order of words is not important: ",(0,n.kt)("inlineCode",{parentName:"li"},"batman robin")," will match ",(0,n.kt)("inlineCode",{parentName:"li"},"Robin & Batman")),(0,n.kt)("li",{parentName:"ul"},"To search by words in order, enclose your search in ",(0,n.kt)("inlineCode",{parentName:"li"},'"'),": ",(0,n.kt)("inlineCode",{parentName:"li"},'"white knight"')," will not match ",(0,n.kt)("inlineCode",{parentName:"li"},"knight white")," nor ",(0,n.kt)("inlineCode",{parentName:"li"},"white and knight")),(0,n.kt)("li",{parentName:"ul"},"By default, the search will match the item title. For Books, the ISBN will also be matched by default."),(0,n.kt)("li",{parentName:"ul"},"You can use the ",(0,n.kt)("inlineCode",{parentName:"li"},"AND"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"OR")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"NOT")," operators (UPPERCASE) to build complex queries:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"batman NOT publisher:dc")," will match all ",(0,n.kt)("inlineCode",{parentName:"li"},"Batman")," series not published by ",(0,n.kt)("em",{parentName:"li"},"DC Comics")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"batman OR robin")," will match ",(0,n.kt)("inlineCode",{parentName:"li"},"Batman")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"Robin")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"batman AND (robin OR superman)")," will match ",(0,n.kt)("inlineCode",{parentName:"li"},"Superman & Batman")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Batman & Robin")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"writer:remender penciller:murphy")))),(0,n.kt)("li",{parentName:"ul"},"You can perform range queries using the ",(0,n.kt)("inlineCode",{parentName:"li"},"[a TO b]")," syntax. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"release_date:[1990 TO 2000]"),". Note that the matching is lexicographic, not numerical. You can also use wildcards: ",(0,n.kt)("inlineCode",{parentName:"li"},"release_date:[2010 TO *]"),".")),(0,n.kt)("p",null,"Some extra fields are available for search using the ",(0,n.kt)("inlineCode",{parentName:"p"},"field:search")," syntax, see after."),(0,n.kt)("h3",{id:"series-additional-fields"},"Series additional fields"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"publisher"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"publisher:vertigo")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"status"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Possible values: ",(0,n.kt)("inlineCode",{parentName:"li"},"ongoing"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"ended"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"hiatus"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"abandoned")),(0,n.kt)("li",{parentName:"ul"},"Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"status:hiatus")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"reading_direction"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Possible values: ",(0,n.kt)("inlineCode",{parentName:"li"},"left_to_right"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"right_to_left"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"vertical"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"webtoon")),(0,n.kt)("li",{parentName:"ul"},"Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"reading_direction:right_to_left")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"age_rating"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"age_rating:12")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"language"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"language:fr")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"tag")," will search any tag, whether it is set at Series or Book level. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"tag:action")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"series_tag")," will search series tags only"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"book_tag")," will search book tags only"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"genre"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"genre:action")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"author")," will search authors with any role. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"author:(sean murphy)"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"You can also search by specific role. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"writer:remender")),(0,n.kt)("li",{parentName:"ul"},"Possible role values are: ",(0,n.kt)("inlineCode",{parentName:"li"},"writer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"penciller"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"letterer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"inker"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"editor"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"cover"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"colorist")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"book_count"),", which is the number of books present in that Series. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"book_count:1")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"total_book_count"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"total_book_count:100")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"release_date")," will search by year released. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"release_date:1999")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"deleted")," will search soft-deleted series. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"deleted:true")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"deleted:false")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"complete")," will search complete series, ie series where the ",(0,n.kt)("em",{parentName:"li"},"total book counts")," (from metadata) is equals to the actual book counts (number of files). Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"complete:true")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"complete:false")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"sharing_label"),". Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"sharing_label:kids"))),(0,n.kt)("h3",{id:"book-additional-fields"},"Book additional fields"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"tag")," will search any tag. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},'tag:"double pages"')),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"author")," will search authors with any role. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"author:(sean murphy)"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"You can also search by specific role. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"writer:remender")),(0,n.kt)("li",{parentName:"ul"},"Possible role values are: ",(0,n.kt)("inlineCode",{parentName:"li"},"writer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"penciller"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"letterer"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"inker"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"editor"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"cover"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"colorist")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"release_date")," will search by year released. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"release_date:1999")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"status"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Possible values: ",(0,n.kt)("inlineCode",{parentName:"li"},"ready"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"unknown"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"error"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"unsupported"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"outdated")),(0,n.kt)("li",{parentName:"ul"},"Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"status:(error OR unsupported)")))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"deleted")," will search soft-deleted books. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"deleted:true")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"deleted:false")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"oneshot")," will search for One-Shots only. Example: ",(0,n.kt)("inlineCode",{parentName:"li"},"oneshot:true")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"oneshot:false"))),(0,n.kt)("p",null,"Some additional Series fields will be available if the book is a One-Shot:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"publisher")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"status"),", which should always be ",(0,n.kt)("inlineCode",{parentName:"li"},"ended")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"reading_direction")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"age_rating")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"language")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"genre")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"sharing_label")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"complete"),", which will always be ",(0,n.kt)("inlineCode",{parentName:"li"},"true"))))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ca683365.af1f4fa3.js b/assets/js/ca683365.8b2ababf.js similarity index 98% rename from assets/js/ca683365.af1f4fa3.js rename to assets/js/ca683365.8b2ababf.js index 526a4a98..ce822c55 100644 --- a/assets/js/ca683365.af1f4fa3.js +++ b/assets/js/ca683365.8b2ababf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3438],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=l(r),d=o,f=m["".concat(c,".").concat(d)]||m[d]||p[d]||a;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[m]="string"==typeof e?e:o,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={},i="Theme",s={unversionedId:"guides/theme",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/theme.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Chunky Reader (iPad)",permalink:"/docs/guides/chunky"},next:{title:"Announcements",permalink:"/docs/guides/announcements"}},c={},l=[],u={toc:l},m="wrapper";function p(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"theme"},"Theme"),(0,o.kt)("p",null,"You can customize the application theme from the sidebar."),(0,o.kt)("img",{src:"/assets/media/guides/theme/theme.png",style:{maxHeight:"50px"}}),(0,o.kt)("p",null,"Three themes are available:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Light"),(0,o.kt)("li",{parentName:"ul"},"Dark"),(0,o.kt)("li",{parentName:"ul"},"System: this will follow the theme of your OS.")),(0,o.kt)("img",{src:"/assets/media/guides/theme/theme-list.png",style:{maxHeight:"150px"}}))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[3438],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=l(r),d=o,f=m["".concat(c,".").concat(d)]||m[d]||p[d]||a;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[m]="string"==typeof e?e:o,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={},i="Theme",s={unversionedId:"guides/theme",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/theme.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Chunky Reader (iPad)",permalink:"/docs/guides/chunky"},next:{title:"Announcements",permalink:"/docs/guides/announcements"}},c={},l=[],u={toc:l},m="wrapper";function p(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"theme"},"Theme"),(0,o.kt)("p",null,"You can customize the application theme from the sidebar."),(0,o.kt)("img",{src:"/assets/media/guides/theme/theme.png",style:{maxHeight:"50px"}}),(0,o.kt)("p",null,"Three themes are available:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Light"),(0,o.kt)("li",{parentName:"ul"},"Dark"),(0,o.kt)("li",{parentName:"ul"},"System: this will follow the theme of your OS.")),(0,o.kt)("img",{src:"/assets/media/guides/theme/theme-list.png",style:{maxHeight:"150px"}}))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d135d818.5e9c25b3.js b/assets/js/d135d818.289aad93.js similarity index 99% rename from assets/js/d135d818.5e9c25b3.js rename to assets/js/d135d818.289aad93.js index a60ced55..a1728058 100644 --- a/assets/js/d135d818.5e9c25b3.js +++ b/assets/js/d135d818.289aad93.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4119],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>g});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(a),d=r,g=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return a?n.createElement(g,i(i({ref:t},c),{},{components:a})):n.createElement(g,i({ref:t},c))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const o={},i="Duplicate Pages",l={unversionedId:"guides/duplicate-pages",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/duplicate-pages.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Duplicate Files",permalink:"/docs/guides/duplicate-files"},next:{title:"Readers",permalink:"/docs/category/readers"}},p={},s=[{value:"Browsing New Duplicates",id:"browsing-new-duplicates",level:2},{value:"Browsing Known Duplicates",id:"browsing-known-duplicates",level:2}],c={toc:s},u="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(u,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"duplicate-pages"},"Duplicate Pages"),(0,r.kt)("p",null,"Komga can detect duplicate pages among your books, and delete them manually or automatically."),(0,r.kt)("p",null,"You need to enable ",(0,r.kt)("a",{parentName:"p",href:"libraries#compute-hash-for-pages"},"page hashing")," for your libraries."),(0,r.kt)("p",null,"You can manage duplicate pages from ",(0,r.kt)("em",{parentName:"p"},"Server Settings > Duplicate Pages"),"."),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("strong",{parentName:"p"},"Duplicate page removal will modify your files.")),(0,r.kt)("p",{parentName:"admonition"},"It is recommended to perform a backup, and to try using manual deletion before using automatic deletion.")),(0,r.kt)("h2",{id:"browsing-new-duplicates"},"Browsing New Duplicates"),(0,r.kt)("p",null,"This screen will show all the newly detected duplicate pages. You can sort them by ",(0,r.kt)("em",{parentName:"p"},"Count")," of duplicates, ",(0,r.kt)("em",{parentName:"p"},"Size")," of the image, or the ",(0,r.kt)("em",{parentName:"p"},"Total Size")," you could save by deleting it."),(0,r.kt)("img",{src:"/assets/media/guides/duplicate-pages/duplicate-pages-new.png",style:{maxHeight:" 400px"},alt:"Browse New Duplicates"}),(0,r.kt)("p",null,"For each duplicate page, you can:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"Ignore"),": It won't show anymore on this page, and Komga won't do anything about it."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"Manual Delete"),": You will be able to trigger manual deletion from the ",(0,r.kt)("em",{parentName:"li"},"Known")," view."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"Auto Delete"),": Komga will automatically remove those pages after a library scan.")),(0,r.kt)("p",null,"You can also see the detailed list of matches by clicking on the ",(0,r.kt)("em",{parentName:"p"},"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."),(0,r.kt)("h2",{id:"browsing-known-duplicates"},"Browsing Known Duplicates"),(0,r.kt)("p",null,"This screen will show all the duplicate pages for which you chose an action. You can sort them by ",(0,r.kt)("em",{parentName:"p"},"Deletion Count")," , ",(0,r.kt)("em",{parentName:"p"},"Size")," of the image, or the ",(0,r.kt)("em",{parentName:"p"},"Space Saved")," so far."),(0,r.kt)("img",{src:"/assets/media/guides/duplicate-pages/duplicate-pages-known.png",style:{maxHeight:" 400px"},alt:"Browse Known Duplicates"}),(0,r.kt)("p",null,"For each page, you can change the action. You can ",(0,r.kt)("em",{parentName:"p"},"Ignore")," a page that was set for deletion, or mark an ignored one for deletion, if you changed your mind."),(0,r.kt)("p",null,"For pages set for ",(0,r.kt)("em",{parentName:"p"},"Manual Delete"),", you can trigger the deletion using the ",(0,r.kt)("em",{parentName:"p"},"Delete Matches")," button."))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[4119],{3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>g});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var p=n.createContext({}),s=function(e){var t=n.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(a),d=r,g=u["".concat(p,".").concat(d)]||u[d]||m[d]||o;return a?n.createElement(g,i(i({ref:t},c),{},{components:a})):n.createElement(g,i({ref:t},c))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const o={},i="Duplicate Pages",l={unversionedId:"guides/duplicate-pages",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/duplicate-pages.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Duplicate Files",permalink:"/docs/guides/duplicate-files"},next:{title:"Readers",permalink:"/docs/category/readers"}},p={},s=[{value:"Browsing New Duplicates",id:"browsing-new-duplicates",level:2},{value:"Browsing Known Duplicates",id:"browsing-known-duplicates",level:2}],c={toc:s},u="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(u,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"duplicate-pages"},"Duplicate Pages"),(0,r.kt)("p",null,"Komga can detect duplicate pages among your books, and delete them manually or automatically."),(0,r.kt)("p",null,"You need to enable ",(0,r.kt)("a",{parentName:"p",href:"libraries#compute-hash-for-pages"},"page hashing")," for your libraries."),(0,r.kt)("p",null,"You can manage duplicate pages from ",(0,r.kt)("em",{parentName:"p"},"Server Settings > Duplicate Pages"),"."),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("strong",{parentName:"p"},"Duplicate page removal will modify your files.")),(0,r.kt)("p",{parentName:"admonition"},"It is recommended to perform a backup, and to try using manual deletion before using automatic deletion.")),(0,r.kt)("h2",{id:"browsing-new-duplicates"},"Browsing New Duplicates"),(0,r.kt)("p",null,"This screen will show all the newly detected duplicate pages. You can sort them by ",(0,r.kt)("em",{parentName:"p"},"Count")," of duplicates, ",(0,r.kt)("em",{parentName:"p"},"Size")," of the image, or the ",(0,r.kt)("em",{parentName:"p"},"Total Size")," you could save by deleting it."),(0,r.kt)("img",{src:"/assets/media/guides/duplicate-pages/duplicate-pages-new.png",style:{maxHeight:" 400px"},alt:"Browse New Duplicates"}),(0,r.kt)("p",null,"For each duplicate page, you can:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"Ignore"),": It won't show anymore on this page, and Komga won't do anything about it."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"Manual Delete"),": You will be able to trigger manual deletion from the ",(0,r.kt)("em",{parentName:"li"},"Known")," view."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"Auto Delete"),": Komga will automatically remove those pages after a library scan.")),(0,r.kt)("p",null,"You can also see the detailed list of matches by clicking on the ",(0,r.kt)("em",{parentName:"p"},"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."),(0,r.kt)("h2",{id:"browsing-known-duplicates"},"Browsing Known Duplicates"),(0,r.kt)("p",null,"This screen will show all the duplicate pages for which you chose an action. You can sort them by ",(0,r.kt)("em",{parentName:"p"},"Deletion Count")," , ",(0,r.kt)("em",{parentName:"p"},"Size")," of the image, or the ",(0,r.kt)("em",{parentName:"p"},"Space Saved")," so far."),(0,r.kt)("img",{src:"/assets/media/guides/duplicate-pages/duplicate-pages-known.png",style:{maxHeight:" 400px"},alt:"Browse Known Duplicates"}),(0,r.kt)("p",null,"For each page, you can change the action. You can ",(0,r.kt)("em",{parentName:"p"},"Ignore")," a page that was set for deletion, or mark an ignored one for deletion, if you changed your mind."),(0,r.kt)("p",null,"For pages set for ",(0,r.kt)("em",{parentName:"p"},"Manual Delete"),", you can trigger the deletion using the ",(0,r.kt)("em",{parentName:"p"},"Delete Matches")," button."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d6e0cd3c.4e08fa38.js b/assets/js/d6e0cd3c.27973669.js similarity index 98% rename from assets/js/d6e0cd3c.4e08fa38.js rename to assets/js/d6e0cd3c.27973669.js index 658885c3..ec6ad4d0 100644 --- a/assets/js/d6e0cd3c.4e08fa38.js +++ b/assets/js/d6e0cd3c.27973669.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[278],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),l=p(r),m=a,f=l["".concat(s,".").concat(m)]||l[m]||d[m]||o;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[l]="string"==typeof e?e:a,i[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={},i="Accessing the web interface",c={unversionedId:"guides/webui",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/webui.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Guides",permalink:"/docs/category/guides"},next:{title:"Desktop Application",permalink:"/docs/guides/desktop"}},s={},p=[{value:"Create user account",id:"create-user-account",level:2}],u={toc:p},l="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(l,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"accessing-the-web-interface"},"Accessing the web interface"),(0,a.kt)("p",null,"Once Komga is started, you can access the web interface at: ",(0,a.kt)("inlineCode",{parentName:"p"},"http://:(/baseUrl)"),"."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"If you are running Komga locally, ",(0,a.kt)("em",{parentName:"p"},(0,a.kt)("inlineCode",{parentName:"em"},""))," will be ",(0,a.kt)("inlineCode",{parentName:"p"},"localhost"),"."),(0,a.kt)("p",{parentName:"admonition"},"The default ",(0,a.kt)("em",{parentName:"p"},(0,a.kt)("inlineCode",{parentName:"em"},""))," is ",(0,a.kt)("inlineCode",{parentName:"p"},"25600"),".")),(0,a.kt)("h2",{id:"create-user-account"},"Create user account"),(0,a.kt)("p",null,"You will be asked to create a user account. Choose an ",(0,a.kt)("em",{parentName:"p"},"email")," and ",(0,a.kt)("em",{parentName:"p"},"password"),", then click on ",(0,a.kt)("strong",{parentName:"p"},"Create User Account"),"."),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/assets/media/installation/create-initial-account.png",style:{maxHeight:"500px"},alt:"Create initial account"})))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[278],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},l="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),l=p(r),m=a,f=l["".concat(s,".").concat(m)]||l[m]||d[m]||o;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[l]="string"==typeof e?e:a,i[1]=c;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={},i="Accessing the web interface",c={unversionedId:"guides/webui",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/webui.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Guides",permalink:"/docs/category/guides"},next:{title:"Desktop Application",permalink:"/docs/guides/desktop"}},s={},p=[{value:"Create user account",id:"create-user-account",level:2}],u={toc:p},l="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(l,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"accessing-the-web-interface"},"Accessing the web interface"),(0,a.kt)("p",null,"Once Komga is started, you can access the web interface at: ",(0,a.kt)("inlineCode",{parentName:"p"},"http://:(/baseUrl)"),"."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"If you are running Komga locally, ",(0,a.kt)("em",{parentName:"p"},(0,a.kt)("inlineCode",{parentName:"em"},""))," will be ",(0,a.kt)("inlineCode",{parentName:"p"},"localhost"),"."),(0,a.kt)("p",{parentName:"admonition"},"The default ",(0,a.kt)("em",{parentName:"p"},(0,a.kt)("inlineCode",{parentName:"em"},""))," is ",(0,a.kt)("inlineCode",{parentName:"p"},"25600"),".")),(0,a.kt)("h2",{id:"create-user-account"},"Create user account"),(0,a.kt)("p",null,"You will be asked to create a user account. Choose an ",(0,a.kt)("em",{parentName:"p"},"email")," and ",(0,a.kt)("em",{parentName:"p"},"password"),", then click on ",(0,a.kt)("strong",{parentName:"p"},"Create User Account"),"."),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/assets/media/installation/create-initial-account.png",style:{maxHeight:"500px"},alt:"Create initial account"})))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d86518ca.6c0ca6bc.js b/assets/js/d86518ca.4c017adf.js similarity index 99% rename from assets/js/d86518ca.6c0ca6bc.js rename to assets/js/d86518ca.4c017adf.js index 1ff878c7..00d2e0f1 100644 --- a/assets/js/d86518ca.6c0ca6bc.js +++ b/assets/js/d86518ca.4c017adf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5416],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),s=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=s(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=s(r),k=n,m=d["".concat(l,".").concat(k)]||d[k]||u[k]||o;return r?a.createElement(m,i(i({ref:t},c),{},{components:r})):a.createElement(m,i({ref:t},c))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=k;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[d]="string"==typeof e?e:n,i[1]=p;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var a=r(7462),n=(r(7294),r(3905));const o={},i="Read with Paperback",p={unversionedId:"guides/paperback",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/paperback.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Tachiyomi",permalink:"/docs/guides/tachiyomi"},next:{title:"Read with CDisplayEx",permalink:"/docs/guides/cdisplayex"}},l={},s=[{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}],c={toc:s},d="wrapper";function u(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"read-with-paperback"},"Read with Paperback"),(0,n.kt)("p",null,"Komga has an extension for ",(0,n.kt)("a",{parentName:"p",href:"https://paperback.moe/"},"Paperback"),", a free iOS and iPadOS reader."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"Paperback requires iOS 13.4+ or iPadOS 13.4+.")),(0,n.kt)("h2",{id:"install-and-configure"},"Install and configure"),(0,n.kt)("h3",{id:"add-the-source-repository"},"Add the source repository"),(0,n.kt)("p",null,"Support for Komga comes pre-installed with Paperback under the ",(0,n.kt)("inlineCode",{parentName:"p"},"Paperback")," source name. If deleted the extension and repository simply open ",(0,n.kt)("a",{parentName:"p",href:"https://paperback-ios.github.io/extensions-main-promises/"},"the repository page")," on your device and tap ",(0,n.kt)("strong",{parentName:"p"},"Add to Paperback"),"."),(0,n.kt)("p",null,'Once Paperback opens choose "Add as Source Repo" on the popup.'),(0,n.kt)("details",null,(0,n.kt)("summary",null,"Add the source repository manually"),"If you prefer, it is also possible to add the repository manually:",(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"In the app, go to ",(0,n.kt)("strong",{parentName:"li"},"Settings"),", ",(0,n.kt)("strong",{parentName:"li"},"External Sources")," then press ",(0,n.kt)("strong",{parentName:"li"},"Edit")," on the top right-hand corner."),(0,n.kt)("li",{parentName:"ol"},"Press the top left-hand corner ",(0,n.kt)("strong",{parentName:"li"},"+")," button to add a repository."),(0,n.kt)("li",{parentName:"ol"},"Use the base url:",(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"https://paperback-ios.github.io/extensions-main-promises/\n"))))),(0,n.kt)("h3",{id:"install-the-source"},"Install the source"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"In the app ",(0,n.kt)("strong",{parentName:"p"},"Settings"),", ",(0,n.kt)("strong",{parentName:"p"},"External Sources")," windows, choose ",(0,n.kt)("inlineCode",{parentName:"p"},"Browse Official Repo"),", or ",(0,n.kt)("inlineCode",{parentName:"p"},"Browse ...")," followed by the repository name you chose previously")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Install the source ",(0,n.kt)("strong",{parentName:"p"},"Paperback")))),(0,n.kt)("h3",{id:"configure-the-source"},"Configure the source"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"In the app ",(0,n.kt)("strong",{parentName:"li"},"Settings"),", ",(0,n.kt)("strong",{parentName:"li"},"External Sources"),", press the ",(0,n.kt)("inlineCode",{parentName:"li"},"Paperback")," source"),(0,n.kt)("li",{parentName:"ol"},"Select ",(0,n.kt)("strong",{parentName:"li"},"Server Settings")," and set your:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"server url"),(0,n.kt)("li",{parentName:"ul"},"username"),(0,n.kt)("li",{parentName:"ul"},"password"))),(0,n.kt)("li",{parentName:"ol"},"Press ",(0,n.kt)("strong",{parentName:"li"},"Save")," to exit")),(0,n.kt)("admonition",{type:"tip"},(0,n.kt)("p",{parentName:"admonition"},"You can test your settings by opening ",(0,n.kt)("strong",{parentName:"p"},"Try Settings")," below the Server Settings section")),(0,n.kt)("h2",{id:"track-read-progress"},"Track read progress"),(0,n.kt)("p",null,"It is possible to sync read chapters from the app to the Komga server using an implicit tracker."),(0,n.kt)("h3",{id:"add-the-tracker-repository"},"Add the tracker repository"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"In the app, go to ",(0,n.kt)("strong",{parentName:"li"},"Settings"),", ",(0,n.kt)("strong",{parentName:"li"},"External Trackers")," then press ",(0,n.kt)("strong",{parentName:"li"},"Edit")," on the top right-hand corner"),(0,n.kt)("li",{parentName:"ol"},"Press the top left-hand corner ",(0,n.kt)("strong",{parentName:"li"},"+")," button to add a repository."),(0,n.kt)("li",{parentName:"ol"},"Use the base url (",(0,n.kt)("strong",{parentName:"li"},"do not")," open this url):",(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"https://paperback-ios.github.io/trackers-main/main/\n")))),(0,n.kt)("h3",{id:"install-the-tracker"},"Install the tracker"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"In the app ",(0,n.kt)("strong",{parentName:"li"},"Settings"),", ",(0,n.kt)("strong",{parentName:"li"},"External Trackers")," windows, choose ",(0,n.kt)("inlineCode",{parentName:"li"},"Browse ...")," for the repository you just added"),(0,n.kt)("li",{parentName:"ol"},"Install the tracker ",(0,n.kt)("strong",{parentName:"li"},"Paperback"))),(0,n.kt)("p",null,"When you read or mark as read a chapter in the app, it will now be marked as such on your Komga server."),(0,n.kt)("h2",{id:"changelog-and-compatibility"},"Changelog and Compatibility"),(0,n.kt)("p",null,"Each version of the Komga extension need a specific version of the Komga server to work properly."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5416],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),s=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=s(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},k=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=s(r),k=n,m=d["".concat(l,".").concat(k)]||d[k]||u[k]||o;return r?a.createElement(m,i(i({ref:t},c),{},{components:r})):a.createElement(m,i({ref:t},c))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=k;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[d]="string"==typeof e?e:n,i[1]=p;for(var s=2;s{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>p,toc:()=>s});var a=r(7462),n=(r(7294),r(3905));const o={},i="Read with Paperback",p={unversionedId:"guides/paperback",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/paperback.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Read with Tachiyomi",permalink:"/docs/guides/tachiyomi"},next:{title:"Read with CDisplayEx",permalink:"/docs/guides/cdisplayex"}},l={},s=[{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}],c={toc:s},d="wrapper";function u(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"read-with-paperback"},"Read with Paperback"),(0,n.kt)("p",null,"Komga has an extension for ",(0,n.kt)("a",{parentName:"p",href:"https://paperback.moe/"},"Paperback"),", a free iOS and iPadOS reader."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"Paperback requires iOS 13.4+ or iPadOS 13.4+.")),(0,n.kt)("h2",{id:"install-and-configure"},"Install and configure"),(0,n.kt)("h3",{id:"add-the-source-repository"},"Add the source repository"),(0,n.kt)("p",null,"Support for Komga comes pre-installed with Paperback under the ",(0,n.kt)("inlineCode",{parentName:"p"},"Paperback")," source name. If deleted the extension and repository simply open ",(0,n.kt)("a",{parentName:"p",href:"https://paperback-ios.github.io/extensions-main-promises/"},"the repository page")," on your device and tap ",(0,n.kt)("strong",{parentName:"p"},"Add to Paperback"),"."),(0,n.kt)("p",null,'Once Paperback opens choose "Add as Source Repo" on the popup.'),(0,n.kt)("details",null,(0,n.kt)("summary",null,"Add the source repository manually"),"If you prefer, it is also possible to add the repository manually:",(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"In the app, go to ",(0,n.kt)("strong",{parentName:"li"},"Settings"),", ",(0,n.kt)("strong",{parentName:"li"},"External Sources")," then press ",(0,n.kt)("strong",{parentName:"li"},"Edit")," on the top right-hand corner."),(0,n.kt)("li",{parentName:"ol"},"Press the top left-hand corner ",(0,n.kt)("strong",{parentName:"li"},"+")," button to add a repository."),(0,n.kt)("li",{parentName:"ol"},"Use the base url:",(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"https://paperback-ios.github.io/extensions-main-promises/\n"))))),(0,n.kt)("h3",{id:"install-the-source"},"Install the source"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"In the app ",(0,n.kt)("strong",{parentName:"p"},"Settings"),", ",(0,n.kt)("strong",{parentName:"p"},"External Sources")," windows, choose ",(0,n.kt)("inlineCode",{parentName:"p"},"Browse Official Repo"),", or ",(0,n.kt)("inlineCode",{parentName:"p"},"Browse ...")," followed by the repository name you chose previously")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Install the source ",(0,n.kt)("strong",{parentName:"p"},"Paperback")))),(0,n.kt)("h3",{id:"configure-the-source"},"Configure the source"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"In the app ",(0,n.kt)("strong",{parentName:"li"},"Settings"),", ",(0,n.kt)("strong",{parentName:"li"},"External Sources"),", press the ",(0,n.kt)("inlineCode",{parentName:"li"},"Paperback")," source"),(0,n.kt)("li",{parentName:"ol"},"Select ",(0,n.kt)("strong",{parentName:"li"},"Server Settings")," and set your:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"server url"),(0,n.kt)("li",{parentName:"ul"},"username"),(0,n.kt)("li",{parentName:"ul"},"password"))),(0,n.kt)("li",{parentName:"ol"},"Press ",(0,n.kt)("strong",{parentName:"li"},"Save")," to exit")),(0,n.kt)("admonition",{type:"tip"},(0,n.kt)("p",{parentName:"admonition"},"You can test your settings by opening ",(0,n.kt)("strong",{parentName:"p"},"Try Settings")," below the Server Settings section")),(0,n.kt)("h2",{id:"track-read-progress"},"Track read progress"),(0,n.kt)("p",null,"It is possible to sync read chapters from the app to the Komga server using an implicit tracker."),(0,n.kt)("h3",{id:"add-the-tracker-repository"},"Add the tracker repository"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"In the app, go to ",(0,n.kt)("strong",{parentName:"li"},"Settings"),", ",(0,n.kt)("strong",{parentName:"li"},"External Trackers")," then press ",(0,n.kt)("strong",{parentName:"li"},"Edit")," on the top right-hand corner"),(0,n.kt)("li",{parentName:"ol"},"Press the top left-hand corner ",(0,n.kt)("strong",{parentName:"li"},"+")," button to add a repository."),(0,n.kt)("li",{parentName:"ol"},"Use the base url (",(0,n.kt)("strong",{parentName:"li"},"do not")," open this url):",(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"https://paperback-ios.github.io/trackers-main/main/\n")))),(0,n.kt)("h3",{id:"install-the-tracker"},"Install the tracker"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"In the app ",(0,n.kt)("strong",{parentName:"li"},"Settings"),", ",(0,n.kt)("strong",{parentName:"li"},"External Trackers")," windows, choose ",(0,n.kt)("inlineCode",{parentName:"li"},"Browse ...")," for the repository you just added"),(0,n.kt)("li",{parentName:"ol"},"Install the tracker ",(0,n.kt)("strong",{parentName:"li"},"Paperback"))),(0,n.kt)("p",null,"When you read or mark as read a chapter in the app, it will now be marked as such on your Komga server."),(0,n.kt)("h2",{id:"changelog-and-compatibility"},"Changelog and Compatibility"),(0,n.kt)("p",null,"Each version of the Komga extension need a specific version of the Komga server to work properly."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/df8142cd.83faade5.js b/assets/js/df8142cd.adcd83bc.js similarity index 98% rename from assets/js/df8142cd.83faade5.js rename to assets/js/df8142cd.adcd83bc.js index 0ce74b45..7bd0989a 100644 --- a/assets/js/df8142cd.83faade5.js +++ b/assets/js/df8142cd.adcd83bc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5035],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(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 o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||i;return n?r.createElement(h,o(o({ref:t},u),{},{components:n})):r.createElement(h,o({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const i={},o="REST API",s={unversionedId:"api/rest",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/api/rest.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"api",next:{title:"Deprecation",permalink:"/docs/api/deprecation"}},l={},p=[{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}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"rest-api"},"REST API"),(0,a.kt)("p",null,"Komga offers a REST API, which you can browse using Swagger. It's available at ",(0,a.kt)("inlineCode",{parentName:"p"},"/swagger-ui.html"),"."),(0,a.kt)("p",null,"The OpenAPI specification is also available ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga/blob/master/komga/docs/openapi.json"},"here"),"."),(0,a.kt)("h2",{id:"authenticating"},"Authenticating"),(0,a.kt)("p",null,"Most endpoints require authentication. Authentication is done using ",(0,a.kt)("strong",{parentName:"p"},"Basic Authentication")," and can be set on any endpoint."),(0,a.kt)("h2",{id:"sessions"},"Sessions"),(0,a.kt)("p",null,"Upon successful authentication, a session is created, and can be reused."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"By default, a ",(0,a.kt)("inlineCode",{parentName:"li"},"SESSION")," cookie is set via ",(0,a.kt)("inlineCode",{parentName:"li"},"Set-Cookie")," response header. This works well for browsers and clients that can handle cookies."),(0,a.kt)("li",{parentName:"ul"},"If you specify a header ",(0,a.kt)("inlineCode",{parentName:"li"},"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.")),(0,a.kt)("p",null,"If you need to set the session cookie later on, you can call ",(0,a.kt)("inlineCode",{parentName:"p"},"/api/v1/login/set-cookie")," with ",(0,a.kt)("inlineCode",{parentName:"p"},"X-Auth-Token"),". The response will contain the ",(0,a.kt)("inlineCode",{parentName:"p"},"Set-Cookie")," header."),(0,a.kt)("h2",{id:"remember-me"},"Remember Me"),(0,a.kt)("p",null,"During authentication, if a request parameter ",(0,a.kt)("inlineCode",{parentName:"p"},"remember-me")," is passed and set to ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),", the server will also return a ",(0,a.kt)("inlineCode",{parentName:"p"},"remember-me")," cookie. This cookie will be used to login automatically even if the session has expired."),(0,a.kt)("h2",{id:"logout"},"Logout"),(0,a.kt)("p",null,"You can explicitely logout an existing session by calling ",(0,a.kt)("inlineCode",{parentName:"p"},"/api/logout"),". This would return a ",(0,a.kt)("inlineCode",{parentName:"p"},"204"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5035],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(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 o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||i;return n?r.createElement(h,o(o({ref:t},u),{},{components:n})):r.createElement(h,o({ref:t},u))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:a,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const i={},o="REST API",s={unversionedId:"api/rest",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/api/rest.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"api",next:{title:"Deprecation",permalink:"/docs/api/deprecation"}},l={},p=[{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}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"rest-api"},"REST API"),(0,a.kt)("p",null,"Komga offers a REST API, which you can browse using Swagger. It's available at ",(0,a.kt)("inlineCode",{parentName:"p"},"/swagger-ui.html"),"."),(0,a.kt)("p",null,"The OpenAPI specification is also available ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/gotson/komga/blob/master/komga/docs/openapi.json"},"here"),"."),(0,a.kt)("h2",{id:"authenticating"},"Authenticating"),(0,a.kt)("p",null,"Most endpoints require authentication. Authentication is done using ",(0,a.kt)("strong",{parentName:"p"},"Basic Authentication")," and can be set on any endpoint."),(0,a.kt)("h2",{id:"sessions"},"Sessions"),(0,a.kt)("p",null,"Upon successful authentication, a session is created, and can be reused."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"By default, a ",(0,a.kt)("inlineCode",{parentName:"li"},"SESSION")," cookie is set via ",(0,a.kt)("inlineCode",{parentName:"li"},"Set-Cookie")," response header. This works well for browsers and clients that can handle cookies."),(0,a.kt)("li",{parentName:"ul"},"If you specify a header ",(0,a.kt)("inlineCode",{parentName:"li"},"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.")),(0,a.kt)("p",null,"If you need to set the session cookie later on, you can call ",(0,a.kt)("inlineCode",{parentName:"p"},"/api/v1/login/set-cookie")," with ",(0,a.kt)("inlineCode",{parentName:"p"},"X-Auth-Token"),". The response will contain the ",(0,a.kt)("inlineCode",{parentName:"p"},"Set-Cookie")," header."),(0,a.kt)("h2",{id:"remember-me"},"Remember Me"),(0,a.kt)("p",null,"During authentication, if a request parameter ",(0,a.kt)("inlineCode",{parentName:"p"},"remember-me")," is passed and set to ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),", the server will also return a ",(0,a.kt)("inlineCode",{parentName:"p"},"remember-me")," cookie. This cookie will be used to login automatically even if the session has expired."),(0,a.kt)("h2",{id:"logout"},"Logout"),(0,a.kt)("p",null,"You can explicitely logout an existing session by calling ",(0,a.kt)("inlineCode",{parentName:"p"},"/api/logout"),". This would return a ",(0,a.kt)("inlineCode",{parentName:"p"},"204"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e1862fee.b97b22f7.js b/assets/js/e1862fee.7fbf0a95.js similarity index 52% rename from assets/js/e1862fee.b97b22f7.js rename to assets/js/e1862fee.7fbf0a95.js index cd499cf2..81a583ac 100644 --- a/assets/js/e1862fee.b97b22f7.js +++ b/assets/js/e1862fee.7fbf0a95.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5880],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},g="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),g=p(r),m=a,d=g["".concat(u,".").concat(m)]||g[m]||c[m]||o;return r?n.createElement(d,i(i({ref:t},s),{},{components:r})):n.createElement(d,i({ref:t},s))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[g]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={slug:"prepare-v1",title:"Prepare for v1.0.0",authors:"gotson",tags:["breaking change","upgrade","komga"]},i=void 0,l={permalink:"/blog/prepare-v1",source:"@site/blog/2023-03-21-prepare-v1.md",title:"Prepare for v1.0.0",description:"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version.",date:"2023-03-21T00:00:00.000Z",formattedDate:"March 21, 2023",tags:[{label:"breaking change",permalink:"/blog/tags/breaking-change"},{label:"upgrade",permalink:"/blog/tags/upgrade"},{label:"komga",permalink:"/blog/tags/komga"}],readingTime:1.115,hasTruncateMarker:!1,authors:[{name:"gotson",title:"Developer of Komga",url:"https://github.com/gotson",imageURL:"https://github.com/gotson.png",key:"gotson"}],frontMatter:{slug:"prepare-v1",title:"Prepare for v1.0.0",authors:"gotson",tags:["breaking change","upgrade","komga"]}},u={authorsImageUrls:[void 0]},p=[{value:"Before upgrading",id:"before-upgrading",level:2},{value:"Breaking changes",id:"breaking-changes",level:2}],s={toc:p},g="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(g,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version."),(0,a.kt)("h2",{id:"before-upgrading"},"Before upgrading"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"If you run Docker, it is advisable to use the ",(0,a.kt)("inlineCode",{parentName:"li"},"0.x")," tag instead of ",(0,a.kt)("inlineCode",{parentName:"li"},"latest"),". You will be able to decide when you want to upgrade, especially if you are updating containers automatically."),(0,a.kt)("li",{parentName:"ul"},"Backup your ",(0,a.kt)("inlineCode",{parentName:"li"},"database.sqlite"),". You can find it in the configuration directory, by default:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"on Windows: ",(0,a.kt)("inlineCode",{parentName:"li"},"%USERPROFILE%/.komga/database.sqlite")),(0,a.kt)("li",{parentName:"ul"},"on Unix: ",(0,a.kt)("inlineCode",{parentName:"li"},"~/.komga/database.sqlite")),(0,a.kt)("li",{parentName:"ul"},"on Docker: in the directory you mounted as ",(0,a.kt)("inlineCode",{parentName:"li"},"/config"))))),(0,a.kt)("h2",{id:"breaking-changes"},"Breaking changes"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The minimum Java version required will be Java 17:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"If you run Komga using the ",(0,a.kt)("inlineCode",{parentName:"li"},"jar"),", you will need to make sure your Java version is sufficient by running ",(0,a.kt)("inlineCode",{parentName:"li"},"java -version"),"."),(0,a.kt)("li",{parentName:"ul"},"If you run Komga using Docker, you don't need to do anything."))),(0,a.kt)("li",{parentName:"ul"},"The hashing algorithm for files and pages will change. Previous hashes for files and pages will be deleted. On startup, if hashing is enabled, Komga will re-hash files and pages using the new algorithm."),(0,a.kt)("li",{parentName:"ul"},"The default port will be changed from ",(0,a.kt)("inlineCode",{parentName:"li"},"8080")," to ",(0,a.kt)("inlineCode",{parentName:"li"},"25600"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"If you use Docker, you will need to update your container or compose configuration to expose the new port."),(0,a.kt)("li",{parentName:"ul"},"You may need to adjust your reverse proxy settings."),(0,a.kt)("li",{parentName:"ul"},"You can still change the port ",(0,a.kt)("a",{parentName:"li",href:"/docs/installation/configuration#server_port--serverport-port"},"through configuration"),".")))))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[5880],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=n.createContext({}),p=function(e){var t=n.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(u.Provider,{value:t},e.children)},g="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,u=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),g=p(r),m=a,d=g["".concat(u,".").concat(m)]||g[m]||c[m]||o;return r?n.createElement(d,i(i({ref:t},s),{},{components:r})):n.createElement(d,i({ref:t},s))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=m;var l={};for(var u in t)hasOwnProperty.call(t,u)&&(l[u]=t[u]);l.originalType=e,l[g]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(3905));const o={slug:"prepare-v1",title:"Prepare for v1.0.0",authors:"gotson",tags:["breaking change","upgrade","komga"]},i=void 0,l={permalink:"/blog/prepare-v1",source:"@site/blog/2023-03-21-prepare-v1.md",title:"Prepare for v1.0.0",description:"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version.",date:"2023-03-21T00:00:00.000Z",formattedDate:"March 21, 2023",tags:[{label:"breaking change",permalink:"/blog/tags/breaking-change"},{label:"upgrade",permalink:"/blog/tags/upgrade"},{label:"komga",permalink:"/blog/tags/komga"}],readingTime:1.115,hasTruncateMarker:!1,authors:[{name:"gotson",title:"Developer of Komga",url:"https://github.com/gotson",imageURL:"https://github.com/gotson.png",key:"gotson"}],frontMatter:{slug:"prepare-v1",title:"Prepare for v1.0.0",authors:"gotson",tags:["breaking change","upgrade","komga"]},prevItem:{title:"eBook support",permalink:"/blog/ebook-support"}},u={authorsImageUrls:[void 0]},p=[{value:"Before upgrading",id:"before-upgrading",level:2},{value:"Breaking changes",id:"breaking-changes",level:2}],s={toc:p},g="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(g,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"The future v1.0.0 will bring some breaking changes, this guide will help you to prepare for the next major version."),(0,a.kt)("h2",{id:"before-upgrading"},"Before upgrading"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"If you run Docker, it is advisable to use the ",(0,a.kt)("inlineCode",{parentName:"li"},"0.x")," tag instead of ",(0,a.kt)("inlineCode",{parentName:"li"},"latest"),". You will be able to decide when you want to upgrade, especially if you are updating containers automatically."),(0,a.kt)("li",{parentName:"ul"},"Backup your ",(0,a.kt)("inlineCode",{parentName:"li"},"database.sqlite"),". You can find it in the configuration directory, by default:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"on Windows: ",(0,a.kt)("inlineCode",{parentName:"li"},"%USERPROFILE%/.komga/database.sqlite")),(0,a.kt)("li",{parentName:"ul"},"on Unix: ",(0,a.kt)("inlineCode",{parentName:"li"},"~/.komga/database.sqlite")),(0,a.kt)("li",{parentName:"ul"},"on Docker: in the directory you mounted as ",(0,a.kt)("inlineCode",{parentName:"li"},"/config"))))),(0,a.kt)("h2",{id:"breaking-changes"},"Breaking changes"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The minimum Java version required will be Java 17:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"If you run Komga using the ",(0,a.kt)("inlineCode",{parentName:"li"},"jar"),", you will need to make sure your Java version is sufficient by running ",(0,a.kt)("inlineCode",{parentName:"li"},"java -version"),"."),(0,a.kt)("li",{parentName:"ul"},"If you run Komga using Docker, you don't need to do anything."))),(0,a.kt)("li",{parentName:"ul"},"The hashing algorithm for files and pages will change. Previous hashes for files and pages will be deleted. On startup, if hashing is enabled, Komga will re-hash files and pages using the new algorithm."),(0,a.kt)("li",{parentName:"ul"},"The default port will be changed from ",(0,a.kt)("inlineCode",{parentName:"li"},"8080")," to ",(0,a.kt)("inlineCode",{parentName:"li"},"25600"),":",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"If you use Docker, you will need to update your container or compose configuration to expose the new port."),(0,a.kt)("li",{parentName:"ul"},"You may need to adjust your reverse proxy settings."),(0,a.kt)("li",{parentName:"ul"},"You can still change the port ",(0,a.kt)("a",{parentName:"li",href:"/docs/installation/configuration#server_port--serverport-port"},"through configuration"),".")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e41126ef.ffac3367.js b/assets/js/e41126ef.e4b0b1e3.js similarity index 98% rename from assets/js/e41126ef.ffac3367.js rename to assets/js/e41126ef.e4b0b1e3.js index fbf6bd25..2012a7a3 100644 --- a/assets/js/e41126ef.ffac3367.js +++ b/assets/js/e41126ef.e4b0b1e3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6383],{3905:(e,t,i)=>{i.d(t,{Zo:()=>c,kt:()=>h});var a=i(7294);function l(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function s(e){for(var t=1;t=0||(l[i]=e[i]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(l[i]=e[i])}return l}var o=a.createContext({}),d=function(e){var t=a.useContext(o),i=t;return e&&(i="function"==typeof e?e(t):s(s({},t),e)),i},c=function(e){var t=d(e.components);return a.createElement(o.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var i=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=n(e,["components","mdxType","originalType","parentName"]),m=d(i),p=l,h=m["".concat(o,".").concat(p)]||m[p]||u[p]||r;return i?a.createElement(h,s(s({ref:t},c),{},{components:i})):a.createElement(h,s({ref:t},c))}));function h(e,t){var i=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=i.length,s=new Array(r);s[0]=p;var n={};for(var o in t)hasOwnProperty.call(t,o)&&(n[o]=t[o]);n.originalType=e,n[m]="string"==typeof e?e:l,s[1]=n;for(var d=2;d{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>n,toc:()=>d});var a=i(7462),l=(i(7294),i(3905));const r={},s="Read lists",n={unversionedId:"guides/readlists",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/readlists.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Collections",permalink:"/docs/guides/collections"},next:{title:"Full Text Search",permalink:"/docs/guides/search"}},o={},d=[{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}],c={toc:d},m="wrapper";function u(e){let{components:t,...i}=e;return(0,l.kt)(m,(0,a.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"read-lists"},"Read lists"),(0,l.kt)("p",null,'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.'),(0,l.kt)("h2",{id:"adding-books-to-a-read-list"},"Adding books to a read list"),(0,l.kt)("p",null,"You can add a Book to a read list from the action menu icon ",(0,l.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,l.kt)("em",{parentName:"p"},"Add to read list"),"."),(0,l.kt)("p",null,"You can also select multiple books, and click on ",(0,l.kt)("em",{parentName:"p"},"Add to read list"),"."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/multiselect-add-readlist.png",style:{maxHeight:" 80px"}}),(0,l.kt)("p",null,"A dialog will show up, where you can either add books to an existing read list, or create a new read list."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/add-readlist-dialog.png",style:{maxHeight:" 300px"}}),(0,l.kt)("h2",{id:"finding-the-read-lists"},"Finding the Read Lists"),(0,l.kt)("p",null,"Read lists can be discovered or viewed in three ways:"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"Book details screen"),(0,l.kt)("li",{parentName:"ol"},'Viewing the libraries "By Read List"'),(0,l.kt)("li",{parentName:"ol"},"Searching in the search bar")),(0,l.kt)("h3",{id:"book-details-screen"},"Book details screen"),(0,l.kt)("p",null,"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."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/book-readlist-collapsed.png",style:{maxHeight:"300px"}}),(0,l.kt)("p",null,"Click on the panel to expand it and see the content of the read list."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/book-readlist-expanded.png",style:{maxHeight:"300px"}}),(0,l.kt)("h3",{id:"viewing-the-libraries-by-read-list"},'Viewing the libraries "By Read List"'),(0,l.kt)("p",null,'Only show read lists that exist in the library. Opening a read list goes to the "read list details" screen (see below).'),(0,l.kt)("img",{src:"/assets/media/guides/readlists/browse-readlists.png",style:{maxHeight:"100px"}}),(0,l.kt)("h2",{id:"read-list-details"},"Read List details"),(0,l.kt)("p",null,"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."),(0,l.kt)("h3",{id:"read-list-ordering"},"Read List ordering"),(0,l.kt)("p",null,"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."),(0,l.kt)("p",null,"Either click on the edit button on the read list card."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-card.png",style:{maxHeight:"300px"}}),(0,l.kt)("p",null,"Or click on the edit button from the read list details screen."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-button.png",style:{maxHeight:"60px"}}),(0,l.kt)("p",null,"A dialog will show up, where you can edit the read list's ordering."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-dialog.png",style:{maxHeight:"300px"}}),(0,l.kt)("p",null,"A manually ordered read list will be showing as such in the read list details screen."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-manual-ordering.png",style:{maxHeight:"50px"}}),(0,l.kt)("h3",{id:"edit-read-list-elements"},"Edit read list elements"),(0,l.kt)("p",null,"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."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-elements-button.png",style:{maxHeight:"80px"}}),(0,l.kt)("p",null,"The book cards will show two extra elements:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"a delete button, to remove the book from the read list"),(0,l.kt)("li",{parentName:"ul"},"a grip handle, which let you drag and drop books to reorder them (only available when the read list is manually ordered)")),(0,l.kt)("p",null,"Once you are done with your changes, click the tick in the top bar. Click the cross to discard your changes."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-elements.png",style:{maxHeight:"400px"}}),(0,l.kt)("h2",{id:"deleting-a-read-list"},"Deleting a read list"),(0,l.kt)("p",null,"To delete a read list, look for the action menu icon ",(0,l.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,l.kt)("em",{parentName:"p"},"Delete"),"."),(0,l.kt)("p",null,"This will not delete the items in the read list, nor your media files."),(0,l.kt)("h2",{id:"import-read-lists-from-comicrack"},"Import read lists from ComicRack"),(0,l.kt)("p",null,"You can import ComicRack reading lists in ",(0,l.kt)("inlineCode",{parentName:"p"},".cbl")," format from the ",(0,l.kt)("em",{parentName:"p"},"Import > Read List")," screen."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/import.png",style:{maxHeight:"400px"}}),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},".cbl")," files contain the following information:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"read list name"),(0,l.kt)("li",{parentName:"ul"},"books contained in the list, in order"),(0,l.kt)("li",{parentName:"ul"},"for each book:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"name of the series it is part of"),(0,l.kt)("li",{parentName:"ul"},"volume of the series"),(0,l.kt)("li",{parentName:"ul"},"year of the series"),(0,l.kt)("li",{parentName:"ul"},"number of that book in the series")))),(0,l.kt)("p",null,"Komga will try to match each book in the list in the following way:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"part of a series named ",(0,l.kt)("inlineCode",{parentName:"li"},"Series")," or ",(0,l.kt)("inlineCode",{parentName:"li"},"Series (Volume)")),(0,l.kt)("li",{parentName:"ul"},"where the number matches")),(0,l.kt)("p",null,"The result will be shown after you click the ",(0,l.kt)("em",{parentName:"p"},"Match")," button."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/import-results.png",style:{maxHeight:"500px"}}),(0,l.kt)("p",null,"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."),(0,l.kt)("p",null,"Click ",(0,l.kt)("em",{parentName:"p"},"Create")," to create the read list. If some books are unmatched, you can still create the read list (a confirmation dialog will pop-up)."))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[6383],{3905:(e,t,i)=>{i.d(t,{Zo:()=>c,kt:()=>h});var a=i(7294);function l(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,a)}return i}function s(e){for(var t=1;t=0||(l[i]=e[i]);return l}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(l[i]=e[i])}return l}var o=a.createContext({}),d=function(e){var t=a.useContext(o),i=t;return e&&(i="function"==typeof e?e(t):s(s({},t),e)),i},c=function(e){var t=d(e.components);return a.createElement(o.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var i=e.components,l=e.mdxType,r=e.originalType,o=e.parentName,c=n(e,["components","mdxType","originalType","parentName"]),m=d(i),p=l,h=m["".concat(o,".").concat(p)]||m[p]||u[p]||r;return i?a.createElement(h,s(s({ref:t},c),{},{components:i})):a.createElement(h,s({ref:t},c))}));function h(e,t){var i=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var r=i.length,s=new Array(r);s[0]=p;var n={};for(var o in t)hasOwnProperty.call(t,o)&&(n[o]=t[o]);n.originalType=e,n[m]="string"==typeof e?e:l,s[1]=n;for(var d=2;d{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>n,toc:()=>d});var a=i(7462),l=(i(7294),i(3905));const r={},s="Read lists",n={unversionedId:"guides/readlists",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/readlists.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",frontMatter:{},sidebar:"docsSidebar",previous:{title:"Collections",permalink:"/docs/guides/collections"},next:{title:"Full Text Search",permalink:"/docs/guides/search"}},o={},d=[{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}],c={toc:d},m="wrapper";function u(e){let{components:t,...i}=e;return(0,l.kt)(m,(0,a.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"read-lists"},"Read lists"),(0,l.kt)("p",null,'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.'),(0,l.kt)("h2",{id:"adding-books-to-a-read-list"},"Adding books to a read list"),(0,l.kt)("p",null,"You can add a Book to a read list from the action menu icon ",(0,l.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,l.kt)("em",{parentName:"p"},"Add to read list"),"."),(0,l.kt)("p",null,"You can also select multiple books, and click on ",(0,l.kt)("em",{parentName:"p"},"Add to read list"),"."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/multiselect-add-readlist.png",style:{maxHeight:" 80px"}}),(0,l.kt)("p",null,"A dialog will show up, where you can either add books to an existing read list, or create a new read list."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/add-readlist-dialog.png",style:{maxHeight:" 300px"}}),(0,l.kt)("h2",{id:"finding-the-read-lists"},"Finding the Read Lists"),(0,l.kt)("p",null,"Read lists can be discovered or viewed in three ways:"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"Book details screen"),(0,l.kt)("li",{parentName:"ol"},'Viewing the libraries "By Read List"'),(0,l.kt)("li",{parentName:"ol"},"Searching in the search bar")),(0,l.kt)("h3",{id:"book-details-screen"},"Book details screen"),(0,l.kt)("p",null,"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."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/book-readlist-collapsed.png",style:{maxHeight:"300px"}}),(0,l.kt)("p",null,"Click on the panel to expand it and see the content of the read list."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/book-readlist-expanded.png",style:{maxHeight:"300px"}}),(0,l.kt)("h3",{id:"viewing-the-libraries-by-read-list"},'Viewing the libraries "By Read List"'),(0,l.kt)("p",null,'Only show read lists that exist in the library. Opening a read list goes to the "read list details" screen (see below).'),(0,l.kt)("img",{src:"/assets/media/guides/readlists/browse-readlists.png",style:{maxHeight:"100px"}}),(0,l.kt)("h2",{id:"read-list-details"},"Read List details"),(0,l.kt)("p",null,"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."),(0,l.kt)("h3",{id:"read-list-ordering"},"Read List ordering"),(0,l.kt)("p",null,"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."),(0,l.kt)("p",null,"Either click on the edit button on the read list card."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-card.png",style:{maxHeight:"300px"}}),(0,l.kt)("p",null,"Or click on the edit button from the read list details screen."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-button.png",style:{maxHeight:"60px"}}),(0,l.kt)("p",null,"A dialog will show up, where you can edit the read list's ordering."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-dialog.png",style:{maxHeight:"300px"}}),(0,l.kt)("p",null,"A manually ordered read list will be showing as such in the read list details screen."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-manual-ordering.png",style:{maxHeight:"50px"}}),(0,l.kt)("h3",{id:"edit-read-list-elements"},"Edit read list elements"),(0,l.kt)("p",null,"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."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-elements-button.png",style:{maxHeight:"80px"}}),(0,l.kt)("p",null,"The book cards will show two extra elements:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"a delete button, to remove the book from the read list"),(0,l.kt)("li",{parentName:"ul"},"a grip handle, which let you drag and drop books to reorder them (only available when the read list is manually ordered)")),(0,l.kt)("p",null,"Once you are done with your changes, click the tick in the top bar. Click the cross to discard your changes."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/readlist-edit-elements.png",style:{maxHeight:"400px"}}),(0,l.kt)("h2",{id:"deleting-a-read-list"},"Deleting a read list"),(0,l.kt)("p",null,"To delete a read list, look for the action menu icon ",(0,l.kt)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,l.kt)("em",{parentName:"p"},"Delete"),"."),(0,l.kt)("p",null,"This will not delete the items in the read list, nor your media files."),(0,l.kt)("h2",{id:"import-read-lists-from-comicrack"},"Import read lists from ComicRack"),(0,l.kt)("p",null,"You can import ComicRack reading lists in ",(0,l.kt)("inlineCode",{parentName:"p"},".cbl")," format from the ",(0,l.kt)("em",{parentName:"p"},"Import > Read List")," screen."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/import.png",style:{maxHeight:"400px"}}),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},".cbl")," files contain the following information:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"read list name"),(0,l.kt)("li",{parentName:"ul"},"books contained in the list, in order"),(0,l.kt)("li",{parentName:"ul"},"for each book:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},"name of the series it is part of"),(0,l.kt)("li",{parentName:"ul"},"volume of the series"),(0,l.kt)("li",{parentName:"ul"},"year of the series"),(0,l.kt)("li",{parentName:"ul"},"number of that book in the series")))),(0,l.kt)("p",null,"Komga will try to match each book in the list in the following way:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"part of a series named ",(0,l.kt)("inlineCode",{parentName:"li"},"Series")," or ",(0,l.kt)("inlineCode",{parentName:"li"},"Series (Volume)")),(0,l.kt)("li",{parentName:"ul"},"where the number matches")),(0,l.kt)("p",null,"The result will be shown after you click the ",(0,l.kt)("em",{parentName:"p"},"Match")," button."),(0,l.kt)("img",{src:"/assets/media/guides/readlists/import-results.png",style:{maxHeight:"500px"}}),(0,l.kt)("p",null,"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."),(0,l.kt)("p",null,"Click ",(0,l.kt)("em",{parentName:"p"},"Create")," to create the read list. If some books are unmatched, you can still create the read list (a confirmation dialog will pop-up)."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ebc1cc14.5536558a.js b/assets/js/ebc1cc14.4f413112.js similarity index 99% rename from assets/js/ebc1cc14.5536558a.js rename to assets/js/ebc1cc14.4f413112.js index 6f4c8d00..5bc2836a 100644 --- a/assets/js/ebc1cc14.5536558a.js +++ b/assets/js/ebc1cc14.4f413112.js @@ -1 +1 @@ -"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[8284],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>y});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function s(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),p=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},d=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=p(r),m=n,y=u["".concat(l,".").concat(m)]||u[m]||c[m]||o;return r?a.createElement(y,s(s({ref:t},d),{},{components:r})):a.createElement(y,s({ref:t},d))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:n,s[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var a=r(7462),n=(r(7294),r(3905));const o={},s="Read with Panels on iOS",i={unversionedId:"guides/panels",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/panels.md",tags:[],version:"current",lastUpdatedAt:1701146710,formattedLastUpdatedAt:"Nov 28, 2023",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"}},l={},p=[{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}],d={toc:p},u="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"read-with-panels-on-ios"},"Read with Panels on iOS"),(0,n.kt)("h2",{id:"background"},"Background"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://apps.apple.com/us/app/panels-comic-reader/id1236567663"},"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."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"Please note that Panels OPDS support requires either a Panels+ subscription or Panels in-app purchase.")),(0,n.kt)("h2",{id:"adding-your-komga-server-to-panels"},"Adding your Komga server to Panels"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"To add a new OPDS feed, open Panels and go to Library -> Connect Service -> OPDS."),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/01.png",style:{maxHeight:"800px"}}),(0,n.kt)("p",null,"You'll be taken to the OPDS configuration screen. Give any name to your server, then enter your ",(0,n.kt)("em",{parentName:"p"},"server address"),", ",(0,n.kt)("em",{parentName:"p"},"username"),", and ",(0,n.kt)("em",{parentName:"p"},"password"),". Tap on ",(0,n.kt)("em",{parentName:"p"},"Apply"),". "),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/02.png",style:{maxHeight:"800px"}}),(0,n.kt)("p",null,"Your Komga server should now appear both as a new library and as a new Import Service. Let's explore both options."),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/03.png",style:{maxHeight:"800px"}}),(0,n.kt)("h2",{id:"komga-as-import-service"},"Komga as Import Service"),(0,n.kt)("p",null,"You can use this method if you plan to use your Komga server mainly to import (download) comics into your device. "),(0,n.kt)("p",null,"To add content to your library, you can follow either of these 2 flows:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"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.")),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/04.png"}),(0,n.kt)("ol",{start:2},(0,n.kt)("li",{parentName:"ol"},'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.')),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/05.png"}),(0,n.kt)("p",null,'From either of the above flows above, your download should start and be visible from the "Downloads" tab.'),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/06.png",style:{maxHeight:"800px"}}),(0,n.kt)("h2",{id:"komga-as-a-library"},"Komga as a Library"),(0,n.kt)("p",null,"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."),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/07.png"}))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[8284],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>y});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function s(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),p=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},d=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=p(r),m=n,y=u["".concat(l,".").concat(m)]||u[m]||c[m]||o;return r?a.createElement(y,s(s({ref:t},d),{},{components:r})):a.createElement(y,s({ref:t},d))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,s=new Array(o);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:n,s[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>p});var a=r(7462),n=(r(7294),r(3905));const o={},s="Read with Panels on iOS",i={unversionedId:"guides/panels",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,editUrl:"https://github.com/gotson/komga-website/tree/master/docs/guides/panels.md",tags:[],version:"current",lastUpdatedAt:1701158320,formattedLastUpdatedAt:"Nov 28, 2023",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"}},l={},p=[{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}],d={toc:p},u="wrapper";function c(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"read-with-panels-on-ios"},"Read with Panels on iOS"),(0,n.kt)("h2",{id:"background"},"Background"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://apps.apple.com/us/app/panels-comic-reader/id1236567663"},"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."),(0,n.kt)("admonition",{type:"caution"},(0,n.kt)("p",{parentName:"admonition"},"Please note that Panels OPDS support requires either a Panels+ subscription or Panels in-app purchase.")),(0,n.kt)("h2",{id:"adding-your-komga-server-to-panels"},"Adding your Komga server to Panels"),(0,n.kt)("p",null,"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."),(0,n.kt)("p",null,"To add a new OPDS feed, open Panels and go to Library -> Connect Service -> OPDS."),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/01.png",style:{maxHeight:"800px"}}),(0,n.kt)("p",null,"You'll be taken to the OPDS configuration screen. Give any name to your server, then enter your ",(0,n.kt)("em",{parentName:"p"},"server address"),", ",(0,n.kt)("em",{parentName:"p"},"username"),", and ",(0,n.kt)("em",{parentName:"p"},"password"),". Tap on ",(0,n.kt)("em",{parentName:"p"},"Apply"),". "),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/02.png",style:{maxHeight:"800px"}}),(0,n.kt)("p",null,"Your Komga server should now appear both as a new library and as a new Import Service. Let's explore both options."),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/03.png",style:{maxHeight:"800px"}}),(0,n.kt)("h2",{id:"komga-as-import-service"},"Komga as Import Service"),(0,n.kt)("p",null,"You can use this method if you plan to use your Komga server mainly to import (download) comics into your device. "),(0,n.kt)("p",null,"To add content to your library, you can follow either of these 2 flows:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"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.")),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/04.png"}),(0,n.kt)("ol",{start:2},(0,n.kt)("li",{parentName:"ol"},'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.')),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/05.png"}),(0,n.kt)("p",null,'From either of the above flows above, your download should start and be visible from the "Downloads" tab.'),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/06.png",style:{maxHeight:"800px"}}),(0,n.kt)("h2",{id:"komga-as-a-library"},"Komga as a Library"),(0,n.kt)("p",null,"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."),(0,n.kt)("img",{src:"/assets/media/guides/panels-setup/07.png"}))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.83279a84.js b/assets/js/main.83279a84.js deleted file mode 100644 index e7d54665..00000000 --- a/assets/js/main.83279a84.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.83279a84.js.LICENSE.txt */ -(self.webpackChunkkomga_website=self.webpackChunkkomga_website||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"01dfd4e6":[()=>n.e(7694).then(n.bind(n,5903)),"@site/docs/guides/server-settings.md",5903],"03c48fcb":[()=>n.e(5037).then(n.bind(n,5371)),"@site/docs/guides/collections.md",5371],"04262cfc":[()=>n.e(3861).then(n.t.bind(n,4698,19)),"~docs/default/category-docs-docssidebar-category-readers-e2b.json",4698],"0480b142":[()=>n.e(836).then(n.bind(n,3584)),"@site/docs/faq.md",3584],"08fb5848":[()=>n.e(2865).then(n.bind(n,7223)),"@site/blog/2023-03-21-prepare-v1.md?truncated=true",7223],"0920ba86":[()=>n.e(2239).then(n.bind(n,9927)),"@site/docs/guides/user-accounts.md",9927],"0bf9748d":[()=>n.e(9847).then(n.bind(n,7257)),"@site/docs/guides/scan-analysis-refresh.md",7257],"0c5c2428":[()=>n.e(6236).then(n.bind(n,9189)),"@site/docs/installation/jar.md",9189],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(8105),n.e(7918)]).then(n.bind(n,5154)),"@theme/DocItem",5154],"1bb85636":[()=>n.e(9844).then(n.bind(n,3728)),"@site/docs/guides/chunky.md",3728],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1c21263c":[()=>n.e(563).then(n.t.bind(n,9287,19)),"~docs/default/category-docs-docssidebar-category-installation-c5d.json",9287],"1df93b7f":[()=>Promise.all([n.e(532),n.e(3237)]).then(n.bind(n,8391)),"@site/src/pages/index.tsx",8391],"1ec3b236":[()=>n.e(7021).then(n.bind(n,6720)),"@site/docs/guides/cli.md",6720],"206b31bb":[()=>n.e(1778).then(n.bind(n,3473)),"@site/docs/guides/oneshots.md",3473],24227623:[()=>n.e(2854).then(n.bind(n,6462)),"@site/docs/guides/read-progress.md",6462],"25088eef":[()=>n.e(8315).then(n.t.bind(n,2233,19)),"~blog/default/blog-tags-upgrade-101-list.json",2233],"2b8f2de1":[()=>n.e(9925).then(n.bind(n,7574)),"@site/docs/guides/opds.md",7574],"2c957fd7":[()=>n.e(855).then(n.t.bind(n,3769,19)),"/home/runner/work/komga-website/komga-website/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"3fda2baf":[()=>n.e(7547).then(n.t.bind(n,1621,19)),"~blog/default/blog-tags-upgrade-101.json",1621],"416fe654":[()=>n.e(7214).then(n.bind(n,421)),"@site/docs/contribution.md",421],"41a2af15":[()=>n.e(1698).then(n.t.bind(n,4469,19)),"/home/runner/work/komga-website/komga-website/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],"49136dfa":[()=>n.e(473).then(n.bind(n,7703)),"@site/docs/guides/import-books.md",7703],"4c25ac78":[()=>n.e(2727).then(n.bind(n,1e3)),"@site/docs/guides/edit-metadata.md",1e3],"4cc4731f":[()=>n.e(1169).then(n.bind(n,3342)),"@site/docs/installation/thirdparty.md",3342],"4e7428db":[()=>n.e(9835).then(n.t.bind(n,7821,19)),"~blog/default/blog-tags-komga-ec4.json",7821],"55519d27":[()=>n.e(4114).then(n.bind(n,4709)),"@site/docs/guides/libraries.md",4709],"5592dbb1":[()=>n.e(8336).then(n.bind(n,3902)),"@site/docs/guides/desktop.md",3902],"58903ab2":[()=>n.e(6399).then(n.bind(n,3558)),"@site/docs/installation/desktop.md",3558],"59c4a0ab":[()=>n.e(7583).then(n.t.bind(n,5570,19)),"~docs/default/category-docs-docssidebar-category-official-methods-a27.json",5570],"5e80a3fb":[()=>n.e(5370).then(n.t.bind(n,6072,19)),"~blog/default/blog-tags-komga-ec4-list.json",6072],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ef0e9d6":[()=>n.e(9880).then(n.bind(n,5330)),"@site/docs/community.md",5330],"607df45e":[()=>n.e(9112).then(n.bind(n,2739)),"@site/docs/installation/gdrive.md",2739],"674e178f":[()=>n.e(5203).then(n.bind(n,3565)),"@site/docs/guides/cdisplayex.md",3565],"6875c492":[()=>Promise.all([n.e(532),n.e(8105),n.e(6048),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"767395cb":[()=>n.e(3526).then(n.bind(n,2463)),"@site/docs/installation/https.md",2463],"78978b71":[()=>n.e(632).then(n.t.bind(n,5745,19)),"/home/runner/work/komga-website/komga-website/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"7d6e8713":[()=>n.e(3620).then(n.bind(n,2421)),"@site/docs/guides/webreader.md",2421],"7da97648":[()=>n.e(5671).then(n.bind(n,5888)),"@site/docs/guides/tachiyomi.md",5888],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"896f20ab":[()=>n.e(7426).then(n.t.bind(n,5414,19)),"~blog/default/blog-tags-breaking-change-d5e-list.json",5414],"8badb5d4":[()=>n.e(3562).then(n.bind(n,9418)),"@site/docs/guides/image-formats.md",9418],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"97c4f258":[()=>n.e(305).then(n.bind(n,8054)),"@site/docs/installation/configuration.md",8054],"98ce5054":[()=>n.e(8209).then(n.bind(n,8288)),"@site/docs/guides/local-artwork-assets.md",8288],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],a09c2993:[()=>n.e(4128).then(n.bind(n,8495)),"@site/docs/introduction.md",8495],a22ccb60:[()=>n.e(9353).then(n.bind(n,2191)),"@site/docs/api/deprecation.md",2191],a624e12b:[()=>n.e(3287).then(n.bind(n,5456)),"@site/docs/installation/oauth2.md",5456],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(8105),n.e(6048),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],a981d65e:[()=>n.e(5674).then(n.bind(n,5373)),"@site/docs/guides/trash.md",5373],ac07380c:[()=>n.e(4434).then(n.bind(n,5917)),"@site/docs/installation/docker.md",5917],b242fde9:[()=>n.e(5647).then(n.bind(n,4446)),"@site/docs/guides/duplicate-files.md",4446],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b94207ad:[()=>n.e(4443).then(n.bind(n,5235)),"@site/docs/installation/ms-store.md",5235],b94d24b4:[()=>n.e(6826).then(n.bind(n,3113)),"@site/docs/guides/announcements.md",3113],b9a7991f:[()=>n.e(3817).then(n.t.bind(n,2954,19)),"~blog/default/blog-tags-breaking-change-d5e.json",2954],c2d7cd96:[()=>n.e(7972).then(n.bind(n,7094)),"@site/docs/guides/search.md",7094],ca683365:[()=>n.e(3438).then(n.bind(n,4294)),"@site/docs/guides/theme.md",4294],ccc49370:[()=>Promise.all([n.e(532),n.e(8105),n.e(6048),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],cfba0797:[()=>n.e(4578).then(n.t.bind(n,5202,19)),"~docs/default/category-docs-docssidebar-category-guides-24e.json",5202],d135d818:[()=>n.e(4119).then(n.bind(n,6127)),"@site/docs/guides/duplicate-pages.md",6127],d6e0cd3c:[()=>n.e(278).then(n.bind(n,4801)),"@site/docs/guides/webui.md",4801],d86518ca:[()=>n.e(5416).then(n.bind(n,2706)),"@site/docs/guides/paperback.md",2706],df8142cd:[()=>n.e(5035).then(n.bind(n,1429)),"@site/docs/api/rest.md",1429],e1862fee:[()=>n.e(5880).then(n.bind(n,1797)),"@site/blog/2023-03-21-prepare-v1.md",1797],e41126ef:[()=>n.e(6383).then(n.bind(n,6892)),"@site/docs/guides/readlists.md",6892],ebc1cc14:[()=>n.e(8284).then(n.bind(n,8055)),"@site/docs/guides/panels.md",8055]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("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%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("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"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],h=(0,u.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));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 o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/blog",component:f("/blog","e7d"),exact:!0},{path:"/blog/archive",component:f("/blog/archive","186"),exact:!0},{path:"/blog/prepare-v1",component:f("/blog/prepare-v1","04b"),exact:!0},{path:"/blog/tags",component:f("/blog/tags","1cb"),exact:!0},{path:"/blog/tags/breaking-change",component:f("/blog/tags/breaking-change","d1b"),exact:!0},{path:"/blog/tags/komga",component:f("/blog/tags/komga","506"),exact:!0},{path:"/blog/tags/upgrade",component:f("/blog/tags/upgrade","173"),exact:!0},{path:"/docs",component:f("/docs","92b"),routes:[{path:"/docs/api/deprecation",component:f("/docs/api/deprecation","ea6"),exact:!0,sidebar:"api"},{path:"/docs/api/rest",component:f("/docs/api/rest","814"),exact:!0,sidebar:"api"},{path:"/docs/category/guides",component:f("/docs/category/guides","277"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/category/installation",component:f("/docs/category/installation","801"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/category/official-methods",component:f("/docs/category/official-methods","39e"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/category/readers",component:f("/docs/category/readers","afc"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/community",component:f("/docs/community","6ef"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/contribution",component:f("/docs/contribution","eac"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/faq",component:f("/docs/faq","76c"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/announcements",component:f("/docs/guides/announcements","3df"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/cdisplayex",component:f("/docs/guides/cdisplayex","1d6"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/chunky",component:f("/docs/guides/chunky","a82"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/cli",component:f("/docs/guides/cli","871"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/collections",component:f("/docs/guides/collections","b98"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/desktop",component:f("/docs/guides/desktop","b77"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/duplicate-files",component:f("/docs/guides/duplicate-files","c0c"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/duplicate-pages",component:f("/docs/guides/duplicate-pages","1e7"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/edit-metadata",component:f("/docs/guides/edit-metadata","e6b"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/image-formats",component:f("/docs/guides/image-formats","0b3"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/import-books",component:f("/docs/guides/import-books","eb3"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/libraries",component:f("/docs/guides/libraries","6e3"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/local-artwork-assets",component:f("/docs/guides/local-artwork-assets","a67"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/oneshots",component:f("/docs/guides/oneshots","16a"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/opds",component:f("/docs/guides/opds","48e"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/panels",component:f("/docs/guides/panels","65d"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/paperback",component:f("/docs/guides/paperback","faa"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/read-progress",component:f("/docs/guides/read-progress","728"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/readlists",component:f("/docs/guides/readlists","7b4"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/scan-analysis-refresh",component:f("/docs/guides/scan-analysis-refresh","573"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/search",component:f("/docs/guides/search","d87"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/server-settings",component:f("/docs/guides/server-settings","887"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/tachiyomi",component:f("/docs/guides/tachiyomi","fe9"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/theme",component:f("/docs/guides/theme","281"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/trash",component:f("/docs/guides/trash","109"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/user-accounts",component:f("/docs/guides/user-accounts","e75"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/webreader",component:f("/docs/guides/webreader","112"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/guides/webui",component:f("/docs/guides/webui","269"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/configuration",component:f("/docs/installation/configuration","1f3"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/desktop",component:f("/docs/installation/desktop","5d2"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/docker",component:f("/docs/installation/docker","244"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/gdrive",component:f("/docs/installation/gdrive","6e6"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/https",component:f("/docs/installation/https","965"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/jar",component:f("/docs/installation/jar","08e"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/ms-store",component:f("/docs/installation/ms-store","c78"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/oauth2",component:f("/docs/installation/oauth2","dd6"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/installation/thirdparty",component:f("/docs/installation/thirdparty","9c4"),exact:!0,sidebar:"docsSidebar"},{path:"/docs/introduction",component:f("/docs/introduction","178"),exact:!0,sidebar:"docsSidebar"}]},{path:"/",component:f("/","780"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},7221:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),h=n(2263),g=n(4996),b=n(6668),v=n(1944),y=n(4711),w=n(9727),k=n(3320),E=n(8780),S=n(197);function x(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,u.TH)();return e+(0,E.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(_,null),r.createElement(x,null),r.createElement(S.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const T=new Map;function A(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),R=n(8940);function P(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()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)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:a}),P("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?P("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=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(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 r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const D=I,M="__docusaurus-base-url-issue-banner-container",B="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container",j="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${j}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${j}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\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(/{window[j]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,z(e))),r.createElement("div",{id:M}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement(U,null):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var H=n(4763),G=n(2389);function Z(){const e=(0,G.Z)();return r.createElement(m.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function V(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(H.Z,null,r.createElement(R.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(q,null),r.createElement(C,null),r.createElement($,null),r.createElement(D,{location:A(t)},e)),r.createElement(Z,null))))}var W=n(6887);const K=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 a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.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 Y=n(9670);const Q=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Q.has(e))(e))return!1;Q.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee);if(l.Z.canUseDOM){window.docusaurus=te;const e=a.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(V,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=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/libraries","path":"/docs/guides/libraries","sidebar":"docsSidebar"},{"id":"guides/local-artwork-assets","path":"/docs/guides/local-artwork-assets","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/tachiyomi","path":"/docs/guides/tachiyomi","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 l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.4.3"}}}'),c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(9037);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(c,{error:t}))}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function u(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(u,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.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??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),c=n(412);const u=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:k}=(0,d.C)(),E=(0,a.useContext)(u),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const x=f||p;const _=(0,s.Z)(x),C=x?.replace("pathname://","");let T=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;T&&_&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const L=(0,a.useRef)(!1),R=n?o.OL:o.rU,P=c.Z.canUseIntersectionObserver,N=(0,a.useRef)(),O=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,a.useEffect)((()=>(!P&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{P&&N.current&&N.current.disconnect()})),[N,T,P,_]);const I=T?.startsWith("#")??!1,D=!T||!_||I;return D||g||E.collectLink(T),D?a.createElement("a",(0,r.Z)({ref:S,href:T},x&&!_&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(R,(0,r.Z)({},v,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,P&&e&&_&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T},n&&{isActive:h,activeClassName:m}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);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 o=n(7529);function i(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 o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(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:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>m,_r:()=>d,Jo:()=>v,zh:()=>f,yW:()=>g,gB:()=>h});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&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 o}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return f(e).versions}function g(e){const t=f(e);return l(t)}function b(e){const t=f(e),{pathname:n}=(0,r.TH)();return c(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("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"}))}},9037:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Rt});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),l=n(7462),s=n(6550),c=n(5999),u=n(5936);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.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,c.I)({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:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:v.skipToContent})}var w=n(6668),k=n(9689);function E(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(C,{className:T.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:T.announcementBarClose}))}var L=n(2961),R=n(2466);var P=n(902),N=n(3102);const O=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,N.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,P.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(O.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(O);if(!e)throw new P.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,N.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function B(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var F=n(2949),j=n(2389);function z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 U(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,j.Z)(),s=(0,c.I)({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"===o?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)($.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",$.toggleButton,!l&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(U,{className:(0,a.Z)($.toggleIcon,$.darkToggleIcon)})))}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,F.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var V=n(1327);function W(){return r.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({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()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function Y(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(Z,{className:"margin-right--md"}),r.createElement(K,null))}var Q=n(9960),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const f=(0,X.Z)(a),p=(0,X.Z)(t),m=(0,X.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,J.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(te.Z,c&&{width:12,height:12}))};return o?r.createElement(Q.Z,(0,l.Z)({href:u?m:o},d,g)):r.createElement(Q.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const c=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.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)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(qe,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),p()}}),c.children??c.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(qe,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ue;return r.createElement(a,n)}var pe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("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 he="iconLanguage_nlXk";function ge(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var be=n(830),ve=["translations"];function ye(){return ye=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Se="Ctrl";var xe=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=Ee(e,ve),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,c=void 0===s?"Search":s,u=we((0,r.useState)(null),2),d=u[0],f=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Se))}),[]),r.createElement("button",ye({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(be.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?r.createElement(ge,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),_e=n(5742);const Ce="q";function Te(){const{withBaseUrl:e}=(0,X.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=function(){const{siteConfig:{themeConfig:e}}=(0,se.Z)();return e}();return(0,r.useCallback)((r=>{const a=new URL(r);if(ee(t,a.href))return r;const o=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(o,n))}),[e,t,n])}var Ae=n(3320);var Le=n(3935);const Re={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({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,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({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,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({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,c.I)({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,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Pe=null;function Ne(e){let{hit:t,children:n}=e;return r.createElement(Q.Z,{to:t.url},n)}function Oe(e){let{state:t,onClose:n}=e;const a=function(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,se.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${Ce}=${encodeURIComponent(t)}`),[e,n])}();return r.createElement(Q.Z,{to:a(t.query),onClick:n},r.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Ie(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,se.Z)(),c=Te(),u=function(){const{locale:e,tags:t}=(0,Ae._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(u,d):d,p={...o.searchParameters,facetFilters:f},m=(0,s.k6)(),h=(0,r.useRef)(null),g=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Pe?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,1426)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Pe=t}))),[]),E=(0,r.useCallback)((()=>{k().then((()=>{h.current=document.createElement("div"),document.body.insertBefore(h.current,document.body.firstChild),v(!0)}))}),[k,v]),S=(0,r.useCallback)((()=>{v(!1),h.current?.remove()}),[v]),x=(0,r.useCallback)((e=>{k().then((()=>{v(!0),w(e.key)}))}),[k,v,w]),_=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;ee(a,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:c(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>r.createElement(Oe,(0,l.Z)({},e,{onClose:S}))),[S]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=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?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:b,onOpen:E,onClose:S,onInput:x,searchButtonRef:g}),r.createElement(r.Fragment,null,r.createElement(_e.Z,null,r.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(xe,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:E,ref:g,translations:Re.button}),b&&Pe&&h.current&&(0,Le.createPortal)(r.createElement(Pe,(0,l.Z)({onClose:S,initialScrollY:window.scrollY,initialQuery:y,navigator:_,transformItems:C,hitComponent:Ne,transformSearchClient:A},o.searchPagePath&&{resultsFooterComponent:T},o,{searchParameters:p,placeholder:Re.placeholder,translations:Re.modal})),h.current))}function De(){const{siteConfig:e}=(0,se.Z)();return r.createElement(Ie,e.themeConfig.algolia)}const Me={searchBox:"searchBox_ZlJk"};function Be(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,Me.searchBox)},t)}var Fe=n(143),je=n(2802);var ze=n(373);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const $e={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,s.TH)(),h=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;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":""}})),...a],g=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:he}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Be,{className:n},r.createElement(De,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Fe.Iw)(a),s=(0,je.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Fe.Iw)(a),s=(0,je.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,je.lO)(a)[0],s=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,Fe.Iw)(n),m=(0,Fe.gB)(n),{savePreferredVersionName:h}=(0,ze.J)(n),g=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...i],b=(0,je.lO)(n)[0],v=t&&g.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&g.length>1?void 0:Ue(b).path;return g.length<=1?r.createElement(oe,(0,l.Z)({},u,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.Z)({},u,{mobile:t,label:v,to:y,items:g,isActive:a?()=>!1:void 0}))}};function qe(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=$e[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function He(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(qe,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ge(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{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)"},"\u2190 Back to main menu"))}function Ze(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Ge,{onClick:()=>t.hide()}),t.content)}function Ve(){const e=(0,L.e)();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?r.createElement(B,{header:r.createElement(Y,null),primaryMenu:r.createElement(He,null),secondaryMenu:r.createElement(Ze,null)}):null}const We={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ke(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ye(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[We.navbarHideable,!s&&We.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ke,{onClick:i.toggle}),r.createElement(Ve,null))}var Qe=n(8780);const Xe={errorBoundaryError:"errorBoundaryError_a6uf"};function Je(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function et(e){let{error:t}=e;const n=(0,Qe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Xe.errorBoundaryError},n)}class tt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const nt="right";function rt(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function at(){const{toggle:e,shown:t}=(0,L.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({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"},r.createElement(rt,null))}const ot={colorModeToggle:"colorModeToggle_DEke"};function it(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(tt,{key:t,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})},r.createElement(qe,e)))))}function lt(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function st(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??nt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(lt,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(at,null),r.createElement(W,null),r.createElement(it,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(it,{items:a}),r.createElement(Z,{className:ot.colorModeToggle}),!o&&r.createElement(Be,null,r.createElement(De,null)))})}function ct(){return r.createElement(Ye,null,r.createElement(st,null))}function ut(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,c=(0,X.Z)(n),u=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Q.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:c},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function dt(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(ut,{item:t}))}function ft(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(dt,{key:t,item:e})))))}function pt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(ft,{key:t,column:e}))))}function mt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function ht(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(ut,{item:t})}function gt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(ht,{item:e}),t.length!==n+1&&r.createElement(mt,null))))))}function bt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(pt,{columns:t}):r.createElement(gt,{links:t})}var vt=n(941);const yt={footerLogoLink:"footerLogoLink_BH7S"};function wt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(vt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?r.createElement(Q.Z,{href:t.href,className:yt.footerLogoLink,target:t.target},r.createElement(wt,{logo:t})):r.createElement(wt,{logo:t})}function Et(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function St(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function xt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(St,{style:o,links:n&&n.length>0&&r.createElement(bt,{links:n}),logo:a&&r.createElement(kt,{logo:a}),copyright:t&&r.createElement(Et,{copyright:t})})}const _t=r.memo(xt),Ct=(0,P.Qc)([F.S,k.pl,R.OC,ze.L5,i.VC,function(e){let{children:t}=e;return r.createElement(N.n2,null,r.createElement(L.M,null,r.createElement(I,null,t)))}]);function Tt(e){let{children:t}=e;return r.createElement(Ct,null,t)}function At(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Je,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(et,{error:t})))))}const Lt={mainWrapper:"mainWrapper_z2l0"};function Rt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:c}=e;return(0,b.t)(),r.createElement(Tt,null,r.createElement(i.d,{title:s,description:c}),r.createElement(y,null),r.createElement(A,null),r.createElement(ct,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Lt.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(At,e)},t)),!n&&r.createElement(_t,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:c}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(c?.href||"/"),h=n?"":t,g=c?.alt??h;return a.createElement(o.Z,(0,r.Z)({to:m},p,c?.target&&{target:c.target}),c&&a.createElement(u,{logo:c,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],u)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>g});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?c:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??l}`,height:`${t}px`}}function s(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?c:u}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const c=(0,a.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:o}),a.createElement(t,{ref:c,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(c.current,n),i?.(n))},className:l},r)}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const r=t?h:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{o(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),c="theme",u=(0,i.WA)(c),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{u.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(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||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>g,Oh:()=>y});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),c=n(12);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(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,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(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,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function y(){const e=(0,a._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(null===e)throw new a.i6("DocsVersionProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(6550),l=(n(1688),n(902));function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(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(6668);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,c.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const u=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(u.Provider,{value:n},t)}function p(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function c(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-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",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:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{MN:()=>_,Wl:()=>m,_F:()=>v,cE:()=>f,jA:()=>h,xz:()=>p,hI:()=>x,lO:()=>k,vY:()=>S,oz:()=>E,s1:()=>w});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(4477),c=n(1116);function u(e){return Array.from(new Set(e))}var d=n(8596);const f=!!i._r;function p(e){const t=(0,s.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function m(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=m(t);if(e)return e}}}function h(){const{pathname:e}=(0,a.TH)(),t=(0,c.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({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 g=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||b(e.items,t))}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function E(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 S(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- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function x(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:c}}function _(e){return e.filter((e=>"category"!==e.type||!!m(e)))}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),c=n(2263);function u(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const u=function(e){const{siteConfig:t}=(0,c.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return 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 s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(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 r.createElement(l.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"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 a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),a=n(2263),o=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(7294),n(1688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"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,i||(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),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){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}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),a=n(6550),o=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.Z)(),{pathname:s}=(0,a.TH)(),c=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),u=l===i?e:e.replace(`/${l}/`,"/"),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}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>p,PP:()=>A,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(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,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!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,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,h(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={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},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[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 a=p(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=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,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;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 a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}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=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{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)*a(Math.random()*t,.1,.95)),t=a(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 a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),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 l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=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,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[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===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,C=1;if(v){if(!(_=o(k,S,e,b))||_.index>=e.length)break;var T=_.index,A=_.index+_[0].length,L=S;for(L+=E.value.length;T>=L;)L+=(E=E.next).value.length;if(S=L-=E.value.length,E.value instanceof a)continue;for(var R=E;R!==t.tail&&(Ld.reach&&(d.reach=I);var D=E.prev;if(N&&(D=s(t,D,N),S+=N.length),c(t,D,C),E=s(t,D,new a(f,g?r.tokenize(P,g):P,y,P)),O&&s(t,E,O),C>1){var M={cause:f+","+m,reach:I};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,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+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},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|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|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|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 a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return u[n]=a,n})).join(""),n,r),f=Object.keys(u);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),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],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,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})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.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"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var f,p=r(s),m=u;a(m);){for(var h in f={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(f[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in p(b))if(v in u){f[b]=!0;break}for(var y in m=f)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var f=i(u.map((function(e){var t=c(e);return delete s[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var u in n)c(u);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=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 l.name="Invariant Violation",l}}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:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n