codex 1.8.0a2__py3-none-any.whl → 1.8.0a3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of codex might be problematic. Click here for more details.

Files changed (477) hide show
  1. codex/choices/admin.py +4 -4
  2. codex/choices/statii.py +1 -1
  3. codex/librarian/covers/status.py +1 -1
  4. codex/librarian/librariand.py +2 -0
  5. codex/librarian/scribe/importer/const.py +8 -0
  6. codex/librarian/scribe/importer/create/foreign_keys.py +1 -1
  7. codex/librarian/scribe/importer/delete/covers.py +3 -1
  8. codex/librarian/scribe/importer/failed/__init__.py +1 -0
  9. codex/librarian/scribe/importer/failed/create.py +97 -0
  10. codex/librarian/scribe/importer/failed/failed.py +54 -0
  11. codex/librarian/scribe/importer/failed/query.py +100 -0
  12. codex/librarian/scribe/importer/init.py +2 -2
  13. codex/librarian/scribe/importer/link/covers.py +1 -1
  14. codex/librarian/scribe/importer/read/aggregate_path.py +4 -2
  15. codex/librarian/scribe/importer/search/__init__.py +1 -1
  16. codex/librarian/scribe/importer/search/update.py +20 -9
  17. codex/librarian/scribe/importer/statii/__init__.py +2 -0
  18. codex/librarian/scribe/importer/statii/failed.py +50 -0
  19. codex/librarian/scribe/importer/status.py +0 -12
  20. codex/librarian/scribe/janitor/janitor.py +13 -5
  21. codex/librarian/scribe/janitor/status.py +3 -2
  22. codex/librarian/scribe/search/optimize.py +1 -2
  23. codex/librarian/scribe/search/remove.py +2 -2
  24. codex/librarian/scribe/search/status.py +8 -8
  25. codex/librarian/scribe/search/sync.py +10 -3
  26. codex/librarian/scribe/status.py +2 -1
  27. codex/librarian/status.py +5 -5
  28. codex/librarian/status_controller.py +41 -20
  29. codex/librarian/watchdog/const.py +30 -1
  30. codex/librarian/watchdog/emitter.py +26 -34
  31. codex/librarian/watchdog/event_batcherd.py +18 -14
  32. codex/librarian/watchdog/observers.py +11 -15
  33. codex/migrations/0035_alter_librarianstatus_status_type.py +72 -0
  34. codex/startup/__init__.py +1 -1
  35. codex/static_root/assets/{VCheckbox-DSndl51k.1e28c443c3cb.js → VCheckbox-DOvv8UEO.e3653c1670c8.js} +1 -1
  36. codex/static_root/assets/VCheckbox-DOvv8UEO.e3653c1670c8.js.br +0 -0
  37. codex/static_root/assets/VCheckbox-DOvv8UEO.e3653c1670c8.js.gz +0 -0
  38. codex/static_root/assets/{VCheckbox-DSndl51k.js → VCheckbox-DOvv8UEO.js} +1 -1
  39. codex/static_root/assets/VCheckbox-DOvv8UEO.js.br +0 -0
  40. codex/static_root/assets/VCheckbox-DOvv8UEO.js.gz +0 -0
  41. codex/static_root/assets/{VCheckboxBtn-Bu2Pf64q.d7463473d7a2.js → VCheckboxBtn-BeZZDumo.59731a32657e.js} +1 -1
  42. codex/static_root/assets/VCheckboxBtn-BeZZDumo.59731a32657e.js.br +0 -0
  43. codex/static_root/assets/VCheckboxBtn-BeZZDumo.59731a32657e.js.gz +0 -0
  44. codex/static_root/assets/{VCheckboxBtn-Bu2Pf64q.js → VCheckboxBtn-BeZZDumo.js} +1 -1
  45. codex/static_root/assets/VCheckboxBtn-BeZZDumo.js.br +0 -0
  46. codex/static_root/assets/VCheckboxBtn-BeZZDumo.js.gz +0 -0
  47. codex/static_root/assets/{VCombobox-Uogv6Ckp.9f900e703605.js → VCombobox-BRJRW2px.369544360b22.js} +1 -1
  48. codex/static_root/assets/VCombobox-BRJRW2px.369544360b22.js.br +0 -0
  49. codex/static_root/assets/VCombobox-BRJRW2px.369544360b22.js.gz +0 -0
  50. codex/static_root/assets/{VCombobox-Uogv6Ckp.js → VCombobox-BRJRW2px.js} +1 -1
  51. codex/static_root/assets/VCombobox-BRJRW2px.js.br +0 -0
  52. codex/static_root/assets/VCombobox-BRJRW2px.js.gz +0 -0
  53. codex/static_root/assets/{VDialog-BzaGu1HN.34f52763c3f8.js → VDialog-D_vkvatj.83e078fa850c.js} +1 -1
  54. codex/static_root/assets/VDialog-D_vkvatj.83e078fa850c.js.br +0 -0
  55. codex/static_root/assets/VDialog-D_vkvatj.83e078fa850c.js.gz +0 -0
  56. codex/static_root/assets/{VDialog-BzaGu1HN.js → VDialog-D_vkvatj.js} +1 -1
  57. codex/static_root/assets/VDialog-D_vkvatj.js.br +0 -0
  58. codex/static_root/assets/VDialog-D_vkvatj.js.gz +0 -0
  59. codex/static_root/assets/{VDivider-C3ikm0Ko.4938e9ced53e.js → VDivider-BH2Oj58Z.83d2c907faff.js} +1 -1
  60. codex/static_root/assets/VDivider-BH2Oj58Z.83d2c907faff.js.br +0 -0
  61. codex/static_root/assets/VDivider-BH2Oj58Z.83d2c907faff.js.gz +0 -0
  62. codex/static_root/assets/{VDivider-C3ikm0Ko.js → VDivider-BH2Oj58Z.js} +1 -1
  63. codex/static_root/assets/VDivider-BH2Oj58Z.js.br +0 -0
  64. codex/static_root/assets/VDivider-BH2Oj58Z.js.gz +0 -0
  65. codex/static_root/assets/{VExpansionPanels-AmsInZN0.5cb7c833de3d.js → VExpansionPanels-Ccv4gBFD.ed063db2e518.js} +1 -1
  66. codex/static_root/assets/VExpansionPanels-Ccv4gBFD.ed063db2e518.js.br +0 -0
  67. codex/static_root/assets/VExpansionPanels-Ccv4gBFD.ed063db2e518.js.gz +0 -0
  68. codex/static_root/assets/{VExpansionPanels-AmsInZN0.js → VExpansionPanels-Ccv4gBFD.js} +1 -1
  69. codex/static_root/assets/VExpansionPanels-Ccv4gBFD.js.br +0 -0
  70. codex/static_root/assets/VExpansionPanels-Ccv4gBFD.js.gz +0 -0
  71. codex/static_root/assets/{VForm-CyCdgusw.c737973a1e85.js → VForm-S5eiHGJ0.d304a07dc6d1.js} +1 -1
  72. codex/static_root/assets/VForm-S5eiHGJ0.d304a07dc6d1.js.br +0 -0
  73. codex/static_root/assets/VForm-S5eiHGJ0.d304a07dc6d1.js.gz +0 -0
  74. codex/static_root/assets/{VForm-CyCdgusw.js → VForm-S5eiHGJ0.js} +1 -1
  75. codex/static_root/assets/VForm-S5eiHGJ0.js.br +0 -0
  76. codex/static_root/assets/VForm-S5eiHGJ0.js.gz +0 -0
  77. codex/static_root/assets/{VRadioGroup-BF0Xjrzi.e54d2bf41bb2.js → VRadioGroup-CyCYk3Z_.4309dbf0173c.js} +1 -1
  78. codex/static_root/assets/VRadioGroup-CyCYk3Z_.4309dbf0173c.js.br +0 -0
  79. codex/static_root/assets/VRadioGroup-CyCYk3Z_.4309dbf0173c.js.gz +0 -0
  80. codex/static_root/assets/{VRadioGroup-BF0Xjrzi.js → VRadioGroup-CyCYk3Z_.js} +1 -1
  81. codex/static_root/assets/VRadioGroup-CyCYk3Z_.js.br +0 -0
  82. codex/static_root/assets/VRadioGroup-CyCYk3Z_.js.gz +0 -0
  83. codex/static_root/assets/{VSelect-Dv50OIkN.js → VSelect-BOhtkCV1.057479737b7f.js} +1 -1
  84. codex/static_root/assets/VSelect-BOhtkCV1.057479737b7f.js.br +0 -0
  85. codex/static_root/assets/VSelect-BOhtkCV1.057479737b7f.js.gz +0 -0
  86. codex/static_root/assets/{VSelect-Dv50OIkN.390adb1fe7fa.js → VSelect-BOhtkCV1.js} +1 -1
  87. codex/static_root/assets/VSelect-BOhtkCV1.js.br +0 -0
  88. codex/static_root/assets/VSelect-BOhtkCV1.js.gz +0 -0
  89. codex/static_root/assets/{VSelectionControl-DbKYScD5.js → VSelectionControl-CmXEFw20.e256f0d0f97d.js} +1 -1
  90. codex/static_root/assets/VSelectionControl-CmXEFw20.e256f0d0f97d.js.br +0 -0
  91. codex/static_root/assets/VSelectionControl-CmXEFw20.e256f0d0f97d.js.gz +0 -0
  92. codex/static_root/assets/{VSelectionControl-DbKYScD5.8d2ab1ebe546.js → VSelectionControl-CmXEFw20.js} +1 -1
  93. codex/static_root/assets/VSelectionControl-CmXEFw20.js.br +0 -0
  94. codex/static_root/assets/VSelectionControl-CmXEFw20.js.gz +0 -0
  95. codex/static_root/assets/{VTable-BmOfHc7J.b2e1311009d1.js → VTable-BDxzw_rH.24ce227e6076.js} +1 -1
  96. codex/static_root/assets/VTable-BDxzw_rH.24ce227e6076.js.br +0 -0
  97. codex/static_root/assets/VTable-BDxzw_rH.24ce227e6076.js.gz +0 -0
  98. codex/static_root/assets/{VTable-BmOfHc7J.js → VTable-BDxzw_rH.js} +1 -1
  99. codex/static_root/assets/VTable-BDxzw_rH.js.br +0 -0
  100. codex/static_root/assets/VTable-BDxzw_rH.js.gz +0 -0
  101. codex/static_root/assets/{VWindowItem-BLEDgagD.4b67c4a63c59.js → VWindowItem-CuDwxsEy.4d68002250ae.js} +1 -1
  102. codex/static_root/assets/VWindowItem-CuDwxsEy.4d68002250ae.js.br +0 -0
  103. codex/static_root/assets/VWindowItem-CuDwxsEy.4d68002250ae.js.gz +0 -0
  104. codex/static_root/assets/{VWindowItem-BLEDgagD.js → VWindowItem-CuDwxsEy.js} +1 -1
  105. codex/static_root/assets/VWindowItem-CuDwxsEy.js.br +0 -0
  106. codex/static_root/assets/VWindowItem-CuDwxsEy.js.gz +0 -0
  107. codex/static_root/assets/{admin-kjMoKlqD.55a1dd908124.js → admin-BZQmoFts.d8e6303f8aee.js} +1 -1
  108. codex/static_root/assets/admin-BZQmoFts.d8e6303f8aee.js.br +0 -0
  109. codex/static_root/assets/admin-BZQmoFts.d8e6303f8aee.js.gz +0 -0
  110. codex/static_root/assets/{admin-kjMoKlqD.js → admin-BZQmoFts.js} +1 -1
  111. codex/static_root/assets/admin-BZQmoFts.js.br +0 -0
  112. codex/static_root/assets/admin-BZQmoFts.js.gz +0 -0
  113. codex/static_root/assets/{admin-Bv40vYZw.8179e1ece835.js → admin-U3AawSbo.f171316d0a93.js} +1 -1
  114. codex/static_root/assets/admin-U3AawSbo.f171316d0a93.js.br +0 -0
  115. codex/static_root/assets/admin-U3AawSbo.f171316d0a93.js.gz +0 -0
  116. codex/static_root/assets/{admin-Bv40vYZw.js → admin-U3AawSbo.js} +1 -1
  117. codex/static_root/assets/admin-U3AawSbo.js.br +0 -0
  118. codex/static_root/assets/admin-U3AawSbo.js.gz +0 -0
  119. codex/static_root/assets/admin-menu-D9RDVBlr.3b62ee7a8b95.js +1 -0
  120. codex/static_root/assets/admin-menu-D9RDVBlr.3b62ee7a8b95.js.br +0 -0
  121. codex/static_root/assets/admin-menu-D9RDVBlr.3b62ee7a8b95.js.gz +0 -0
  122. codex/static_root/assets/admin-menu-D9RDVBlr.js +1 -0
  123. codex/static_root/assets/admin-menu-D9RDVBlr.js.br +0 -0
  124. codex/static_root/assets/admin-menu-D9RDVBlr.js.gz +0 -0
  125. codex/static_root/assets/{admin-settings-button-progress-RfwaqLl2.4cdd37d0dd16.js → admin-settings-button-progress-DwWq9uM1.fbacafc0db08.js} +1 -1
  126. codex/static_root/assets/admin-settings-button-progress-DwWq9uM1.fbacafc0db08.js.br +0 -0
  127. codex/static_root/assets/admin-settings-button-progress-DwWq9uM1.fbacafc0db08.js.gz +0 -0
  128. codex/static_root/assets/{admin-settings-button-progress-RfwaqLl2.js → admin-settings-button-progress-DwWq9uM1.js} +1 -1
  129. codex/static_root/assets/admin-settings-button-progress-DwWq9uM1.js.br +0 -0
  130. codex/static_root/assets/admin-settings-button-progress-DwWq9uM1.js.gz +0 -0
  131. codex/static_root/assets/{browser-plYso4v5.js → browser-DFM_JsAK.bffd4eb259d8.js} +1 -1
  132. codex/static_root/assets/browser-DFM_JsAK.bffd4eb259d8.js.br +0 -0
  133. codex/static_root/assets/browser-DFM_JsAK.bffd4eb259d8.js.gz +0 -0
  134. codex/static_root/assets/{browser-plYso4v5.87ef04b44d37.js → browser-DFM_JsAK.js} +1 -1
  135. codex/static_root/assets/browser-DFM_JsAK.js.br +0 -0
  136. codex/static_root/assets/browser-DFM_JsAK.js.gz +0 -0
  137. codex/static_root/assets/{change-password-dialog-DyhQwNv1.26383853ccc0.js → change-password-dialog-yLNkzMp9.50da9f352709.js} +1 -1
  138. codex/static_root/assets/change-password-dialog-yLNkzMp9.50da9f352709.js.br +0 -0
  139. codex/static_root/assets/change-password-dialog-yLNkzMp9.50da9f352709.js.gz +0 -0
  140. codex/static_root/assets/{change-password-dialog-DyhQwNv1.js → change-password-dialog-yLNkzMp9.js} +1 -1
  141. codex/static_root/assets/change-password-dialog-yLNkzMp9.js.br +0 -0
  142. codex/static_root/assets/change-password-dialog-yLNkzMp9.js.gz +0 -0
  143. codex/static_root/assets/{confirm-dialog-B7ndwV5M.d1f0728d4bd0.js → confirm-dialog-q6RAb_qs.120460c84883.js} +1 -1
  144. codex/static_root/assets/confirm-dialog-q6RAb_qs.120460c84883.js.br +0 -0
  145. codex/static_root/assets/confirm-dialog-q6RAb_qs.120460c84883.js.gz +0 -0
  146. codex/static_root/assets/{confirm-dialog-B7ndwV5M.js → confirm-dialog-q6RAb_qs.js} +1 -1
  147. codex/static_root/assets/confirm-dialog-q6RAb_qs.js.br +0 -0
  148. codex/static_root/assets/confirm-dialog-q6RAb_qs.js.gz +0 -0
  149. codex/static_root/assets/{datetime-column-DANpNGGe.13985ff7d484.js → datetime-column-HJ5dvW99.ba0a30b3fc0d.js} +1 -1
  150. codex/static_root/assets/datetime-column-HJ5dvW99.ba0a30b3fc0d.js.br +0 -0
  151. codex/static_root/assets/datetime-column-HJ5dvW99.ba0a30b3fc0d.js.gz +0 -0
  152. codex/static_root/assets/{datetime-column-DANpNGGe.js → datetime-column-HJ5dvW99.js} +1 -1
  153. codex/static_root/assets/datetime-column-HJ5dvW99.js.br +0 -0
  154. codex/static_root/assets/datetime-column-HJ5dvW99.js.gz +0 -0
  155. codex/static_root/assets/{filter-Dhe8cVmt.ad92d3b618e3.js → filter-r_zFj-tS.161a85ef1860.js} +1 -1
  156. codex/static_root/assets/filter-r_zFj-tS.161a85ef1860.js.br +0 -0
  157. codex/static_root/assets/filter-r_zFj-tS.161a85ef1860.js.gz +0 -0
  158. codex/static_root/assets/{filter-Dhe8cVmt.js → filter-r_zFj-tS.js} +1 -1
  159. codex/static_root/assets/filter-r_zFj-tS.js.br +0 -0
  160. codex/static_root/assets/filter-r_zFj-tS.js.gz +0 -0
  161. codex/static_root/assets/{flag-tab-BZ9S7U8D.0b814b215567.js → flag-tab-D0Z4uhsg.06e720e71319.js} +1 -1
  162. codex/static_root/assets/flag-tab-D0Z4uhsg.06e720e71319.js.br +0 -0
  163. codex/static_root/assets/flag-tab-D0Z4uhsg.06e720e71319.js.gz +0 -0
  164. codex/static_root/assets/{flag-tab-BZ9S7U8D.js → flag-tab-D0Z4uhsg.js} +1 -1
  165. codex/static_root/assets/flag-tab-D0Z4uhsg.js.br +0 -0
  166. codex/static_root/assets/flag-tab-D0Z4uhsg.js.gz +0 -0
  167. codex/static_root/assets/{forwardRefs-Z0d4Mnc7.js → forwardRefs-Nj5UEeg5.50a55d7d8b68.js} +1 -1
  168. codex/static_root/assets/forwardRefs-Nj5UEeg5.50a55d7d8b68.js.br +0 -0
  169. codex/static_root/assets/forwardRefs-Nj5UEeg5.50a55d7d8b68.js.gz +0 -0
  170. codex/static_root/assets/{forwardRefs-Z0d4Mnc7.deb4e7a1b8b5.js → forwardRefs-Nj5UEeg5.js} +1 -1
  171. codex/static_root/assets/forwardRefs-Nj5UEeg5.js.br +0 -0
  172. codex/static_root/assets/forwardRefs-Nj5UEeg5.js.gz +0 -0
  173. codex/static_root/assets/{group-tab-B0ASBB3_.8e10b90ff052.js → group-tab-lamd9pcq.604a78bd4e4f.js} +1 -1
  174. codex/static_root/assets/group-tab-lamd9pcq.604a78bd4e4f.js.br +0 -0
  175. codex/static_root/assets/group-tab-lamd9pcq.604a78bd4e4f.js.gz +0 -0
  176. codex/static_root/assets/{group-tab-B0ASBB3_.js → group-tab-lamd9pcq.js} +1 -1
  177. codex/static_root/assets/group-tab-lamd9pcq.js.br +0 -0
  178. codex/static_root/assets/group-tab-lamd9pcq.js.gz +0 -0
  179. codex/static_root/assets/{http-error-BP-mMZsK.72c4d00b40d2.js → http-error-DRYA5ir1.46f4babacf15.js} +1 -1
  180. codex/static_root/assets/http-error-DRYA5ir1.46f4babacf15.js.br +0 -0
  181. codex/static_root/assets/http-error-DRYA5ir1.46f4babacf15.js.gz +0 -0
  182. codex/static_root/assets/{http-error-BP-mMZsK.js → http-error-DRYA5ir1.js} +1 -1
  183. codex/static_root/assets/http-error-DRYA5ir1.js.br +0 -0
  184. codex/static_root/assets/http-error-DRYA5ir1.js.gz +0 -0
  185. codex/static_root/assets/{index-Cu9nQXJD.49795921eada.js → index-Cl7tPJIx.c0a239cf7069.js} +1 -1
  186. codex/static_root/assets/index-Cl7tPJIx.c0a239cf7069.js.br +0 -0
  187. codex/static_root/assets/index-Cl7tPJIx.c0a239cf7069.js.gz +0 -0
  188. codex/static_root/assets/{index-Cu9nQXJD.js → index-Cl7tPJIx.js} +1 -1
  189. codex/static_root/assets/index-Cl7tPJIx.js.br +0 -0
  190. codex/static_root/assets/index-Cl7tPJIx.js.gz +0 -0
  191. codex/static_root/assets/library-tab-2UucZZAW.f4541a086231.js +1 -0
  192. codex/static_root/assets/library-tab-2UucZZAW.f4541a086231.js.br +0 -0
  193. codex/static_root/assets/library-tab-2UucZZAW.f4541a086231.js.gz +0 -0
  194. codex/static_root/assets/library-tab-2UucZZAW.js +1 -0
  195. codex/static_root/assets/library-tab-2UucZZAW.js.br +0 -0
  196. codex/static_root/assets/library-tab-2UucZZAW.js.gz +0 -0
  197. codex/static_root/assets/{library-tab-D9lxhAqv.02f7064c20f3.css → library-tab-5StL67ei.0fad8998a237.css} +1 -1
  198. codex/static_root/assets/library-tab-5StL67ei.0fad8998a237.css.br +0 -0
  199. codex/static_root/assets/library-tab-5StL67ei.0fad8998a237.css.gz +0 -0
  200. codex/static_root/assets/{library-tab-D9lxhAqv.css → library-tab-5StL67ei.css} +1 -1
  201. codex/static_root/assets/library-tab-5StL67ei.css.br +0 -0
  202. codex/static_root/assets/library-tab-5StL67ei.css.gz +0 -0
  203. codex/static_root/assets/main-BX4TjIpG.dc79406e2a7b.js +39 -0
  204. codex/static_root/assets/main-BX4TjIpG.dc79406e2a7b.js.br +0 -0
  205. codex/static_root/assets/main-BX4TjIpG.dc79406e2a7b.js.gz +0 -0
  206. codex/static_root/assets/main-BX4TjIpG.js +39 -0
  207. codex/static_root/assets/main-BX4TjIpG.js.br +0 -0
  208. codex/static_root/assets/main-BX4TjIpG.js.gz +0 -0
  209. codex/static_root/assets/pager-full-pdf-KI4NQUMe.762b6bef9373.js +1 -0
  210. codex/static_root/assets/pager-full-pdf-KI4NQUMe.762b6bef9373.js.br +0 -0
  211. codex/static_root/assets/pager-full-pdf-KI4NQUMe.762b6bef9373.js.gz +0 -0
  212. codex/static_root/assets/pager-full-pdf-KI4NQUMe.js +1 -0
  213. codex/static_root/assets/pager-full-pdf-KI4NQUMe.js.br +0 -0
  214. codex/static_root/assets/pager-full-pdf-KI4NQUMe.js.gz +0 -0
  215. codex/static_root/assets/{pagination-toolbar-DGfRDeRW.c3f463ad6edd.js → pagination-toolbar-48pwYEe_.892375c5aa51.js} +1 -1
  216. codex/static_root/assets/pagination-toolbar-48pwYEe_.892375c5aa51.js.br +0 -0
  217. codex/static_root/assets/pagination-toolbar-48pwYEe_.892375c5aa51.js.gz +0 -0
  218. codex/static_root/assets/{pagination-toolbar-DGfRDeRW.js → pagination-toolbar-48pwYEe_.js} +1 -1
  219. codex/static_root/assets/pagination-toolbar-48pwYEe_.js.br +0 -0
  220. codex/static_root/assets/pagination-toolbar-48pwYEe_.js.gz +0 -0
  221. codex/static_root/assets/{pdf-doc-D6Meu4vZ.91b43d057670.js → pdf-doc-GyrCvyP5.54b26ba8d93c.js} +14 -14
  222. codex/static_root/assets/pdf-doc-GyrCvyP5.54b26ba8d93c.js.br +0 -0
  223. codex/static_root/assets/pdf-doc-GyrCvyP5.54b26ba8d93c.js.gz +0 -0
  224. codex/static_root/assets/{pdf-doc-D6Meu4vZ.js → pdf-doc-GyrCvyP5.js} +14 -14
  225. codex/static_root/assets/pdf-doc-GyrCvyP5.js.br +0 -0
  226. codex/static_root/assets/pdf-doc-GyrCvyP5.js.gz +0 -0
  227. codex/static_root/assets/{reader-LwL05rgA.c022ad3b7b94.css → reader-HE07eoaG.8626eeb7c718.css} +1 -1
  228. codex/static_root/assets/reader-HE07eoaG.8626eeb7c718.css.br +0 -0
  229. codex/static_root/assets/reader-HE07eoaG.8626eeb7c718.css.gz +0 -0
  230. codex/static_root/assets/{reader-LwL05rgA.css → reader-HE07eoaG.css} +1 -1
  231. codex/static_root/assets/reader-HE07eoaG.css.br +0 -0
  232. codex/static_root/assets/reader-HE07eoaG.css.gz +0 -0
  233. codex/static_root/assets/reader-lmk4MiSj.9239243e1be1.js +2 -0
  234. codex/static_root/assets/reader-lmk4MiSj.9239243e1be1.js.br +0 -0
  235. codex/static_root/assets/reader-lmk4MiSj.9239243e1be1.js.gz +0 -0
  236. codex/static_root/assets/reader-lmk4MiSj.js +2 -0
  237. codex/static_root/assets/reader-lmk4MiSj.js.br +0 -0
  238. codex/static_root/assets/reader-lmk4MiSj.js.gz +0 -0
  239. codex/static_root/assets/{relation-chips-CAXZIswb.e991a259ce59.js → relation-chips-Dgb6LQdZ.c028ab2df979.js} +1 -1
  240. codex/static_root/assets/relation-chips-Dgb6LQdZ.c028ab2df979.js.br +0 -0
  241. codex/static_root/assets/relation-chips-Dgb6LQdZ.c028ab2df979.js.gz +0 -0
  242. codex/static_root/assets/{relation-chips-CAXZIswb.js → relation-chips-Dgb6LQdZ.js} +1 -1
  243. codex/static_root/assets/relation-chips-Dgb6LQdZ.js.br +0 -0
  244. codex/static_root/assets/relation-chips-Dgb6LQdZ.js.gz +0 -0
  245. codex/static_root/assets/{settings-drawer-B4gD41g6.js → settings-drawer-CRmLEncr.6937d45e18af.js} +2 -2
  246. codex/static_root/assets/settings-drawer-CRmLEncr.6937d45e18af.js.br +0 -0
  247. codex/static_root/assets/settings-drawer-CRmLEncr.6937d45e18af.js.gz +0 -0
  248. codex/static_root/assets/{settings-drawer-B4gD41g6.82718694498e.js → settings-drawer-CRmLEncr.js} +2 -2
  249. codex/static_root/assets/settings-drawer-CRmLEncr.js.br +0 -0
  250. codex/static_root/assets/settings-drawer-CRmLEncr.js.gz +0 -0
  251. codex/static_root/assets/{ssrBoot-O6yTJ_UV.7180d77d283e.js → ssrBoot-CCKPlpgB.c90fa83e0817.js} +1 -1
  252. codex/static_root/assets/ssrBoot-CCKPlpgB.c90fa83e0817.js.br +0 -0
  253. codex/static_root/assets/ssrBoot-CCKPlpgB.c90fa83e0817.js.gz +0 -0
  254. codex/static_root/assets/{ssrBoot-O6yTJ_UV.js → ssrBoot-CCKPlpgB.js} +1 -1
  255. codex/static_root/assets/ssrBoot-CCKPlpgB.js.br +0 -0
  256. codex/static_root/assets/ssrBoot-CCKPlpgB.js.gz +0 -0
  257. codex/static_root/assets/{stats-tab-BZjOg19A.afb2e6b0d648.js → stats-tab-CrU_p2gC.e12768f9423d.js} +1 -1
  258. codex/static_root/assets/stats-tab-CrU_p2gC.e12768f9423d.js.br +0 -0
  259. codex/static_root/assets/stats-tab-CrU_p2gC.e12768f9423d.js.gz +0 -0
  260. codex/static_root/assets/{stats-tab-BZjOg19A.js → stats-tab-CrU_p2gC.js} +1 -1
  261. codex/static_root/assets/stats-tab-CrU_p2gC.js.br +0 -0
  262. codex/static_root/assets/stats-tab-CrU_p2gC.js.gz +0 -0
  263. codex/static_root/assets/task-tab-Bp0wsH4V.2a5135c30818.js +1 -0
  264. codex/static_root/assets/task-tab-Bp0wsH4V.2a5135c30818.js.br +0 -0
  265. codex/static_root/assets/task-tab-Bp0wsH4V.2a5135c30818.js.gz +0 -0
  266. codex/static_root/assets/task-tab-Bp0wsH4V.js +1 -0
  267. codex/static_root/assets/task-tab-Bp0wsH4V.js.br +0 -0
  268. codex/static_root/assets/task-tab-Bp0wsH4V.js.gz +0 -0
  269. codex/static_root/assets/{unauthorized-Bo3ThIrX.12d2efd95d7d.js → unauthorized-DObmibd6.b47434919de7.js} +1 -1
  270. codex/static_root/assets/unauthorized-DObmibd6.b47434919de7.js.br +0 -0
  271. codex/static_root/assets/unauthorized-DObmibd6.b47434919de7.js.gz +0 -0
  272. codex/static_root/assets/{unauthorized-Bo3ThIrX.js → unauthorized-DObmibd6.js} +1 -1
  273. codex/static_root/assets/unauthorized-DObmibd6.js.br +0 -0
  274. codex/static_root/assets/unauthorized-DObmibd6.js.gz +0 -0
  275. codex/static_root/assets/{user-tab-BQ82qBg3.17190dc83452.js → user-tab-DedY8MbN.624af3a6a978.js} +1 -1
  276. codex/static_root/assets/user-tab-DedY8MbN.624af3a6a978.js.br +0 -0
  277. codex/static_root/assets/user-tab-DedY8MbN.624af3a6a978.js.gz +0 -0
  278. codex/static_root/assets/{user-tab-BQ82qBg3.js → user-tab-DedY8MbN.js} +1 -1
  279. codex/static_root/assets/user-tab-DedY8MbN.js.br +0 -0
  280. codex/static_root/assets/user-tab-DedY8MbN.js.gz +0 -0
  281. codex/static_root/{manifest.0dc91d0dee6d.json → manifest.4217bf6f9edb.json} +313 -313
  282. codex/static_root/manifest.4217bf6f9edb.json.br +0 -0
  283. codex/static_root/manifest.4217bf6f9edb.json.gz +0 -0
  284. codex/static_root/manifest.json +313 -313
  285. codex/static_root/manifest.json.br +0 -0
  286. codex/static_root/manifest.json.gz +0 -0
  287. codex/static_root/staticfiles.json +1 -1
  288. codex/views/admin/library.py +4 -1
  289. codex/views/browser/params.py +21 -17
  290. codex/views/reader/arcs.py +16 -6
  291. codex/views/reader/params.py +4 -1
  292. codex/views/session.py +1 -0
  293. {codex-1.8.0a2.dist-info → codex-1.8.0a3.dist-info}/METADATA +2 -2
  294. {codex-1.8.0a2.dist-info → codex-1.8.0a3.dist-info}/RECORD +297 -293
  295. codex/librarian/scribe/importer/failed_imports.py +0 -168
  296. codex/librarian/scribe/importer/statii/1 +0 -27
  297. codex/static_root/assets/VCheckbox-DSndl51k.1e28c443c3cb.js.br +0 -0
  298. codex/static_root/assets/VCheckbox-DSndl51k.1e28c443c3cb.js.gz +0 -0
  299. codex/static_root/assets/VCheckbox-DSndl51k.js.br +0 -0
  300. codex/static_root/assets/VCheckbox-DSndl51k.js.gz +0 -0
  301. codex/static_root/assets/VCheckboxBtn-Bu2Pf64q.d7463473d7a2.js.br +0 -0
  302. codex/static_root/assets/VCheckboxBtn-Bu2Pf64q.d7463473d7a2.js.gz +0 -0
  303. codex/static_root/assets/VCheckboxBtn-Bu2Pf64q.js.br +0 -0
  304. codex/static_root/assets/VCheckboxBtn-Bu2Pf64q.js.gz +0 -0
  305. codex/static_root/assets/VCombobox-Uogv6Ckp.9f900e703605.js.br +0 -0
  306. codex/static_root/assets/VCombobox-Uogv6Ckp.9f900e703605.js.gz +0 -0
  307. codex/static_root/assets/VCombobox-Uogv6Ckp.js.br +0 -0
  308. codex/static_root/assets/VCombobox-Uogv6Ckp.js.gz +0 -0
  309. codex/static_root/assets/VDialog-BzaGu1HN.34f52763c3f8.js.br +0 -0
  310. codex/static_root/assets/VDialog-BzaGu1HN.34f52763c3f8.js.gz +0 -0
  311. codex/static_root/assets/VDialog-BzaGu1HN.js.br +0 -0
  312. codex/static_root/assets/VDialog-BzaGu1HN.js.gz +0 -0
  313. codex/static_root/assets/VDivider-C3ikm0Ko.4938e9ced53e.js.br +0 -0
  314. codex/static_root/assets/VDivider-C3ikm0Ko.4938e9ced53e.js.gz +0 -0
  315. codex/static_root/assets/VDivider-C3ikm0Ko.js.br +0 -0
  316. codex/static_root/assets/VDivider-C3ikm0Ko.js.gz +0 -0
  317. codex/static_root/assets/VExpansionPanels-AmsInZN0.5cb7c833de3d.js.br +0 -0
  318. codex/static_root/assets/VExpansionPanels-AmsInZN0.5cb7c833de3d.js.gz +0 -0
  319. codex/static_root/assets/VExpansionPanels-AmsInZN0.js.br +0 -0
  320. codex/static_root/assets/VExpansionPanels-AmsInZN0.js.gz +0 -0
  321. codex/static_root/assets/VForm-CyCdgusw.c737973a1e85.js.br +0 -0
  322. codex/static_root/assets/VForm-CyCdgusw.c737973a1e85.js.gz +0 -0
  323. codex/static_root/assets/VForm-CyCdgusw.js.br +0 -0
  324. codex/static_root/assets/VForm-CyCdgusw.js.gz +0 -0
  325. codex/static_root/assets/VRadioGroup-BF0Xjrzi.e54d2bf41bb2.js.br +0 -0
  326. codex/static_root/assets/VRadioGroup-BF0Xjrzi.e54d2bf41bb2.js.gz +0 -0
  327. codex/static_root/assets/VRadioGroup-BF0Xjrzi.js.br +0 -0
  328. codex/static_root/assets/VRadioGroup-BF0Xjrzi.js.gz +0 -0
  329. codex/static_root/assets/VSelect-Dv50OIkN.390adb1fe7fa.js.br +0 -0
  330. codex/static_root/assets/VSelect-Dv50OIkN.390adb1fe7fa.js.gz +0 -0
  331. codex/static_root/assets/VSelect-Dv50OIkN.js.br +0 -0
  332. codex/static_root/assets/VSelect-Dv50OIkN.js.gz +0 -0
  333. codex/static_root/assets/VSelectionControl-DbKYScD5.8d2ab1ebe546.js.br +0 -0
  334. codex/static_root/assets/VSelectionControl-DbKYScD5.8d2ab1ebe546.js.gz +0 -0
  335. codex/static_root/assets/VSelectionControl-DbKYScD5.js.br +0 -0
  336. codex/static_root/assets/VSelectionControl-DbKYScD5.js.gz +0 -0
  337. codex/static_root/assets/VTable-BmOfHc7J.b2e1311009d1.js.br +0 -0
  338. codex/static_root/assets/VTable-BmOfHc7J.b2e1311009d1.js.gz +0 -0
  339. codex/static_root/assets/VTable-BmOfHc7J.js.br +0 -0
  340. codex/static_root/assets/VTable-BmOfHc7J.js.gz +0 -0
  341. codex/static_root/assets/VWindowItem-BLEDgagD.4b67c4a63c59.js.br +0 -0
  342. codex/static_root/assets/VWindowItem-BLEDgagD.4b67c4a63c59.js.gz +0 -0
  343. codex/static_root/assets/VWindowItem-BLEDgagD.js.br +0 -0
  344. codex/static_root/assets/VWindowItem-BLEDgagD.js.gz +0 -0
  345. codex/static_root/assets/admin-Bv40vYZw.8179e1ece835.js.br +0 -0
  346. codex/static_root/assets/admin-Bv40vYZw.8179e1ece835.js.gz +0 -0
  347. codex/static_root/assets/admin-Bv40vYZw.js.br +0 -0
  348. codex/static_root/assets/admin-Bv40vYZw.js.gz +0 -0
  349. codex/static_root/assets/admin-kjMoKlqD.55a1dd908124.js.br +0 -0
  350. codex/static_root/assets/admin-kjMoKlqD.55a1dd908124.js.gz +0 -0
  351. codex/static_root/assets/admin-kjMoKlqD.js.br +0 -0
  352. codex/static_root/assets/admin-kjMoKlqD.js.gz +0 -0
  353. codex/static_root/assets/admin-menu-BNpuOmbI.e1f62ba483cd.js +0 -1
  354. codex/static_root/assets/admin-menu-BNpuOmbI.e1f62ba483cd.js.br +0 -0
  355. codex/static_root/assets/admin-menu-BNpuOmbI.e1f62ba483cd.js.gz +0 -0
  356. codex/static_root/assets/admin-menu-BNpuOmbI.js +0 -1
  357. codex/static_root/assets/admin-menu-BNpuOmbI.js.br +0 -0
  358. codex/static_root/assets/admin-menu-BNpuOmbI.js.gz +0 -0
  359. codex/static_root/assets/admin-settings-button-progress-RfwaqLl2.4cdd37d0dd16.js.br +0 -0
  360. codex/static_root/assets/admin-settings-button-progress-RfwaqLl2.4cdd37d0dd16.js.gz +0 -0
  361. codex/static_root/assets/admin-settings-button-progress-RfwaqLl2.js.br +0 -0
  362. codex/static_root/assets/admin-settings-button-progress-RfwaqLl2.js.gz +0 -0
  363. codex/static_root/assets/browser-plYso4v5.87ef04b44d37.js.br +0 -0
  364. codex/static_root/assets/browser-plYso4v5.87ef04b44d37.js.gz +0 -0
  365. codex/static_root/assets/browser-plYso4v5.js.br +0 -0
  366. codex/static_root/assets/browser-plYso4v5.js.gz +0 -0
  367. codex/static_root/assets/change-password-dialog-DyhQwNv1.26383853ccc0.js.br +0 -0
  368. codex/static_root/assets/change-password-dialog-DyhQwNv1.26383853ccc0.js.gz +0 -0
  369. codex/static_root/assets/change-password-dialog-DyhQwNv1.js.br +0 -0
  370. codex/static_root/assets/change-password-dialog-DyhQwNv1.js.gz +0 -0
  371. codex/static_root/assets/confirm-dialog-B7ndwV5M.d1f0728d4bd0.js.br +0 -0
  372. codex/static_root/assets/confirm-dialog-B7ndwV5M.d1f0728d4bd0.js.gz +0 -0
  373. codex/static_root/assets/confirm-dialog-B7ndwV5M.js.br +0 -0
  374. codex/static_root/assets/confirm-dialog-B7ndwV5M.js.gz +0 -0
  375. codex/static_root/assets/datetime-column-DANpNGGe.13985ff7d484.js.br +0 -0
  376. codex/static_root/assets/datetime-column-DANpNGGe.13985ff7d484.js.gz +0 -0
  377. codex/static_root/assets/datetime-column-DANpNGGe.js.br +0 -0
  378. codex/static_root/assets/datetime-column-DANpNGGe.js.gz +0 -0
  379. codex/static_root/assets/filter-Dhe8cVmt.ad92d3b618e3.js.br +0 -0
  380. codex/static_root/assets/filter-Dhe8cVmt.ad92d3b618e3.js.gz +0 -0
  381. codex/static_root/assets/filter-Dhe8cVmt.js.br +0 -0
  382. codex/static_root/assets/filter-Dhe8cVmt.js.gz +0 -0
  383. codex/static_root/assets/flag-tab-BZ9S7U8D.0b814b215567.js.br +0 -0
  384. codex/static_root/assets/flag-tab-BZ9S7U8D.0b814b215567.js.gz +0 -0
  385. codex/static_root/assets/flag-tab-BZ9S7U8D.js.br +0 -0
  386. codex/static_root/assets/flag-tab-BZ9S7U8D.js.gz +0 -0
  387. codex/static_root/assets/forwardRefs-Z0d4Mnc7.deb4e7a1b8b5.js.br +0 -0
  388. codex/static_root/assets/forwardRefs-Z0d4Mnc7.deb4e7a1b8b5.js.gz +0 -0
  389. codex/static_root/assets/forwardRefs-Z0d4Mnc7.js.br +0 -0
  390. codex/static_root/assets/forwardRefs-Z0d4Mnc7.js.gz +0 -0
  391. codex/static_root/assets/group-tab-B0ASBB3_.8e10b90ff052.js.br +0 -0
  392. codex/static_root/assets/group-tab-B0ASBB3_.8e10b90ff052.js.gz +0 -0
  393. codex/static_root/assets/group-tab-B0ASBB3_.js.br +0 -0
  394. codex/static_root/assets/group-tab-B0ASBB3_.js.gz +0 -0
  395. codex/static_root/assets/http-error-BP-mMZsK.72c4d00b40d2.js.br +0 -0
  396. codex/static_root/assets/http-error-BP-mMZsK.72c4d00b40d2.js.gz +0 -0
  397. codex/static_root/assets/http-error-BP-mMZsK.js.br +0 -0
  398. codex/static_root/assets/http-error-BP-mMZsK.js.gz +0 -0
  399. codex/static_root/assets/index-Cu9nQXJD.49795921eada.js.br +0 -0
  400. codex/static_root/assets/index-Cu9nQXJD.49795921eada.js.gz +0 -0
  401. codex/static_root/assets/index-Cu9nQXJD.js.br +0 -0
  402. codex/static_root/assets/index-Cu9nQXJD.js.gz +0 -0
  403. codex/static_root/assets/library-tab-8g2eSuGN.846cc1674a67.js +0 -1
  404. codex/static_root/assets/library-tab-8g2eSuGN.846cc1674a67.js.br +0 -0
  405. codex/static_root/assets/library-tab-8g2eSuGN.846cc1674a67.js.gz +0 -0
  406. codex/static_root/assets/library-tab-8g2eSuGN.js +0 -1
  407. codex/static_root/assets/library-tab-8g2eSuGN.js.br +0 -0
  408. codex/static_root/assets/library-tab-8g2eSuGN.js.gz +0 -0
  409. codex/static_root/assets/library-tab-D9lxhAqv.02f7064c20f3.css.br +0 -0
  410. codex/static_root/assets/library-tab-D9lxhAqv.02f7064c20f3.css.gz +0 -0
  411. codex/static_root/assets/library-tab-D9lxhAqv.css.br +0 -0
  412. codex/static_root/assets/library-tab-D9lxhAqv.css.gz +0 -0
  413. codex/static_root/assets/main-BoAlbVoF.e41ba211717d.js +0 -39
  414. codex/static_root/assets/main-BoAlbVoF.e41ba211717d.js.br +0 -0
  415. codex/static_root/assets/main-BoAlbVoF.e41ba211717d.js.gz +0 -0
  416. codex/static_root/assets/main-BoAlbVoF.js +0 -39
  417. codex/static_root/assets/main-BoAlbVoF.js.br +0 -0
  418. codex/static_root/assets/main-BoAlbVoF.js.gz +0 -0
  419. codex/static_root/assets/pager-full-pdf-DShiSKPO.026946648650.js +0 -1
  420. codex/static_root/assets/pager-full-pdf-DShiSKPO.026946648650.js.br +0 -0
  421. codex/static_root/assets/pager-full-pdf-DShiSKPO.026946648650.js.gz +0 -0
  422. codex/static_root/assets/pager-full-pdf-DShiSKPO.js +0 -1
  423. codex/static_root/assets/pager-full-pdf-DShiSKPO.js.br +0 -0
  424. codex/static_root/assets/pager-full-pdf-DShiSKPO.js.gz +0 -0
  425. codex/static_root/assets/pagination-toolbar-DGfRDeRW.c3f463ad6edd.js.br +0 -0
  426. codex/static_root/assets/pagination-toolbar-DGfRDeRW.c3f463ad6edd.js.gz +0 -0
  427. codex/static_root/assets/pagination-toolbar-DGfRDeRW.js.br +0 -0
  428. codex/static_root/assets/pagination-toolbar-DGfRDeRW.js.gz +0 -0
  429. codex/static_root/assets/pdf-doc-D6Meu4vZ.91b43d057670.js.br +0 -0
  430. codex/static_root/assets/pdf-doc-D6Meu4vZ.91b43d057670.js.gz +0 -0
  431. codex/static_root/assets/pdf-doc-D6Meu4vZ.js.br +0 -0
  432. codex/static_root/assets/pdf-doc-D6Meu4vZ.js.gz +0 -0
  433. codex/static_root/assets/reader-CptqnqBZ.340bc756e164.js +0 -2
  434. codex/static_root/assets/reader-CptqnqBZ.340bc756e164.js.br +0 -0
  435. codex/static_root/assets/reader-CptqnqBZ.340bc756e164.js.gz +0 -0
  436. codex/static_root/assets/reader-CptqnqBZ.js +0 -2
  437. codex/static_root/assets/reader-CptqnqBZ.js.br +0 -0
  438. codex/static_root/assets/reader-CptqnqBZ.js.gz +0 -0
  439. codex/static_root/assets/reader-LwL05rgA.c022ad3b7b94.css.br +0 -0
  440. codex/static_root/assets/reader-LwL05rgA.c022ad3b7b94.css.gz +0 -0
  441. codex/static_root/assets/reader-LwL05rgA.css.br +0 -0
  442. codex/static_root/assets/reader-LwL05rgA.css.gz +0 -0
  443. codex/static_root/assets/relation-chips-CAXZIswb.e991a259ce59.js.br +0 -0
  444. codex/static_root/assets/relation-chips-CAXZIswb.e991a259ce59.js.gz +0 -0
  445. codex/static_root/assets/relation-chips-CAXZIswb.js.br +0 -0
  446. codex/static_root/assets/relation-chips-CAXZIswb.js.gz +0 -0
  447. codex/static_root/assets/settings-drawer-B4gD41g6.82718694498e.js.br +0 -0
  448. codex/static_root/assets/settings-drawer-B4gD41g6.82718694498e.js.gz +0 -0
  449. codex/static_root/assets/settings-drawer-B4gD41g6.js.br +0 -0
  450. codex/static_root/assets/settings-drawer-B4gD41g6.js.gz +0 -0
  451. codex/static_root/assets/ssrBoot-O6yTJ_UV.7180d77d283e.js.br +0 -0
  452. codex/static_root/assets/ssrBoot-O6yTJ_UV.7180d77d283e.js.gz +0 -0
  453. codex/static_root/assets/ssrBoot-O6yTJ_UV.js.br +0 -0
  454. codex/static_root/assets/ssrBoot-O6yTJ_UV.js.gz +0 -0
  455. codex/static_root/assets/stats-tab-BZjOg19A.afb2e6b0d648.js.br +0 -0
  456. codex/static_root/assets/stats-tab-BZjOg19A.afb2e6b0d648.js.gz +0 -0
  457. codex/static_root/assets/stats-tab-BZjOg19A.js.br +0 -0
  458. codex/static_root/assets/stats-tab-BZjOg19A.js.gz +0 -0
  459. codex/static_root/assets/task-tab-GP2jPkRE.cfdfb9396ec4.js +0 -1
  460. codex/static_root/assets/task-tab-GP2jPkRE.cfdfb9396ec4.js.br +0 -0
  461. codex/static_root/assets/task-tab-GP2jPkRE.cfdfb9396ec4.js.gz +0 -0
  462. codex/static_root/assets/task-tab-GP2jPkRE.js +0 -1
  463. codex/static_root/assets/task-tab-GP2jPkRE.js.br +0 -0
  464. codex/static_root/assets/task-tab-GP2jPkRE.js.gz +0 -0
  465. codex/static_root/assets/unauthorized-Bo3ThIrX.12d2efd95d7d.js.br +0 -0
  466. codex/static_root/assets/unauthorized-Bo3ThIrX.12d2efd95d7d.js.gz +0 -0
  467. codex/static_root/assets/unauthorized-Bo3ThIrX.js.br +0 -0
  468. codex/static_root/assets/unauthorized-Bo3ThIrX.js.gz +0 -0
  469. codex/static_root/assets/user-tab-BQ82qBg3.17190dc83452.js.br +0 -0
  470. codex/static_root/assets/user-tab-BQ82qBg3.17190dc83452.js.gz +0 -0
  471. codex/static_root/assets/user-tab-BQ82qBg3.js.br +0 -0
  472. codex/static_root/assets/user-tab-BQ82qBg3.js.gz +0 -0
  473. codex/static_root/manifest.0dc91d0dee6d.json.br +0 -0
  474. codex/static_root/manifest.0dc91d0dee6d.json.gz +0 -0
  475. {codex-1.8.0a2.dist-info → codex-1.8.0a3.dist-info}/WHEEL +0 -0
  476. {codex-1.8.0a2.dist-info → codex-1.8.0a3.dist-info}/entry_points.txt +0 -0
  477. {codex-1.8.0a2.dist-info → codex-1.8.0a3.dist-info}/licenses/LICENSE +0 -0
@@ -1,168 +0,0 @@
1
- """Update and create failed imports."""
2
-
3
- from pathlib import Path
4
-
5
- from django.db.models.functions import Now
6
-
7
- from codex.librarian.scribe.importer.const import FIS
8
- from codex.librarian.scribe.importer.delete import DeletedImporter
9
- from codex.librarian.scribe.importer.status import ImporterFailedImportsStatus
10
- from codex.models import Comic, FailedImport
11
-
12
- _UPDATE_FIS = "update_fis"
13
- _CREATE_FIS = "create_fis"
14
- _DELETE_FI_PATHS = "delete_fi_paths"
15
- _BULK_UPDATE_FAILED_IMPORT_FIELDS = ("name", "stat", "updated_at")
16
-
17
-
18
- class FailedImportsImporter(DeletedImporter):
19
- """Methods for failed imports."""
20
-
21
- def _query_failed_import_deletes(self, existing_failed_import_paths):
22
- """Calculate Deletes."""
23
- untouched_failed_import_paths = existing_failed_import_paths - frozenset(
24
- self.metadata[FIS].keys()
25
- )
26
-
27
- succeeded_failed_imports = frozenset(
28
- Comic.objects.filter(
29
- library=self.library, path__in=untouched_failed_import_paths
30
- ).values_list("path", flat=True)
31
- )
32
-
33
- possibly_missing_failed_import_paths = (
34
- untouched_failed_import_paths - succeeded_failed_imports
35
- )
36
- missing_failed_imports = set()
37
- for path in possibly_missing_failed_import_paths:
38
- if not Path(path).exists():
39
- missing_failed_imports.add(path)
40
-
41
- return succeeded_failed_imports | missing_failed_imports
42
-
43
- def _query_failed_imports(
44
- self,
45
- fis,
46
- ):
47
- """Determine what to do with failed imports."""
48
- if not self.metadata[FIS]:
49
- return
50
-
51
- # Remove the files deleted hack thing.
52
- self.metadata[FIS].pop("files_deleted", None)
53
-
54
- existing_failed_import_paths = set(
55
- FailedImport.objects.filter(library=self.library).values_list(
56
- "path", flat=True
57
- )
58
- )
59
-
60
- # Calculate creates and updates
61
- for path, exc in self.metadata[FIS].items():
62
- if path in existing_failed_import_paths:
63
- fis[_UPDATE_FIS][path] = exc
64
- else:
65
- fis[_CREATE_FIS][path] = exc
66
-
67
- fis[_DELETE_FI_PATHS] |= self._query_failed_import_deletes(
68
- existing_failed_import_paths
69
- )
70
- self.metadata.pop(FIS)
71
- return
72
-
73
- def _bulk_update_failed_imports(self, update_failed_imports):
74
- """Bulk update failed imports."""
75
- if not update_failed_imports:
76
- return
77
- update_failed_import_objs = FailedImport.objects.filter(
78
- library=self.library, path__in=update_failed_imports.keys()
79
- ).only(*_BULK_UPDATE_FAILED_IMPORT_FIELDS)
80
- if not update_failed_import_objs:
81
- return
82
- for fi in update_failed_import_objs:
83
- try:
84
- exc = update_failed_imports.pop(fi.path)
85
- fi.set_reason(exc)
86
- fi.updated_at = Now()
87
- fi.presave()
88
- except OSError as exc:
89
- self.log.warning(f"Presaving failed import {fi.path}: {exc}")
90
- except Exception:
91
- self.log.exception(
92
- f"Error preparing failed import update for {fi.path}"
93
- )
94
-
95
- FailedImport.objects.bulk_update(
96
- update_failed_import_objs, fields=_BULK_UPDATE_FAILED_IMPORT_FIELDS
97
- )
98
- count = len(update_failed_import_objs)
99
- level = "INFO" if count else "DEBUG"
100
- self.log.log(level, f"Updated {count} old failed imports.")
101
- return
102
-
103
- def _bulk_create_failed_imports(self, create_failed_imports):
104
- """Bulk create failed imports."""
105
- if not create_failed_imports:
106
- return 0
107
- create_objs = []
108
- for path, exc in create_failed_imports.items():
109
- try:
110
- fi = FailedImport(library=self.library, path=path, parent_folder=None)
111
- fi.set_reason(exc)
112
- create_objs.append(fi)
113
- fi.presave()
114
- except OSError:
115
- self.log.warning(
116
- f"Error preparing failed import create for {path}: {exc}"
117
- )
118
- except Exception:
119
- self.log.exception(f"Error preparing failed import create for {path}")
120
- count = len(create_objs)
121
- if count:
122
- FailedImport.objects.bulk_create(
123
- create_objs,
124
- update_conflicts=True,
125
- update_fields=_BULK_UPDATE_FAILED_IMPORT_FIELDS,
126
- unique_fields=FailedImport._meta.unique_together[0],
127
- )
128
- level = "INFO" if count else "DEBUG"
129
- self.log.log(level, f"Added {count} comics to failed imports.")
130
- return count
131
-
132
- def _bulk_cleanup_failed_imports(self, delete_failed_imports_paths):
133
- """Remove FailedImport objects that have since succeeded."""
134
- if not delete_failed_imports_paths:
135
- return 0
136
- # Cleanup FailedImports that were actually successful
137
- qs = FailedImport.objects.filter(library=self.library).filter(
138
- path__in=delete_failed_imports_paths
139
- )
140
- count, _ = qs.delete()
141
- level = "INFO" if count else "DEBUG"
142
- self.log.log(
143
- level, f"Cleaned up {count} failed imports from {self.library.path}"
144
- )
145
- return count
146
-
147
- def fail_imports(self):
148
- """Handle failed imports."""
149
- fis = self.metadata.get(FIS)
150
- if not fis:
151
- return
152
- status = ImporterFailedImportsStatus()
153
- self.status_controller.start(status)
154
- created_count = 0
155
-
156
- try:
157
- fis = {_UPDATE_FIS: {}, _CREATE_FIS: {}, _DELETE_FI_PATHS: set()}
158
- if self.task.files_deleted:
159
- # if any files were deleted. Run the failed import check
160
- self.metadata[FIS]["files_deleted"] = True
161
- self._query_failed_imports(fis)
162
- self._bulk_update_failed_imports(fis[_UPDATE_FIS])
163
- created_count += self._bulk_create_failed_imports(fis[_CREATE_FIS])
164
- self._bulk_cleanup_failed_imports(fis[_DELETE_FI_PATHS])
165
- except Exception:
166
- self.log.exception("Processing failed imports")
167
- self.status_controller.finish(status)
168
- self.counts.failed_imports = created_count
@@ -1,27 +0,0 @@
1
- """Importer Link Statii."""
2
-
3
- from codex.librarian.scribe.importer.status import ImporterStatus
4
-
5
-
6
- class ImporterLinkStatus(ImporterStatus):
7
- """Importer Link Statii."""
8
-
9
- VERB = "Link"
10
- _verbed = "Linked"
11
-
12
-
13
- class ImporterLinkTagsStatus(ImporterLinkStatus):
14
- """Importer Link Tags Status."""
15
-
16
- CODE = "ILT"
17
- ITEM_NAME = "tags"
18
-
19
-
20
- class ImporterLinkCoversStatus(ImporterLinkStatus):
21
- """Importer Link Covers Status."""
22
-
23
- CODE = "ILV"
24
- ITEM_NAME = "custom covers"
25
-
26
-
27
- LINK_STATII = (ImporterLinkTagsStatus, ImporterLinkCoversStatus)
@@ -1 +0,0 @@
1
- import{_ as S,ad as L,cM as y,q as a,v as s,b as f,G as n,a as r,A as c,y as g,B as v,D as C,C as O,s as p,x as d,w as m,F as T,z as A,S as D,bC as R,E as F,cN as V,bA as x,$ as N}from"./main-BoAlbVoF.js";import{C as U}from"./change-password-dialog-DyhQwNv1.js";import{n as B}from"./forwardRefs-Z0d4Mnc7.js";import{useAdminStore as h}from"./admin-kjMoKlqD.js";import{d as k}from"./VSelectionControl-DbKYScD5.js";import{a as w}from"./VDivider-C3ikm0Ko.js";import{v as J,a as P,C as E}from"./VDialog-BzaGu1HN.js";import{T as M}from"./index-Cu9nQXJD.js";import"./VForm-CyCdgusw.js";const Q="Create Covers",z="Find Orphan Covers",q="Remove Covers",G="Aggregate tags from Comics",W="Create Comics",j="Create Tags",K="Create Custom Covers",X="Mark Failed Imports",H="Operate Items",Y="Link Tags",Z="Link Custom Covers",$="Query Comics",tt="Query Tag Links",et="Query Missing Tags",st="Query Missing Custom Covers",at="Remove Comics",nt="Remove Folders",rt="Read tags from Comics",ot="Remove Custom Covers",it="Create Search Index Entries",ut="Update Search Index Entries",ct="Update Comics",lt="Update Tags",mt="Update Custom Covers",dt="Adopt Orphan Folders",Ct="Cleanup Orphan Tags",pt="Update Codex Server Software",ht="Backup Database",It="Optimize Database",St="Check Integrity Of Entire Database",_t="Check Integrtity Of Database Foreign Keys",bt="Check Integrity Of Full Text Virtual Table",Tt="Check Codex Latest Version",kt="Cleanup Orphan Bookmarks",ft="Cleanup Old Sessions",gt="Cleanup Orphan Covers",vt="Rebuild Full Text Search Virtual Table",wt="Restart Codex Server",Lt="Stop Codex Server",yt="Optimize Search Virtual Table",Ot="Clean Orphan Search Entries",At="Clear Full Text Search Table",Dt="Sync new Search Entries",Rt="Sync old Search Entries",Ft="Poll Library",Vt={CCC:Q,CFO:z,CRC:q,IAT:G,ICC:W,ICT:j,ICV:K,IFI:X,IGU:H,ILT:Y,ILV:Z,IQC:$,IQL:tt,IQT:et,IQV:st,IRC:at,IRF:nt,IRT:rt,IRV:ot,ISC:it,ISU:ut,IUC:ct,IUT:lt,IUV:mt,JAF:dt,JCT:Ct,JCU:pt,JDB:ht,JDO:It,JID:St,JIF:_t,JIS:bt,JLV:Tt,JRB:kt,JRS:ft,JRV:gt,JSR:vt,RCR:wt,RCS:Lt,SIO:yt,SIR:Ot,SIX:At,SSC:Dt,SSU:Rt,WPO:Ft},xt={name:"AdminStatusListItem",props:{status:{type:Object,required:!0},now:{type:Number,required:!0}},computed:{showComplete(){return Number.isInteger(this.status.complete)},showNumbers(){return this.showComplete||Number.isInteger(this.status.total)},indeterminate(){return this.status.active&&(!this.status.total||!Number.isInteger(this.status.complete))},progress(){return!this.status.total||globalThis.indeterminate?0:100*+this.status.complete/+this.status.total},title(){return Vt[this.status.statusType]},activeTime(){return new Date(this.status.active).getTime()},duration(){return this.status.active?y(this.activeTime,this.now):""}},methods:{nf(e){return Number.isInteger(e)?L.format(e):"?"}}},Nt={class:"statusItem"},Ut={class:"statusItemTitle"},Bt={key:0,class:"statusItemDetails"},Jt={key:0,class:"statusItemSubtitle"},Pt={key:1,class:"statusItemProgress"},Et={key:0,class:"statusItemProgressNumbers"},Mt={key:0},Qt={key:1,class:"statusItemDuration"};function zt(e,i,o,_,u,t){return s(),a("div",Nt,[f("div",Ut,c(t.title),1),o.status.subtitle||t.showNumbers||t.duration?(s(),a("div",Bt,[o.status.subtitle?(s(),a("div",Jt,c(o.status.subtitle),1)):n("",!0),t.showNumbers||t.duration?(s(),a("div",Pt,[t.showNumbers?(s(),a("span",Et,[t.showComplete?(s(),a("span",Mt,c(t.nf(o.status.complete))+" / ",1)):n("",!0),g(" "+c(t.nf(o.status.total)),1)])):n("",!0),t.duration?(s(),a("span",Qt,c(t.duration),1)):n("",!0)])):n("",!0)])):n("",!0),r(B,{indeterminate:t.indeterminate,"model-value":t.progress,bottom:""},null,8,["indeterminate","model-value"])])}const qt=S(xt,[["render",zt],["__scopeId","data-v-660b56f0"]]),Gt={name:"AdminStatusList",components:{CloseButton:U,StatusListItem:qt},data(){return{now:Date.now()}},computed:{...C(O,{isSettingsDrawerOpen:e=>e.isSettingsDrawerOpen}),...C(h,{librarianStatuses:e=>e.librarianStatuses,show:e=>e.librarianStatuses.length>0})},created(){this.load()},watch:{show(e){e&&this.updateTime()},isSettingsDrawerOpen(e){e&&this.updateTime()}},mounted(){this.updateTime()},methods:{...v(h,["loadTable","librarianTask"]),load(){this.loadTable("LibrarianStatus")},clear(){this.librarianTask("librarian_clear_status","")},updateTime(){this.now=Date.now(),setTimeout(()=>{this.isSettingsDrawerOpen&&this.show&&this.updateTime()},1e3)}}},Wt={key:0};function jt(e,i,o,_,u,t){const l=p("CloseButton"),I=p("StatusListItem");return s(),a(T,null,[e.show?(s(),d(w,{key:0})):n("",!0),r(P,{onClick:t.load},{default:m(()=>[r(k,null,{default:m(()=>[e.show?(s(),a("div",Wt,[r(l,{id:"clearButton",title:"Clear Librarian Statuses",size:"small",onClick:t.clear},null,8,["onClick"]),i[0]||(i[0]=f("h4",null,"Librarian Tasks",-1)),(s(!0),a(T,null,A(e.librarianStatuses,b=>(s(),d(k,{key:b.id},{default:m(()=>[r(I,{status:b,now:u.now},null,8,["status","now"])]),_:2},1024))),128))])):(s(),d(J,{key:1,id:"noTasksRunning"},{default:m(()=>i[1]||(i[1]=[g(" No librarian tasks running ")])),_:1,__:[1]}))]),_:1})]),_:1},8,["onClick"])],64)}const Kt=S(Gt,[["render",jt],["__scopeId","data-v-4e53661b"]]),Xt={name:"AdminMenu",components:{AdminStatusList:Kt,CodexListItem:E},data(){return{mdiOpenInNew:N,mdiDatabaseClockOutline:x,mdiCrownOutline:V}},computed:{...C(F,["isUserAdmin"]),...C(h,["unseenFailedImports"]),failedImportsIcon(){return this.unseenFailedImports?R:void 0},showAdminPanelLink(){return!this.$router.currentRoute?.value?.name?.startsWith("admin")}},methods:{...v(h,["clearFailedImports","librarianTask"]),onPoll(){this.librarianTask("poll")}}},Ht={key:0};function Yt(e,i,o,_,u,t){const l=p("CodexListItem"),I=p("AdminStatusList");return e.isUserAdmin?(s(),a("div",Ht,[r(w),D(r(l,{title:"Poll All Libraries","prepend-icon":u.mdiDatabaseClockOutline,onClick:t.onPoll},null,8,["prepend-icon","onClick"]),[[M,{openDelay:2e3,text:"for updated comics"}]]),t.showAdminPanelLink?(s(),d(l,{key:0,class:"adminPanelLink",to:{name:"admin"},"prepend-icon":u.mdiCrownOutline,title:"Admin Panel","append-icon":t.failedImportsIcon},null,8,["prepend-icon","append-icon"])):n("",!0),r(I)])):n("",!0)}const ie=S(Xt,[["render",Yt]]);export{ie as default};
@@ -1 +0,0 @@
1
- import{_ as S,ad as L,cM as y,q as a,v as s,b as f,G as n,a as r,A as c,y as g,B as v,D as C,C as O,s as p,x as d,w as m,F as T,z as A,S as D,bC as R,E as F,cN as V,bA as x,$ as N}from"./main-BoAlbVoF.js";import{C as U}from"./change-password-dialog-DyhQwNv1.js";import{n as B}from"./forwardRefs-Z0d4Mnc7.js";import{useAdminStore as h}from"./admin-kjMoKlqD.js";import{d as k}from"./VSelectionControl-DbKYScD5.js";import{a as w}from"./VDivider-C3ikm0Ko.js";import{v as J,a as P,C as E}from"./VDialog-BzaGu1HN.js";import{T as M}from"./index-Cu9nQXJD.js";import"./VForm-CyCdgusw.js";const Q="Create Covers",z="Find Orphan Covers",q="Remove Covers",G="Aggregate tags from Comics",W="Create Comics",j="Create Tags",K="Create Custom Covers",X="Mark Failed Imports",H="Operate Items",Y="Link Tags",Z="Link Custom Covers",$="Query Comics",tt="Query Tag Links",et="Query Missing Tags",st="Query Missing Custom Covers",at="Remove Comics",nt="Remove Folders",rt="Read tags from Comics",ot="Remove Custom Covers",it="Create Search Index Entries",ut="Update Search Index Entries",ct="Update Comics",lt="Update Tags",mt="Update Custom Covers",dt="Adopt Orphan Folders",Ct="Cleanup Orphan Tags",pt="Update Codex Server Software",ht="Backup Database",It="Optimize Database",St="Check Integrity Of Entire Database",_t="Check Integrtity Of Database Foreign Keys",bt="Check Integrity Of Full Text Virtual Table",Tt="Check Codex Latest Version",kt="Cleanup Orphan Bookmarks",ft="Cleanup Old Sessions",gt="Cleanup Orphan Covers",vt="Rebuild Full Text Search Virtual Table",wt="Restart Codex Server",Lt="Stop Codex Server",yt="Optimize Search Virtual Table",Ot="Clean Orphan Search Entries",At="Clear Full Text Search Table",Dt="Sync new Search Entries",Rt="Sync old Search Entries",Ft="Poll Library",Vt={CCC:Q,CFO:z,CRC:q,IAT:G,ICC:W,ICT:j,ICV:K,IFI:X,IGU:H,ILT:Y,ILV:Z,IQC:$,IQL:tt,IQT:et,IQV:st,IRC:at,IRF:nt,IRT:rt,IRV:ot,ISC:it,ISU:ut,IUC:ct,IUT:lt,IUV:mt,JAF:dt,JCT:Ct,JCU:pt,JDB:ht,JDO:It,JID:St,JIF:_t,JIS:bt,JLV:Tt,JRB:kt,JRS:ft,JRV:gt,JSR:vt,RCR:wt,RCS:Lt,SIO:yt,SIR:Ot,SIX:At,SSC:Dt,SSU:Rt,WPO:Ft},xt={name:"AdminStatusListItem",props:{status:{type:Object,required:!0},now:{type:Number,required:!0}},computed:{showComplete(){return Number.isInteger(this.status.complete)},showNumbers(){return this.showComplete||Number.isInteger(this.status.total)},indeterminate(){return this.status.active&&(!this.status.total||!Number.isInteger(this.status.complete))},progress(){return!this.status.total||globalThis.indeterminate?0:100*+this.status.complete/+this.status.total},title(){return Vt[this.status.statusType]},activeTime(){return new Date(this.status.active).getTime()},duration(){return this.status.active?y(this.activeTime,this.now):""}},methods:{nf(e){return Number.isInteger(e)?L.format(e):"?"}}},Nt={class:"statusItem"},Ut={class:"statusItemTitle"},Bt={key:0,class:"statusItemDetails"},Jt={key:0,class:"statusItemSubtitle"},Pt={key:1,class:"statusItemProgress"},Et={key:0,class:"statusItemProgressNumbers"},Mt={key:0},Qt={key:1,class:"statusItemDuration"};function zt(e,i,o,_,u,t){return s(),a("div",Nt,[f("div",Ut,c(t.title),1),o.status.subtitle||t.showNumbers||t.duration?(s(),a("div",Bt,[o.status.subtitle?(s(),a("div",Jt,c(o.status.subtitle),1)):n("",!0),t.showNumbers||t.duration?(s(),a("div",Pt,[t.showNumbers?(s(),a("span",Et,[t.showComplete?(s(),a("span",Mt,c(t.nf(o.status.complete))+" / ",1)):n("",!0),g(" "+c(t.nf(o.status.total)),1)])):n("",!0),t.duration?(s(),a("span",Qt,c(t.duration),1)):n("",!0)])):n("",!0)])):n("",!0),r(B,{indeterminate:t.indeterminate,"model-value":t.progress,bottom:""},null,8,["indeterminate","model-value"])])}const qt=S(xt,[["render",zt],["__scopeId","data-v-660b56f0"]]),Gt={name:"AdminStatusList",components:{CloseButton:U,StatusListItem:qt},data(){return{now:Date.now()}},computed:{...C(O,{isSettingsDrawerOpen:e=>e.isSettingsDrawerOpen}),...C(h,{librarianStatuses:e=>e.librarianStatuses,show:e=>e.librarianStatuses.length>0})},created(){this.load()},watch:{show(e){e&&this.updateTime()},isSettingsDrawerOpen(e){e&&this.updateTime()}},mounted(){this.updateTime()},methods:{...v(h,["loadTable","librarianTask"]),load(){this.loadTable("LibrarianStatus")},clear(){this.librarianTask("librarian_clear_status","")},updateTime(){this.now=Date.now(),setTimeout(()=>{this.isSettingsDrawerOpen&&this.show&&this.updateTime()},1e3)}}},Wt={key:0};function jt(e,i,o,_,u,t){const l=p("CloseButton"),I=p("StatusListItem");return s(),a(T,null,[e.show?(s(),d(w,{key:0})):n("",!0),r(P,{onClick:t.load},{default:m(()=>[r(k,null,{default:m(()=>[e.show?(s(),a("div",Wt,[r(l,{id:"clearButton",title:"Clear Librarian Statuses",size:"small",onClick:t.clear},null,8,["onClick"]),i[0]||(i[0]=f("h4",null,"Librarian Tasks",-1)),(s(!0),a(T,null,A(e.librarianStatuses,b=>(s(),d(k,{key:b.id},{default:m(()=>[r(I,{status:b,now:u.now},null,8,["status","now"])]),_:2},1024))),128))])):(s(),d(J,{key:1,id:"noTasksRunning"},{default:m(()=>i[1]||(i[1]=[g(" No librarian tasks running ")])),_:1,__:[1]}))]),_:1})]),_:1},8,["onClick"])],64)}const Kt=S(Gt,[["render",jt],["__scopeId","data-v-4e53661b"]]),Xt={name:"AdminMenu",components:{AdminStatusList:Kt,CodexListItem:E},data(){return{mdiOpenInNew:N,mdiDatabaseClockOutline:x,mdiCrownOutline:V}},computed:{...C(F,["isUserAdmin"]),...C(h,["unseenFailedImports"]),failedImportsIcon(){return this.unseenFailedImports?R:void 0},showAdminPanelLink(){return!this.$router.currentRoute?.value?.name?.startsWith("admin")}},methods:{...v(h,["clearFailedImports","librarianTask"]),onPoll(){this.librarianTask("poll")}}},Ht={key:0};function Yt(e,i,o,_,u,t){const l=p("CodexListItem"),I=p("AdminStatusList");return e.isUserAdmin?(s(),a("div",Ht,[r(w),D(r(l,{title:"Poll All Libraries","prepend-icon":u.mdiDatabaseClockOutline,onClick:t.onPoll},null,8,["prepend-icon","onClick"]),[[M,{openDelay:2e3,text:"for updated comics"}]]),t.showAdminPanelLink?(s(),d(l,{key:0,class:"adminPanelLink",to:{name:"admin"},"prepend-icon":u.mdiCrownOutline,title:"Admin Panel","append-icon":t.failedImportsIcon},null,8,["prepend-icon","append-icon"])):n("",!0),r(I)])):n("",!0)}const ie=S(Xt,[["render",Yt]]);export{ie as default};
@@ -1 +0,0 @@
1
- import{_,B as k,D as y,C as I,q as C,v as p,a as r,w as s,m as L,X as q,x as w,G as F,s as u,A as v,L as E,ad as X,M as J,an as H,$,bz as Q,bA as Z,bB as ee,b as o,d as te,y as a,k as oe,bC as re,F as le,z as se}from"./main-BoAlbVoF.js";import{A as ie,R as ne,a as B,b as ae,c as de}from"./relation-chips-CAXZIswb.js";import{useAdminStore as h}from"./admin-kjMoKlqD.js";import{a as me}from"./VDialog-BzaGu1HN.js";import{V as ue}from"./VCombobox-Uogv6Ckp.js";import{V as D}from"./VCheckbox-DSndl51k.js";import{c as pe,d as U}from"./VSelectionControl-DbKYScD5.js";import{D as N}from"./datetime-column-DANpNGGe.js";import{C as ce}from"./confirm-dialog-B7ndwV5M.js";import{V as z}from"./VCheckboxBtn-Bu2Pf64q.js";import{V as A,a as x,b as P,c as T}from"./VExpansionPanels-AmsInZN0.js";import{k as R}from"./forwardRefs-Z0d4Mnc7.js";import{V as he}from"./VTable-BmOfHc7J.js";import"./VForm-CyCdgusw.js";import"./VSelect-Dv50OIkN.js";import"./ssrBoot-O6yTJ_UV.js";import"./VDivider-C3ikm0Ko.js";import"./filter-Dhe8cVmt.js";const fe={name:"AdminServerFolderPicker",emits:["change","menu"],data(){return{path:"",originalPath:"",showHidden:!1,menuOpen:!1}},computed:{...y(h,{folders:e=>e.folderPicker.folders,rootFolder:e=>e.folderPicker.rootFolder}),...y(I,{formErrors:e=>e.form.errors}),appendOuterIcon(){return this.showHidden?this.mdiFolderHidden:this.mdiFolderOutline},showHiddenTooltipPrefix(){return this.showHidden?"Hide":"Show"}},watch:{menuOpen(e){e&&this.$emit("menu",e)}},created(){this.loadFolders().then(()=>(this.path=this.rootFolder,this.originalPath=this.rootFolder,!0)).catch(console.warn)},methods:{...k(h,["clearFolders","loadFolders"]),...k(I,["clearErrors"]),change(e){let t;e?t=e.startsWith("/")||e.startsWith("\\")?e:[this.rootFolder,e].join("/"):t=this.rootFolder;const m=this.menuOpen;this.clearErrors(),this.loadFolders(t,this.showHidden).then(()=>{this.menuOpen=m;let b="";return this.formErrors.length===0&&(this.path=b=this.rootFolder),this.$emit("change",b)}).catch(console.warn)},onBlur(){this.menuOpen=!1,this.change(this.path)},onClear(){this.clearFolders(this.orignalPath).then(()=>this.change(this.orginalPath)).catch(console.error)},onKeyDownEnter(){this.change(this.path)},onItemClick(e){this.change(e)}}},be={id:"folderPicker"};function ye(e,t,m,b,l,n){return p(),C("div",be,[r(ue,L({modelValue:l.path,"onUpdate:modelValue":t[0]||(t[0]=d=>l.path=d),menu:l.menuOpen,"onUpdate:menu":t[1]||(t[1]=d=>l.menuOpen=d)},e.$attrs,{"aria-label":"Library folder",clearable:"","error-messages":e.formErrors,"full-width":"","hide-details":"auto",items:e.folders,"menu-props":{maxHeight:"370px"},"validate-on":"blur",variant:"filled",onBlur:n.onBlur,"onClick:clear":n.onClear,onKeydown:q(n.onKeyDownEnter,["enter"])}),{item:s(({item:d,props:f})=>[r(me,L(f,{title:d.title,value:d.value,onClick:g=>n.onItemClick(d.value)}),null,16,["title","value","onClick"])]),_:1},16,["modelValue","menu","error-messages","items","onBlur","onClick:clear","onKeydown"]),r(D,{modelValue:l.showHidden,"onUpdate:modelValue":t[2]||(t[2]=d=>l.showHidden=d),density:"compact",class:"showHidden","hide-details":"auto",label:"Show Hidden Folders"},null,8,["modelValue"])])}const ve=_(fe,[["render",ye],["__scopeId","data-v-61ca3769"]]),O="DDD HH:mm:SS",ge=/^(?:[0-3]?\d?\d\s)?(?:[01]?\d|2[0-3])(?::[0-5]\d){2}$/,Ce={name:"TimeTextField",data(){return{FORMAT:O,timeRules:[e=>ge.test(e)||`Invalid time format ${O}`]}}};function we(e,t,m,b,l,n){return p(),w(pe,L({ref:"timeField",density:"compact",filled:"",hint:l.FORMAT,round:"",rules:l.timeRules},e.$attrs),null,16,["hint","rules"])}const _e=_(Ce,[["render",we]]),j=["events","poll","pollEvery","groups"];Object.freeze(j);const V={path:"",events:!0,poll:!0,pollEvery:"01:00:00",groups:[]};Object.freeze(V);const S=(e,t)=>(e=e.replaceAll("\\","/"),t=t.replaceAll("\\","/"),e.endsWith("/")||(e+="/"),t.endsWith("/")||(t+="/"),t.startsWith(e)),ke={name:"AdminLibraryCreateUpdateInputs",components:{AdminRelationPicker:ie,AdminServerFolderPicker:ve,TimeTextField:_e},props:{oldRow:{type:[Object,Boolean],default:!1}},emits:["change"],data(){return{rules:{path:[e=>!!e||"Path is required",e=>{if(!e)return!1;for(const t of this.paths){if(S(t,e))return"Path is a child of an existing library";if(S(e,t))return"Path is a parent of an existing library"}return!0}]},row:E(this.oldRow||V)}},computed:{...y(h,["normalLibraries"]),...y(h,{groups:e=>e.groups}),paths(){return this.nameSet(this.normalLibraries,"path",this.oldRow,!1)}},watch:{row:{handler(e){this.$emit("change",e)},deep:!0},oldRow:{handler(e){this.row=E(e)},deep:!0}},methods:{...k(h,["nameSet"])},UPDATE_KEYS:j,EMPTY_ROW:V},Fe={key:1};function Ae(e,t,m,b,l,n){const d=u("AdminServerFolderPicker"),f=u("TimeTextField"),g=u("AdminRelationPicker");return p(),C("section",null,[m.oldRow?(p(),C("div",Fe,v(m.oldRow.path),1)):(p(),w(d,{key:0,rules:l.rules.path,autofocus:"",label:"Library Folder",onChange:t[0]||(t[0]=c=>l.row.path=c)},null,8,["rules"])),r(D,{modelValue:l.row.events,"onUpdate:modelValue":t[1]||(t[1]=c=>l.row.events=c),"hide-details":"auto",hint:"Update Codex instantly when the filesystem changes",label:"Watch Filesystem Events","persistent-hint":!0},null,8,["modelValue"]),r(D,{modelValue:l.row.poll,"onUpdate:modelValue":t[2]||(t[2]=c=>l.row.poll=c),label:"Poll Filesystem Periodically","hide-details":"auto",hint:"Periodically poll the library for changes","persistent-hint":!0},null,8,["modelValue"]),r(f,{modelValue:l.row.pollEvery,"onUpdate:modelValue":t[3]||(t[3]=c=>l.row.pollEvery=c),label:"Poll Every",disabled:!l.row.poll},null,8,["modelValue","disabled"]),l.row.coversOnly?F("",!0):(p(),w(g,{key:2,modelValue:l.row.groups,"onUpdate:modelValue":t[4]||(t[4]=c=>l.row.groups=c),label:"Groups",objs:e.groups,"group-type":"","title-key":"name"},null,8,["modelValue","objs"]))])}const W=_(ke,[["render",Ae]]),xe={name:"AdminLibrariesTab",components:{AdminTable:de,AdminDeleteRowDialog:ae,AdminCreateUpdateDialog:B,RelationChips:ne,ConfirmDialog:ce,DateTimeColumn:N},props:{coversDir:{type:Boolean,default:!1}},data(){return{lastUpdate:{pk:0,field:void 0},mdiCircleOffOutline:ee,mdiDatabaseClockOutline:Z,mdiDatabaseSyncOutline:Q,mdiOpenInNew:$,AdminLibraryCreateUpdateInputs:H(W)}},computed:{...y(h,["normalLibraries","customCoverLibraries"]),...y(h,{groups:e=>e.groups}),...y(I,{formErrors:e=>e.form?.errors}),...y(J,{twentyFourHourTime:e=>e.settings.twentyFourHourTime}),headers(){const e=this.coversDir?"Covers":"Comics",t=[{title:"Path",key:"path",align:"start"},{title:e,key:"comicCount"},{title:"Failed",key:"FailedCount"},{title:"Watch File Events",key:"events"},{title:"Poll Files Periodically",key:"poll"},{title:"Poll Every",key:"pollEvery"},{title:"Last Poll",key:"lastPoll"}];return this.coversDir||t.push({title:"Groups",key:"groups"}),t.push({title:"Actions",key:"actions",sortable:!1}),t},items(){return globalThis.coversDir?this.customCoverLibraries:this.normalLibraries},updateLabel(){return this.coversDir?"Cover Dir":""},itemName(){return this.coversDir?"custom covers":"comics"},iconSize(){const e=this.$vuetify.display;return e.xlAndUp?"x-large":e.lgAndUp?"large":e.mdAndUp?"default":"small"}},mounted(){this.loadTables(["Group","Library","FailedImport"])},methods:{...k(h,["updateRow","clearErrors","librarianTask","loadTables"]),formatNumber(e){return X.format(e)},changeCol(e,t,m){this.lastUpdate.pk=e,this.lastUpdate.field=t;const b={[t]:m};this.updateRow("Library",e,b)},getFormErrors(e,t){if(e===this.lastUpdate.pk&&t===this.lastUpdate.field)return this.formErrors},libraryLabel(e,t=!0){let m="";return e.coversOnly?(t&&(m+="Custom Group "),m+="Cover Dir"):m+="Library",m},poll(e){const t=this.libraryLabel(e);this.librarianTask("poll",`Poll ${t} ${e.pk}`,e.pk)},forcePoll(e){const t=this.libraryLabel(e);this.librarianTask("poll_force",`Force Poll ${t} ${e.pk}`,e.pk)},pollConfirmText(e){return`Poll ${this.libraryLabel(e,!1)}`}}},Pe={class:"failedComics"},Te={class:"actionButtonCell"};function Ie(e,t,m,b,l,n){const d=u("DateTimeColumn"),f=u("RelationChips"),g=u("ConfirmDialog"),c=u("AdminCreateUpdateDialog"),M=u("AdminDeleteRowDialog"),K=u("AdminTable");return p(),w(K,{headers:n.headers},{"no-data":s(()=>t[0]||(t[0]=[o("td",{class:"adminNoData",colspan:"100%"}," Add a Library to start using Codex ",-1)])),"item.comicCount":s(({item:i})=>[a(v(n.formatNumber(i.comicCount)),1)]),"item.failedCount":s(({item:i})=>[o("span",Pe,v(n.formatNumber(i.failedCount)),1)]),"item.events":s(({item:i})=>[r(z,{"model-value":i.events,disabled:""},null,8,["model-value"])]),"item.poll":s(({item:i})=>[r(z,{"model-value":i.poll,disabled:""},null,8,["model-value"])]),"item.pollEvery":s(({item:i})=>[o("span",{class:te({disabled:!i.poll})},v(i.pollEvery),3)]),"item.lastPoll":s(({item:i})=>[r(d,{dttm:i.lastPoll},null,8,["dttm"])]),"item.groups":s(({item:i})=>[r(f,{pks:i.groups,objs:e.groups,"group-type":"","title-key":"name"},null,8,["pks","objs"])]),"item.actions":s(({item:i})=>[o("span",Te,[r(g,{icon:l.mdiDatabaseClockOutline,"title-text":`Poll for updated ${n.itemName}`,text:i.path,"confirm-text":n.pollConfirmText(i),size:n.iconSize,density:"compact",onConfirm:Y=>n.poll(i)},null,8,["icon","title-text","text","confirm-text","size","onConfirm"]),r(g,{icon:l.mdiDatabaseSyncOutline,"title-text":`Force update ${n.itemName}`,text:i.path,"confirm-text":"Force Update",size:n.iconSize,density:"compact",onConfirm:Y=>n.forcePoll(i)},null,8,["icon","title-text","text","size","onConfirm"]),r(c,{table:"Library","old-row":i,inputs:l.AdminLibraryCreateUpdateInputs,label:n.updateLabel,"max-width":"22em",size:n.iconSize,density:"compact"},null,8,["old-row","inputs","label","size"]),i.coversOnly?F("",!0):(p(),w(M,{key:0,table:"Library",pk:i.pk,name:i.path,size:n.iconSize,density:"compact"},null,8,["pk","name","size"]))])]),_:2},1032,["headers"])}const G=_(xe,[["render",Ie],["__scopeId","data-v-0c151b28"]]),Le={name:"AdminCustomCoversPanel",components:{AdminLibraryTable:G},computed:{...y(h,["customCoverLibraries"])}};function De(e,t,m,b,l,n){const d=u("AdminLibraryTable");return p(),w(A,null,{default:s(()=>[r(x,null,{default:s(()=>[r(P,null,{default:s(()=>t[0]||(t[0]=[o("h4",{id:"coverDirHeader"},"Custom Covers",-1)])),_:1,__:[0]}),r(T,null,{default:s(()=>[r(d,{items:e.customCoverLibraries,"disable-sort":"","covers-dir":!0},null,8,["items"]),r(A,null,{default:s(()=>[r(x,{id:"customCoversHelp"},{default:s(()=>[r(P,null,{default:s(()=>t[1]||(t[1]=[o("h4",null,"Custom Covers Help",-1)])),_:1,__:[1]}),r(T,null,{default:s(()=>t[2]||(t[2]=[o("p",null,"Custom covers may be added to the browser in two locations:",-1),o("h4",null,"Folders",-1),o("p",null,[a(" A library folder with a file named "),o("code",null,".codex-cover.jpg"),a(" will show a custom cover for that folder in Folder view. The addition and removal of these covers by watching filesystem events and polling is handled by the library that folder belongs to. ")],-1),o("h4",null,"Custom Covers Dir",-1),o("p",null,[a(" The Codex config directory has a special folder named "),o("code",null,"custom-covers"),a(" under which are subdirectories for each of the browser groups that may adopt custom covers. Images in these subdirectories that match the name of the browser group will be used as custom covers. For instance: "),o("code",null,".../custom-covers/publishers/American Comics Group.webp"),a(' would be used as the cover for the publisher "American Comics Group". '),o("code",null,".../custom-covers/series/arrow.png"),a(' would be used as the cover for every series named "Arrow", for '),o("em",null,"every"),a(" publisher. Similar to a comic library, the "),o("code",null,"custom-covers"),a(" directory may be watched and polled for changes. By default it is neither watched nor polled and must be enabled by the admin. ")],-1),o("h4",null,"Image Formats & Size",-1),o("p",null,[a(" Custom covers are detected only for files with the extensions: "),o("code",null,".bmp, .gif, .jpeg, .jpg, .png, .webp"),a(". ")],-1),o("p",null," Browser covers are transformed from their sources to 165px x 254px thumbnails. Custom covers will transform most aesthetically the closer to that ratio they are. ",-1),o("h4",null,"Priority",-1),o("p",null," Custom covers supersede covers set by the user's individual browser settings. ",-1)])),_:1,__:[2]})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}const Ve=_(Le,[["render",De],["__scopeId","data-v-268927b7"]]),Ee={name:"AdminFailedImportsPanel",components:{DateTimeColumn:N},data(){return{mdiBookAlert:re,mdiOpenInNew:$}},computed:{...y(h,{failedImports:e=>e.failedImports,showFailedImports:e=>e.failedImports&&e.failedImports.length>0}),...oe(h,["unseenFailedImports"])}},Ue={key:0},ze={class:"dateCol"},Re={href:"https://github.com/ajslater/codex/issues/",target:"_blank"};function Oe(e,t,m,b,l,n){const d=u("DateTimeColumn");return e.showFailedImports?(p(),C("div",Ue,[r(A,null,{default:s(()=>[r(x,{id:"failedImportsPanel",onClick:t[0]||(t[0]=f=>e.unseenFailedImports=!1)},{default:s(()=>[r(P,null,{default:s(()=>[o("h4",null,"Failed Imports: "+v(e.failedImports.length),1),e.unseenFailedImports?(p(),w(R,{key:0,id:"failedImportsIcon",title:"New Failed Imports"},{default:s(()=>[a(v(l.mdiBookAlert),1)]),_:1})):F("",!0)]),_:1}),r(T,null,{default:s(()=>[r(he,{class:"highlight-table"},{default:s(()=>[t[1]||(t[1]=o("thead",null,[o("tr",null,[o("th",null,"Path"),o("th",null,"Created")])],-1)),o("tbody",null,[(p(!0),C(le,null,se(e.failedImports,f=>(p(),C("tr",{key:`fi:${f.path}`},[o("td",null,v(f.path),1),o("td",ze,[r(d,{dttm:f.createdAt},null,8,["dttm"])])]))),128))])]),_:1}),r(A,null,{default:s(()=>[r(x,{id:"failedImportsHelp"},{default:s(()=>[r(P,null,{default:s(()=>t[2]||(t[2]=[o("h4",null,"Failed Imports Help",-1)])),_:1,__:[2]}),r(T,null,{default:s(()=>[t[8]||(t[8]=o("p",null," These are Comic archives that have failed to import. This list is updated every time the library updates. You should probably review these files and fix or remove them. ",-1)),t[9]||(t[9]=o("h4",null,"Fixing comics",-1)),t[10]||(t[10]=o("p",null,[a(" Try using the zip fixer to fix comics: "),o("code",{class:"cli"},[a(" cp problem-comic.cbz /somewhere/safe/problem-comic.cbz.backup"),o("br"),a(" zip -F problem-comic.cbz --out fixed.zip"),o("br"),a(" mv fixed.zip problem-comic.cbz ")]),a(" You may also try "),o("code",null,"zip -FF"),a(" to fix comics which uses a different (not necissarily better) algorithm. If you fix some imports, and Codex does not immediately detect the change, poll the library which contains the fixed comics. ")],-1)),t[11]||(t[11]=o("h4",null,"Reporting Issues",-1)),o("p",null,[t[4]||(t[4]=a(" If the comic looks good to you, but still shows up as a failed import, it might be Codex's fault for not importing it correctly. Please file an ")),o("a",Re,[t[3]||(t[3]=a("Issue Report")),r(R,{size:"small"},{default:s(()=>[a(v(l.mdiOpenInNew),1)]),_:1})]),t[5]||(t[5]=a(" and include the stack trace from the logs at ")),t[6]||(t[6]=o("code",null,"config/logs/codex.log",-1)),t[7]||(t[7]=a(" if you can. "))])]),_:1,__:[8,9,10,11]})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})])):F("",!0)}const Se=_(Ee,[["render",Oe],["__scopeId","data-v-827c9a0b"]]),He={name:"AdminLibrariesTab",components:{AdminFailedImportsPanel:Se,AdminLibraryTable:G,AdminCreateUpdateDialog:B,AdminCustomCoversPanel:Ve},data(){return{AdminLibraryCreateUpdateInputs:H(W)}},computed:{...y(h,["normalLibraries"])},mounted(){this.loadTables(["Group","Library","FailedImport"])},methods:{...k(h,["loadTables"])}},$e={class:"tabHeader"};function Be(e,t,m,b,l,n){const d=u("AdminCreateUpdateDialog"),f=u("AdminLibraryTable"),g=u("AdminFailedImportsPanel"),c=u("AdminCustomCoversPanel");return p(),C("div",null,[o("header",$e,[r(d,{table:"Library",inputs:l.AdminLibraryCreateUpdateInputs},null,8,["inputs"])]),r(f,{items:e.normalLibraries,"sort-by":[{key:"path",order:"asc"}]},null,8,["items"]),r(U,null,{default:s(()=>[r(g,{id:"failedImports"})]),_:1}),r(U,null,{default:s(()=>[r(c,{id:"customCovers"})]),_:1}),t[0]||(t[0]=o("p",{id:"libraryHelp"}," Each Watched File Events box checked creates a thread to monitor the Library. An large number of watching threads may exceed the limits of your operating system or container. ",-1))])}const it=_(He,[["render",Be],["__scopeId","data-v-66bb908f"]]);export{it as default};
@@ -1 +0,0 @@
1
- import{_,B as k,D as y,C as I,q as C,v as p,a as r,w as s,m as L,X as q,x as w,G as F,s as u,A as v,L as E,ad as X,M as J,an as H,$,bz as Q,bA as Z,bB as ee,b as o,d as te,y as a,k as oe,bC as re,F as le,z as se}from"./main-BoAlbVoF.js";import{A as ie,R as ne,a as B,b as ae,c as de}from"./relation-chips-CAXZIswb.js";import{useAdminStore as h}from"./admin-kjMoKlqD.js";import{a as me}from"./VDialog-BzaGu1HN.js";import{V as ue}from"./VCombobox-Uogv6Ckp.js";import{V as D}from"./VCheckbox-DSndl51k.js";import{c as pe,d as U}from"./VSelectionControl-DbKYScD5.js";import{D as N}from"./datetime-column-DANpNGGe.js";import{C as ce}from"./confirm-dialog-B7ndwV5M.js";import{V as z}from"./VCheckboxBtn-Bu2Pf64q.js";import{V as A,a as x,b as P,c as T}from"./VExpansionPanels-AmsInZN0.js";import{k as R}from"./forwardRefs-Z0d4Mnc7.js";import{V as he}from"./VTable-BmOfHc7J.js";import"./VForm-CyCdgusw.js";import"./VSelect-Dv50OIkN.js";import"./ssrBoot-O6yTJ_UV.js";import"./VDivider-C3ikm0Ko.js";import"./filter-Dhe8cVmt.js";const fe={name:"AdminServerFolderPicker",emits:["change","menu"],data(){return{path:"",originalPath:"",showHidden:!1,menuOpen:!1}},computed:{...y(h,{folders:e=>e.folderPicker.folders,rootFolder:e=>e.folderPicker.rootFolder}),...y(I,{formErrors:e=>e.form.errors}),appendOuterIcon(){return this.showHidden?this.mdiFolderHidden:this.mdiFolderOutline},showHiddenTooltipPrefix(){return this.showHidden?"Hide":"Show"}},watch:{menuOpen(e){e&&this.$emit("menu",e)}},created(){this.loadFolders().then(()=>(this.path=this.rootFolder,this.originalPath=this.rootFolder,!0)).catch(console.warn)},methods:{...k(h,["clearFolders","loadFolders"]),...k(I,["clearErrors"]),change(e){let t;e?t=e.startsWith("/")||e.startsWith("\\")?e:[this.rootFolder,e].join("/"):t=this.rootFolder;const m=this.menuOpen;this.clearErrors(),this.loadFolders(t,this.showHidden).then(()=>{this.menuOpen=m;let b="";return this.formErrors.length===0&&(this.path=b=this.rootFolder),this.$emit("change",b)}).catch(console.warn)},onBlur(){this.menuOpen=!1,this.change(this.path)},onClear(){this.clearFolders(this.orignalPath).then(()=>this.change(this.orginalPath)).catch(console.error)},onKeyDownEnter(){this.change(this.path)},onItemClick(e){this.change(e)}}},be={id:"folderPicker"};function ye(e,t,m,b,l,n){return p(),C("div",be,[r(ue,L({modelValue:l.path,"onUpdate:modelValue":t[0]||(t[0]=d=>l.path=d),menu:l.menuOpen,"onUpdate:menu":t[1]||(t[1]=d=>l.menuOpen=d)},e.$attrs,{"aria-label":"Library folder",clearable:"","error-messages":e.formErrors,"full-width":"","hide-details":"auto",items:e.folders,"menu-props":{maxHeight:"370px"},"validate-on":"blur",variant:"filled",onBlur:n.onBlur,"onClick:clear":n.onClear,onKeydown:q(n.onKeyDownEnter,["enter"])}),{item:s(({item:d,props:f})=>[r(me,L(f,{title:d.title,value:d.value,onClick:g=>n.onItemClick(d.value)}),null,16,["title","value","onClick"])]),_:1},16,["modelValue","menu","error-messages","items","onBlur","onClick:clear","onKeydown"]),r(D,{modelValue:l.showHidden,"onUpdate:modelValue":t[2]||(t[2]=d=>l.showHidden=d),density:"compact",class:"showHidden","hide-details":"auto",label:"Show Hidden Folders"},null,8,["modelValue"])])}const ve=_(fe,[["render",ye],["__scopeId","data-v-61ca3769"]]),O="DDD HH:mm:SS",ge=/^(?:[0-3]?\d?\d\s)?(?:[01]?\d|2[0-3])(?::[0-5]\d){2}$/,Ce={name:"TimeTextField",data(){return{FORMAT:O,timeRules:[e=>ge.test(e)||`Invalid time format ${O}`]}}};function we(e,t,m,b,l,n){return p(),w(pe,L({ref:"timeField",density:"compact",filled:"",hint:l.FORMAT,round:"",rules:l.timeRules},e.$attrs),null,16,["hint","rules"])}const _e=_(Ce,[["render",we]]),j=["events","poll","pollEvery","groups"];Object.freeze(j);const V={path:"",events:!0,poll:!0,pollEvery:"01:00:00",groups:[]};Object.freeze(V);const S=(e,t)=>(e=e.replaceAll("\\","/"),t=t.replaceAll("\\","/"),e.endsWith("/")||(e+="/"),t.endsWith("/")||(t+="/"),t.startsWith(e)),ke={name:"AdminLibraryCreateUpdateInputs",components:{AdminRelationPicker:ie,AdminServerFolderPicker:ve,TimeTextField:_e},props:{oldRow:{type:[Object,Boolean],default:!1}},emits:["change"],data(){return{rules:{path:[e=>!!e||"Path is required",e=>{if(!e)return!1;for(const t of this.paths){if(S(t,e))return"Path is a child of an existing library";if(S(e,t))return"Path is a parent of an existing library"}return!0}]},row:E(this.oldRow||V)}},computed:{...y(h,["normalLibraries"]),...y(h,{groups:e=>e.groups}),paths(){return this.nameSet(this.normalLibraries,"path",this.oldRow,!1)}},watch:{row:{handler(e){this.$emit("change",e)},deep:!0},oldRow:{handler(e){this.row=E(e)},deep:!0}},methods:{...k(h,["nameSet"])},UPDATE_KEYS:j,EMPTY_ROW:V},Fe={key:1};function Ae(e,t,m,b,l,n){const d=u("AdminServerFolderPicker"),f=u("TimeTextField"),g=u("AdminRelationPicker");return p(),C("section",null,[m.oldRow?(p(),C("div",Fe,v(m.oldRow.path),1)):(p(),w(d,{key:0,rules:l.rules.path,autofocus:"",label:"Library Folder",onChange:t[0]||(t[0]=c=>l.row.path=c)},null,8,["rules"])),r(D,{modelValue:l.row.events,"onUpdate:modelValue":t[1]||(t[1]=c=>l.row.events=c),"hide-details":"auto",hint:"Update Codex instantly when the filesystem changes",label:"Watch Filesystem Events","persistent-hint":!0},null,8,["modelValue"]),r(D,{modelValue:l.row.poll,"onUpdate:modelValue":t[2]||(t[2]=c=>l.row.poll=c),label:"Poll Filesystem Periodically","hide-details":"auto",hint:"Periodically poll the library for changes","persistent-hint":!0},null,8,["modelValue"]),r(f,{modelValue:l.row.pollEvery,"onUpdate:modelValue":t[3]||(t[3]=c=>l.row.pollEvery=c),label:"Poll Every",disabled:!l.row.poll},null,8,["modelValue","disabled"]),l.row.coversOnly?F("",!0):(p(),w(g,{key:2,modelValue:l.row.groups,"onUpdate:modelValue":t[4]||(t[4]=c=>l.row.groups=c),label:"Groups",objs:e.groups,"group-type":"","title-key":"name"},null,8,["modelValue","objs"]))])}const W=_(ke,[["render",Ae]]),xe={name:"AdminLibrariesTab",components:{AdminTable:de,AdminDeleteRowDialog:ae,AdminCreateUpdateDialog:B,RelationChips:ne,ConfirmDialog:ce,DateTimeColumn:N},props:{coversDir:{type:Boolean,default:!1}},data(){return{lastUpdate:{pk:0,field:void 0},mdiCircleOffOutline:ee,mdiDatabaseClockOutline:Z,mdiDatabaseSyncOutline:Q,mdiOpenInNew:$,AdminLibraryCreateUpdateInputs:H(W)}},computed:{...y(h,["normalLibraries","customCoverLibraries"]),...y(h,{groups:e=>e.groups}),...y(I,{formErrors:e=>e.form?.errors}),...y(J,{twentyFourHourTime:e=>e.settings.twentyFourHourTime}),headers(){const e=this.coversDir?"Covers":"Comics",t=[{title:"Path",key:"path",align:"start"},{title:e,key:"comicCount"},{title:"Failed",key:"FailedCount"},{title:"Watch File Events",key:"events"},{title:"Poll Files Periodically",key:"poll"},{title:"Poll Every",key:"pollEvery"},{title:"Last Poll",key:"lastPoll"}];return this.coversDir||t.push({title:"Groups",key:"groups"}),t.push({title:"Actions",key:"actions",sortable:!1}),t},items(){return globalThis.coversDir?this.customCoverLibraries:this.normalLibraries},updateLabel(){return this.coversDir?"Cover Dir":""},itemName(){return this.coversDir?"custom covers":"comics"},iconSize(){const e=this.$vuetify.display;return e.xlAndUp?"x-large":e.lgAndUp?"large":e.mdAndUp?"default":"small"}},mounted(){this.loadTables(["Group","Library","FailedImport"])},methods:{...k(h,["updateRow","clearErrors","librarianTask","loadTables"]),formatNumber(e){return X.format(e)},changeCol(e,t,m){this.lastUpdate.pk=e,this.lastUpdate.field=t;const b={[t]:m};this.updateRow("Library",e,b)},getFormErrors(e,t){if(e===this.lastUpdate.pk&&t===this.lastUpdate.field)return this.formErrors},libraryLabel(e,t=!0){let m="";return e.coversOnly?(t&&(m+="Custom Group "),m+="Cover Dir"):m+="Library",m},poll(e){const t=this.libraryLabel(e);this.librarianTask("poll",`Poll ${t} ${e.pk}`,e.pk)},forcePoll(e){const t=this.libraryLabel(e);this.librarianTask("poll_force",`Force Poll ${t} ${e.pk}`,e.pk)},pollConfirmText(e){return`Poll ${this.libraryLabel(e,!1)}`}}},Pe={class:"failedComics"},Te={class:"actionButtonCell"};function Ie(e,t,m,b,l,n){const d=u("DateTimeColumn"),f=u("RelationChips"),g=u("ConfirmDialog"),c=u("AdminCreateUpdateDialog"),M=u("AdminDeleteRowDialog"),K=u("AdminTable");return p(),w(K,{headers:n.headers},{"no-data":s(()=>t[0]||(t[0]=[o("td",{class:"adminNoData",colspan:"100%"}," Add a Library to start using Codex ",-1)])),"item.comicCount":s(({item:i})=>[a(v(n.formatNumber(i.comicCount)),1)]),"item.failedCount":s(({item:i})=>[o("span",Pe,v(n.formatNumber(i.failedCount)),1)]),"item.events":s(({item:i})=>[r(z,{"model-value":i.events,disabled:""},null,8,["model-value"])]),"item.poll":s(({item:i})=>[r(z,{"model-value":i.poll,disabled:""},null,8,["model-value"])]),"item.pollEvery":s(({item:i})=>[o("span",{class:te({disabled:!i.poll})},v(i.pollEvery),3)]),"item.lastPoll":s(({item:i})=>[r(d,{dttm:i.lastPoll},null,8,["dttm"])]),"item.groups":s(({item:i})=>[r(f,{pks:i.groups,objs:e.groups,"group-type":"","title-key":"name"},null,8,["pks","objs"])]),"item.actions":s(({item:i})=>[o("span",Te,[r(g,{icon:l.mdiDatabaseClockOutline,"title-text":`Poll for updated ${n.itemName}`,text:i.path,"confirm-text":n.pollConfirmText(i),size:n.iconSize,density:"compact",onConfirm:Y=>n.poll(i)},null,8,["icon","title-text","text","confirm-text","size","onConfirm"]),r(g,{icon:l.mdiDatabaseSyncOutline,"title-text":`Force update ${n.itemName}`,text:i.path,"confirm-text":"Force Update",size:n.iconSize,density:"compact",onConfirm:Y=>n.forcePoll(i)},null,8,["icon","title-text","text","size","onConfirm"]),r(c,{table:"Library","old-row":i,inputs:l.AdminLibraryCreateUpdateInputs,label:n.updateLabel,"max-width":"22em",size:n.iconSize,density:"compact"},null,8,["old-row","inputs","label","size"]),i.coversOnly?F("",!0):(p(),w(M,{key:0,table:"Library",pk:i.pk,name:i.path,size:n.iconSize,density:"compact"},null,8,["pk","name","size"]))])]),_:2},1032,["headers"])}const G=_(xe,[["render",Ie],["__scopeId","data-v-0c151b28"]]),Le={name:"AdminCustomCoversPanel",components:{AdminLibraryTable:G},computed:{...y(h,["customCoverLibraries"])}};function De(e,t,m,b,l,n){const d=u("AdminLibraryTable");return p(),w(A,null,{default:s(()=>[r(x,null,{default:s(()=>[r(P,null,{default:s(()=>t[0]||(t[0]=[o("h4",{id:"coverDirHeader"},"Custom Covers",-1)])),_:1,__:[0]}),r(T,null,{default:s(()=>[r(d,{items:e.customCoverLibraries,"disable-sort":"","covers-dir":!0},null,8,["items"]),r(A,null,{default:s(()=>[r(x,{id:"customCoversHelp"},{default:s(()=>[r(P,null,{default:s(()=>t[1]||(t[1]=[o("h4",null,"Custom Covers Help",-1)])),_:1,__:[1]}),r(T,null,{default:s(()=>t[2]||(t[2]=[o("p",null,"Custom covers may be added to the browser in two locations:",-1),o("h4",null,"Folders",-1),o("p",null,[a(" A library folder with a file named "),o("code",null,".codex-cover.jpg"),a(" will show a custom cover for that folder in Folder view. The addition and removal of these covers by watching filesystem events and polling is handled by the library that folder belongs to. ")],-1),o("h4",null,"Custom Covers Dir",-1),o("p",null,[a(" The Codex config directory has a special folder named "),o("code",null,"custom-covers"),a(" under which are subdirectories for each of the browser groups that may adopt custom covers. Images in these subdirectories that match the name of the browser group will be used as custom covers. For instance: "),o("code",null,".../custom-covers/publishers/American Comics Group.webp"),a(' would be used as the cover for the publisher "American Comics Group". '),o("code",null,".../custom-covers/series/arrow.png"),a(' would be used as the cover for every series named "Arrow", for '),o("em",null,"every"),a(" publisher. Similar to a comic library, the "),o("code",null,"custom-covers"),a(" directory may be watched and polled for changes. By default it is neither watched nor polled and must be enabled by the admin. ")],-1),o("h4",null,"Image Formats & Size",-1),o("p",null,[a(" Custom covers are detected only for files with the extensions: "),o("code",null,".bmp, .gif, .jpeg, .jpg, .png, .webp"),a(". ")],-1),o("p",null," Browser covers are transformed from their sources to 165px x 254px thumbnails. Custom covers will transform most aesthetically the closer to that ratio they are. ",-1),o("h4",null,"Priority",-1),o("p",null," Custom covers supersede covers set by the user's individual browser settings. ",-1)])),_:1,__:[2]})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}const Ve=_(Le,[["render",De],["__scopeId","data-v-268927b7"]]),Ee={name:"AdminFailedImportsPanel",components:{DateTimeColumn:N},data(){return{mdiBookAlert:re,mdiOpenInNew:$}},computed:{...y(h,{failedImports:e=>e.failedImports,showFailedImports:e=>e.failedImports&&e.failedImports.length>0}),...oe(h,["unseenFailedImports"])}},Ue={key:0},ze={class:"dateCol"},Re={href:"https://github.com/ajslater/codex/issues/",target:"_blank"};function Oe(e,t,m,b,l,n){const d=u("DateTimeColumn");return e.showFailedImports?(p(),C("div",Ue,[r(A,null,{default:s(()=>[r(x,{id:"failedImportsPanel",onClick:t[0]||(t[0]=f=>e.unseenFailedImports=!1)},{default:s(()=>[r(P,null,{default:s(()=>[o("h4",null,"Failed Imports: "+v(e.failedImports.length),1),e.unseenFailedImports?(p(),w(R,{key:0,id:"failedImportsIcon",title:"New Failed Imports"},{default:s(()=>[a(v(l.mdiBookAlert),1)]),_:1})):F("",!0)]),_:1}),r(T,null,{default:s(()=>[r(he,{class:"highlight-table"},{default:s(()=>[t[1]||(t[1]=o("thead",null,[o("tr",null,[o("th",null,"Path"),o("th",null,"Created")])],-1)),o("tbody",null,[(p(!0),C(le,null,se(e.failedImports,f=>(p(),C("tr",{key:`fi:${f.path}`},[o("td",null,v(f.path),1),o("td",ze,[r(d,{dttm:f.createdAt},null,8,["dttm"])])]))),128))])]),_:1}),r(A,null,{default:s(()=>[r(x,{id:"failedImportsHelp"},{default:s(()=>[r(P,null,{default:s(()=>t[2]||(t[2]=[o("h4",null,"Failed Imports Help",-1)])),_:1,__:[2]}),r(T,null,{default:s(()=>[t[8]||(t[8]=o("p",null," These are Comic archives that have failed to import. This list is updated every time the library updates. You should probably review these files and fix or remove them. ",-1)),t[9]||(t[9]=o("h4",null,"Fixing comics",-1)),t[10]||(t[10]=o("p",null,[a(" Try using the zip fixer to fix comics: "),o("code",{class:"cli"},[a(" cp problem-comic.cbz /somewhere/safe/problem-comic.cbz.backup"),o("br"),a(" zip -F problem-comic.cbz --out fixed.zip"),o("br"),a(" mv fixed.zip problem-comic.cbz ")]),a(" You may also try "),o("code",null,"zip -FF"),a(" to fix comics which uses a different (not necissarily better) algorithm. If you fix some imports, and Codex does not immediately detect the change, poll the library which contains the fixed comics. ")],-1)),t[11]||(t[11]=o("h4",null,"Reporting Issues",-1)),o("p",null,[t[4]||(t[4]=a(" If the comic looks good to you, but still shows up as a failed import, it might be Codex's fault for not importing it correctly. Please file an ")),o("a",Re,[t[3]||(t[3]=a("Issue Report")),r(R,{size:"small"},{default:s(()=>[a(v(l.mdiOpenInNew),1)]),_:1})]),t[5]||(t[5]=a(" and include the stack trace from the logs at ")),t[6]||(t[6]=o("code",null,"config/logs/codex.log",-1)),t[7]||(t[7]=a(" if you can. "))])]),_:1,__:[8,9,10,11]})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})])):F("",!0)}const Se=_(Ee,[["render",Oe],["__scopeId","data-v-827c9a0b"]]),He={name:"AdminLibrariesTab",components:{AdminFailedImportsPanel:Se,AdminLibraryTable:G,AdminCreateUpdateDialog:B,AdminCustomCoversPanel:Ve},data(){return{AdminLibraryCreateUpdateInputs:H(W)}},computed:{...y(h,["normalLibraries"])},mounted(){this.loadTables(["Group","Library","FailedImport"])},methods:{...k(h,["loadTables"])}},$e={class:"tabHeader"};function Be(e,t,m,b,l,n){const d=u("AdminCreateUpdateDialog"),f=u("AdminLibraryTable"),g=u("AdminFailedImportsPanel"),c=u("AdminCustomCoversPanel");return p(),C("div",null,[o("header",$e,[r(d,{table:"Library",inputs:l.AdminLibraryCreateUpdateInputs},null,8,["inputs"])]),r(f,{items:e.normalLibraries,"sort-by":[{key:"path",order:"asc"}]},null,8,["items"]),r(U,null,{default:s(()=>[r(g,{id:"failedImports"})]),_:1}),r(U,null,{default:s(()=>[r(c,{id:"customCovers"})]),_:1}),t[0]||(t[0]=o("p",{id:"libraryHelp"}," Each Watched File Events box checked creates a thread to monitor the Library. An large number of watching threads may exceed the limits of your operating system or container. ",-1))])}const it=_(He,[["render",Be],["__scopeId","data-v-66bb908f"]]);export{it as default};