scitex 2.14.0__py3-none-any.whl → 2.16.0__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.
Files changed (1856) hide show
  1. scitex/__init__.py +71 -17
  2. scitex/_env_loader.py +156 -0
  3. scitex/_mcp_resources/__init__.py +39 -0
  4. scitex/_mcp_resources/_cheatsheet.py +135 -0
  5. scitex/_mcp_resources/_figrecipe.py +138 -0
  6. scitex/_mcp_resources/_formats.py +102 -0
  7. scitex/_mcp_resources/_modules.py +337 -0
  8. scitex/_mcp_resources/_scholar.py +148 -0
  9. scitex/_mcp_resources/_session.py +149 -0
  10. scitex/_mcp_tools/__init__.py +6 -0
  11. scitex/_mcp_tools/audio.py +66 -0
  12. scitex/_mcp_tools/canvas.py +36 -15
  13. scitex/_mcp_tools/dataset.py +27 -0
  14. scitex/_mcp_tools/diagram.py +11 -95
  15. scitex/_mcp_tools/introspect.py +210 -0
  16. scitex/_mcp_tools/plt.py +263 -308
  17. scitex/_mcp_tools/scholar.py +57 -32
  18. scitex/_mcp_tools/social.py +27 -0
  19. scitex/_mcp_tools/template.py +24 -0
  20. scitex/_mcp_tools/writer.py +17 -210
  21. scitex/ai/_gen_ai/_PARAMS.py +10 -7
  22. scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
  23. scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
  24. scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
  25. scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
  26. scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
  27. scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
  28. scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
  29. scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
  30. scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
  31. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
  32. scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
  33. scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
  34. scitex/audio/README.md +40 -36
  35. scitex/audio/__init__.py +160 -91
  36. scitex/audio/_branding.py +185 -0
  37. scitex/audio/_mcp/__init__.py +32 -0
  38. scitex/audio/_mcp/handlers.py +67 -12
  39. scitex/audio/_mcp/speak_handlers.py +238 -0
  40. scitex/audio/_relay.py +225 -0
  41. scitex/audio/_tts.py +18 -10
  42. scitex/audio/engines/__init__.py +4 -8
  43. scitex/audio/engines/_base.py +287 -0
  44. scitex/audio/engines/_elevenlabs_engine.py +151 -0
  45. scitex/audio/engines/_gtts_engine.py +162 -0
  46. scitex/audio/engines/_pyttsx3_engine.py +131 -0
  47. scitex/audio/mcp_server.py +228 -75
  48. scitex/bridge/_stats_plt.py +1 -1
  49. scitex/canvas/README.md +1 -1
  50. scitex/canvas/__init__.py +169 -287
  51. scitex/canvas/_legacy.py +171 -0
  52. scitex/canvas/editor/_dearpygui/__init__.py +25 -0
  53. scitex/canvas/editor/_dearpygui/_editor.py +147 -0
  54. scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
  55. scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
  56. scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
  57. scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
  58. scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
  59. scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
  60. scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
  61. scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
  62. scitex/canvas/editor/_dearpygui/_selection.py +295 -0
  63. scitex/canvas/editor/_dearpygui/_state.py +93 -0
  64. scitex/canvas/editor/_dearpygui/_utils.py +61 -0
  65. scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
  66. scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
  67. scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
  68. scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
  69. scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
  70. scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
  71. scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
  72. scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
  73. scitex/canvas/editor/flask_editor/_core.py +25 -1684
  74. scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
  75. scitex/canvas/mcp_server.py +16 -3
  76. scitex/capture/__init__.py +5 -6
  77. scitex/capture/mcp_server.py +16 -2
  78. scitex/cli/__init__.py +94 -42
  79. scitex/cli/audio.py +194 -45
  80. scitex/cli/capture.py +151 -20
  81. scitex/cli/dataset.py +76 -0
  82. scitex/cli/introspect.py +524 -0
  83. scitex/cli/main.py +240 -115
  84. scitex/cli/mcp.py +239 -88
  85. scitex/cli/plt.py +432 -0
  86. scitex/cli/repro.py +15 -8
  87. scitex/cli/resource.py +15 -8
  88. scitex/cli/scholar/__init__.py +190 -10
  89. scitex/cli/scholar/_crossref_scitex.py +55 -0
  90. scitex/cli/scholar/_fetch.py +25 -3
  91. scitex/cli/scholar/_openalex_scitex.py +55 -0
  92. scitex/cli/social.py +355 -0
  93. scitex/cli/stats.py +154 -11
  94. scitex/cli/template.py +129 -12
  95. scitex/cli/tex.py +15 -8
  96. scitex/cli/writer.py +49 -299
  97. scitex/cloud/__init__.py +41 -2
  98. scitex/config/README.md +1 -1
  99. scitex/config/__init__.py +16 -2
  100. scitex/config/_env_registry.py +256 -0
  101. scitex/context/__init__.py +22 -0
  102. scitex/dataset/__init__.py +85 -0
  103. scitex/dev/__init__.py +20 -1
  104. scitex/diagram/__init__.py +42 -19
  105. scitex/diagram/mcp_server.py +13 -125
  106. scitex/gen/__init__.py +50 -14
  107. scitex/gen/_list_packages.py +4 -4
  108. scitex/introspect/__init__.py +82 -0
  109. scitex/introspect/_call_graph.py +303 -0
  110. scitex/introspect/_class_hierarchy.py +163 -0
  111. scitex/introspect/_core.py +41 -0
  112. scitex/introspect/_docstring.py +131 -0
  113. scitex/introspect/_examples.py +113 -0
  114. scitex/introspect/_imports.py +271 -0
  115. scitex/introspect/_list_api.py +266 -0
  116. scitex/introspect/_mcp/__init__.py +41 -0
  117. scitex/introspect/_mcp/handlers.py +233 -0
  118. scitex/introspect/_members.py +155 -0
  119. scitex/introspect/_resolve.py +89 -0
  120. scitex/introspect/_signature.py +131 -0
  121. scitex/introspect/_source.py +80 -0
  122. scitex/introspect/_type_hints.py +172 -0
  123. scitex/io/__init__.py +15 -11
  124. scitex/io/_save.py +1 -2
  125. scitex/io/_save_modules/_tex.py +4 -7
  126. scitex/io/bundle/README.md +1 -1
  127. scitex/logging/__init__.py +86 -58
  128. scitex/logging/_formatters.py +19 -9
  129. scitex/mcp_server.py +98 -5
  130. scitex/os/__init__.py +4 -0
  131. scitex/os/_check_host.py +33 -0
  132. scitex/plt/__init__.py +245 -550
  133. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
  134. scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  135. scitex/plt/gallery/README.md +1 -1
  136. scitex/plt/utils/_hitmap/__init__.py +82 -0
  137. scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
  138. scitex/plt/utils/_hitmap/_color_application.py +346 -0
  139. scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
  140. scitex/plt/utils/_hitmap/_constants.py +40 -0
  141. scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
  142. scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
  143. scitex/plt/utils/_hitmap/_query.py +113 -0
  144. scitex/plt/utils/_hitmap.py +46 -1616
  145. scitex/plt/utils/_metadata/__init__.py +80 -0
  146. scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
  147. scitex/plt/utils/_metadata/_artists/_base.py +195 -0
  148. scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
  149. scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
  150. scitex/plt/utils/_metadata/_artists/_images.py +80 -0
  151. scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
  152. scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
  153. scitex/plt/utils/_metadata/_artists/_text.py +106 -0
  154. scitex/plt/utils/_metadata/_csv.py +416 -0
  155. scitex/plt/utils/_metadata/_detect.py +225 -0
  156. scitex/plt/utils/_metadata/_legend.py +127 -0
  157. scitex/plt/utils/_metadata/_rounding.py +117 -0
  158. scitex/plt/utils/_metadata/_verification.py +202 -0
  159. scitex/schema/README.md +1 -1
  160. scitex/schema/_stats.py +8 -16
  161. scitex/scholar/__init__.py +30 -14
  162. scitex/scholar/_mcp/crossref_handlers.py +265 -0
  163. scitex/scholar/_mcp/crossref_tool_schemas.py +133 -0
  164. scitex/scholar/_mcp/openalex_handlers.py +212 -0
  165. scitex/scholar/_mcp/openalex_tool_schemas.py +96 -0
  166. scitex/scholar/_mcp/tool_schemas.py +16 -1
  167. scitex/scholar/core/Scholar.py +63 -1700
  168. scitex/scholar/core/_mixins/__init__.py +36 -0
  169. scitex/scholar/core/_mixins/_enrichers.py +270 -0
  170. scitex/scholar/core/_mixins/_library_handlers.py +100 -0
  171. scitex/scholar/core/_mixins/_loaders.py +103 -0
  172. scitex/scholar/core/_mixins/_pdf_download.py +375 -0
  173. scitex/scholar/core/_mixins/_pipeline.py +312 -0
  174. scitex/scholar/core/_mixins/_project_handlers.py +125 -0
  175. scitex/scholar/core/_mixins/_savers.py +69 -0
  176. scitex/scholar/core/_mixins/_search.py +103 -0
  177. scitex/scholar/core/_mixins/_services.py +88 -0
  178. scitex/scholar/core/_mixins/_url_finding.py +105 -0
  179. scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  180. scitex/scholar/examples/00_run_all.sh +120 -0
  181. scitex/scholar/examples/03_02-engine-for-bibtex.py +1 -1
  182. scitex/scholar/examples/04_02-url-for-bibtex.py +1 -1
  183. scitex/scholar/examples/06_parse_bibtex.py +1 -1
  184. scitex/scholar/examples/99_fullpipeline-for-bibtex.py +1 -1
  185. scitex/scholar/jobs/_executors.py +27 -3
  186. scitex/scholar/local_dbs/__init__.py +31 -0
  187. scitex/scholar/local_dbs/crossref_scitex.py +30 -0
  188. scitex/scholar/local_dbs/openalex_scitex.py +30 -0
  189. scitex/scholar/mcp_server.py +59 -4
  190. scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
  191. scitex/scholar/pdf_download/_cli.py +154 -0
  192. scitex/scholar/pdf_download/strategies/__init__.py +11 -8
  193. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
  194. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
  195. scitex/scholar/pipelines/ScholarPipelineMetadataSingle.py +1 -1
  196. scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
  197. scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
  198. scitex/scholar/pipelines/_single_steps.py +71 -36
  199. scitex/scholar/storage/_LibraryManager.py +97 -1695
  200. scitex/scholar/storage/_mixins/__init__.py +30 -0
  201. scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
  202. scitex/scholar/storage/_mixins/_library_operations.py +218 -0
  203. scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
  204. scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
  205. scitex/scholar/storage/_mixins/_resolution.py +376 -0
  206. scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
  207. scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
  208. scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +6 -4
  209. scitex/scholar/url_finder/translators/__init__.py +4 -3
  210. scitex/scholar/url_finder/translators/_core/registry.py +372 -0
  211. scitex/scholar/url_finder/translators/_individual/CLASE.py +23 -0
  212. scitex/scholar/url_finder/translators/_individual/COBISS.py +23 -0
  213. scitex/scholar/url_finder/translators/_individual/COinS.py +23 -0
  214. scitex/scholar/url_finder/translators/_individual/CQ_Press.py +23 -0
  215. scitex/scholar/url_finder/translators/_individual/CROSBI.py +23 -0
  216. scitex/scholar/url_finder/translators/_individual/CSL_JSON.py +23 -0
  217. scitex/scholar/url_finder/translators/_individual/CSV.py +23 -0
  218. scitex/scholar/url_finder/translators/_individual/CalMatters.py +23 -0
  219. scitex/scholar/url_finder/translators/_individual/Calisphere.py +23 -0
  220. scitex/scholar/url_finder/translators/_individual/__init__.py +25 -0
  221. scitex/scholar/url_finder/translators/_individual/abc_news_australia.py +23 -0
  222. scitex/scholar/url_finder/translators/_individual/access_engineering.py +23 -0
  223. scitex/scholar/url_finder/translators/_individual/access_medicine.py +255 -0
  224. scitex/scholar/url_finder/translators/_individual/access_science.py +23 -0
  225. scitex/scholar/url_finder/translators/_individual/acls_humanities_ebook.py +23 -0
  226. scitex/scholar/url_finder/translators/_individual/aclweb.py +23 -0
  227. scitex/scholar/url_finder/translators/_individual/acm_digital_library.py +355 -0
  228. scitex/scholar/url_finder/translators/_individual/acs.py +23 -0
  229. scitex/scholar/url_finder/translators/_individual/acs_publications.py +23 -0
  230. scitex/scholar/url_finder/translators/_individual/adam_matthew_digital.py +23 -0
  231. scitex/scholar/url_finder/translators/_individual/ads_bibcode.py +23 -0
  232. scitex/scholar/url_finder/translators/_individual/aea_web.py +23 -0
  233. scitex/scholar/url_finder/translators/_individual/agencia_del_isbn.py +23 -0
  234. scitex/scholar/url_finder/translators/_individual/agris.py +23 -0
  235. scitex/scholar/url_finder/translators/_individual/ahval_news.py +23 -0
  236. scitex/scholar/url_finder/translators/_individual/aip.py +23 -0
  237. scitex/scholar/url_finder/translators/_individual/air_university_journals.py +23 -0
  238. scitex/scholar/url_finder/translators/_individual/airiti.py +25 -0
  239. scitex/scholar/url_finder/translators/_individual/alexander_street_press.py +23 -0
  240. scitex/scholar/url_finder/translators/_individual/all_africa.py +23 -0
  241. scitex/scholar/url_finder/translators/_individual/allafrica.py +23 -0
  242. scitex/scholar/url_finder/translators/_individual/alsharekh.py +23 -0
  243. scitex/scholar/url_finder/translators/_individual/alternet.py +23 -0
  244. scitex/scholar/url_finder/translators/_individual/aluka.py +23 -0
  245. scitex/scholar/url_finder/translators/_individual/amazon.py +23 -0
  246. scitex/scholar/url_finder/translators/_individual/american_archive_public_broadcasting.py +23 -0
  247. scitex/scholar/url_finder/translators/_individual/american_institute_aeronautics_astronautics.py +23 -0
  248. scitex/scholar/url_finder/translators/_individual/american_prospect.py +23 -0
  249. scitex/scholar/url_finder/translators/_individual/ams_journals.py +23 -0
  250. scitex/scholar/url_finder/translators/_individual/ams_mathscinet.py +23 -0
  251. scitex/scholar/url_finder/translators/_individual/ams_mathscinet_legacy.py +23 -0
  252. scitex/scholar/url_finder/translators/_individual/ancestry_com_us_federal_census.py +23 -0
  253. scitex/scholar/url_finder/translators/_individual/ancestry_us_federal_census.py +23 -0
  254. scitex/scholar/url_finder/translators/_individual/annual_reviews.py +23 -0
  255. scitex/scholar/url_finder/translators/_individual/antikvarium_hu.py +23 -0
  256. scitex/scholar/url_finder/translators/_individual/aosic.py +25 -0
  257. scitex/scholar/url_finder/translators/_individual/apa_psycnet.py +23 -0
  258. scitex/scholar/url_finder/translators/_individual/apn_ru.py +23 -0
  259. scitex/scholar/url_finder/translators/_individual/aps.py +23 -0
  260. scitex/scholar/url_finder/translators/_individual/aquadocs.py +23 -0
  261. scitex/scholar/url_finder/translators/_individual/archeion.py +23 -0
  262. scitex/scholar/url_finder/translators/_individual/archiv_fuer_sozialgeschichte.py +23 -0
  263. scitex/scholar/url_finder/translators/_individual/archive_ouverte_aosic.py +25 -0
  264. scitex/scholar/url_finder/translators/_individual/archive_ouverte_en_sciences_de_l_information_et_de_la_communication___aosic_.py +27 -0
  265. scitex/scholar/url_finder/translators/_individual/archives_canada.py +23 -0
  266. scitex/scholar/url_finder/translators/_individual/ariana_news.py +23 -0
  267. scitex/scholar/url_finder/translators/_individual/art_institute_of_chicago.py +23 -0
  268. scitex/scholar/url_finder/translators/_individual/artefacts_canada.py +23 -0
  269. scitex/scholar/url_finder/translators/_individual/artfl_encyclopedie.py +23 -0
  270. scitex/scholar/url_finder/translators/_individual/artnet.py +23 -0
  271. scitex/scholar/url_finder/translators/_individual/artnews.py +23 -0
  272. scitex/scholar/url_finder/translators/_individual/artstor.py +23 -0
  273. scitex/scholar/url_finder/translators/_individual/arxiv.py +39 -0
  274. scitex/scholar/url_finder/translators/_individual/arxiv_org.py +122 -0
  275. scitex/scholar/url_finder/translators/_individual/asce.py +23 -0
  276. scitex/scholar/url_finder/translators/_individual/asco_meeting_library.py +23 -0
  277. scitex/scholar/url_finder/translators/_individual/astis.py +23 -0
  278. scitex/scholar/url_finder/translators/_individual/ats_international_journal.py +23 -0
  279. scitex/scholar/url_finder/translators/_individual/atypon.py +23 -0
  280. scitex/scholar/url_finder/translators/_individual/atypon_journals.py +253 -0
  281. scitex/scholar/url_finder/translators/_individual/beck_online.py +23 -0
  282. scitex/scholar/url_finder/translators/_individual/bibliotheque_et_archives_nationale_du_quebec__pistard_.py +23 -0
  283. scitex/scholar/url_finder/translators/_individual/bibliotheque_et_archives_nationales_du_quebec.py +23 -0
  284. scitex/scholar/url_finder/translators/_individual/bibliotheque_nationale_de_france.py +23 -0
  285. scitex/scholar/url_finder/translators/_individual/biomed_central.py +151 -0
  286. scitex/scholar/url_finder/translators/_individual/bioone.py +23 -0
  287. scitex/scholar/url_finder/translators/_individual/biorxiv.py +146 -0
  288. scitex/scholar/url_finder/translators/_individual/blaetter.py +23 -0
  289. scitex/scholar/url_finder/translators/_individual/bnf_isbn.py +118 -0
  290. scitex/scholar/url_finder/translators/_individual/bookmarks.py +23 -0
  291. scitex/scholar/url_finder/translators/_individual/bookshop_org.py +23 -0
  292. scitex/scholar/url_finder/translators/_individual/boston_review.py +23 -0
  293. scitex/scholar/url_finder/translators/_individual/bosworth_toller_anglo_saxon_dictionary.py +23 -0
  294. scitex/scholar/url_finder/translators/_individual/bosworth_toller_s_anglo_saxon_dictionary_online.py +23 -0
  295. scitex/scholar/url_finder/translators/_individual/bracero_history_archive.py +23 -0
  296. scitex/scholar/url_finder/translators/_individual/brill.py +25 -0
  297. scitex/scholar/url_finder/translators/_individual/brukerhandboken.py +23 -0
  298. scitex/scholar/url_finder/translators/_individual/bryn_mawr_classical_review.py +23 -0
  299. scitex/scholar/url_finder/translators/_individual/bundesgesetzblatt.py +23 -0
  300. scitex/scholar/url_finder/translators/_individual/cabi___cab_abstracts.py +23 -0
  301. scitex/scholar/url_finder/translators/_individual/cairn.py +23 -0
  302. scitex/scholar/url_finder/translators/_individual/cairn_info.py +23 -0
  303. scitex/scholar/url_finder/translators/_individual/cambridge.py +25 -0
  304. scitex/scholar/url_finder/translators/_individual/cambridge_core.py +178 -0
  305. scitex/scholar/url_finder/translators/_individual/cambridge_engage_preprints.py +23 -0
  306. scitex/scholar/url_finder/translators/_individual/ccfr__bnf_.py +23 -0
  307. scitex/scholar/url_finder/translators/_individual/cell_press.py +150 -0
  308. scitex/scholar/url_finder/translators/_individual/cern_document_server.py +23 -0
  309. scitex/scholar/url_finder/translators/_individual/ceur_workshop_proceedings.py +23 -0
  310. scitex/scholar/url_finder/translators/_individual/cff.py +23 -0
  311. scitex/scholar/url_finder/translators/_individual/cff_references.py +23 -0
  312. scitex/scholar/url_finder/translators/_individual/champlain_society___collection.py +23 -0
  313. scitex/scholar/url_finder/translators/_individual/chronicling_america.py +23 -0
  314. scitex/scholar/url_finder/translators/_individual/cinii_research.py +23 -0
  315. scitex/scholar/url_finder/translators/_individual/citavi_5_xml.py +23 -0
  316. scitex/scholar/url_finder/translators/_individual/citeseer.py +23 -0
  317. scitex/scholar/url_finder/translators/_individual/citizen_lab.py +23 -0
  318. scitex/scholar/url_finder/translators/_individual/civilization_ca.py +23 -0
  319. scitex/scholar/url_finder/translators/_individual/clacso.py +23 -0
  320. scitex/scholar/url_finder/translators/_individual/climate_change_and_human_health_literature_portal.py +23 -0
  321. scitex/scholar/url_finder/translators/_individual/climate_change_human_health.py +23 -0
  322. scitex/scholar/url_finder/translators/_individual/clinical_key.py +23 -0
  323. scitex/scholar/url_finder/translators/_individual/clinicaltrials_gov.py +23 -0
  324. scitex/scholar/url_finder/translators/_individual/cnki.py +23 -0
  325. scitex/scholar/url_finder/translators/_individual/code4lib_journal.py +23 -0
  326. scitex/scholar/url_finder/translators/_individual/colorado_state_legislature.py +23 -0
  327. scitex/scholar/url_finder/translators/_individual/computer_history_museum_archive.py +23 -0
  328. scitex/scholar/url_finder/translators/_individual/copernicus.py +23 -0
  329. scitex/scholar/url_finder/translators/_individual/crossref_rest.py +618 -0
  330. scitex/scholar/url_finder/translators/_individual/crossref_unixref_xml.py +23 -0
  331. scitex/scholar/url_finder/translators/_individual/csiro_publishing.py +23 -0
  332. scitex/scholar/url_finder/translators/_individual/csiro_publishing_dup.py +23 -0
  333. scitex/scholar/url_finder/translators/_individual/dagens_nyheter.py +25 -0
  334. scitex/scholar/url_finder/translators/_individual/dagstuhl_research_online_publication_server.py +23 -0
  335. scitex/scholar/url_finder/translators/_individual/de_gruyter_brill.py +23 -0
  336. scitex/scholar/url_finder/translators/_individual/dejure_org.py +23 -0
  337. scitex/scholar/url_finder/translators/_individual/desiring_god.py +23 -0
  338. scitex/scholar/url_finder/translators/_individual/deutsche_fotothek.py +23 -0
  339. scitex/scholar/url_finder/translators/_individual/deutsche_nationalbibliothek.py +23 -0
  340. scitex/scholar/url_finder/translators/_individual/dhistory.py +23 -0
  341. scitex/scholar/url_finder/translators/_individual/dialnet.py +23 -0
  342. scitex/scholar/url_finder/translators/_individual/die_zeit.py +23 -0
  343. scitex/scholar/url_finder/translators/_individual/digibib_net.py +25 -0
  344. scitex/scholar/url_finder/translators/_individual/digital_humanities_quarterly.py +23 -0
  345. scitex/scholar/url_finder/translators/_individual/digital_spy.py +23 -0
  346. scitex/scholar/url_finder/translators/_individual/digizeitschriften.py +25 -0
  347. scitex/scholar/url_finder/translators/_individual/dimensions.py +23 -0
  348. scitex/scholar/url_finder/translators/_individual/dlibra.py +23 -0
  349. scitex/scholar/url_finder/translators/_individual/doaj.py +23 -0
  350. scitex/scholar/url_finder/translators/_individual/doi.py +23 -0
  351. scitex/scholar/url_finder/translators/_individual/doi_content_negotiation.py +23 -0
  352. scitex/scholar/url_finder/translators/_individual/douban.py +23 -0
  353. scitex/scholar/url_finder/translators/_individual/dreier_neuerscheinungsdienst.py +23 -0
  354. scitex/scholar/url_finder/translators/_individual/drugbank_ca.py +23 -0
  355. scitex/scholar/url_finder/translators/_individual/dryad.py +23 -0
  356. scitex/scholar/url_finder/translators/_individual/dryad_digital_repository.py +23 -0
  357. scitex/scholar/url_finder/translators/_individual/dspace_intermediate_metadata.py +23 -0
  358. scitex/scholar/url_finder/translators/_individual/duke_university_press_books.py +23 -0
  359. scitex/scholar/url_finder/translators/_individual/e_periodica_switzerland.py +23 -0
  360. scitex/scholar/url_finder/translators/_individual/eastview.py +23 -0
  361. scitex/scholar/url_finder/translators/_individual/ebrary.py +25 -0
  362. scitex/scholar/url_finder/translators/_individual/ebsco_discovery_layer.py +23 -0
  363. scitex/scholar/url_finder/translators/_individual/ebscohost.py +25 -0
  364. scitex/scholar/url_finder/translators/_individual/edinburgh_university_press_journals.py +23 -0
  365. scitex/scholar/url_finder/translators/_individual/education_week.py +23 -0
  366. scitex/scholar/url_finder/translators/_individual/eidr.py +23 -0
  367. scitex/scholar/url_finder/translators/_individual/el_comercio__peru_.py +23 -0
  368. scitex/scholar/url_finder/translators/_individual/el_pais.py +23 -0
  369. scitex/scholar/url_finder/translators/_individual/electronic_colloquium_on_computational_complexity.py +25 -0
  370. scitex/scholar/url_finder/translators/_individual/elibrary_ru.py +23 -0
  371. scitex/scholar/url_finder/translators/_individual/elicit.py +23 -0
  372. scitex/scholar/url_finder/translators/_individual/elife.py +25 -0
  373. scitex/scholar/url_finder/translators/_individual/elsevier_health.py +23 -0
  374. scitex/scholar/url_finder/translators/_individual/elsevier_health_journals.py +25 -0
  375. scitex/scholar/url_finder/translators/_individual/elsevier_pure.py +23 -0
  376. scitex/scholar/url_finder/translators/_individual/embedded_metadata.py +23 -0
  377. scitex/scholar/url_finder/translators/_individual/emedicine.py +23 -0
  378. scitex/scholar/url_finder/translators/_individual/emerald.py +25 -0
  379. scitex/scholar/url_finder/translators/_individual/emerald_insight.py +25 -0
  380. scitex/scholar/url_finder/translators/_individual/emja.py +23 -0
  381. scitex/scholar/url_finder/translators/_individual/encyclopedia_of_chicago.py +23 -0
  382. scitex/scholar/url_finder/translators/_individual/encyclopedia_of_korean_culture.py +23 -0
  383. scitex/scholar/url_finder/translators/_individual/endnote_xml.py +23 -0
  384. scitex/scholar/url_finder/translators/_individual/engineering_village.py +23 -0
  385. scitex/scholar/url_finder/translators/_individual/envidat.py +23 -0
  386. scitex/scholar/url_finder/translators/_individual/epa_national_library_catalog.py +23 -0
  387. scitex/scholar/url_finder/translators/_individual/epicurious.py +25 -0
  388. scitex/scholar/url_finder/translators/_individual/eprint_iacr.py +23 -0
  389. scitex/scholar/url_finder/translators/_individual/eric.py +23 -0
  390. scitex/scholar/url_finder/translators/_individual/erudit.py +23 -0
  391. scitex/scholar/url_finder/translators/_individual/espacenet.py +23 -0
  392. scitex/scholar/url_finder/translators/_individual/etatar_ru.py +23 -0
  393. scitex/scholar/url_finder/translators/_individual/euclid.py +23 -0
  394. scitex/scholar/url_finder/translators/_individual/eur_lex.py +23 -0
  395. scitex/scholar/url_finder/translators/_individual/eurasianet.py +23 -0
  396. scitex/scholar/url_finder/translators/_individual/eurogamerusgamer.py +25 -0
  397. scitex/scholar/url_finder/translators/_individual/europe_pmc.py +23 -0
  398. scitex/scholar/url_finder/translators/_individual/evernote.py +23 -0
  399. scitex/scholar/url_finder/translators/_individual/f1000_research.py +23 -0
  400. scitex/scholar/url_finder/translators/_individual/fachportal_padagogik.py +25 -0
  401. scitex/scholar/url_finder/translators/_individual/factiva.py +23 -0
  402. scitex/scholar/url_finder/translators/_individual/failed_architecture.py +23 -0
  403. scitex/scholar/url_finder/translators/_individual/fairfax_australia.py +23 -0
  404. scitex/scholar/url_finder/translators/_individual/fao_publications.py +23 -0
  405. scitex/scholar/url_finder/translators/_individual/fatcat.py +23 -0
  406. scitex/scholar/url_finder/translators/_individual/faz_net.py +23 -0
  407. scitex/scholar/url_finder/translators/_individual/feb_web_ru.py +23 -0
  408. scitex/scholar/url_finder/translators/_individual/figshare.py +23 -0
  409. scitex/scholar/url_finder/translators/_individual/financial_times.py +23 -0
  410. scitex/scholar/url_finder/translators/_individual/finna.py +23 -0
  411. scitex/scholar/url_finder/translators/_individual/fishpond_co_nz.py +23 -0
  412. scitex/scholar/url_finder/translators/_individual/flickr.py +23 -0
  413. scitex/scholar/url_finder/translators/_individual/foreign_affairs.py +23 -0
  414. scitex/scholar/url_finder/translators/_individual/foreign_policy.py +23 -0
  415. scitex/scholar/url_finder/translators/_individual/fr_online_de.py +23 -0
  416. scitex/scholar/url_finder/translators/_individual/freecite.py +23 -0
  417. scitex/scholar/url_finder/translators/_individual/freepatentsonline.py +23 -0
  418. scitex/scholar/url_finder/translators/_individual/frieze.py +23 -0
  419. scitex/scholar/url_finder/translators/_individual/frontiers.py +84 -0
  420. scitex/scholar/url_finder/translators/_individual/gale_databases.py +25 -0
  421. scitex/scholar/url_finder/translators/_individual/galegdc.py +23 -0
  422. scitex/scholar/url_finder/translators/_individual/galegroup.py +23 -0
  423. scitex/scholar/url_finder/translators/_individual/gallica.py +23 -0
  424. scitex/scholar/url_finder/translators/_individual/game_studies.py +23 -0
  425. scitex/scholar/url_finder/translators/_individual/gamespot.py +23 -0
  426. scitex/scholar/url_finder/translators/_individual/gamestar_gamepro.py +23 -0
  427. scitex/scholar/url_finder/translators/_individual/gasyrlar_awazy.py +23 -0
  428. scitex/scholar/url_finder/translators/_individual/gemeinsamer_bibliotheksverbund_isbn.py +23 -0
  429. scitex/scholar/url_finder/translators/_individual/gene_ontology.py +23 -0
  430. scitex/scholar/url_finder/translators/_individual/github.py +23 -0
  431. scitex/scholar/url_finder/translators/_individual/globes.py +23 -0
  432. scitex/scholar/url_finder/translators/_individual/gmail.py +23 -0
  433. scitex/scholar/url_finder/translators/_individual/goodreads.py +23 -0
  434. scitex/scholar/url_finder/translators/_individual/google_books.py +23 -0
  435. scitex/scholar/url_finder/translators/_individual/google_patents.py +23 -0
  436. scitex/scholar/url_finder/translators/_individual/google_play.py +23 -0
  437. scitex/scholar/url_finder/translators/_individual/google_presentation.py +23 -0
  438. scitex/scholar/url_finder/translators/_individual/google_research.py +23 -0
  439. scitex/scholar/url_finder/translators/_individual/google_scholar.py +23 -0
  440. scitex/scholar/url_finder/translators/_individual/govinfo.py +23 -0
  441. scitex/scholar/url_finder/translators/_individual/gpo_access_e_cfr.py +23 -0
  442. scitex/scholar/url_finder/translators/_individual/gulag_many_days__many_lives.py +23 -0
  443. scitex/scholar/url_finder/translators/_individual/haaretz.py +23 -0
  444. scitex/scholar/url_finder/translators/_individual/habr.py +23 -0
  445. scitex/scholar/url_finder/translators/_individual/hal.py +23 -0
  446. scitex/scholar/url_finder/translators/_individual/hal_archives_ouvertes.py +23 -0
  447. scitex/scholar/url_finder/translators/_individual/handelszeitung.py +23 -0
  448. scitex/scholar/url_finder/translators/_individual/hanrei_watch.py +23 -0
  449. scitex/scholar/url_finder/translators/_individual/harper_s_magazine.py +23 -0
  450. scitex/scholar/url_finder/translators/_individual/harvard_business_review.py +23 -0
  451. scitex/scholar/url_finder/translators/_individual/harvard_caselaw_access_project.py +23 -0
  452. scitex/scholar/url_finder/translators/_individual/harvard_university_press_books.py +23 -0
  453. scitex/scholar/url_finder/translators/_individual/hathitrust.py +23 -0
  454. scitex/scholar/url_finder/translators/_individual/hcsp.py +23 -0
  455. scitex/scholar/url_finder/translators/_individual/heinonline.py +23 -0
  456. scitex/scholar/url_finder/translators/_individual/heise.py +23 -0
  457. scitex/scholar/url_finder/translators/_individual/herder.py +23 -0
  458. scitex/scholar/url_finder/translators/_individual/highbeam.py +23 -0
  459. scitex/scholar/url_finder/translators/_individual/highwire.py +23 -0
  460. scitex/scholar/url_finder/translators/_individual/highwire2.py +23 -0
  461. scitex/scholar/url_finder/translators/_individual/highwire_2_0.py +23 -0
  462. scitex/scholar/url_finder/translators/_individual/hindawi.py +23 -0
  463. scitex/scholar/url_finder/translators/_individual/hindawi_publishers.py +23 -0
  464. scitex/scholar/url_finder/translators/_individual/hispanic_american_periodical_index.py +23 -0
  465. scitex/scholar/url_finder/translators/_individual/homeland_security_digital_library.py +23 -0
  466. scitex/scholar/url_finder/translators/_individual/hudoc.py +23 -0
  467. scitex/scholar/url_finder/translators/_individual/huff_post.py +23 -0
  468. scitex/scholar/url_finder/translators/_individual/human_rights_watch.py +23 -0
  469. scitex/scholar/url_finder/translators/_individual/ibisworld.py +23 -0
  470. scitex/scholar/url_finder/translators/_individual/idea_alm.py +23 -0
  471. scitex/scholar/url_finder/translators/_individual/idref.py +23 -0
  472. scitex/scholar/url_finder/translators/_individual/ieee_xplore.py +265 -0
  473. scitex/scholar/url_finder/translators/_individual/ietf.py +23 -0
  474. scitex/scholar/url_finder/translators/_individual/ign.py +23 -0
  475. scitex/scholar/url_finder/translators/_individual/imdb.py +23 -0
  476. scitex/scholar/url_finder/translators/_individual/imf.py +23 -0
  477. scitex/scholar/url_finder/translators/_individual/in_these_times.py +23 -0
  478. scitex/scholar/url_finder/translators/_individual/informationssystem_medienpaedagogik.py +23 -0
  479. scitex/scholar/url_finder/translators/_individual/informit_database.py +23 -0
  480. scitex/scholar/url_finder/translators/_individual/infotrac.py +23 -0
  481. scitex/scholar/url_finder/translators/_individual/ingenta_connect.py +23 -0
  482. scitex/scholar/url_finder/translators/_individual/ingentaconnect.py +23 -0
  483. scitex/scholar/url_finder/translators/_individual/inside_higher_ed.py +23 -0
  484. scitex/scholar/url_finder/translators/_individual/insignia_opac.py +23 -0
  485. scitex/scholar/url_finder/translators/_individual/inspire.py +23 -0
  486. scitex/scholar/url_finder/translators/_individual/institute_of_contemporary_art.py +23 -0
  487. scitex/scholar/url_finder/translators/_individual/institute_of_physics.py +23 -0
  488. scitex/scholar/url_finder/translators/_individual/integrum.py +23 -0
  489. scitex/scholar/url_finder/translators/_individual/intellixir.py +23 -0
  490. scitex/scholar/url_finder/translators/_individual/international_nuclear_information_system.py +23 -0
  491. scitex/scholar/url_finder/translators/_individual/internet_archive.py +23 -0
  492. scitex/scholar/url_finder/translators/_individual/internet_archive_scholar.py +23 -0
  493. scitex/scholar/url_finder/translators/_individual/internet_archive_wayback.py +23 -0
  494. scitex/scholar/url_finder/translators/_individual/internet_archive_wayback_machine.py +23 -0
  495. scitex/scholar/url_finder/translators/_individual/invenio_rdm.py +23 -0
  496. scitex/scholar/url_finder/translators/_individual/inveniordm.py +23 -0
  497. scitex/scholar/url_finder/translators/_individual/io_port.py +23 -0
  498. scitex/scholar/url_finder/translators/_individual/iop.py +23 -0
  499. scitex/scholar/url_finder/translators/_individual/ipcc.py +23 -0
  500. scitex/scholar/url_finder/translators/_individual/isidore.py +23 -0
  501. scitex/scholar/url_finder/translators/_individual/istc.py +23 -0
  502. scitex/scholar/url_finder/translators/_individual/j_stage.py +23 -0
  503. scitex/scholar/url_finder/translators/_individual/jahrbuch.py +23 -0
  504. scitex/scholar/url_finder/translators/_individual/japan_times_online.py +23 -0
  505. scitex/scholar/url_finder/translators/_individual/jets.py +23 -0
  506. scitex/scholar/url_finder/translators/_individual/jisc_historical_texts.py +25 -0
  507. scitex/scholar/url_finder/translators/_individual/journal_of_electronic_publishing.py +23 -0
  508. scitex/scholar/url_finder/translators/_individual/journal_of_extension.py +23 -0
  509. scitex/scholar/url_finder/translators/_individual/journal_of_machine_learning_research.py +23 -0
  510. scitex/scholar/url_finder/translators/_individual/journal_of_religion_and_society.py +23 -0
  511. scitex/scholar/url_finder/translators/_individual/jrc_publications_repository.py +23 -0
  512. scitex/scholar/url_finder/translators/_individual/jstage.py +23 -0
  513. scitex/scholar/url_finder/translators/_individual/jstor.py +211 -0
  514. scitex/scholar/url_finder/translators/_individual/juricaf.py +23 -0
  515. scitex/scholar/url_finder/translators/_individual/jurion.py +23 -0
  516. scitex/scholar/url_finder/translators/_individual/juris.py +23 -0
  517. scitex/scholar/url_finder/translators/_individual/jurpc.py +23 -0
  518. scitex/scholar/url_finder/translators/_individual/k10plus_isbn.py +23 -0
  519. scitex/scholar/url_finder/translators/_individual/kanopy.py +23 -0
  520. scitex/scholar/url_finder/translators/_individual/karger.py +23 -0
  521. scitex/scholar/url_finder/translators/_individual/khaama_press.py +23 -0
  522. scitex/scholar/url_finder/translators/_individual/kitapyurdu_com.py +23 -0
  523. scitex/scholar/url_finder/translators/_individual/kommersant.py +23 -0
  524. scitex/scholar/url_finder/translators/_individual/korean_national_library.py +25 -0
  525. scitex/scholar/url_finder/translators/_individual/kstudy.py +23 -0
  526. scitex/scholar/url_finder/translators/_individual/l_annee_philologique.py +23 -0
  527. scitex/scholar/url_finder/translators/_individual/la_croix.py +23 -0
  528. scitex/scholar/url_finder/translators/_individual/la_nacion__argentina_.py +23 -0
  529. scitex/scholar/url_finder/translators/_individual/la_presse.py +23 -0
  530. scitex/scholar/url_finder/translators/_individual/la_republica__peru_.py +23 -0
  531. scitex/scholar/url_finder/translators/_individual/la_times.py +25 -0
  532. scitex/scholar/url_finder/translators/_individual/lagen_nu.py +23 -0
  533. scitex/scholar/url_finder/translators/_individual/landesbibliographie_baden_wurttemberg.py +25 -0
  534. scitex/scholar/url_finder/translators/_individual/lapham_s_quarterly.py +23 -0
  535. scitex/scholar/url_finder/translators/_individual/le_devoir.py +23 -0
  536. scitex/scholar/url_finder/translators/_individual/le_figaro.py +23 -0
  537. scitex/scholar/url_finder/translators/_individual/le_maitron.py +23 -0
  538. scitex/scholar/url_finder/translators/_individual/le_monde.py +23 -0
  539. scitex/scholar/url_finder/translators/_individual/le_monde_diplomatique.py +23 -0
  540. scitex/scholar/url_finder/translators/_individual/legifrance.py +23 -0
  541. scitex/scholar/url_finder/translators/_individual/legislative_insight.py +25 -0
  542. scitex/scholar/url_finder/translators/_individual/lexis_.py +23 -0
  543. scitex/scholar/url_finder/translators/_individual/lexisnexis.py +23 -0
  544. scitex/scholar/url_finder/translators/_individual/libraries_tasmania.py +25 -0
  545. scitex/scholar/url_finder/translators/_individual/library_catalog__aleph_.py +23 -0
  546. scitex/scholar/url_finder/translators/_individual/library_catalog__amicus_.py +23 -0
  547. scitex/scholar/url_finder/translators/_individual/library_catalog__aquabrowser_.py +23 -0
  548. scitex/scholar/url_finder/translators/_individual/library_catalog__bibliocommons_.py +23 -0
  549. scitex/scholar/url_finder/translators/_individual/library_catalog__blacklight_.py +23 -0
  550. scitex/scholar/url_finder/translators/_individual/library_catalog__capita_prism_.py +23 -0
  551. scitex/scholar/url_finder/translators/_individual/library_catalog__dra_.py +23 -0
  552. scitex/scholar/url_finder/translators/_individual/library_catalog__dynix_.py +23 -0
  553. scitex/scholar/url_finder/translators/_individual/library_catalog__encore_.py +23 -0
  554. scitex/scholar/url_finder/translators/_individual/library_catalog__innopac_.py +23 -0
  555. scitex/scholar/url_finder/translators/_individual/library_catalog__koha_.py +25 -0
  556. scitex/scholar/url_finder/translators/_individual/library_catalog__mango_.py +23 -0
  557. scitex/scholar/url_finder/translators/_individual/library_catalog__opals_.py +23 -0
  558. scitex/scholar/url_finder/translators/_individual/library_catalog__pica2_.py +23 -0
  559. scitex/scholar/url_finder/translators/_individual/library_catalog__pica_.py +23 -0
  560. scitex/scholar/url_finder/translators/_individual/library_catalog__pika_.py +23 -0
  561. scitex/scholar/url_finder/translators/_individual/library_catalog__polaris_.py +23 -0
  562. scitex/scholar/url_finder/translators/_individual/library_catalog__quolto_.py +23 -0
  563. scitex/scholar/url_finder/translators/_individual/library_catalog__rero_ils_.py +23 -0
  564. scitex/scholar/url_finder/translators/_individual/library_catalog__sirsi_.py +23 -0
  565. scitex/scholar/url_finder/translators/_individual/library_catalog__sirsi_elibrary_.py +23 -0
  566. scitex/scholar/url_finder/translators/_individual/library_catalog__slims_.py +23 -0
  567. scitex/scholar/url_finder/translators/_individual/library_catalog__tind_ils_.py +23 -0
  568. scitex/scholar/url_finder/translators/_individual/library_catalog__tinread_.py +23 -0
  569. scitex/scholar/url_finder/translators/_individual/library_catalog__tlcyouseemore_.py +23 -0
  570. scitex/scholar/url_finder/translators/_individual/library_catalog__visual_library_2021_.py +23 -0
  571. scitex/scholar/url_finder/translators/_individual/library_catalog__voyager_.py +23 -0
  572. scitex/scholar/url_finder/translators/_individual/library_catalog__voyager_7_.py +23 -0
  573. scitex/scholar/url_finder/translators/_individual/library_catalog__vtls_.py +23 -0
  574. scitex/scholar/url_finder/translators/_individual/library_genesis.py +23 -0
  575. scitex/scholar/url_finder/translators/_individual/library_hub_discover.py +23 -0
  576. scitex/scholar/url_finder/translators/_individual/library_of_congress_digital_collections.py +23 -0
  577. scitex/scholar/url_finder/translators/_individual/library_of_congress_isbn.py +23 -0
  578. scitex/scholar/url_finder/translators/_individual/libris_isbn.py +23 -0
  579. scitex/scholar/url_finder/translators/_individual/lippincott_williams_and_wilkins.py +23 -0
  580. scitex/scholar/url_finder/translators/_individual/literary_hub.py +23 -0
  581. scitex/scholar/url_finder/translators/_individual/litres.py +23 -0
  582. scitex/scholar/url_finder/translators/_individual/livejournal.py +23 -0
  583. scitex/scholar/url_finder/translators/_individual/livivo.py +23 -0
  584. scitex/scholar/url_finder/translators/_individual/london_review_of_books.py +23 -0
  585. scitex/scholar/url_finder/translators/_individual/lookus.py +23 -0
  586. scitex/scholar/url_finder/translators/_individual/lulu.py +23 -0
  587. scitex/scholar/url_finder/translators/_individual/lwn_net.py +23 -0
  588. scitex/scholar/url_finder/translators/_individual/lww.py +23 -0
  589. scitex/scholar/url_finder/translators/_individual/mab2.py +23 -0
  590. scitex/scholar/url_finder/translators/_individual/magazines_russ_ru.py +23 -0
  591. scitex/scholar/url_finder/translators/_individual/mailman.py +23 -0
  592. scitex/scholar/url_finder/translators/_individual/mainichi_daily_news.py +23 -0
  593. scitex/scholar/url_finder/translators/_individual/marc.py +23 -0
  594. scitex/scholar/url_finder/translators/_individual/marcxml.py +23 -0
  595. scitex/scholar/url_finder/translators/_individual/mastodon.py +23 -0
  596. scitex/scholar/url_finder/translators/_individual/matbugat_ru.py +23 -0
  597. scitex/scholar/url_finder/translators/_individual/max_planck_institute_for_the_history_of_science_virtual_laboratory_library.py +25 -0
  598. scitex/scholar/url_finder/translators/_individual/mcv.py +23 -0
  599. scitex/scholar/url_finder/translators/_individual/mdpi.py +76 -0
  600. scitex/scholar/url_finder/translators/_individual/mdpi_journals.py +23 -0
  601. scitex/scholar/url_finder/translators/_individual/medes.py +23 -0
  602. scitex/scholar/url_finder/translators/_individual/medium.py +23 -0
  603. scitex/scholar/url_finder/translators/_individual/medline_nbib.py +23 -0
  604. scitex/scholar/url_finder/translators/_individual/medlinenbib.py +23 -0
  605. scitex/scholar/url_finder/translators/_individual/medra.py +23 -0
  606. scitex/scholar/url_finder/translators/_individual/metalib.py +23 -0
  607. scitex/scholar/url_finder/translators/_individual/mets.py +23 -0
  608. scitex/scholar/url_finder/translators/_individual/microbiology_society_journals.py +25 -0
  609. scitex/scholar/url_finder/translators/_individual/microsoft_academic.py +23 -0
  610. scitex/scholar/url_finder/translators/_individual/midas_journals.py +25 -0
  611. scitex/scholar/url_finder/translators/_individual/mikromarc.py +23 -0
  612. scitex/scholar/url_finder/translators/_individual/milli_kutuphane.py +23 -0
  613. scitex/scholar/url_finder/translators/_individual/mit_press_books.py +23 -0
  614. scitex/scholar/url_finder/translators/_individual/mods.py +23 -0
  615. scitex/scholar/url_finder/translators/_individual/mpg_pure.py +23 -0
  616. scitex/scholar/url_finder/translators/_individual/musee_du_louvre.py +23 -0
  617. scitex/scholar/url_finder/translators/_individual/nagoya_university_opac.py +25 -0
  618. scitex/scholar/url_finder/translators/_individual/nasa_ads.py +23 -0
  619. scitex/scholar/url_finder/translators/_individual/nasa_ntrs.py +23 -0
  620. scitex/scholar/url_finder/translators/_individual/national_academies_press.py +23 -0
  621. scitex/scholar/url_finder/translators/_individual/national_agriculture_library.py +23 -0
  622. scitex/scholar/url_finder/translators/_individual/national_archives_of_australia.py +23 -0
  623. scitex/scholar/url_finder/translators/_individual/national_archives_of_south_africa.py +23 -0
  624. scitex/scholar/url_finder/translators/_individual/national_bureau_of_economic_research.py +23 -0
  625. scitex/scholar/url_finder/translators/_individual/national_diet_library_catalogue.py +23 -0
  626. scitex/scholar/url_finder/translators/_individual/national_gallery_of_art___usa.py +23 -0
  627. scitex/scholar/url_finder/translators/_individual/national_gallery_of_australia.py +23 -0
  628. scitex/scholar/url_finder/translators/_individual/national_library_of_australia__new_catalog_.py +23 -0
  629. scitex/scholar/url_finder/translators/_individual/national_library_of_belarus.py +23 -0
  630. scitex/scholar/url_finder/translators/_individual/national_library_of_norway.py +23 -0
  631. scitex/scholar/url_finder/translators/_individual/national_library_of_poland_isbn.py +23 -0
  632. scitex/scholar/url_finder/translators/_individual/national_post.py +23 -0
  633. scitex/scholar/url_finder/translators/_individual/national_technical_reports_library.py +23 -0
  634. scitex/scholar/url_finder/translators/_individual/national_transportation_library_rosa_p.py +23 -0
  635. scitex/scholar/url_finder/translators/_individual/nature.py +23 -0
  636. scitex/scholar/url_finder/translators/_individual/nature_publishing_group.py +193 -0
  637. scitex/scholar/url_finder/translators/_individual/nber.py +23 -0
  638. scitex/scholar/url_finder/translators/_individual/ncbi_nucleotide.py +23 -0
  639. scitex/scholar/url_finder/translators/_individual/neural_information_processing_systems.py +23 -0
  640. scitex/scholar/url_finder/translators/_individual/new_left_review.py +23 -0
  641. scitex/scholar/url_finder/translators/_individual/new_zealand_herald.py +23 -0
  642. scitex/scholar/url_finder/translators/_individual/newlines_magazine.py +23 -0
  643. scitex/scholar/url_finder/translators/_individual/news_corp_australia.py +23 -0
  644. scitex/scholar/url_finder/translators/_individual/newsbank.py +23 -0
  645. scitex/scholar/url_finder/translators/_individual/newshub_co_nz.py +23 -0
  646. scitex/scholar/url_finder/translators/_individual/newsnettamedia.py +23 -0
  647. scitex/scholar/url_finder/translators/_individual/newspapers_com.py +23 -0
  648. scitex/scholar/url_finder/translators/_individual/noor_digital_library.py +23 -0
  649. scitex/scholar/url_finder/translators/_individual/note_html.py +23 -0
  650. scitex/scholar/url_finder/translators/_individual/note_markdown.py +23 -0
  651. scitex/scholar/url_finder/translators/_individual/notre_dame_philosophical_reviews.py +23 -0
  652. scitex/scholar/url_finder/translators/_individual/npr.py +23 -0
  653. scitex/scholar/url_finder/translators/_individual/nrc_nl.py +23 -0
  654. scitex/scholar/url_finder/translators/_individual/nrc_research_press.py +23 -0
  655. scitex/scholar/url_finder/translators/_individual/ntsb_accident_reports.py +25 -0
  656. scitex/scholar/url_finder/translators/_individual/nypl_menus.py +23 -0
  657. scitex/scholar/url_finder/translators/_individual/nypl_research_catalog.py +23 -0
  658. scitex/scholar/url_finder/translators/_individual/nytimes_com.py +23 -0
  659. scitex/scholar/url_finder/translators/_individual/nzz_ch.py +23 -0
  660. scitex/scholar/url_finder/translators/_individual/oapen.py +23 -0
  661. scitex/scholar/url_finder/translators/_individual/oclc_worldcat_firstsearch.py +23 -0
  662. scitex/scholar/url_finder/translators/_individual/oecd.py +23 -0
  663. scitex/scholar/url_finder/translators/_individual/oecd_ilibrary.py +23 -0
  664. scitex/scholar/url_finder/translators/_individual/ohiolink.py +23 -0
  665. scitex/scholar/url_finder/translators/_individual/open_conf.py +23 -0
  666. scitex/scholar/url_finder/translators/_individual/open_knowledge_repository.py +23 -0
  667. scitex/scholar/url_finder/translators/_individual/open_worldcat.py +23 -0
  668. scitex/scholar/url_finder/translators/_individual/openalex.py +23 -0
  669. scitex/scholar/url_finder/translators/_individual/openalex_json.py +23 -0
  670. scitex/scholar/url_finder/translators/_individual/openedition_books.py +23 -0
  671. scitex/scholar/url_finder/translators/_individual/openjur.py +23 -0
  672. scitex/scholar/url_finder/translators/_individual/optical_society_of_america.py +23 -0
  673. scitex/scholar/url_finder/translators/_individual/optimization_online.py +23 -0
  674. scitex/scholar/url_finder/translators/_individual/osa.py +23 -0
  675. scitex/scholar/url_finder/translators/_individual/osf_preprints.py +23 -0
  676. scitex/scholar/url_finder/translators/_individual/osti_energy_citations.py +23 -0
  677. scitex/scholar/url_finder/translators/_individual/ovid.py +23 -0
  678. scitex/scholar/url_finder/translators/_individual/ovid_tagged.py +23 -0
  679. scitex/scholar/url_finder/translators/_individual/oxford.py +148 -0
  680. scitex/scholar/url_finder/translators/_individual/oxford_dictionaries_premium.py +25 -0
  681. scitex/scholar/url_finder/translators/_individual/oxford_english_dictionary.py +23 -0
  682. scitex/scholar/url_finder/translators/_individual/oxford_music_and_art_online.py +23 -0
  683. scitex/scholar/url_finder/translators/_individual/oxford_reference.py +23 -0
  684. scitex/scholar/url_finder/translators/_individual/oxford_university_press.py +23 -0
  685. scitex/scholar/url_finder/translators/_individual/ozon_ru.py +25 -0
  686. scitex/scholar/url_finder/translators/_individual/pajhwok_afghan_news.py +23 -0
  687. scitex/scholar/url_finder/translators/_individual/papers_past.py +23 -0
  688. scitex/scholar/url_finder/translators/_individual/paris_review.py +23 -0
  689. scitex/scholar/url_finder/translators/_individual/pastebin.py +23 -0
  690. scitex/scholar/url_finder/translators/_individual/patents___uspto.py +23 -0
  691. scitex/scholar/url_finder/translators/_individual/pc_gamer.py +23 -0
  692. scitex/scholar/url_finder/translators/_individual/pc_games.py +23 -0
  693. scitex/scholar/url_finder/translators/_individual/peeters.py +23 -0
  694. scitex/scholar/url_finder/translators/_individual/pei_archival_information_network.py +23 -0
  695. scitex/scholar/url_finder/translators/_individual/pep_web.py +23 -0
  696. scitex/scholar/url_finder/translators/_individual/perceiving_systems.py +23 -0
  697. scitex/scholar/url_finder/translators/_individual/perlego.py +23 -0
  698. scitex/scholar/url_finder/translators/_individual/philosopher_s_imprint.py +23 -0
  699. scitex/scholar/url_finder/translators/_individual/philpapers.py +23 -0
  700. scitex/scholar/url_finder/translators/_individual/pkp_catalog_systems.py +23 -0
  701. scitex/scholar/url_finder/translators/_individual/pleade.py +23 -0
  702. scitex/scholar/url_finder/translators/_individual/plos.py +111 -0
  703. scitex/scholar/url_finder/translators/_individual/plos_journals.py +23 -0
  704. scitex/scholar/url_finder/translators/_individual/pnas.py +23 -0
  705. scitex/scholar/url_finder/translators/_individual/polygon.py +25 -0
  706. scitex/scholar/url_finder/translators/_individual/potsdamer_neueste_nachrichten.py +23 -0
  707. scitex/scholar/url_finder/translators/_individual/prc_history_review.py +23 -0
  708. scitex/scholar/url_finder/translators/_individual/preprints_org.py +23 -0
  709. scitex/scholar/url_finder/translators/_individual/primo.py +25 -0
  710. scitex/scholar/url_finder/translators/_individual/primo_2018.py +23 -0
  711. scitex/scholar/url_finder/translators/_individual/primo_normalized_xml.py +23 -0
  712. scitex/scholar/url_finder/translators/_individual/probing_the_past.py +23 -0
  713. scitex/scholar/url_finder/translators/_individual/project_gutenberg.py +23 -0
  714. scitex/scholar/url_finder/translators/_individual/project_muse.py +25 -0
  715. scitex/scholar/url_finder/translators/_individual/promed.py +23 -0
  716. scitex/scholar/url_finder/translators/_individual/proquest.py +23 -0
  717. scitex/scholar/url_finder/translators/_individual/proquest_ebook_central.py +23 -0
  718. scitex/scholar/url_finder/translators/_individual/proquest_policyfile.py +23 -0
  719. scitex/scholar/url_finder/translators/_individual/protein_data_bank.py +23 -0
  720. scitex/scholar/url_finder/translators/_individual/pubfactory_journals.py +25 -0
  721. scitex/scholar/url_finder/translators/_individual/public_record_office_victoria.py +23 -0
  722. scitex/scholar/url_finder/translators/_individual/publications_du_quebec.py +23 -0
  723. scitex/scholar/url_finder/translators/_individual/publications_office_of_the_european_union.py +23 -0
  724. scitex/scholar/url_finder/translators/_individual/pubmed.py +330 -0
  725. scitex/scholar/url_finder/translators/_individual/pubmed_central.py +71 -0
  726. scitex/scholar/url_finder/translators/_individual/pubmed_xml.py +23 -0
  727. scitex/scholar/url_finder/translators/_individual/pubpub.py +23 -0
  728. scitex/scholar/url_finder/translators/_individual/pypi.py +23 -0
  729. scitex/scholar/url_finder/translators/_individual/qatar_digital_library.py +23 -0
  730. scitex/scholar/url_finder/translators/_individual/queensland_state_archives.py +23 -0
  731. scitex/scholar/url_finder/translators/_individual/r_packages.py +23 -0
  732. scitex/scholar/url_finder/translators/_individual/radio_free_europe__radio_liberty.py +23 -0
  733. scitex/scholar/url_finder/translators/_individual/rand.py +23 -0
  734. scitex/scholar/url_finder/translators/_individual/rdf.py +23 -0
  735. scitex/scholar/url_finder/translators/_individual/rechtspraak_nl.py +25 -0
  736. scitex/scholar/url_finder/translators/_individual/redalyc.py +23 -0
  737. scitex/scholar/url_finder/translators/_individual/reddit.py +23 -0
  738. scitex/scholar/url_finder/translators/_individual/referbibix.py +23 -0
  739. scitex/scholar/url_finder/translators/_individual/refworks_tagged.py +23 -0
  740. scitex/scholar/url_finder/translators/_individual/regeringskansliet.py +23 -0
  741. scitex/scholar/url_finder/translators/_individual/repec___econpapers.py +23 -0
  742. scitex/scholar/url_finder/translators/_individual/repec___ideas.py +23 -0
  743. scitex/scholar/url_finder/translators/_individual/repec_ideas.py +23 -0
  744. scitex/scholar/url_finder/translators/_individual/research_square.py +23 -0
  745. scitex/scholar/url_finder/translators/_individual/researchgate.py +23 -0
  746. scitex/scholar/url_finder/translators/_individual/retsinformation.py +23 -0
  747. scitex/scholar/url_finder/translators/_individual/reuters.py +23 -0
  748. scitex/scholar/url_finder/translators/_individual/ris.py +23 -0
  749. scitex/scholar/url_finder/translators/_individual/rock__paper__shotgun.py +23 -0
  750. scitex/scholar/url_finder/translators/_individual/roll_call.py +23 -0
  751. scitex/scholar/url_finder/translators/_individual/rsc.py +23 -0
  752. scitex/scholar/url_finder/translators/_individual/rsc_publishing.py +23 -0
  753. scitex/scholar/url_finder/translators/_individual/russian_state_library.py +23 -0
  754. scitex/scholar/url_finder/translators/_individual/sacramento_bee.py +23 -0
  755. scitex/scholar/url_finder/translators/_individual/sae_papers.py +23 -0
  756. scitex/scholar/url_finder/translators/_individual/safari_books_online.py +23 -0
  757. scitex/scholar/url_finder/translators/_individual/sage.py +23 -0
  758. scitex/scholar/url_finder/translators/_individual/sage_journals.py +183 -0
  759. scitex/scholar/url_finder/translators/_individual/sage_knowledge.py +23 -0
  760. scitex/scholar/url_finder/translators/_individual/saildart.py +23 -0
  761. scitex/scholar/url_finder/translators/_individual/salt_research_archives.py +23 -0
  762. scitex/scholar/url_finder/translators/_individual/sbn_it.py +23 -0
  763. scitex/scholar/url_finder/translators/_individual/scholars_portal_journals.py +23 -0
  764. scitex/scholar/url_finder/translators/_individual/scholia.py +23 -0
  765. scitex/scholar/url_finder/translators/_individual/schweizer_radio_und_fernsehen_srf.py +23 -0
  766. scitex/scholar/url_finder/translators/_individual/scielo.py +23 -0
  767. scitex/scholar/url_finder/translators/_individual/sciencedirect.py +132 -0
  768. scitex/scholar/url_finder/translators/_individual/scopus.py +23 -0
  769. scitex/scholar/url_finder/translators/_individual/semantic_scholar.py +23 -0
  770. scitex/scholar/url_finder/translators/_individual/semantics_visual_library.py +25 -0
  771. scitex/scholar/url_finder/translators/_individual/sfu_ipinch.py +23 -0
  772. scitex/scholar/url_finder/translators/_individual/silverchair.py +301 -0
  773. scitex/scholar/url_finder/translators/_individual/sipri.py +23 -0
  774. scitex/scholar/url_finder/translators/_individual/sirs_knowledge_source.py +23 -0
  775. scitex/scholar/url_finder/translators/_individual/slate.py +23 -0
  776. scitex/scholar/url_finder/translators/_individual/slideshare.py +23 -0
  777. scitex/scholar/url_finder/translators/_individual/slub_dresden.py +23 -0
  778. scitex/scholar/url_finder/translators/_individual/sora.py +25 -0
  779. scitex/scholar/url_finder/translators/_individual/springer.py +121 -0
  780. scitex/scholar/url_finder/translators/_individual/springer_link.py +23 -0
  781. scitex/scholar/url_finder/translators/_individual/ssoar.py +23 -0
  782. scitex/scholar/url_finder/translators/_individual/ssrn.py +63 -0
  783. scitex/scholar/url_finder/translators/_individual/stack_exchange.py +23 -0
  784. scitex/scholar/url_finder/translators/_individual/standard_ebooks.py +23 -0
  785. scitex/scholar/url_finder/translators/_individual/stanford_encyclopedia_of_philosophy.py +25 -0
  786. scitex/scholar/url_finder/translators/_individual/stanford_university_press.py +23 -0
  787. scitex/scholar/url_finder/translators/_individual/state_records_office_of_western_australia.py +23 -0
  788. scitex/scholar/url_finder/translators/_individual/state_records_office_wa.py +23 -0
  789. scitex/scholar/url_finder/translators/_individual/stitcher.py +23 -0
  790. scitex/scholar/url_finder/translators/_individual/store_norske_leksikon.py +23 -0
  791. scitex/scholar/url_finder/translators/_individual/stuff_co_nz.py +23 -0
  792. scitex/scholar/url_finder/translators/_individual/substack.py +23 -0
  793. scitex/scholar/url_finder/translators/_individual/sud_ouest.py +23 -0
  794. scitex/scholar/url_finder/translators/_individual/sueddeutsche_de.py +23 -0
  795. scitex/scholar/url_finder/translators/_individual/summon_2.py +23 -0
  796. scitex/scholar/url_finder/translators/_individual/superlib.py +25 -0
  797. scitex/scholar/url_finder/translators/_individual/svenska_dagbladet.py +23 -0
  798. scitex/scholar/url_finder/translators/_individual/sveriges_radio.py +23 -0
  799. scitex/scholar/url_finder/translators/_individual/svt_nyheter.py +23 -0
  800. scitex/scholar/url_finder/translators/_individual/tagesspiegel.py +23 -0
  801. scitex/scholar/url_finder/translators/_individual/talis_aspire.py +23 -0
  802. scitex/scholar/url_finder/translators/_individual/talisprism.py +23 -0
  803. scitex/scholar/url_finder/translators/_individual/tatknigafund.py +23 -0
  804. scitex/scholar/url_finder/translators/_individual/tatpressa_ru.py +23 -0
  805. scitex/scholar/url_finder/translators/_individual/taylor___francis_ebooks.py +23 -0
  806. scitex/scholar/url_finder/translators/_individual/taylor_and_francis_nejm.py +23 -0
  807. scitex/scholar/url_finder/translators/_individual/taylor_francis.py +23 -0
  808. scitex/scholar/url_finder/translators/_individual/taylor_francis_nejm.py +23 -0
  809. scitex/scholar/url_finder/translators/_individual/taz_de.py +23 -0
  810. scitex/scholar/url_finder/translators/_individual/tei.py +23 -0
  811. scitex/scholar/url_finder/translators/_individual/tesis_doctorals_en_xarxa.py +23 -0
  812. scitex/scholar/url_finder/translators/_individual/the_art_newspaper.py +23 -0
  813. scitex/scholar/url_finder/translators/_individual/the_atlantic.py +23 -0
  814. scitex/scholar/url_finder/translators/_individual/the_boston_globe.py +23 -0
  815. scitex/scholar/url_finder/translators/_individual/the_chronicle_of_higher_education.py +23 -0
  816. scitex/scholar/url_finder/translators/_individual/the_daily_beast.py +23 -0
  817. scitex/scholar/url_finder/translators/_individual/the_economic_times___the_times_of_india.py +23 -0
  818. scitex/scholar/url_finder/translators/_individual/the_economist.py +23 -0
  819. scitex/scholar/url_finder/translators/_individual/the_free_dictionary.py +23 -0
  820. scitex/scholar/url_finder/translators/_individual/the_globe_and_mail.py +23 -0
  821. scitex/scholar/url_finder/translators/_individual/the_guardian.py +23 -0
  822. scitex/scholar/url_finder/translators/_individual/the_hamilton_spectator.py +23 -0
  823. scitex/scholar/url_finder/translators/_individual/the_hindu.py +23 -0
  824. scitex/scholar/url_finder/translators/_individual/the_independent.py +23 -0
  825. scitex/scholar/url_finder/translators/_individual/the_intercept.py +23 -0
  826. scitex/scholar/url_finder/translators/_individual/the_met.py +23 -0
  827. scitex/scholar/url_finder/translators/_individual/the_microfinance_gateway.py +23 -0
  828. scitex/scholar/url_finder/translators/_individual/the_nation.py +23 -0
  829. scitex/scholar/url_finder/translators/_individual/the_national_archives__uk_.py +23 -0
  830. scitex/scholar/url_finder/translators/_individual/the_new_republic.py +23 -0
  831. scitex/scholar/url_finder/translators/_individual/the_new_york_review_of_books.py +23 -0
  832. scitex/scholar/url_finder/translators/_individual/the_new_yorker.py +23 -0
  833. scitex/scholar/url_finder/translators/_individual/the_open_library.py +23 -0
  834. scitex/scholar/url_finder/translators/_individual/the_straits_times.py +23 -0
  835. scitex/scholar/url_finder/translators/_individual/the_telegraph.py +23 -0
  836. scitex/scholar/url_finder/translators/_individual/the_times_and_sunday_times.py +23 -0
  837. scitex/scholar/url_finder/translators/_individual/the_times_of_israel.py +23 -0
  838. scitex/scholar/url_finder/translators/_individual/themarker.py +23 -0
  839. scitex/scholar/url_finder/translators/_individual/theory_of_computing.py +23 -0
  840. scitex/scholar/url_finder/translators/_individual/thesesfr.py +23 -0
  841. scitex/scholar/url_finder/translators/_individual/thieme.py +23 -0
  842. scitex/scholar/url_finder/translators/_individual/time_com.py +23 -0
  843. scitex/scholar/url_finder/translators/_individual/timesmachine.py +23 -0
  844. scitex/scholar/url_finder/translators/_individual/tony_blair_institute.py +23 -0
  845. scitex/scholar/url_finder/translators/_individual/tony_blair_institute_for_global_change.py +23 -0
  846. scitex/scholar/url_finder/translators/_individual/toronto_star.py +23 -0
  847. scitex/scholar/url_finder/translators/_individual/transportation_research_board.py +23 -0
  848. scitex/scholar/url_finder/translators/_individual/treesearch.py +25 -0
  849. scitex/scholar/url_finder/translators/_individual/trove.py +23 -0
  850. scitex/scholar/url_finder/translators/_individual/tumblr.py +23 -0
  851. scitex/scholar/url_finder/translators/_individual/tv_by_the_numbers.py +23 -0
  852. scitex/scholar/url_finder/translators/_individual/tvnz.py +23 -0
  853. scitex/scholar/url_finder/translators/_individual/twitter.py +23 -0
  854. scitex/scholar/url_finder/translators/_individual/ubiquity_journals.py +23 -0
  855. scitex/scholar/url_finder/translators/_individual/uchicago_vufind.py +23 -0
  856. scitex/scholar/url_finder/translators/_individual/unapi.py +23 -0
  857. scitex/scholar/url_finder/translators/_individual/unesco.py +23 -0
  858. scitex/scholar/url_finder/translators/_individual/university_of_california_press_books.py +23 -0
  859. scitex/scholar/url_finder/translators/_individual/university_of_chicago_press_books.py +25 -0
  860. scitex/scholar/url_finder/translators/_individual/university_of_wisconsin_madison_libraries_catalog.py +23 -0
  861. scitex/scholar/url_finder/translators/_individual/university_press_scholarship.py +23 -0
  862. scitex/scholar/url_finder/translators/_individual/unqualified_dublin_core_rdf.py +23 -0
  863. scitex/scholar/url_finder/translators/_individual/unz_print_archive.py +23 -0
  864. scitex/scholar/url_finder/translators/_individual/upcommons.py +23 -0
  865. scitex/scholar/url_finder/translators/_individual/uptodate_references.py +23 -0
  866. scitex/scholar/url_finder/translators/_individual/us_national_archives_research_catalog.py +23 -0
  867. scitex/scholar/url_finder/translators/_individual/usenix.py +23 -0
  868. scitex/scholar/url_finder/translators/_individual/vanity_fair.py +23 -0
  869. scitex/scholar/url_finder/translators/_individual/verniana.py +23 -0
  870. scitex/scholar/url_finder/translators/_individual/verniana_jules_verne_studies.py +23 -0
  871. scitex/scholar/url_finder/translators/_individual/verso_books.py +23 -0
  872. scitex/scholar/url_finder/translators/_individual/vice.py +23 -0
  873. scitex/scholar/url_finder/translators/_individual/victoria___albert_museum.py +23 -0
  874. scitex/scholar/url_finder/translators/_individual/vimeo.py +23 -0
  875. scitex/scholar/url_finder/translators/_individual/vlex.py +25 -0
  876. scitex/scholar/url_finder/translators/_individual/voxeu.py +23 -0
  877. scitex/scholar/url_finder/translators/_individual/wall_street_journal.py +23 -0
  878. scitex/scholar/url_finder/translators/_individual/wanfang_data.py +23 -0
  879. scitex/scholar/url_finder/translators/_individual/washington_monthly.py +23 -0
  880. scitex/scholar/url_finder/translators/_individual/washington_post.py +23 -0
  881. scitex/scholar/url_finder/translators/_individual/web_of_science.py +25 -0
  882. scitex/scholar/url_finder/translators/_individual/web_of_science_nextgen.py +25 -0
  883. scitex/scholar/url_finder/translators/_individual/web_of_science_tagged.py +23 -0
  884. scitex/scholar/url_finder/translators/_individual/welt_online.py +23 -0
  885. scitex/scholar/url_finder/translators/_individual/westlaw_uk.py +23 -0
  886. scitex/scholar/url_finder/translators/_individual/who.py +23 -0
  887. scitex/scholar/url_finder/translators/_individual/wikidata.py +23 -0
  888. scitex/scholar/url_finder/translators/_individual/wikidata_quickstatements.py +23 -0
  889. scitex/scholar/url_finder/translators/_individual/wikileaks_plusd.py +23 -0
  890. scitex/scholar/url_finder/translators/_individual/wikimedia_commons.py +23 -0
  891. scitex/scholar/url_finder/translators/_individual/wikipedia.py +23 -0
  892. scitex/scholar/url_finder/translators/_individual/wikipedia_citation_templates.py +23 -0
  893. scitex/scholar/url_finder/translators/_individual/wikisource.py +23 -0
  894. scitex/scholar/url_finder/translators/_individual/wikiwand.py +23 -0
  895. scitex/scholar/url_finder/translators/_individual/wiktionary.py +23 -0
  896. scitex/scholar/url_finder/translators/_individual/wildlife_biology_in_practice.py +23 -0
  897. scitex/scholar/url_finder/translators/_individual/wiley.py +187 -0
  898. scitex/scholar/url_finder/translators/_individual/wiley_online_library.py +23 -0
  899. scitex/scholar/url_finder/translators/_individual/wilson_center_digital_archive.py +25 -0
  900. scitex/scholar/url_finder/translators/_individual/winnipeg_free_press.py +23 -0
  901. scitex/scholar/url_finder/translators/_individual/wipo.py +23 -0
  902. scitex/scholar/url_finder/translators/_individual/wired.py +23 -0
  903. scitex/scholar/url_finder/translators/_individual/wiso.py +23 -0
  904. scitex/scholar/url_finder/translators/_individual/womennews.py +23 -0
  905. scitex/scholar/url_finder/translators/_individual/world_bank.py +23 -0
  906. scitex/scholar/url_finder/translators/_individual/world_digital_library.py +23 -0
  907. scitex/scholar/url_finder/translators/_individual/world_history_connected.py +23 -0
  908. scitex/scholar/url_finder/translators/_individual/world_shakespeare_bibliography_online.py +23 -0
  909. scitex/scholar/url_finder/translators/_individual/worldcat_discovery_service.py +23 -0
  910. scitex/scholar/url_finder/translators/_individual/xml_contextobject.py +23 -0
  911. scitex/scholar/url_finder/translators/_individual/yandex_books.py +23 -0
  912. scitex/scholar/url_finder/translators/_individual/ynet.py +23 -0
  913. scitex/scholar/url_finder/translators/_individual/youtube.py +23 -0
  914. scitex/scholar/url_finder/translators/_individual/ypfs.py +23 -0
  915. scitex/scholar/url_finder/translators/_individual/ypsf.py +23 -0
  916. scitex/scholar/url_finder/translators/_individual/zenodo.py +23 -0
  917. scitex/scholar/url_finder/translators/_individual/ziponline.py +23 -0
  918. scitex/scholar/url_finder/translators/_individual/zobodat.py +23 -0
  919. scitex/scholar/url_finder/translators/_individual/zotero_org.py +23 -0
  920. scitex/scholar/url_finder/translators/_individual/zotero_rdf.py +23 -0
  921. scitex/scholar/url_finder/translators/_individual/zoterobib.py +23 -0
  922. scitex/security/README.md +3 -3
  923. scitex/session/README.md +1 -1
  924. scitex/session/__init__.py +26 -7
  925. scitex/session/_decorator.py +1 -1
  926. scitex/sh/README.md +1 -1
  927. scitex/sh/__init__.py +7 -4
  928. scitex/social/__init__.py +155 -0
  929. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  930. scitex/stats/__init__.py +15 -32
  931. scitex/stats/_mcp/_handlers/__init__.py +31 -0
  932. scitex/stats/_mcp/_handlers/_corrections.py +113 -0
  933. scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
  934. scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
  935. scitex/stats/_mcp/_handlers/_format.py +94 -0
  936. scitex/stats/_mcp/_handlers/_normality.py +110 -0
  937. scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
  938. scitex/stats/_mcp/_handlers/_power.py +247 -0
  939. scitex/stats/_mcp/_handlers/_recommend.py +102 -0
  940. scitex/stats/_mcp/_handlers/_run_test.py +279 -0
  941. scitex/stats/_mcp/_handlers/_stars.py +48 -0
  942. scitex/stats/_mcp/handlers.py +19 -1171
  943. scitex/stats/_utils/__init__.py +52 -0
  944. scitex/stats/_utils/_effect_size.py +995 -0
  945. scitex/stats/_utils/_formatters.py +279 -0
  946. scitex/stats/_utils/_normalizers.py +924 -0
  947. scitex/stats/_utils/_power.py +436 -0
  948. scitex/stats/auto/__init__.py +49 -92
  949. scitex/stats/auto/_stat_style.py +175 -0
  950. scitex/stats/auto/_style_definitions.py +411 -0
  951. scitex/stats/auto/_styles.py +22 -620
  952. scitex/stats/correct/_correct_bonferroni.py +4 -2
  953. scitex/stats/correct/_correct_fdr.py +4 -8
  954. scitex/stats/correct/_correct_fdr_.py +4 -2
  955. scitex/stats/correct/_correct_holm.py +3 -1
  956. scitex/stats/correct/_correct_sidak.py +3 -1
  957. scitex/stats/descriptive/__init__.py +11 -8
  958. scitex/stats/descriptive/_ci.py +39 -0
  959. scitex/stats/mcp_server.py +16 -3
  960. scitex/stats/posthoc/_dunnett.py +14 -10
  961. scitex/stats/posthoc/_games_howell.py +8 -4
  962. scitex/stats/posthoc/_tukey_hsd.py +8 -4
  963. scitex/stats/power/_power.py +15 -4
  964. scitex/stats/tests/correlation/_test_pearson.py +2 -2
  965. scitex/str/__init__.py +3 -3
  966. scitex/str/_title_case.py +63 -0
  967. scitex/template/README.md +1 -1
  968. scitex/template/__init__.py +25 -10
  969. scitex/template/_code_templates.py +147 -0
  970. scitex/template/_mcp/handlers.py +81 -0
  971. scitex/template/_mcp/tool_schemas.py +55 -0
  972. scitex/template/_templates/__init__.py +51 -0
  973. scitex/template/_templates/audio.py +233 -0
  974. scitex/template/_templates/canvas.py +312 -0
  975. scitex/template/_templates/capture.py +268 -0
  976. scitex/template/_templates/config.py +43 -0
  977. scitex/template/_templates/diagram.py +294 -0
  978. scitex/template/_templates/io.py +107 -0
  979. scitex/template/_templates/module.py +53 -0
  980. scitex/template/_templates/plt.py +202 -0
  981. scitex/template/_templates/scholar.py +267 -0
  982. scitex/template/_templates/session.py +130 -0
  983. scitex/template/_templates/session_minimal.py +43 -0
  984. scitex/template/_templates/session_plot.py +67 -0
  985. scitex/template/_templates/session_stats.py +77 -0
  986. scitex/template/_templates/stats.py +323 -0
  987. scitex/template/_templates/writer.py +296 -0
  988. scitex/template/clone_writer_directory.py +5 -5
  989. scitex/template/mcp_server.py +16 -3
  990. scitex/ui/_backends/_email.py +10 -2
  991. scitex/ui/_backends/_webhook.py +5 -1
  992. scitex/ui/mcp_server.py +16 -3
  993. scitex/utils/__init__.py +19 -9
  994. scitex/web/__init__.py +25 -20
  995. scitex/web/_search_pubmed.py +10 -6
  996. scitex/writer/README.md +1 -1
  997. scitex/writer/__init__.py +43 -34
  998. scitex/writer/_mcp/handlers.py +11 -744
  999. scitex/writer/_mcp/tool_schemas.py +5 -335
  1000. scitex-2.16.0.dist-info/METADATA +712 -0
  1001. scitex-2.16.0.dist-info/RECORD +2630 -0
  1002. scitex/audio/engines/base.py +0 -275
  1003. scitex/audio/engines/elevenlabs_engine.py +0 -146
  1004. scitex/audio/engines/gtts_engine.py +0 -162
  1005. scitex/audio/engines/pyttsx3_engine.py +0 -131
  1006. scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
  1007. scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
  1008. scitex/diagram/_compile.py +0 -312
  1009. scitex/diagram/_diagram.py +0 -355
  1010. scitex/diagram/_mcp/__init__.py +0 -4
  1011. scitex/diagram/_mcp/handlers.py +0 -400
  1012. scitex/diagram/_mcp/tool_schemas.py +0 -157
  1013. scitex/diagram/_presets.py +0 -173
  1014. scitex/diagram/_schema.py +0 -182
  1015. scitex/diagram/_split.py +0 -278
  1016. scitex/gen/_check_host.py +0 -34
  1017. scitex/gen/_ci.py +0 -12
  1018. scitex/gen/_inspect_module.py +0 -256
  1019. scitex/gen/_title_case.py +0 -89
  1020. scitex/plt/_mcp/__init__.py +0 -4
  1021. scitex/plt/_mcp/_handlers_annotation.py +0 -102
  1022. scitex/plt/_mcp/_handlers_figure.py +0 -195
  1023. scitex/plt/_mcp/_handlers_plot.py +0 -252
  1024. scitex/plt/_mcp/_handlers_style.py +0 -219
  1025. scitex/plt/_mcp/handlers.py +0 -74
  1026. scitex/plt/_mcp/tool_schemas.py +0 -497
  1027. scitex/plt/mcp_server.py +0 -231
  1028. scitex/scholar/examples/SUGGESTIONS.md +0 -865
  1029. scitex/scholar/examples/dev.py +0 -38
  1030. scitex/scholar/url_finder/translators/core/registry.py +0 -372
  1031. scitex/scholar/url_finder/translators/individual/CLASE.py +0 -23
  1032. scitex/scholar/url_finder/translators/individual/COBISS.py +0 -23
  1033. scitex/scholar/url_finder/translators/individual/COinS.py +0 -23
  1034. scitex/scholar/url_finder/translators/individual/CQ_Press.py +0 -23
  1035. scitex/scholar/url_finder/translators/individual/CROSBI.py +0 -23
  1036. scitex/scholar/url_finder/translators/individual/CSL_JSON.py +0 -23
  1037. scitex/scholar/url_finder/translators/individual/CSV.py +0 -23
  1038. scitex/scholar/url_finder/translators/individual/CalMatters.py +0 -23
  1039. scitex/scholar/url_finder/translators/individual/Calisphere.py +0 -23
  1040. scitex/scholar/url_finder/translators/individual/__init__.py +0 -25
  1041. scitex/scholar/url_finder/translators/individual/abc_news_australia.py +0 -23
  1042. scitex/scholar/url_finder/translators/individual/access_engineering.py +0 -23
  1043. scitex/scholar/url_finder/translators/individual/access_medicine.py +0 -255
  1044. scitex/scholar/url_finder/translators/individual/access_science.py +0 -23
  1045. scitex/scholar/url_finder/translators/individual/acls_humanities_ebook.py +0 -23
  1046. scitex/scholar/url_finder/translators/individual/aclweb.py +0 -23
  1047. scitex/scholar/url_finder/translators/individual/acm_digital_library.py +0 -355
  1048. scitex/scholar/url_finder/translators/individual/acs.py +0 -23
  1049. scitex/scholar/url_finder/translators/individual/acs_publications.py +0 -23
  1050. scitex/scholar/url_finder/translators/individual/adam_matthew_digital.py +0 -23
  1051. scitex/scholar/url_finder/translators/individual/ads_bibcode.py +0 -23
  1052. scitex/scholar/url_finder/translators/individual/aea_web.py +0 -23
  1053. scitex/scholar/url_finder/translators/individual/agencia_del_isbn.py +0 -23
  1054. scitex/scholar/url_finder/translators/individual/agris.py +0 -23
  1055. scitex/scholar/url_finder/translators/individual/ahval_news.py +0 -23
  1056. scitex/scholar/url_finder/translators/individual/aip.py +0 -23
  1057. scitex/scholar/url_finder/translators/individual/air_university_journals.py +0 -23
  1058. scitex/scholar/url_finder/translators/individual/airiti.py +0 -25
  1059. scitex/scholar/url_finder/translators/individual/alexander_street_press.py +0 -23
  1060. scitex/scholar/url_finder/translators/individual/all_africa.py +0 -23
  1061. scitex/scholar/url_finder/translators/individual/allafrica.py +0 -23
  1062. scitex/scholar/url_finder/translators/individual/alsharekh.py +0 -23
  1063. scitex/scholar/url_finder/translators/individual/alternet.py +0 -23
  1064. scitex/scholar/url_finder/translators/individual/aluka.py +0 -23
  1065. scitex/scholar/url_finder/translators/individual/amazon.py +0 -23
  1066. scitex/scholar/url_finder/translators/individual/american_archive_public_broadcasting.py +0 -23
  1067. scitex/scholar/url_finder/translators/individual/american_institute_aeronautics_astronautics.py +0 -23
  1068. scitex/scholar/url_finder/translators/individual/american_prospect.py +0 -23
  1069. scitex/scholar/url_finder/translators/individual/ams_journals.py +0 -23
  1070. scitex/scholar/url_finder/translators/individual/ams_mathscinet.py +0 -23
  1071. scitex/scholar/url_finder/translators/individual/ams_mathscinet_legacy.py +0 -23
  1072. scitex/scholar/url_finder/translators/individual/ancestry_com_us_federal_census.py +0 -23
  1073. scitex/scholar/url_finder/translators/individual/ancestry_us_federal_census.py +0 -23
  1074. scitex/scholar/url_finder/translators/individual/annual_reviews.py +0 -23
  1075. scitex/scholar/url_finder/translators/individual/antikvarium_hu.py +0 -23
  1076. scitex/scholar/url_finder/translators/individual/aosic.py +0 -25
  1077. scitex/scholar/url_finder/translators/individual/apa_psycnet.py +0 -23
  1078. scitex/scholar/url_finder/translators/individual/apn_ru.py +0 -23
  1079. scitex/scholar/url_finder/translators/individual/aps.py +0 -23
  1080. scitex/scholar/url_finder/translators/individual/aquadocs.py +0 -23
  1081. scitex/scholar/url_finder/translators/individual/archeion.py +0 -23
  1082. scitex/scholar/url_finder/translators/individual/archiv_fuer_sozialgeschichte.py +0 -23
  1083. scitex/scholar/url_finder/translators/individual/archive_ouverte_aosic.py +0 -25
  1084. scitex/scholar/url_finder/translators/individual/archive_ouverte_en_sciences_de_l_information_et_de_la_communication___aosic_.py +0 -27
  1085. scitex/scholar/url_finder/translators/individual/archives_canada.py +0 -23
  1086. scitex/scholar/url_finder/translators/individual/ariana_news.py +0 -23
  1087. scitex/scholar/url_finder/translators/individual/art_institute_of_chicago.py +0 -23
  1088. scitex/scholar/url_finder/translators/individual/artefacts_canada.py +0 -23
  1089. scitex/scholar/url_finder/translators/individual/artfl_encyclopedie.py +0 -23
  1090. scitex/scholar/url_finder/translators/individual/artnet.py +0 -23
  1091. scitex/scholar/url_finder/translators/individual/artnews.py +0 -23
  1092. scitex/scholar/url_finder/translators/individual/artstor.py +0 -23
  1093. scitex/scholar/url_finder/translators/individual/arxiv.py +0 -39
  1094. scitex/scholar/url_finder/translators/individual/arxiv_org.py +0 -122
  1095. scitex/scholar/url_finder/translators/individual/asce.py +0 -23
  1096. scitex/scholar/url_finder/translators/individual/asco_meeting_library.py +0 -23
  1097. scitex/scholar/url_finder/translators/individual/astis.py +0 -23
  1098. scitex/scholar/url_finder/translators/individual/ats_international_journal.py +0 -23
  1099. scitex/scholar/url_finder/translators/individual/atypon.py +0 -23
  1100. scitex/scholar/url_finder/translators/individual/atypon_journals.py +0 -253
  1101. scitex/scholar/url_finder/translators/individual/beck_online.py +0 -23
  1102. scitex/scholar/url_finder/translators/individual/bibliotheque_et_archives_nationale_du_quebec__pistard_.py +0 -23
  1103. scitex/scholar/url_finder/translators/individual/bibliotheque_et_archives_nationales_du_quebec.py +0 -23
  1104. scitex/scholar/url_finder/translators/individual/bibliotheque_nationale_de_france.py +0 -23
  1105. scitex/scholar/url_finder/translators/individual/biomed_central.py +0 -151
  1106. scitex/scholar/url_finder/translators/individual/bioone.py +0 -23
  1107. scitex/scholar/url_finder/translators/individual/biorxiv.py +0 -146
  1108. scitex/scholar/url_finder/translators/individual/blaetter.py +0 -23
  1109. scitex/scholar/url_finder/translators/individual/bnf_isbn.py +0 -118
  1110. scitex/scholar/url_finder/translators/individual/bookmarks.py +0 -23
  1111. scitex/scholar/url_finder/translators/individual/bookshop_org.py +0 -23
  1112. scitex/scholar/url_finder/translators/individual/boston_review.py +0 -23
  1113. scitex/scholar/url_finder/translators/individual/bosworth_toller_anglo_saxon_dictionary.py +0 -23
  1114. scitex/scholar/url_finder/translators/individual/bosworth_toller_s_anglo_saxon_dictionary_online.py +0 -23
  1115. scitex/scholar/url_finder/translators/individual/bracero_history_archive.py +0 -23
  1116. scitex/scholar/url_finder/translators/individual/brill.py +0 -25
  1117. scitex/scholar/url_finder/translators/individual/brukerhandboken.py +0 -23
  1118. scitex/scholar/url_finder/translators/individual/bryn_mawr_classical_review.py +0 -23
  1119. scitex/scholar/url_finder/translators/individual/bundesgesetzblatt.py +0 -23
  1120. scitex/scholar/url_finder/translators/individual/cabi___cab_abstracts.py +0 -23
  1121. scitex/scholar/url_finder/translators/individual/cairn.py +0 -23
  1122. scitex/scholar/url_finder/translators/individual/cairn_info.py +0 -23
  1123. scitex/scholar/url_finder/translators/individual/cambridge.py +0 -25
  1124. scitex/scholar/url_finder/translators/individual/cambridge_core.py +0 -178
  1125. scitex/scholar/url_finder/translators/individual/cambridge_engage_preprints.py +0 -23
  1126. scitex/scholar/url_finder/translators/individual/ccfr__bnf_.py +0 -23
  1127. scitex/scholar/url_finder/translators/individual/cell_press.py +0 -150
  1128. scitex/scholar/url_finder/translators/individual/cern_document_server.py +0 -23
  1129. scitex/scholar/url_finder/translators/individual/ceur_workshop_proceedings.py +0 -23
  1130. scitex/scholar/url_finder/translators/individual/cff.py +0 -23
  1131. scitex/scholar/url_finder/translators/individual/cff_references.py +0 -23
  1132. scitex/scholar/url_finder/translators/individual/champlain_society___collection.py +0 -23
  1133. scitex/scholar/url_finder/translators/individual/chronicling_america.py +0 -23
  1134. scitex/scholar/url_finder/translators/individual/cinii_research.py +0 -23
  1135. scitex/scholar/url_finder/translators/individual/citavi_5_xml.py +0 -23
  1136. scitex/scholar/url_finder/translators/individual/citeseer.py +0 -23
  1137. scitex/scholar/url_finder/translators/individual/citizen_lab.py +0 -23
  1138. scitex/scholar/url_finder/translators/individual/civilization_ca.py +0 -23
  1139. scitex/scholar/url_finder/translators/individual/clacso.py +0 -23
  1140. scitex/scholar/url_finder/translators/individual/climate_change_and_human_health_literature_portal.py +0 -23
  1141. scitex/scholar/url_finder/translators/individual/climate_change_human_health.py +0 -23
  1142. scitex/scholar/url_finder/translators/individual/clinical_key.py +0 -23
  1143. scitex/scholar/url_finder/translators/individual/clinicaltrials_gov.py +0 -23
  1144. scitex/scholar/url_finder/translators/individual/cnki.py +0 -23
  1145. scitex/scholar/url_finder/translators/individual/code4lib_journal.py +0 -23
  1146. scitex/scholar/url_finder/translators/individual/colorado_state_legislature.py +0 -23
  1147. scitex/scholar/url_finder/translators/individual/computer_history_museum_archive.py +0 -23
  1148. scitex/scholar/url_finder/translators/individual/copernicus.py +0 -23
  1149. scitex/scholar/url_finder/translators/individual/crossref_rest.py +0 -618
  1150. scitex/scholar/url_finder/translators/individual/crossref_unixref_xml.py +0 -23
  1151. scitex/scholar/url_finder/translators/individual/csiro_publishing.py +0 -23
  1152. scitex/scholar/url_finder/translators/individual/csiro_publishing_dup.py +0 -23
  1153. scitex/scholar/url_finder/translators/individual/dagens_nyheter.py +0 -25
  1154. scitex/scholar/url_finder/translators/individual/dagstuhl_research_online_publication_server.py +0 -23
  1155. scitex/scholar/url_finder/translators/individual/de_gruyter_brill.py +0 -23
  1156. scitex/scholar/url_finder/translators/individual/dejure_org.py +0 -23
  1157. scitex/scholar/url_finder/translators/individual/desiring_god.py +0 -23
  1158. scitex/scholar/url_finder/translators/individual/deutsche_fotothek.py +0 -23
  1159. scitex/scholar/url_finder/translators/individual/deutsche_nationalbibliothek.py +0 -23
  1160. scitex/scholar/url_finder/translators/individual/dhistory.py +0 -23
  1161. scitex/scholar/url_finder/translators/individual/dialnet.py +0 -23
  1162. scitex/scholar/url_finder/translators/individual/die_zeit.py +0 -23
  1163. scitex/scholar/url_finder/translators/individual/digibib_net.py +0 -25
  1164. scitex/scholar/url_finder/translators/individual/digital_humanities_quarterly.py +0 -23
  1165. scitex/scholar/url_finder/translators/individual/digital_spy.py +0 -23
  1166. scitex/scholar/url_finder/translators/individual/digizeitschriften.py +0 -25
  1167. scitex/scholar/url_finder/translators/individual/dimensions.py +0 -23
  1168. scitex/scholar/url_finder/translators/individual/dlibra.py +0 -23
  1169. scitex/scholar/url_finder/translators/individual/doaj.py +0 -23
  1170. scitex/scholar/url_finder/translators/individual/doi.py +0 -23
  1171. scitex/scholar/url_finder/translators/individual/doi_content_negotiation.py +0 -23
  1172. scitex/scholar/url_finder/translators/individual/douban.py +0 -23
  1173. scitex/scholar/url_finder/translators/individual/dreier_neuerscheinungsdienst.py +0 -23
  1174. scitex/scholar/url_finder/translators/individual/drugbank_ca.py +0 -23
  1175. scitex/scholar/url_finder/translators/individual/dryad.py +0 -23
  1176. scitex/scholar/url_finder/translators/individual/dryad_digital_repository.py +0 -23
  1177. scitex/scholar/url_finder/translators/individual/dspace_intermediate_metadata.py +0 -23
  1178. scitex/scholar/url_finder/translators/individual/duke_university_press_books.py +0 -23
  1179. scitex/scholar/url_finder/translators/individual/e_periodica_switzerland.py +0 -23
  1180. scitex/scholar/url_finder/translators/individual/eastview.py +0 -23
  1181. scitex/scholar/url_finder/translators/individual/ebrary.py +0 -25
  1182. scitex/scholar/url_finder/translators/individual/ebsco_discovery_layer.py +0 -23
  1183. scitex/scholar/url_finder/translators/individual/ebscohost.py +0 -25
  1184. scitex/scholar/url_finder/translators/individual/edinburgh_university_press_journals.py +0 -23
  1185. scitex/scholar/url_finder/translators/individual/education_week.py +0 -23
  1186. scitex/scholar/url_finder/translators/individual/eidr.py +0 -23
  1187. scitex/scholar/url_finder/translators/individual/el_comercio__peru_.py +0 -23
  1188. scitex/scholar/url_finder/translators/individual/el_pais.py +0 -23
  1189. scitex/scholar/url_finder/translators/individual/electronic_colloquium_on_computational_complexity.py +0 -25
  1190. scitex/scholar/url_finder/translators/individual/elibrary_ru.py +0 -23
  1191. scitex/scholar/url_finder/translators/individual/elicit.py +0 -23
  1192. scitex/scholar/url_finder/translators/individual/elife.py +0 -25
  1193. scitex/scholar/url_finder/translators/individual/elsevier_health.py +0 -23
  1194. scitex/scholar/url_finder/translators/individual/elsevier_health_journals.py +0 -25
  1195. scitex/scholar/url_finder/translators/individual/elsevier_pure.py +0 -23
  1196. scitex/scholar/url_finder/translators/individual/embedded_metadata.py +0 -23
  1197. scitex/scholar/url_finder/translators/individual/emedicine.py +0 -23
  1198. scitex/scholar/url_finder/translators/individual/emerald.py +0 -25
  1199. scitex/scholar/url_finder/translators/individual/emerald_insight.py +0 -25
  1200. scitex/scholar/url_finder/translators/individual/emja.py +0 -23
  1201. scitex/scholar/url_finder/translators/individual/encyclopedia_of_chicago.py +0 -23
  1202. scitex/scholar/url_finder/translators/individual/encyclopedia_of_korean_culture.py +0 -23
  1203. scitex/scholar/url_finder/translators/individual/endnote_xml.py +0 -23
  1204. scitex/scholar/url_finder/translators/individual/engineering_village.py +0 -23
  1205. scitex/scholar/url_finder/translators/individual/envidat.py +0 -23
  1206. scitex/scholar/url_finder/translators/individual/epa_national_library_catalog.py +0 -23
  1207. scitex/scholar/url_finder/translators/individual/epicurious.py +0 -25
  1208. scitex/scholar/url_finder/translators/individual/eprint_iacr.py +0 -23
  1209. scitex/scholar/url_finder/translators/individual/eric.py +0 -23
  1210. scitex/scholar/url_finder/translators/individual/erudit.py +0 -23
  1211. scitex/scholar/url_finder/translators/individual/espacenet.py +0 -23
  1212. scitex/scholar/url_finder/translators/individual/etatar_ru.py +0 -23
  1213. scitex/scholar/url_finder/translators/individual/euclid.py +0 -23
  1214. scitex/scholar/url_finder/translators/individual/eur_lex.py +0 -23
  1215. scitex/scholar/url_finder/translators/individual/eurasianet.py +0 -23
  1216. scitex/scholar/url_finder/translators/individual/eurogamerusgamer.py +0 -25
  1217. scitex/scholar/url_finder/translators/individual/europe_pmc.py +0 -23
  1218. scitex/scholar/url_finder/translators/individual/evernote.py +0 -23
  1219. scitex/scholar/url_finder/translators/individual/f1000_research.py +0 -23
  1220. scitex/scholar/url_finder/translators/individual/fachportal_padagogik.py +0 -25
  1221. scitex/scholar/url_finder/translators/individual/factiva.py +0 -23
  1222. scitex/scholar/url_finder/translators/individual/failed_architecture.py +0 -23
  1223. scitex/scholar/url_finder/translators/individual/fairfax_australia.py +0 -23
  1224. scitex/scholar/url_finder/translators/individual/fao_publications.py +0 -23
  1225. scitex/scholar/url_finder/translators/individual/fatcat.py +0 -23
  1226. scitex/scholar/url_finder/translators/individual/faz_net.py +0 -23
  1227. scitex/scholar/url_finder/translators/individual/feb_web_ru.py +0 -23
  1228. scitex/scholar/url_finder/translators/individual/figshare.py +0 -23
  1229. scitex/scholar/url_finder/translators/individual/financial_times.py +0 -23
  1230. scitex/scholar/url_finder/translators/individual/finna.py +0 -23
  1231. scitex/scholar/url_finder/translators/individual/fishpond_co_nz.py +0 -23
  1232. scitex/scholar/url_finder/translators/individual/flickr.py +0 -23
  1233. scitex/scholar/url_finder/translators/individual/foreign_affairs.py +0 -23
  1234. scitex/scholar/url_finder/translators/individual/foreign_policy.py +0 -23
  1235. scitex/scholar/url_finder/translators/individual/fr_online_de.py +0 -23
  1236. scitex/scholar/url_finder/translators/individual/freecite.py +0 -23
  1237. scitex/scholar/url_finder/translators/individual/freepatentsonline.py +0 -23
  1238. scitex/scholar/url_finder/translators/individual/frieze.py +0 -23
  1239. scitex/scholar/url_finder/translators/individual/frontiers.py +0 -84
  1240. scitex/scholar/url_finder/translators/individual/gale_databases.py +0 -25
  1241. scitex/scholar/url_finder/translators/individual/galegdc.py +0 -23
  1242. scitex/scholar/url_finder/translators/individual/galegroup.py +0 -23
  1243. scitex/scholar/url_finder/translators/individual/gallica.py +0 -23
  1244. scitex/scholar/url_finder/translators/individual/game_studies.py +0 -23
  1245. scitex/scholar/url_finder/translators/individual/gamespot.py +0 -23
  1246. scitex/scholar/url_finder/translators/individual/gamestar_gamepro.py +0 -23
  1247. scitex/scholar/url_finder/translators/individual/gasyrlar_awazy.py +0 -23
  1248. scitex/scholar/url_finder/translators/individual/gemeinsamer_bibliotheksverbund_isbn.py +0 -23
  1249. scitex/scholar/url_finder/translators/individual/gene_ontology.py +0 -23
  1250. scitex/scholar/url_finder/translators/individual/github.py +0 -23
  1251. scitex/scholar/url_finder/translators/individual/globes.py +0 -23
  1252. scitex/scholar/url_finder/translators/individual/gmail.py +0 -23
  1253. scitex/scholar/url_finder/translators/individual/goodreads.py +0 -23
  1254. scitex/scholar/url_finder/translators/individual/google_books.py +0 -23
  1255. scitex/scholar/url_finder/translators/individual/google_patents.py +0 -23
  1256. scitex/scholar/url_finder/translators/individual/google_play.py +0 -23
  1257. scitex/scholar/url_finder/translators/individual/google_presentation.py +0 -23
  1258. scitex/scholar/url_finder/translators/individual/google_research.py +0 -23
  1259. scitex/scholar/url_finder/translators/individual/google_scholar.py +0 -23
  1260. scitex/scholar/url_finder/translators/individual/govinfo.py +0 -23
  1261. scitex/scholar/url_finder/translators/individual/gpo_access_e_cfr.py +0 -23
  1262. scitex/scholar/url_finder/translators/individual/gulag_many_days__many_lives.py +0 -23
  1263. scitex/scholar/url_finder/translators/individual/haaretz.py +0 -23
  1264. scitex/scholar/url_finder/translators/individual/habr.py +0 -23
  1265. scitex/scholar/url_finder/translators/individual/hal.py +0 -23
  1266. scitex/scholar/url_finder/translators/individual/hal_archives_ouvertes.py +0 -23
  1267. scitex/scholar/url_finder/translators/individual/handelszeitung.py +0 -23
  1268. scitex/scholar/url_finder/translators/individual/hanrei_watch.py +0 -23
  1269. scitex/scholar/url_finder/translators/individual/harper_s_magazine.py +0 -23
  1270. scitex/scholar/url_finder/translators/individual/harvard_business_review.py +0 -23
  1271. scitex/scholar/url_finder/translators/individual/harvard_caselaw_access_project.py +0 -23
  1272. scitex/scholar/url_finder/translators/individual/harvard_university_press_books.py +0 -23
  1273. scitex/scholar/url_finder/translators/individual/hathitrust.py +0 -23
  1274. scitex/scholar/url_finder/translators/individual/hcsp.py +0 -23
  1275. scitex/scholar/url_finder/translators/individual/heinonline.py +0 -23
  1276. scitex/scholar/url_finder/translators/individual/heise.py +0 -23
  1277. scitex/scholar/url_finder/translators/individual/herder.py +0 -23
  1278. scitex/scholar/url_finder/translators/individual/highbeam.py +0 -23
  1279. scitex/scholar/url_finder/translators/individual/highwire.py +0 -23
  1280. scitex/scholar/url_finder/translators/individual/highwire2.py +0 -23
  1281. scitex/scholar/url_finder/translators/individual/highwire_2_0.py +0 -23
  1282. scitex/scholar/url_finder/translators/individual/hindawi.py +0 -23
  1283. scitex/scholar/url_finder/translators/individual/hindawi_publishers.py +0 -23
  1284. scitex/scholar/url_finder/translators/individual/hispanic_american_periodical_index.py +0 -23
  1285. scitex/scholar/url_finder/translators/individual/homeland_security_digital_library.py +0 -23
  1286. scitex/scholar/url_finder/translators/individual/hudoc.py +0 -23
  1287. scitex/scholar/url_finder/translators/individual/huff_post.py +0 -23
  1288. scitex/scholar/url_finder/translators/individual/human_rights_watch.py +0 -23
  1289. scitex/scholar/url_finder/translators/individual/ibisworld.py +0 -23
  1290. scitex/scholar/url_finder/translators/individual/idea_alm.py +0 -23
  1291. scitex/scholar/url_finder/translators/individual/idref.py +0 -23
  1292. scitex/scholar/url_finder/translators/individual/ieee_xplore.py +0 -265
  1293. scitex/scholar/url_finder/translators/individual/ietf.py +0 -23
  1294. scitex/scholar/url_finder/translators/individual/ign.py +0 -23
  1295. scitex/scholar/url_finder/translators/individual/imdb.py +0 -23
  1296. scitex/scholar/url_finder/translators/individual/imf.py +0 -23
  1297. scitex/scholar/url_finder/translators/individual/in_these_times.py +0 -23
  1298. scitex/scholar/url_finder/translators/individual/informationssystem_medienpaedagogik.py +0 -23
  1299. scitex/scholar/url_finder/translators/individual/informit_database.py +0 -23
  1300. scitex/scholar/url_finder/translators/individual/infotrac.py +0 -23
  1301. scitex/scholar/url_finder/translators/individual/ingenta_connect.py +0 -23
  1302. scitex/scholar/url_finder/translators/individual/ingentaconnect.py +0 -23
  1303. scitex/scholar/url_finder/translators/individual/inside_higher_ed.py +0 -23
  1304. scitex/scholar/url_finder/translators/individual/insignia_opac.py +0 -23
  1305. scitex/scholar/url_finder/translators/individual/inspire.py +0 -23
  1306. scitex/scholar/url_finder/translators/individual/institute_of_contemporary_art.py +0 -23
  1307. scitex/scholar/url_finder/translators/individual/institute_of_physics.py +0 -23
  1308. scitex/scholar/url_finder/translators/individual/integrum.py +0 -23
  1309. scitex/scholar/url_finder/translators/individual/intellixir.py +0 -23
  1310. scitex/scholar/url_finder/translators/individual/international_nuclear_information_system.py +0 -23
  1311. scitex/scholar/url_finder/translators/individual/internet_archive.py +0 -23
  1312. scitex/scholar/url_finder/translators/individual/internet_archive_scholar.py +0 -23
  1313. scitex/scholar/url_finder/translators/individual/internet_archive_wayback.py +0 -23
  1314. scitex/scholar/url_finder/translators/individual/internet_archive_wayback_machine.py +0 -23
  1315. scitex/scholar/url_finder/translators/individual/invenio_rdm.py +0 -23
  1316. scitex/scholar/url_finder/translators/individual/inveniordm.py +0 -23
  1317. scitex/scholar/url_finder/translators/individual/io_port.py +0 -23
  1318. scitex/scholar/url_finder/translators/individual/iop.py +0 -23
  1319. scitex/scholar/url_finder/translators/individual/ipcc.py +0 -23
  1320. scitex/scholar/url_finder/translators/individual/isidore.py +0 -23
  1321. scitex/scholar/url_finder/translators/individual/istc.py +0 -23
  1322. scitex/scholar/url_finder/translators/individual/j_stage.py +0 -23
  1323. scitex/scholar/url_finder/translators/individual/jahrbuch.py +0 -23
  1324. scitex/scholar/url_finder/translators/individual/japan_times_online.py +0 -23
  1325. scitex/scholar/url_finder/translators/individual/jets.py +0 -23
  1326. scitex/scholar/url_finder/translators/individual/jisc_historical_texts.py +0 -25
  1327. scitex/scholar/url_finder/translators/individual/journal_of_electronic_publishing.py +0 -23
  1328. scitex/scholar/url_finder/translators/individual/journal_of_extension.py +0 -23
  1329. scitex/scholar/url_finder/translators/individual/journal_of_machine_learning_research.py +0 -23
  1330. scitex/scholar/url_finder/translators/individual/journal_of_religion_and_society.py +0 -23
  1331. scitex/scholar/url_finder/translators/individual/jrc_publications_repository.py +0 -23
  1332. scitex/scholar/url_finder/translators/individual/jstage.py +0 -23
  1333. scitex/scholar/url_finder/translators/individual/jstor.py +0 -211
  1334. scitex/scholar/url_finder/translators/individual/juricaf.py +0 -23
  1335. scitex/scholar/url_finder/translators/individual/jurion.py +0 -23
  1336. scitex/scholar/url_finder/translators/individual/juris.py +0 -23
  1337. scitex/scholar/url_finder/translators/individual/jurpc.py +0 -23
  1338. scitex/scholar/url_finder/translators/individual/k10plus_isbn.py +0 -23
  1339. scitex/scholar/url_finder/translators/individual/kanopy.py +0 -23
  1340. scitex/scholar/url_finder/translators/individual/karger.py +0 -23
  1341. scitex/scholar/url_finder/translators/individual/khaama_press.py +0 -23
  1342. scitex/scholar/url_finder/translators/individual/kitapyurdu_com.py +0 -23
  1343. scitex/scholar/url_finder/translators/individual/kommersant.py +0 -23
  1344. scitex/scholar/url_finder/translators/individual/korean_national_library.py +0 -25
  1345. scitex/scholar/url_finder/translators/individual/kstudy.py +0 -23
  1346. scitex/scholar/url_finder/translators/individual/l_annee_philologique.py +0 -23
  1347. scitex/scholar/url_finder/translators/individual/la_croix.py +0 -23
  1348. scitex/scholar/url_finder/translators/individual/la_nacion__argentina_.py +0 -23
  1349. scitex/scholar/url_finder/translators/individual/la_presse.py +0 -23
  1350. scitex/scholar/url_finder/translators/individual/la_republica__peru_.py +0 -23
  1351. scitex/scholar/url_finder/translators/individual/la_times.py +0 -25
  1352. scitex/scholar/url_finder/translators/individual/lagen_nu.py +0 -23
  1353. scitex/scholar/url_finder/translators/individual/landesbibliographie_baden_wurttemberg.py +0 -25
  1354. scitex/scholar/url_finder/translators/individual/lapham_s_quarterly.py +0 -23
  1355. scitex/scholar/url_finder/translators/individual/le_devoir.py +0 -23
  1356. scitex/scholar/url_finder/translators/individual/le_figaro.py +0 -23
  1357. scitex/scholar/url_finder/translators/individual/le_maitron.py +0 -23
  1358. scitex/scholar/url_finder/translators/individual/le_monde.py +0 -23
  1359. scitex/scholar/url_finder/translators/individual/le_monde_diplomatique.py +0 -23
  1360. scitex/scholar/url_finder/translators/individual/legifrance.py +0 -23
  1361. scitex/scholar/url_finder/translators/individual/legislative_insight.py +0 -25
  1362. scitex/scholar/url_finder/translators/individual/lexis_.py +0 -23
  1363. scitex/scholar/url_finder/translators/individual/lexisnexis.py +0 -23
  1364. scitex/scholar/url_finder/translators/individual/libraries_tasmania.py +0 -25
  1365. scitex/scholar/url_finder/translators/individual/library_catalog__aleph_.py +0 -23
  1366. scitex/scholar/url_finder/translators/individual/library_catalog__amicus_.py +0 -23
  1367. scitex/scholar/url_finder/translators/individual/library_catalog__aquabrowser_.py +0 -23
  1368. scitex/scholar/url_finder/translators/individual/library_catalog__bibliocommons_.py +0 -23
  1369. scitex/scholar/url_finder/translators/individual/library_catalog__blacklight_.py +0 -23
  1370. scitex/scholar/url_finder/translators/individual/library_catalog__capita_prism_.py +0 -23
  1371. scitex/scholar/url_finder/translators/individual/library_catalog__dra_.py +0 -23
  1372. scitex/scholar/url_finder/translators/individual/library_catalog__dynix_.py +0 -23
  1373. scitex/scholar/url_finder/translators/individual/library_catalog__encore_.py +0 -23
  1374. scitex/scholar/url_finder/translators/individual/library_catalog__innopac_.py +0 -23
  1375. scitex/scholar/url_finder/translators/individual/library_catalog__koha_.py +0 -25
  1376. scitex/scholar/url_finder/translators/individual/library_catalog__mango_.py +0 -23
  1377. scitex/scholar/url_finder/translators/individual/library_catalog__opals_.py +0 -23
  1378. scitex/scholar/url_finder/translators/individual/library_catalog__pica2_.py +0 -23
  1379. scitex/scholar/url_finder/translators/individual/library_catalog__pica_.py +0 -23
  1380. scitex/scholar/url_finder/translators/individual/library_catalog__pika_.py +0 -23
  1381. scitex/scholar/url_finder/translators/individual/library_catalog__polaris_.py +0 -23
  1382. scitex/scholar/url_finder/translators/individual/library_catalog__quolto_.py +0 -23
  1383. scitex/scholar/url_finder/translators/individual/library_catalog__rero_ils_.py +0 -23
  1384. scitex/scholar/url_finder/translators/individual/library_catalog__sirsi_.py +0 -23
  1385. scitex/scholar/url_finder/translators/individual/library_catalog__sirsi_elibrary_.py +0 -23
  1386. scitex/scholar/url_finder/translators/individual/library_catalog__slims_.py +0 -23
  1387. scitex/scholar/url_finder/translators/individual/library_catalog__tind_ils_.py +0 -23
  1388. scitex/scholar/url_finder/translators/individual/library_catalog__tinread_.py +0 -23
  1389. scitex/scholar/url_finder/translators/individual/library_catalog__tlcyouseemore_.py +0 -23
  1390. scitex/scholar/url_finder/translators/individual/library_catalog__visual_library_2021_.py +0 -23
  1391. scitex/scholar/url_finder/translators/individual/library_catalog__voyager_.py +0 -23
  1392. scitex/scholar/url_finder/translators/individual/library_catalog__voyager_7_.py +0 -23
  1393. scitex/scholar/url_finder/translators/individual/library_catalog__vtls_.py +0 -23
  1394. scitex/scholar/url_finder/translators/individual/library_genesis.py +0 -23
  1395. scitex/scholar/url_finder/translators/individual/library_hub_discover.py +0 -23
  1396. scitex/scholar/url_finder/translators/individual/library_of_congress_digital_collections.py +0 -23
  1397. scitex/scholar/url_finder/translators/individual/library_of_congress_isbn.py +0 -23
  1398. scitex/scholar/url_finder/translators/individual/libris_isbn.py +0 -23
  1399. scitex/scholar/url_finder/translators/individual/lippincott_williams_and_wilkins.py +0 -23
  1400. scitex/scholar/url_finder/translators/individual/literary_hub.py +0 -23
  1401. scitex/scholar/url_finder/translators/individual/litres.py +0 -23
  1402. scitex/scholar/url_finder/translators/individual/livejournal.py +0 -23
  1403. scitex/scholar/url_finder/translators/individual/livivo.py +0 -23
  1404. scitex/scholar/url_finder/translators/individual/london_review_of_books.py +0 -23
  1405. scitex/scholar/url_finder/translators/individual/lookus.py +0 -23
  1406. scitex/scholar/url_finder/translators/individual/lulu.py +0 -23
  1407. scitex/scholar/url_finder/translators/individual/lwn_net.py +0 -23
  1408. scitex/scholar/url_finder/translators/individual/lww.py +0 -23
  1409. scitex/scholar/url_finder/translators/individual/mab2.py +0 -23
  1410. scitex/scholar/url_finder/translators/individual/magazines_russ_ru.py +0 -23
  1411. scitex/scholar/url_finder/translators/individual/mailman.py +0 -23
  1412. scitex/scholar/url_finder/translators/individual/mainichi_daily_news.py +0 -23
  1413. scitex/scholar/url_finder/translators/individual/marc.py +0 -23
  1414. scitex/scholar/url_finder/translators/individual/marcxml.py +0 -23
  1415. scitex/scholar/url_finder/translators/individual/mastodon.py +0 -23
  1416. scitex/scholar/url_finder/translators/individual/matbugat_ru.py +0 -23
  1417. scitex/scholar/url_finder/translators/individual/max_planck_institute_for_the_history_of_science_virtual_laboratory_library.py +0 -25
  1418. scitex/scholar/url_finder/translators/individual/mcv.py +0 -23
  1419. scitex/scholar/url_finder/translators/individual/mdpi.py +0 -76
  1420. scitex/scholar/url_finder/translators/individual/mdpi_journals.py +0 -23
  1421. scitex/scholar/url_finder/translators/individual/medes.py +0 -23
  1422. scitex/scholar/url_finder/translators/individual/medium.py +0 -23
  1423. scitex/scholar/url_finder/translators/individual/medline_nbib.py +0 -23
  1424. scitex/scholar/url_finder/translators/individual/medlinenbib.py +0 -23
  1425. scitex/scholar/url_finder/translators/individual/medra.py +0 -23
  1426. scitex/scholar/url_finder/translators/individual/metalib.py +0 -23
  1427. scitex/scholar/url_finder/translators/individual/mets.py +0 -23
  1428. scitex/scholar/url_finder/translators/individual/microbiology_society_journals.py +0 -25
  1429. scitex/scholar/url_finder/translators/individual/microsoft_academic.py +0 -23
  1430. scitex/scholar/url_finder/translators/individual/midas_journals.py +0 -25
  1431. scitex/scholar/url_finder/translators/individual/mikromarc.py +0 -23
  1432. scitex/scholar/url_finder/translators/individual/milli_kutuphane.py +0 -23
  1433. scitex/scholar/url_finder/translators/individual/mit_press_books.py +0 -23
  1434. scitex/scholar/url_finder/translators/individual/mods.py +0 -23
  1435. scitex/scholar/url_finder/translators/individual/mpg_pure.py +0 -23
  1436. scitex/scholar/url_finder/translators/individual/musee_du_louvre.py +0 -23
  1437. scitex/scholar/url_finder/translators/individual/nagoya_university_opac.py +0 -25
  1438. scitex/scholar/url_finder/translators/individual/nasa_ads.py +0 -23
  1439. scitex/scholar/url_finder/translators/individual/nasa_ntrs.py +0 -23
  1440. scitex/scholar/url_finder/translators/individual/national_academies_press.py +0 -23
  1441. scitex/scholar/url_finder/translators/individual/national_agriculture_library.py +0 -23
  1442. scitex/scholar/url_finder/translators/individual/national_archives_of_australia.py +0 -23
  1443. scitex/scholar/url_finder/translators/individual/national_archives_of_south_africa.py +0 -23
  1444. scitex/scholar/url_finder/translators/individual/national_bureau_of_economic_research.py +0 -23
  1445. scitex/scholar/url_finder/translators/individual/national_diet_library_catalogue.py +0 -23
  1446. scitex/scholar/url_finder/translators/individual/national_gallery_of_art___usa.py +0 -23
  1447. scitex/scholar/url_finder/translators/individual/national_gallery_of_australia.py +0 -23
  1448. scitex/scholar/url_finder/translators/individual/national_library_of_australia__new_catalog_.py +0 -23
  1449. scitex/scholar/url_finder/translators/individual/national_library_of_belarus.py +0 -23
  1450. scitex/scholar/url_finder/translators/individual/national_library_of_norway.py +0 -23
  1451. scitex/scholar/url_finder/translators/individual/national_library_of_poland_isbn.py +0 -23
  1452. scitex/scholar/url_finder/translators/individual/national_post.py +0 -23
  1453. scitex/scholar/url_finder/translators/individual/national_technical_reports_library.py +0 -23
  1454. scitex/scholar/url_finder/translators/individual/national_transportation_library_rosa_p.py +0 -23
  1455. scitex/scholar/url_finder/translators/individual/nature.py +0 -23
  1456. scitex/scholar/url_finder/translators/individual/nature_publishing_group.py +0 -193
  1457. scitex/scholar/url_finder/translators/individual/nber.py +0 -23
  1458. scitex/scholar/url_finder/translators/individual/ncbi_nucleotide.py +0 -23
  1459. scitex/scholar/url_finder/translators/individual/neural_information_processing_systems.py +0 -23
  1460. scitex/scholar/url_finder/translators/individual/new_left_review.py +0 -23
  1461. scitex/scholar/url_finder/translators/individual/new_zealand_herald.py +0 -23
  1462. scitex/scholar/url_finder/translators/individual/newlines_magazine.py +0 -23
  1463. scitex/scholar/url_finder/translators/individual/news_corp_australia.py +0 -23
  1464. scitex/scholar/url_finder/translators/individual/newsbank.py +0 -23
  1465. scitex/scholar/url_finder/translators/individual/newshub_co_nz.py +0 -23
  1466. scitex/scholar/url_finder/translators/individual/newsnettamedia.py +0 -23
  1467. scitex/scholar/url_finder/translators/individual/newspapers_com.py +0 -23
  1468. scitex/scholar/url_finder/translators/individual/noor_digital_library.py +0 -23
  1469. scitex/scholar/url_finder/translators/individual/note_html.py +0 -23
  1470. scitex/scholar/url_finder/translators/individual/note_markdown.py +0 -23
  1471. scitex/scholar/url_finder/translators/individual/notre_dame_philosophical_reviews.py +0 -23
  1472. scitex/scholar/url_finder/translators/individual/npr.py +0 -23
  1473. scitex/scholar/url_finder/translators/individual/nrc_nl.py +0 -23
  1474. scitex/scholar/url_finder/translators/individual/nrc_research_press.py +0 -23
  1475. scitex/scholar/url_finder/translators/individual/ntsb_accident_reports.py +0 -25
  1476. scitex/scholar/url_finder/translators/individual/nypl_menus.py +0 -23
  1477. scitex/scholar/url_finder/translators/individual/nypl_research_catalog.py +0 -23
  1478. scitex/scholar/url_finder/translators/individual/nytimes_com.py +0 -23
  1479. scitex/scholar/url_finder/translators/individual/nzz_ch.py +0 -23
  1480. scitex/scholar/url_finder/translators/individual/oapen.py +0 -23
  1481. scitex/scholar/url_finder/translators/individual/oclc_worldcat_firstsearch.py +0 -23
  1482. scitex/scholar/url_finder/translators/individual/oecd.py +0 -23
  1483. scitex/scholar/url_finder/translators/individual/oecd_ilibrary.py +0 -23
  1484. scitex/scholar/url_finder/translators/individual/ohiolink.py +0 -23
  1485. scitex/scholar/url_finder/translators/individual/open_conf.py +0 -23
  1486. scitex/scholar/url_finder/translators/individual/open_knowledge_repository.py +0 -23
  1487. scitex/scholar/url_finder/translators/individual/open_worldcat.py +0 -23
  1488. scitex/scholar/url_finder/translators/individual/openalex.py +0 -23
  1489. scitex/scholar/url_finder/translators/individual/openalex_json.py +0 -23
  1490. scitex/scholar/url_finder/translators/individual/openedition_books.py +0 -23
  1491. scitex/scholar/url_finder/translators/individual/openjur.py +0 -23
  1492. scitex/scholar/url_finder/translators/individual/optical_society_of_america.py +0 -23
  1493. scitex/scholar/url_finder/translators/individual/optimization_online.py +0 -23
  1494. scitex/scholar/url_finder/translators/individual/osa.py +0 -23
  1495. scitex/scholar/url_finder/translators/individual/osf_preprints.py +0 -23
  1496. scitex/scholar/url_finder/translators/individual/osti_energy_citations.py +0 -23
  1497. scitex/scholar/url_finder/translators/individual/ovid.py +0 -23
  1498. scitex/scholar/url_finder/translators/individual/ovid_tagged.py +0 -23
  1499. scitex/scholar/url_finder/translators/individual/oxford.py +0 -148
  1500. scitex/scholar/url_finder/translators/individual/oxford_dictionaries_premium.py +0 -25
  1501. scitex/scholar/url_finder/translators/individual/oxford_english_dictionary.py +0 -23
  1502. scitex/scholar/url_finder/translators/individual/oxford_music_and_art_online.py +0 -23
  1503. scitex/scholar/url_finder/translators/individual/oxford_reference.py +0 -23
  1504. scitex/scholar/url_finder/translators/individual/oxford_university_press.py +0 -23
  1505. scitex/scholar/url_finder/translators/individual/ozon_ru.py +0 -25
  1506. scitex/scholar/url_finder/translators/individual/pajhwok_afghan_news.py +0 -23
  1507. scitex/scholar/url_finder/translators/individual/papers_past.py +0 -23
  1508. scitex/scholar/url_finder/translators/individual/paris_review.py +0 -23
  1509. scitex/scholar/url_finder/translators/individual/pastebin.py +0 -23
  1510. scitex/scholar/url_finder/translators/individual/patents___uspto.py +0 -23
  1511. scitex/scholar/url_finder/translators/individual/pc_gamer.py +0 -23
  1512. scitex/scholar/url_finder/translators/individual/pc_games.py +0 -23
  1513. scitex/scholar/url_finder/translators/individual/peeters.py +0 -23
  1514. scitex/scholar/url_finder/translators/individual/pei_archival_information_network.py +0 -23
  1515. scitex/scholar/url_finder/translators/individual/pep_web.py +0 -23
  1516. scitex/scholar/url_finder/translators/individual/perceiving_systems.py +0 -23
  1517. scitex/scholar/url_finder/translators/individual/perlego.py +0 -23
  1518. scitex/scholar/url_finder/translators/individual/philosopher_s_imprint.py +0 -23
  1519. scitex/scholar/url_finder/translators/individual/philpapers.py +0 -23
  1520. scitex/scholar/url_finder/translators/individual/pkp_catalog_systems.py +0 -23
  1521. scitex/scholar/url_finder/translators/individual/pleade.py +0 -23
  1522. scitex/scholar/url_finder/translators/individual/plos.py +0 -111
  1523. scitex/scholar/url_finder/translators/individual/plos_journals.py +0 -23
  1524. scitex/scholar/url_finder/translators/individual/pnas.py +0 -23
  1525. scitex/scholar/url_finder/translators/individual/polygon.py +0 -25
  1526. scitex/scholar/url_finder/translators/individual/potsdamer_neueste_nachrichten.py +0 -23
  1527. scitex/scholar/url_finder/translators/individual/prc_history_review.py +0 -23
  1528. scitex/scholar/url_finder/translators/individual/preprints_org.py +0 -23
  1529. scitex/scholar/url_finder/translators/individual/primo.py +0 -25
  1530. scitex/scholar/url_finder/translators/individual/primo_2018.py +0 -23
  1531. scitex/scholar/url_finder/translators/individual/primo_normalized_xml.py +0 -23
  1532. scitex/scholar/url_finder/translators/individual/probing_the_past.py +0 -23
  1533. scitex/scholar/url_finder/translators/individual/project_gutenberg.py +0 -23
  1534. scitex/scholar/url_finder/translators/individual/project_muse.py +0 -25
  1535. scitex/scholar/url_finder/translators/individual/promed.py +0 -23
  1536. scitex/scholar/url_finder/translators/individual/proquest.py +0 -23
  1537. scitex/scholar/url_finder/translators/individual/proquest_ebook_central.py +0 -23
  1538. scitex/scholar/url_finder/translators/individual/proquest_policyfile.py +0 -23
  1539. scitex/scholar/url_finder/translators/individual/protein_data_bank.py +0 -23
  1540. scitex/scholar/url_finder/translators/individual/pubfactory_journals.py +0 -25
  1541. scitex/scholar/url_finder/translators/individual/public_record_office_victoria.py +0 -23
  1542. scitex/scholar/url_finder/translators/individual/publications_du_quebec.py +0 -23
  1543. scitex/scholar/url_finder/translators/individual/publications_office_of_the_european_union.py +0 -23
  1544. scitex/scholar/url_finder/translators/individual/pubmed.py +0 -330
  1545. scitex/scholar/url_finder/translators/individual/pubmed_central.py +0 -71
  1546. scitex/scholar/url_finder/translators/individual/pubmed_xml.py +0 -23
  1547. scitex/scholar/url_finder/translators/individual/pubpub.py +0 -23
  1548. scitex/scholar/url_finder/translators/individual/pypi.py +0 -23
  1549. scitex/scholar/url_finder/translators/individual/qatar_digital_library.py +0 -23
  1550. scitex/scholar/url_finder/translators/individual/queensland_state_archives.py +0 -23
  1551. scitex/scholar/url_finder/translators/individual/r_packages.py +0 -23
  1552. scitex/scholar/url_finder/translators/individual/radio_free_europe__radio_liberty.py +0 -23
  1553. scitex/scholar/url_finder/translators/individual/rand.py +0 -23
  1554. scitex/scholar/url_finder/translators/individual/rdf.py +0 -23
  1555. scitex/scholar/url_finder/translators/individual/rechtspraak_nl.py +0 -25
  1556. scitex/scholar/url_finder/translators/individual/redalyc.py +0 -23
  1557. scitex/scholar/url_finder/translators/individual/reddit.py +0 -23
  1558. scitex/scholar/url_finder/translators/individual/referbibix.py +0 -23
  1559. scitex/scholar/url_finder/translators/individual/refworks_tagged.py +0 -23
  1560. scitex/scholar/url_finder/translators/individual/regeringskansliet.py +0 -23
  1561. scitex/scholar/url_finder/translators/individual/repec___econpapers.py +0 -23
  1562. scitex/scholar/url_finder/translators/individual/repec___ideas.py +0 -23
  1563. scitex/scholar/url_finder/translators/individual/repec_ideas.py +0 -23
  1564. scitex/scholar/url_finder/translators/individual/research_square.py +0 -23
  1565. scitex/scholar/url_finder/translators/individual/researchgate.py +0 -23
  1566. scitex/scholar/url_finder/translators/individual/retsinformation.py +0 -23
  1567. scitex/scholar/url_finder/translators/individual/reuters.py +0 -23
  1568. scitex/scholar/url_finder/translators/individual/ris.py +0 -23
  1569. scitex/scholar/url_finder/translators/individual/rock__paper__shotgun.py +0 -23
  1570. scitex/scholar/url_finder/translators/individual/roll_call.py +0 -23
  1571. scitex/scholar/url_finder/translators/individual/rsc.py +0 -23
  1572. scitex/scholar/url_finder/translators/individual/rsc_publishing.py +0 -23
  1573. scitex/scholar/url_finder/translators/individual/russian_state_library.py +0 -23
  1574. scitex/scholar/url_finder/translators/individual/sacramento_bee.py +0 -23
  1575. scitex/scholar/url_finder/translators/individual/sae_papers.py +0 -23
  1576. scitex/scholar/url_finder/translators/individual/safari_books_online.py +0 -23
  1577. scitex/scholar/url_finder/translators/individual/sage.py +0 -23
  1578. scitex/scholar/url_finder/translators/individual/sage_journals.py +0 -183
  1579. scitex/scholar/url_finder/translators/individual/sage_knowledge.py +0 -23
  1580. scitex/scholar/url_finder/translators/individual/saildart.py +0 -23
  1581. scitex/scholar/url_finder/translators/individual/salt_research_archives.py +0 -23
  1582. scitex/scholar/url_finder/translators/individual/sbn_it.py +0 -23
  1583. scitex/scholar/url_finder/translators/individual/scholars_portal_journals.py +0 -23
  1584. scitex/scholar/url_finder/translators/individual/scholia.py +0 -23
  1585. scitex/scholar/url_finder/translators/individual/schweizer_radio_und_fernsehen_srf.py +0 -23
  1586. scitex/scholar/url_finder/translators/individual/scielo.py +0 -23
  1587. scitex/scholar/url_finder/translators/individual/sciencedirect.py +0 -132
  1588. scitex/scholar/url_finder/translators/individual/scopus.py +0 -23
  1589. scitex/scholar/url_finder/translators/individual/semantic_scholar.py +0 -23
  1590. scitex/scholar/url_finder/translators/individual/semantics_visual_library.py +0 -25
  1591. scitex/scholar/url_finder/translators/individual/sfu_ipinch.py +0 -23
  1592. scitex/scholar/url_finder/translators/individual/silverchair.py +0 -301
  1593. scitex/scholar/url_finder/translators/individual/sipri.py +0 -23
  1594. scitex/scholar/url_finder/translators/individual/sirs_knowledge_source.py +0 -23
  1595. scitex/scholar/url_finder/translators/individual/slate.py +0 -23
  1596. scitex/scholar/url_finder/translators/individual/slideshare.py +0 -23
  1597. scitex/scholar/url_finder/translators/individual/slub_dresden.py +0 -23
  1598. scitex/scholar/url_finder/translators/individual/sora.py +0 -25
  1599. scitex/scholar/url_finder/translators/individual/springer.py +0 -121
  1600. scitex/scholar/url_finder/translators/individual/springer_link.py +0 -23
  1601. scitex/scholar/url_finder/translators/individual/ssoar.py +0 -23
  1602. scitex/scholar/url_finder/translators/individual/ssrn.py +0 -63
  1603. scitex/scholar/url_finder/translators/individual/stack_exchange.py +0 -23
  1604. scitex/scholar/url_finder/translators/individual/standard_ebooks.py +0 -23
  1605. scitex/scholar/url_finder/translators/individual/stanford_encyclopedia_of_philosophy.py +0 -25
  1606. scitex/scholar/url_finder/translators/individual/stanford_university_press.py +0 -23
  1607. scitex/scholar/url_finder/translators/individual/state_records_office_of_western_australia.py +0 -23
  1608. scitex/scholar/url_finder/translators/individual/state_records_office_wa.py +0 -23
  1609. scitex/scholar/url_finder/translators/individual/stitcher.py +0 -23
  1610. scitex/scholar/url_finder/translators/individual/store_norske_leksikon.py +0 -23
  1611. scitex/scholar/url_finder/translators/individual/stuff_co_nz.py +0 -23
  1612. scitex/scholar/url_finder/translators/individual/substack.py +0 -23
  1613. scitex/scholar/url_finder/translators/individual/sud_ouest.py +0 -23
  1614. scitex/scholar/url_finder/translators/individual/sueddeutsche_de.py +0 -23
  1615. scitex/scholar/url_finder/translators/individual/summon_2.py +0 -23
  1616. scitex/scholar/url_finder/translators/individual/superlib.py +0 -25
  1617. scitex/scholar/url_finder/translators/individual/svenska_dagbladet.py +0 -23
  1618. scitex/scholar/url_finder/translators/individual/sveriges_radio.py +0 -23
  1619. scitex/scholar/url_finder/translators/individual/svt_nyheter.py +0 -23
  1620. scitex/scholar/url_finder/translators/individual/tagesspiegel.py +0 -23
  1621. scitex/scholar/url_finder/translators/individual/talis_aspire.py +0 -23
  1622. scitex/scholar/url_finder/translators/individual/talisprism.py +0 -23
  1623. scitex/scholar/url_finder/translators/individual/tatknigafund.py +0 -23
  1624. scitex/scholar/url_finder/translators/individual/tatpressa_ru.py +0 -23
  1625. scitex/scholar/url_finder/translators/individual/taylor___francis_ebooks.py +0 -23
  1626. scitex/scholar/url_finder/translators/individual/taylor_and_francis_nejm.py +0 -23
  1627. scitex/scholar/url_finder/translators/individual/taylor_francis.py +0 -23
  1628. scitex/scholar/url_finder/translators/individual/taylor_francis_nejm.py +0 -23
  1629. scitex/scholar/url_finder/translators/individual/taz_de.py +0 -23
  1630. scitex/scholar/url_finder/translators/individual/tei.py +0 -23
  1631. scitex/scholar/url_finder/translators/individual/tesis_doctorals_en_xarxa.py +0 -23
  1632. scitex/scholar/url_finder/translators/individual/the_art_newspaper.py +0 -23
  1633. scitex/scholar/url_finder/translators/individual/the_atlantic.py +0 -23
  1634. scitex/scholar/url_finder/translators/individual/the_boston_globe.py +0 -23
  1635. scitex/scholar/url_finder/translators/individual/the_chronicle_of_higher_education.py +0 -23
  1636. scitex/scholar/url_finder/translators/individual/the_daily_beast.py +0 -23
  1637. scitex/scholar/url_finder/translators/individual/the_economic_times___the_times_of_india.py +0 -23
  1638. scitex/scholar/url_finder/translators/individual/the_economist.py +0 -23
  1639. scitex/scholar/url_finder/translators/individual/the_free_dictionary.py +0 -23
  1640. scitex/scholar/url_finder/translators/individual/the_globe_and_mail.py +0 -23
  1641. scitex/scholar/url_finder/translators/individual/the_guardian.py +0 -23
  1642. scitex/scholar/url_finder/translators/individual/the_hamilton_spectator.py +0 -23
  1643. scitex/scholar/url_finder/translators/individual/the_hindu.py +0 -23
  1644. scitex/scholar/url_finder/translators/individual/the_independent.py +0 -23
  1645. scitex/scholar/url_finder/translators/individual/the_intercept.py +0 -23
  1646. scitex/scholar/url_finder/translators/individual/the_met.py +0 -23
  1647. scitex/scholar/url_finder/translators/individual/the_microfinance_gateway.py +0 -23
  1648. scitex/scholar/url_finder/translators/individual/the_nation.py +0 -23
  1649. scitex/scholar/url_finder/translators/individual/the_national_archives__uk_.py +0 -23
  1650. scitex/scholar/url_finder/translators/individual/the_new_republic.py +0 -23
  1651. scitex/scholar/url_finder/translators/individual/the_new_york_review_of_books.py +0 -23
  1652. scitex/scholar/url_finder/translators/individual/the_new_yorker.py +0 -23
  1653. scitex/scholar/url_finder/translators/individual/the_open_library.py +0 -23
  1654. scitex/scholar/url_finder/translators/individual/the_straits_times.py +0 -23
  1655. scitex/scholar/url_finder/translators/individual/the_telegraph.py +0 -23
  1656. scitex/scholar/url_finder/translators/individual/the_times_and_sunday_times.py +0 -23
  1657. scitex/scholar/url_finder/translators/individual/the_times_of_israel.py +0 -23
  1658. scitex/scholar/url_finder/translators/individual/themarker.py +0 -23
  1659. scitex/scholar/url_finder/translators/individual/theory_of_computing.py +0 -23
  1660. scitex/scholar/url_finder/translators/individual/thesesfr.py +0 -23
  1661. scitex/scholar/url_finder/translators/individual/thieme.py +0 -23
  1662. scitex/scholar/url_finder/translators/individual/time_com.py +0 -23
  1663. scitex/scholar/url_finder/translators/individual/timesmachine.py +0 -23
  1664. scitex/scholar/url_finder/translators/individual/tony_blair_institute.py +0 -23
  1665. scitex/scholar/url_finder/translators/individual/tony_blair_institute_for_global_change.py +0 -23
  1666. scitex/scholar/url_finder/translators/individual/toronto_star.py +0 -23
  1667. scitex/scholar/url_finder/translators/individual/transportation_research_board.py +0 -23
  1668. scitex/scholar/url_finder/translators/individual/treesearch.py +0 -25
  1669. scitex/scholar/url_finder/translators/individual/trove.py +0 -23
  1670. scitex/scholar/url_finder/translators/individual/tumblr.py +0 -23
  1671. scitex/scholar/url_finder/translators/individual/tv_by_the_numbers.py +0 -23
  1672. scitex/scholar/url_finder/translators/individual/tvnz.py +0 -23
  1673. scitex/scholar/url_finder/translators/individual/twitter.py +0 -23
  1674. scitex/scholar/url_finder/translators/individual/ubiquity_journals.py +0 -23
  1675. scitex/scholar/url_finder/translators/individual/uchicago_vufind.py +0 -23
  1676. scitex/scholar/url_finder/translators/individual/unapi.py +0 -23
  1677. scitex/scholar/url_finder/translators/individual/unesco.py +0 -23
  1678. scitex/scholar/url_finder/translators/individual/university_of_california_press_books.py +0 -23
  1679. scitex/scholar/url_finder/translators/individual/university_of_chicago_press_books.py +0 -25
  1680. scitex/scholar/url_finder/translators/individual/university_of_wisconsin_madison_libraries_catalog.py +0 -23
  1681. scitex/scholar/url_finder/translators/individual/university_press_scholarship.py +0 -23
  1682. scitex/scholar/url_finder/translators/individual/unqualified_dublin_core_rdf.py +0 -23
  1683. scitex/scholar/url_finder/translators/individual/unz_print_archive.py +0 -23
  1684. scitex/scholar/url_finder/translators/individual/upcommons.py +0 -23
  1685. scitex/scholar/url_finder/translators/individual/uptodate_references.py +0 -23
  1686. scitex/scholar/url_finder/translators/individual/us_national_archives_research_catalog.py +0 -23
  1687. scitex/scholar/url_finder/translators/individual/usenix.py +0 -23
  1688. scitex/scholar/url_finder/translators/individual/vanity_fair.py +0 -23
  1689. scitex/scholar/url_finder/translators/individual/verniana.py +0 -23
  1690. scitex/scholar/url_finder/translators/individual/verniana_jules_verne_studies.py +0 -23
  1691. scitex/scholar/url_finder/translators/individual/verso_books.py +0 -23
  1692. scitex/scholar/url_finder/translators/individual/vice.py +0 -23
  1693. scitex/scholar/url_finder/translators/individual/victoria___albert_museum.py +0 -23
  1694. scitex/scholar/url_finder/translators/individual/vimeo.py +0 -23
  1695. scitex/scholar/url_finder/translators/individual/vlex.py +0 -25
  1696. scitex/scholar/url_finder/translators/individual/voxeu.py +0 -23
  1697. scitex/scholar/url_finder/translators/individual/wall_street_journal.py +0 -23
  1698. scitex/scholar/url_finder/translators/individual/wanfang_data.py +0 -23
  1699. scitex/scholar/url_finder/translators/individual/washington_monthly.py +0 -23
  1700. scitex/scholar/url_finder/translators/individual/washington_post.py +0 -23
  1701. scitex/scholar/url_finder/translators/individual/web_of_science.py +0 -25
  1702. scitex/scholar/url_finder/translators/individual/web_of_science_nextgen.py +0 -25
  1703. scitex/scholar/url_finder/translators/individual/web_of_science_tagged.py +0 -23
  1704. scitex/scholar/url_finder/translators/individual/welt_online.py +0 -23
  1705. scitex/scholar/url_finder/translators/individual/westlaw_uk.py +0 -23
  1706. scitex/scholar/url_finder/translators/individual/who.py +0 -23
  1707. scitex/scholar/url_finder/translators/individual/wikidata.py +0 -23
  1708. scitex/scholar/url_finder/translators/individual/wikidata_quickstatements.py +0 -23
  1709. scitex/scholar/url_finder/translators/individual/wikileaks_plusd.py +0 -23
  1710. scitex/scholar/url_finder/translators/individual/wikimedia_commons.py +0 -23
  1711. scitex/scholar/url_finder/translators/individual/wikipedia.py +0 -23
  1712. scitex/scholar/url_finder/translators/individual/wikipedia_citation_templates.py +0 -23
  1713. scitex/scholar/url_finder/translators/individual/wikisource.py +0 -23
  1714. scitex/scholar/url_finder/translators/individual/wikiwand.py +0 -23
  1715. scitex/scholar/url_finder/translators/individual/wiktionary.py +0 -23
  1716. scitex/scholar/url_finder/translators/individual/wildlife_biology_in_practice.py +0 -23
  1717. scitex/scholar/url_finder/translators/individual/wiley.py +0 -187
  1718. scitex/scholar/url_finder/translators/individual/wiley_online_library.py +0 -23
  1719. scitex/scholar/url_finder/translators/individual/wilson_center_digital_archive.py +0 -25
  1720. scitex/scholar/url_finder/translators/individual/winnipeg_free_press.py +0 -23
  1721. scitex/scholar/url_finder/translators/individual/wipo.py +0 -23
  1722. scitex/scholar/url_finder/translators/individual/wired.py +0 -23
  1723. scitex/scholar/url_finder/translators/individual/wiso.py +0 -23
  1724. scitex/scholar/url_finder/translators/individual/womennews.py +0 -23
  1725. scitex/scholar/url_finder/translators/individual/world_bank.py +0 -23
  1726. scitex/scholar/url_finder/translators/individual/world_digital_library.py +0 -23
  1727. scitex/scholar/url_finder/translators/individual/world_history_connected.py +0 -23
  1728. scitex/scholar/url_finder/translators/individual/world_shakespeare_bibliography_online.py +0 -23
  1729. scitex/scholar/url_finder/translators/individual/worldcat_discovery_service.py +0 -23
  1730. scitex/scholar/url_finder/translators/individual/xml_contextobject.py +0 -23
  1731. scitex/scholar/url_finder/translators/individual/yandex_books.py +0 -23
  1732. scitex/scholar/url_finder/translators/individual/ynet.py +0 -23
  1733. scitex/scholar/url_finder/translators/individual/youtube.py +0 -23
  1734. scitex/scholar/url_finder/translators/individual/ypfs.py +0 -23
  1735. scitex/scholar/url_finder/translators/individual/ypsf.py +0 -23
  1736. scitex/scholar/url_finder/translators/individual/zenodo.py +0 -23
  1737. scitex/scholar/url_finder/translators/individual/ziponline.py +0 -23
  1738. scitex/scholar/url_finder/translators/individual/zobodat.py +0 -23
  1739. scitex/scholar/url_finder/translators/individual/zotero_org.py +0 -23
  1740. scitex/scholar/url_finder/translators/individual/zotero_rdf.py +0 -23
  1741. scitex/scholar/url_finder/translators/individual/zoterobib.py +0 -23
  1742. scitex/stats/utils/__init__.py +0 -59
  1743. scitex/stats/utils/_effect_size.py +0 -992
  1744. scitex/stats/utils/_formatters.py +0 -276
  1745. scitex/stats/utils/_normalizers.py +0 -923
  1746. scitex/stats/utils/_power.py +0 -433
  1747. scitex-2.14.0.dist-info/METADATA +0 -1238
  1748. scitex-2.14.0.dist-info/RECORD +0 -2498
  1749. /scitex/{gen → context}/_detect_environment.py +0 -0
  1750. /scitex/{gen → context}/_get_notebook_path.py +0 -0
  1751. /scitex/io/{utils → _utils}/__init__.py +0 -0
  1752. /scitex/io/{utils → _utils}/h5_to_zarr.py +0 -0
  1753. /scitex/scholar/{utils → _utils}/__init__.py +0 -0
  1754. /scitex/scholar/{utils → _utils}/bibtex/__init__.py +0 -0
  1755. /scitex/scholar/{utils → _utils}/bibtex/_parse_bibtex.py +0 -0
  1756. /scitex/scholar/{utils → _utils}/cleanup/__init__.py +0 -0
  1757. /scitex/scholar/{utils → _utils}/cleanup/_cleanup_scholar_processes.py +0 -0
  1758. /scitex/scholar/{utils → _utils}/create_demo_movie.sh +0 -0
  1759. /scitex/scholar/{utils → _utils}/text/_TextNormalizer.py +0 -0
  1760. /scitex/scholar/{utils → _utils}/text/__init__.py +0 -0
  1761. /scitex/scholar/{utils → _utils}/validation/DOIValidator.py +0 -0
  1762. /scitex/scholar/{utils → _utils}/validation/README.md +0 -0
  1763. /scitex/scholar/{utils → _utils}/validation/__init__.py +0 -0
  1764. /scitex/scholar/{utils → _utils}/validation/validate_library_dois.py +0 -0
  1765. /scitex/scholar/url_finder/translators/{core → _core}/__init__.py +0 -0
  1766. /scitex/scholar/url_finder/translators/{core → _core}/base.py +0 -0
  1767. /scitex/scholar/url_finder/translators/{core → _core}/patterns.py +0 -0
  1768. /scitex/scholar/url_finder/translators/{individual → _individual}/BOFiP_Impots.py +0 -0
  1769. /scitex/scholar/url_finder/translators/{individual → _individual}/Baidu_Scholar.py +0 -0
  1770. /scitex/scholar/url_finder/translators/{individual → _individual}/Bangkok_Post.py +0 -0
  1771. /scitex/scholar/url_finder/translators/{individual → _individual}/Baruch_Foundation.py +0 -0
  1772. /scitex/scholar/url_finder/translators/{individual → _individual}/Beobachter.py +0 -0
  1773. /scitex/scholar/url_finder/translators/{individual → _individual}/Bezneng_Gajit.py +0 -0
  1774. /scitex/scholar/url_finder/translators/{individual → _individual}/BibLaTeX.py +0 -0
  1775. /scitex/scholar/url_finder/translators/{individual → _individual}/BibTeX.py +0 -0
  1776. /scitex/scholar/url_finder/translators/{individual → _individual}/Biblio_com.py +0 -0
  1777. /scitex/scholar/url_finder/translators/{individual → _individual}/Bibliontology_RDF.py +0 -0
  1778. /scitex/scholar/url_finder/translators/{individual → _individual}/Camara_Brasileira_do_Livro_ISBN.py +0 -0
  1779. /scitex/scholar/url_finder/translators/{individual → _individual}/CanLII.py +0 -0
  1780. /scitex/scholar/url_finder/translators/{individual → _individual}/Canada_com.py +0 -0
  1781. /scitex/scholar/url_finder/translators/{individual → _individual}/Canadian_Letters_and_Images.py +0 -0
  1782. /scitex/scholar/url_finder/translators/{individual → _individual}/Canadiana_ca.py +0 -0
  1783. /scitex/scholar/url_finder/translators/{individual → _individual}/Cascadilla_Proceedings_Project.py +0 -0
  1784. /scitex/scholar/url_finder/translators/{individual → _individual}/Central_and_Eastern_European_Online_Library_Journals.py +0 -0
  1785. /scitex/scholar/url_finder/translators/{individual → _individual}/Champlain_Society_Collection.py +0 -0
  1786. /scitex/scholar/url_finder/translators/{individual → _individual}/Chicago_Journal_of_Theoretical_Computer_Science.py +0 -0
  1787. /scitex/scholar/url_finder/translators/{individual → _individual}/Christian_Science_Monitor.py +0 -0
  1788. /scitex/scholar/url_finder/translators/{individual → _individual}/Columbia_University_Press.py +0 -0
  1789. /scitex/scholar/url_finder/translators/{individual → _individual}/Common_Place.py +0 -0
  1790. /scitex/scholar/url_finder/translators/{individual → _individual}/Cornell_LII.py +0 -0
  1791. /scitex/scholar/url_finder/translators/{individual → _individual}/Cornell_University_Press.py +0 -0
  1792. /scitex/scholar/url_finder/translators/{individual → _individual}/CourtListener.py +0 -0
  1793. /scitex/scholar/url_finder/translators/{individual → _individual}/DAI_Zenon.py +0 -0
  1794. /scitex/scholar/url_finder/translators/{individual → _individual}/FULL_DOWNLOAD_LOG.txt +0 -0
  1795. /scitex/scholar/url_finder/translators/{individual → _individual}/FULL_DOWNLOAD_LOG_colored.txt +0 -0
  1796. /scitex/scholar/url_finder/translators/{individual → _individual}/acm.py +0 -0
  1797. /scitex/scholar/url_finder/translators/{individual → _individual}/aps_physics.py +0 -0
  1798. /scitex/scholar/url_finder/translators/{individual → _individual}/artforum.py +0 -0
  1799. /scitex/scholar/url_finder/translators/{individual → _individual}/atlanta_journal_constitution.py +0 -0
  1800. /scitex/scholar/url_finder/translators/{individual → _individual}/austlii_and_nzlii.py +0 -0
  1801. /scitex/scholar/url_finder/translators/{individual → _individual}/australian_dictionary_of_biography.py +0 -0
  1802. /scitex/scholar/url_finder/translators/{individual → _individual}/bailii.py +0 -0
  1803. /scitex/scholar/url_finder/translators/{individual → _individual}/bbc.py +0 -0
  1804. /scitex/scholar/url_finder/translators/{individual → _individual}/bbc_genome.py +0 -0
  1805. /scitex/scholar/url_finder/translators/{individual → _individual}/biblioteca_nacional_de_maestros.py +0 -0
  1806. /scitex/scholar/url_finder/translators/{individual → _individual}/bibliotheque_archives_nationale_quebec_pistard.py +0 -0
  1807. /scitex/scholar/url_finder/translators/{individual → _individual}/bibliotheque_archives_nationales_quebec.py +0 -0
  1808. /scitex/scholar/url_finder/translators/{individual → _individual}/bibliotheque_nationale_france.py +0 -0
  1809. /scitex/scholar/url_finder/translators/{individual → _individual}/bibsys.py +0 -0
  1810. /scitex/scholar/url_finder/translators/{individual → _individual}/bioconductor.py +0 -0
  1811. /scitex/scholar/url_finder/translators/{individual → _individual}/blogger.py +0 -0
  1812. /scitex/scholar/url_finder/translators/{individual → _individual}/bloomberg.py +0 -0
  1813. /scitex/scholar/url_finder/translators/{individual → _individual}/bloomsbury_food_library.py +0 -0
  1814. /scitex/scholar/url_finder/translators/{individual → _individual}/bluesky.py +0 -0
  1815. /scitex/scholar/url_finder/translators/{individual → _individual}/bocc.py +0 -0
  1816. /scitex/scholar/url_finder/translators/{individual → _individual}/boe.py +0 -0
  1817. /scitex/scholar/url_finder/translators/{individual → _individual}/business_standard.py +0 -0
  1818. /scitex/scholar/url_finder/translators/{individual → _individual}/cabi_cab_abstracts.py +0 -0
  1819. /scitex/scholar/url_finder/translators/{individual → _individual}/caod.py +0 -0
  1820. /scitex/scholar/url_finder/translators/{individual → _individual}/cbc.py +0 -0
  1821. /scitex/scholar/url_finder/translators/{individual → _individual}/ccfr_bnf.py +0 -0
  1822. /scitex/scholar/url_finder/translators/{individual → _individual}/cia_world_factbook.py +0 -0
  1823. /scitex/scholar/url_finder/translators/{individual → _individual}/current_affairs.py +0 -0
  1824. /scitex/scholar/url_finder/translators/{individual → _individual}/dabi.py +0 -0
  1825. /scitex/scholar/url_finder/translators/{individual → _individual}/dagstuhl.py +0 -0
  1826. /scitex/scholar/url_finder/translators/{individual → _individual}/dar_almandumah.py +0 -0
  1827. /scitex/scholar/url_finder/translators/{individual → _individual}/dart_europe.py +0 -0
  1828. /scitex/scholar/url_finder/translators/{individual → _individual}/data_gov.py +0 -0
  1829. /scitex/scholar/url_finder/translators/{individual → _individual}/databrary.py +0 -0
  1830. /scitex/scholar/url_finder/translators/{individual → _individual}/datacite_json.py +0 -0
  1831. /scitex/scholar/url_finder/translators/{individual → _individual}/dataverse.py +0 -0
  1832. /scitex/scholar/url_finder/translators/{individual → _individual}/daum_news.py +0 -0
  1833. /scitex/scholar/url_finder/translators/{individual → _individual}/dblp.py +0 -0
  1834. /scitex/scholar/url_finder/translators/{individual → _individual}/dblp_computer_science_bibliography.py +0 -0
  1835. /scitex/scholar/url_finder/translators/{individual → _individual}/dbpia.py +0 -0
  1836. /scitex/scholar/url_finder/translators/{individual → _individual}/defense_technical_information_center.py +0 -0
  1837. /scitex/scholar/url_finder/translators/{individual → _individual}/delpher.py +0 -0
  1838. /scitex/scholar/url_finder/translators/{individual → _individual}/demographic_research.py +0 -0
  1839. /scitex/scholar/url_finder/translators/{individual → _individual}/denik_cz.py +0 -0
  1840. /scitex/scholar/url_finder/translators/{individual → _individual}/depatisnet.py +0 -0
  1841. /scitex/scholar/url_finder/translators/{individual → _individual}/der_freitag.py +0 -0
  1842. /scitex/scholar/url_finder/translators/{individual → _individual}/der_spiegel.py +0 -0
  1843. /scitex/scholar/url_finder/translators/{individual → _individual}/dpla.py +0 -0
  1844. /scitex/scholar/url_finder/translators/{individual → _individual}/dspace.py +0 -0
  1845. /scitex/scholar/url_finder/translators/{individual → _individual}/gms_german_medical_science.py +0 -0
  1846. /scitex/scholar/url_finder/translators/{individual → _individual}/ieee_computer_society.py +0 -0
  1847. /scitex/scholar/url_finder/translators/{individual → _individual}/inter_research_science_center.py +0 -0
  1848. /scitex/scholar/url_finder/translators/{individual → _individual}/lingbuzz.py +0 -0
  1849. /scitex/scholar/url_finder/translators/{individual → _individual}/openedition_journals.py +0 -0
  1850. /scitex/scholar/url_finder/translators/{individual → _individual}/orcid.py +0 -0
  1851. /scitex/scholar/url_finder/translators/{individual → _individual}/scinapse.py +0 -0
  1852. /scitex/scholar/url_finder/translators/{individual → _individual}/zbmath.py +0 -0
  1853. /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
  1854. {scitex-2.14.0.dist-info → scitex-2.16.0.dist-info}/WHEEL +0 -0
  1855. {scitex-2.14.0.dist-info → scitex-2.16.0.dist-info}/entry_points.txt +0 -0
  1856. {scitex-2.14.0.dist-info → scitex-2.16.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,37 +1,110 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Timestamp: "2025-10-08 05:41:15 (ywatanabe)"
4
- # File: /home/ywatanabe/proj/scitex_repo/src/scitex/scholar/storage/_LibraryManager.py
5
- # ----------------------------------------
6
- from __future__ import annotations
7
- import os
8
-
9
- __FILE__ = "./src/scitex/scholar/storage/_LibraryManager.py"
10
- __DIR__ = os.path.dirname(__FILE__)
11
- # ----------------------------------------
2
+ # Timestamp: "2026-01-24 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-python/src/scitex/scholar/storage/_LibraryManager.py
4
+
5
+ """
6
+ Unified manager for Scholar library structure and paper storage.
7
+
8
+ This module provides a comprehensive library manager that:
9
+ - Manages paper storage in the master library
10
+ - Handles metadata conversion and standardization
11
+ - Creates project symlinks for organization
12
+ - Generates BibTeX entries and structures
13
+ - Resolves DOIs and updates library metadata
14
+
15
+ The main class inherits from multiple mixins for modular functionality:
16
+ - StorageHelpersMixin: Storage helper methods (has_*, load, save)
17
+ - MetadataConversionMixin: Metadata conversion utilities
18
+ - PaperSavingMixin: Paper saving methods
19
+ - ResolutionMixin: DOI resolution and library structure creation
20
+ - SymlinkHandlersMixin: Symlink generation and management
21
+ - BibtexHandlersMixin: BibTeX structure and entry generation
22
+ - LibraryOperationsMixin: Library operations (update, validate)
23
+ """
12
24
 
13
- __FILE__ = __file__
25
+ from __future__ import annotations
14
26
 
15
- import asyncio
16
- import copy
17
- import json
18
- import re
19
- from collections import OrderedDict
20
- from datetime import datetime
21
- from pathlib import Path
22
- from typing import Any, Dict, List, Optional
27
+ from typing import Optional
23
28
 
24
29
  from scitex import logging
25
30
  from scitex.scholar.config import ScholarConfig
26
- from scitex.scholar.metadata_engines.utils import BASE_STRUCTURE, standardize_metadata
27
31
  from scitex.scholar.storage._DeduplicationManager import DeduplicationManager
28
- from scitex.scholar.utils import TextNormalizer
32
+
33
+ from ._mixins import (
34
+ BibtexHandlersMixin,
35
+ LibraryOperationsMixin,
36
+ MetadataConversionMixin,
37
+ PaperSavingMixin,
38
+ ResolutionMixin,
39
+ StorageHelpersMixin,
40
+ SymlinkHandlersMixin,
41
+ )
29
42
 
30
43
  logger = logging.getLogger(__name__)
31
44
 
32
45
 
33
- class LibraryManager:
34
- """Unified manager for Scholar library structure and paper storage."""
46
+ class LibraryManager(
47
+ StorageHelpersMixin,
48
+ MetadataConversionMixin,
49
+ PaperSavingMixin,
50
+ ResolutionMixin,
51
+ SymlinkHandlersMixin,
52
+ BibtexHandlersMixin,
53
+ LibraryOperationsMixin,
54
+ ):
55
+ """
56
+ Unified manager for Scholar library structure and paper storage.
57
+
58
+ This class provides comprehensive functionality for managing the Scholar
59
+ library, including:
60
+ - Storage helpers (check metadata, URLs, PDFs)
61
+ - Paper loading and incremental saving
62
+ - Metadata conversion to standardized format
63
+ - DOI resolution and library structure creation
64
+ - Project symlink management
65
+ - BibTeX entry generation
66
+ - Library validation and updates
67
+
68
+ Parameters
69
+ ----------
70
+ project : str, optional
71
+ Project name for organizing papers
72
+ single_doi_resolver : object, optional
73
+ DOI resolver instance for resolving DOIs from metadata
74
+ config : ScholarConfig, optional
75
+ Configuration object for Scholar settings
76
+
77
+ Attributes
78
+ ----------
79
+ config : ScholarConfig
80
+ Configuration object
81
+ project : str
82
+ Current project name
83
+ library_master_dir : Path
84
+ Path to the master library directory
85
+ single_doi_resolver : object
86
+ DOI resolver instance
87
+ dedup_manager : DeduplicationManager
88
+ Deduplication manager instance
89
+
90
+ Examples
91
+ --------
92
+ >>> # Basic usage
93
+ >>> manager = LibraryManager(project="my_research")
94
+ >>> paper_id = manager.save_resolved_paper(
95
+ ... title="My Paper",
96
+ ... doi="10.1234/example",
97
+ ... authors=["Author One", "Author Two"],
98
+ ... year=2024,
99
+ ... )
100
+
101
+ >>> # Check if paper exists
102
+ >>> has_pdf = manager.has_pdf(paper_id)
103
+ >>> has_meta = manager.has_metadata(paper_id)
104
+
105
+ >>> # Load paper
106
+ >>> paper = manager.load_paper_from_id(paper_id)
107
+ """
35
108
 
36
109
  def __init__(
37
110
  self,
@@ -47,1679 +120,8 @@ class LibraryManager:
47
120
  self._source_filename = "papers"
48
121
  self.dedup_manager = DeduplicationManager(config=self.config)
49
122
 
50
- # =========================================================================
51
- # Storage Helper Methods (Phase 1)
52
- # =========================================================================
53
-
54
- def has_metadata(self, paper_id: str) -> bool:
55
- """Check if metadata.json exists for paper.
56
-
57
- Args:
58
- paper_id: 8-digit paper ID
59
-
60
- Returns:
61
- True if metadata.json exists, False otherwise
62
- """
63
- metadata_file = self.library_master_dir / paper_id / "metadata.json"
64
- return metadata_file.exists()
65
-
66
- def has_urls(self, paper_id: str) -> bool:
67
- """Check if PDF URLs exist in metadata.
68
-
69
- Args:
70
- paper_id: 8-digit paper ID
71
-
72
- Returns:
73
- True if metadata has PDF URLs, False otherwise
74
- """
75
- if not self.has_metadata(paper_id):
76
- return False
77
-
78
- metadata_file = self.library_master_dir / paper_id / "metadata.json"
79
- try:
80
- with open(metadata_file, "r") as f:
81
- data = json.load(f)
82
-
83
- # Check nested structure: metadata.url.pdfs
84
- urls = data.get("metadata", {}).get("url", {}).get("pdfs", [])
85
- return len(urls) > 0
86
- except Exception:
87
- return False
88
-
89
- def has_pdf(self, paper_id: str) -> bool:
90
- """Check if PDF file exists in storage.
91
-
92
- Args:
93
- paper_id: 8-digit paper ID
94
-
95
- Returns:
96
- True if any PDF file exists, False otherwise
97
- """
98
- paper_dir = self.library_master_dir / paper_id
99
- if not paper_dir.exists():
100
- return False
101
-
102
- # Check for any PDF files
103
- pdf_files = list(paper_dir.glob("*.pdf"))
104
- return len(pdf_files) > 0
105
-
106
- def load_paper_from_id(self, paper_id: str) -> Optional["Paper"]:
107
- """Load Paper object from storage by ID.
108
-
109
- Args:
110
- paper_id: 8-digit paper ID
111
-
112
- Returns:
113
- Paper object if found, None otherwise
114
- """
115
- from scitex.scholar.core.Paper import Paper
116
-
117
- metadata_file = self.library_master_dir / paper_id / "metadata.json"
118
-
119
- if not metadata_file.exists():
120
- return None
121
-
122
- try:
123
- with open(metadata_file, "r") as f:
124
- data = json.load(f)
125
-
126
- # Use Paper.from_dict() which handles Pydantic validation
127
- paper = Paper.from_dict(data)
128
- return paper
129
-
130
- except Exception as e:
131
- logger.error(f"Failed to load paper {paper_id}: {e}")
132
- return None
133
-
134
- def save_paper_incremental(self, paper_id: str, paper: "Paper") -> None:
135
- """Save Paper object to storage (incremental update).
136
-
137
- This saves the complete Paper object to metadata.json,
138
- preserving existing data and updating with new fields.
139
-
140
- Args:
141
- paper_id: 8-digit paper ID
142
- paper: Paper object to save
143
- """
144
- storage_path = self.library_master_dir / paper_id
145
- storage_path.mkdir(parents=True, exist_ok=True)
146
-
147
- metadata_file = storage_path / "metadata.json"
148
-
149
- # Load existing metadata if it exists
150
- existing_data = {}
151
- if metadata_file.exists():
152
- try:
153
- with open(metadata_file, "r") as f:
154
- existing_data = json.load(f)
155
- except Exception:
156
- pass
157
-
158
- # Get new data from Paper object
159
- new_data = paper.model_dump()
160
-
161
- # Merge: new data takes precedence for non-None values
162
- merged_data = self._merge_metadata(existing_data, new_data)
163
-
164
- # Update timestamps
165
- if "container" not in merged_data:
166
- merged_data["container"] = {}
167
- merged_data["container"]["updated_at"] = datetime.now().isoformat()
168
-
169
- # Save to file
170
- with open(metadata_file, "w") as f:
171
- json.dump(merged_data, f, indent=2, ensure_ascii=False)
172
-
173
- logger.debug(f"Saved paper {paper_id} to storage")
174
-
175
- def _merge_metadata(self, existing: Dict, new: Dict) -> Dict:
176
- """Recursively merge metadata dicts, preferring new non-None values."""
177
- result = existing.copy()
178
-
179
- for key, new_value in new.items():
180
- if key not in result:
181
- result[key] = new_value
182
- elif new_value is None:
183
- # Keep existing value if new is None
184
- pass
185
- elif isinstance(new_value, dict) and isinstance(result[key], dict):
186
- # Recursively merge nested dicts
187
- result[key] = self._merge_metadata(result[key], new_value)
188
- elif isinstance(new_value, list) and len(new_value) > 0:
189
- # Update lists if new list is not empty
190
- result[key] = new_value
191
- elif new_value:
192
- # Update with new non-empty value
193
- result[key] = new_value
194
-
195
- return result
196
-
197
- # =========================================================================
198
- # Existing Methods
199
- # =========================================================================
200
-
201
- def _dotdict_to_dict(self, obj):
202
- """Recursively convert DotDict to plain dict for JSON serialization."""
203
- from scitex.dict import DotDict
204
-
205
- if isinstance(obj, DotDict):
206
- return {k: self._dotdict_to_dict(v) for k, v in obj._data.items()}
207
- elif isinstance(obj, dict):
208
- return {k: self._dotdict_to_dict(v) for k, v in obj.items()}
209
- elif isinstance(obj, list):
210
- return [self._dotdict_to_dict(item) for item in obj]
211
- else:
212
- return obj
213
-
214
- def _add_engine_to_list(self, engines_list: list, source: str) -> None:
215
- """Helper to add source to engines list if not already present."""
216
- if source and source not in engines_list:
217
- engines_list.append(source)
218
-
219
- def _convert_to_standardized_metadata(self, flat_metadata: Dict) -> OrderedDict:
220
- """Convert flat metadata dict to standardized nested structure with _engines tracking."""
221
- standardized = copy.deepcopy(BASE_STRUCTURE)
222
-
223
- # Map flat fields to standardized structure
224
- # ID section
225
- if "doi" in flat_metadata:
226
- standardized["id"]["doi"] = flat_metadata["doi"]
227
- self._add_engine_to_list(
228
- standardized["id"]["doi_engines"],
229
- flat_metadata.get("doi_source"),
230
- )
231
- if "scitex_id" in flat_metadata:
232
- standardized["id"]["scholar_id"] = flat_metadata["scitex_id"]
233
-
234
- # Basic section
235
- if "title" in flat_metadata:
236
- standardized["basic"]["title"] = flat_metadata["title"]
237
- self._add_engine_to_list(
238
- standardized["basic"]["title_engines"],
239
- flat_metadata.get("title_source"),
240
- )
241
- if "authors" in flat_metadata:
242
- standardized["basic"]["authors"] = flat_metadata["authors"]
243
- self._add_engine_to_list(
244
- standardized["basic"]["authors_engines"],
245
- flat_metadata.get("authors_source"),
246
- )
247
- if "year" in flat_metadata:
248
- standardized["basic"]["year"] = flat_metadata["year"]
249
- self._add_engine_to_list(
250
- standardized["basic"]["year_engines"],
251
- flat_metadata.get("year_source"),
252
- )
253
- if "abstract" in flat_metadata:
254
- standardized["basic"]["abstract"] = flat_metadata["abstract"]
255
- self._add_engine_to_list(
256
- standardized["basic"]["abstract_engines"],
257
- flat_metadata.get("abstract_source"),
258
- )
259
-
260
- # Citation count section
261
- if "citation_count" in flat_metadata:
262
- cc_value = flat_metadata["citation_count"]
263
- # Handle both scalar (4) and dict ({"total": 4}) formats
264
- if isinstance(cc_value, dict):
265
- # If it's a dict, extract the total value
266
- standardized["citation_count"]["total"] = cc_value.get("total")
267
- self._add_engine_to_list(
268
- standardized["citation_count"]["total_engines"],
269
- cc_value.get("total_source"),
270
- )
271
- # Copy yearly breakdowns if present
272
- for year in [
273
- "2025",
274
- "2024",
275
- "2023",
276
- "2022",
277
- "2021",
278
- "2020",
279
- "2019",
280
- "2018",
281
- "2017",
282
- "2016",
283
- "2015",
284
- ]:
285
- if year in cc_value:
286
- standardized["citation_count"][year] = cc_value[year]
287
- if f"{year}_source" in cc_value:
288
- self._add_engine_to_list(
289
- standardized["citation_count"][f"{year}_engines"],
290
- cc_value.get(f"{year}_source"),
291
- )
292
- else:
293
- # If it's a scalar, just assign it to total
294
- standardized["citation_count"]["total"] = cc_value
295
- self._add_engine_to_list(
296
- standardized["citation_count"]["total_engines"],
297
- flat_metadata.get("citation_count_source"),
298
- )
299
-
300
- # Publication section
301
- if "journal" in flat_metadata:
302
- standardized["publication"]["journal"] = flat_metadata["journal"]
303
- self._add_engine_to_list(
304
- standardized["publication"]["journal_engines"],
305
- flat_metadata.get("journal_source"),
306
- )
307
- if "short_journal" in flat_metadata:
308
- standardized["publication"]["short_journal"] = flat_metadata[
309
- "short_journal"
310
- ]
311
- if "impact_factor" in flat_metadata:
312
- standardized["publication"]["impact_factor"] = flat_metadata[
313
- "impact_factor"
314
- ]
315
- if "issn" in flat_metadata:
316
- standardized["publication"]["issn"] = flat_metadata["issn"]
317
- if "volume" in flat_metadata:
318
- standardized["publication"]["volume"] = flat_metadata["volume"]
319
- if "issue" in flat_metadata:
320
- standardized["publication"]["issue"] = flat_metadata["issue"]
321
- if "pages" in flat_metadata:
322
- # Split pages into first_page and last_page if needed
323
- pages = flat_metadata["pages"]
324
- if pages and "-" in str(pages):
325
- first, last = str(pages).split("-", 1)
326
- standardized["publication"]["first_page"] = first.strip()
327
- standardized["publication"]["last_page"] = last.strip()
328
- if "publisher" in flat_metadata:
329
- standardized["publication"]["publisher"] = flat_metadata["publisher"]
330
-
331
- # URL section
332
- if "url_doi" in flat_metadata:
333
- standardized["url"]["doi"] = flat_metadata["url_doi"]
334
- if "url_publisher" in flat_metadata:
335
- standardized["url"]["publisher"] = flat_metadata["url_publisher"]
336
- self._add_engine_to_list(
337
- standardized["url"]["publisher_engines"], "ScholarURLFinder"
338
- )
339
- if "url_openurl_query" in flat_metadata:
340
- standardized["url"]["openurl_query"] = flat_metadata["url_openurl_query"]
341
- if "url_openurl_resolved" in flat_metadata:
342
- standardized["url"]["openurl_resolved"] = flat_metadata[
343
- "url_openurl_resolved"
344
- ]
345
- self._add_engine_to_list(
346
- standardized["url"]["openurl_resolved_engines"],
347
- "ScholarURLFinder",
348
- )
349
- if "urls_pdf" in flat_metadata:
350
- standardized["url"]["pdfs"] = flat_metadata["urls_pdf"]
351
- self._add_engine_to_list(
352
- standardized["url"]["pdfs_engines"], "ScholarURLFinder"
353
- )
354
-
355
- # Path section
356
- if "pdf_path" in flat_metadata:
357
- standardized["path"]["pdfs"] = [flat_metadata["pdf_path"]]
358
- self._add_engine_to_list(
359
- standardized["path"]["pdfs_engines"],
360
- "ScholarPDFDownloaderWithScreenshotsParallel",
361
- )
362
-
363
- return standardized
364
-
365
- def _call_path_manager_get_storage_paths(
366
- self, paper_info: Dict, collection_name: str = "MASTER"
367
- ) -> Dict[str, Any]:
368
- """Helper to call PathManager's get_paper_storage_paths with proper parameters."""
369
- # Extract parameters from paper_info dict
370
- doi = paper_info.get("doi")
371
- title = paper_info.get("title")
372
- authors = paper_info.get("authors", [])
373
- year = paper_info.get("year")
374
- journal = paper_info.get("journal")
375
-
376
- # Call PathManager with individual parameters
377
- storage_path, readable_name, paper_id = (
378
- self.config.path_manager.get_paper_storage_paths(
379
- doi=doi,
380
- title=title,
381
- authors=authors,
382
- year=year,
383
- journal=journal,
384
- project=collection_name,
385
- )
386
- )
387
-
388
- # Return in the expected dict format
389
- return {
390
- "storage_path": storage_path,
391
- "readable_name": readable_name,
392
- "unique_id": paper_id,
393
- }
394
-
395
- def check_library_for_doi(
396
- self, title: str, year: Optional[int] = None
397
- ) -> Optional[str]:
398
- """Check if DOI already exists in master Scholar library."""
399
-
400
- try:
401
- for paper_dir in self.library_master_dir.iterdir():
402
- if not paper_dir.is_dir():
403
- continue
404
-
405
- metadata_file = paper_dir / "metadata.json"
406
- if metadata_file.exists():
407
- try:
408
- with open(metadata_file, "r") as file_:
409
- metadata = json.load(file_)
410
-
411
- stored_title = metadata.get("title", "")
412
- stored_year = metadata.get("year")
413
- stored_doi = metadata.get("doi")
414
-
415
- title_match = self._is_title_similar(title, stored_title)
416
- year_match = (
417
- not year
418
- or not stored_year
419
- or abs(int(stored_year) - int(year)) <= 1
420
- if isinstance(stored_year, (int, str))
421
- and str(stored_year).isdigit()
422
- else stored_year == year
423
- )
424
-
425
- if title_match and year_match and stored_doi:
426
- logger.info(
427
- f"DOI found in master Scholar library: {stored_doi} (paper_id: {paper_dir.name})"
428
- )
429
- return stored_doi
430
-
431
- except (
432
- json.JSONDecodeError,
433
- KeyError,
434
- ValueError,
435
- ) as exc_:
436
- logger.debug(
437
- f"Error reading metadata from {metadata_file}: {exc_}"
438
- )
439
- continue
440
-
441
- return None
442
-
443
- except Exception as exc_:
444
- logger.debug(f"Error checking master Scholar library: {exc_}")
445
- return None
446
-
447
- def save_resolved_paper(
448
- self,
449
- # Can accept either a Paper object or individual fields
450
- paper_data: Optional["Paper"] = None,
451
- # Required bibliographic fields (if not providing paper_data)
452
- title: Optional[str] = None,
453
- doi: Optional[str] = None,
454
- # Optional bibliographic fields
455
- authors: Optional[List[str]] = None,
456
- year: Optional[int] = None,
457
- journal: Optional[str] = None,
458
- abstract: Optional[str] = None,
459
- # Additional bibliographic fields
460
- volume: Optional[str] = None,
461
- issue: Optional[str] = None,
462
- pages: Optional[str] = None,
463
- publisher: Optional[str] = None,
464
- issn: Optional[str] = None,
465
- short_journal: Optional[str] = None,
466
- # Enrichment fields
467
- citation_count: Optional[int] = None,
468
- impact_factor: Optional[float] = None,
469
- # Source tracking (which engine/database provided this info)
470
- doi_source: Optional[str] = None,
471
- title_source: Optional[str] = None,
472
- abstract_source: Optional[str] = None,
473
- authors_source: Optional[str] = None,
474
- year_source: Optional[str] = None,
475
- journal_source: Optional[str] = None,
476
- # Library management
477
- library_id: Optional[str] = None,
478
- project: Optional[str] = None,
479
- # Legacy support (will be removed)
480
- metadata: Optional[Dict] = None,
481
- bibtex_source: Optional[str] = None,
482
- source: Optional[str] = None, # Legacy doi_source
483
- paper_id: Optional[str] = None, # Legacy library_id
484
- **kwargs, # For backward compatibility
485
- ) -> str:
486
- """Save successfully resolved paper to Scholar library."""
487
-
488
- # If paper_data is provided, extract fields from it
489
- if paper_data is not None:
490
- if hasattr(paper_data, "metadata"):
491
- # Pydantic Paper object
492
- title = title or (paper_data.metadata.basic.title or "")
493
- doi = doi or (paper_data.metadata.id.doi or "")
494
- authors = authors or paper_data.metadata.basic.authors
495
- year = year or paper_data.metadata.basic.year
496
- journal = journal or paper_data.metadata.publication.journal
497
- abstract = abstract or paper_data.metadata.basic.abstract
498
- publisher = publisher or paper_data.metadata.publication.publisher
499
- impact_factor = (
500
- impact_factor or paper_data.metadata.publication.impact_factor
501
- )
502
- library_id = library_id or paper_data.container.library_id
503
- elif isinstance(paper_data, dict):
504
- # Dict paper object
505
- title = title or paper_data.get("title", "")
506
- doi = doi or paper_data.get("doi", "")
507
- authors = authors or paper_data.get("authors", [])
508
- year = year or paper_data.get("year")
509
- journal = journal or paper_data.get("journal")
510
- abstract = abstract or paper_data.get("abstract")
511
- publisher = publisher or paper_data.get("publisher")
512
- impact_factor = impact_factor or paper_data.get("impact_factor")
513
- library_id = (
514
- library_id
515
- or paper_data.get("scitex_id")
516
- or paper_data.get("scholar_id")
517
- )
518
-
519
- # Handle legacy parameters
520
- if paper_id and not library_id:
521
- library_id = paper_id
522
- if source and not doi_source:
523
- doi_source = source
524
-
525
- # Build paper_info with explicit parameters (not metadata dict)
526
- paper_info = {
527
- "title": title,
528
- "year": year,
529
- "authors": authors or [],
530
- "doi": doi,
531
- "journal": journal,
532
- }
533
-
534
- # Only use metadata dict as fallback for backward compatibility
535
- if metadata:
536
- if not journal:
537
- journal = metadata.get("journal")
538
- paper_info["journal"] = journal
539
- if not year:
540
- year = metadata.get("year")
541
- paper_info["year"] = year
542
- if not authors:
543
- authors = metadata.get("authors")
544
- paper_info["authors"] = authors or []
545
-
546
- # Check for existing paper first (deduplication)
547
- check_metadata = {
548
- "doi": doi,
549
- "title": title,
550
- "authors": authors or [],
551
- "year": year,
552
- }
553
- existing_paper_dir = self.dedup_manager.check_for_existing_paper(check_metadata)
554
-
555
- if existing_paper_dir:
556
- logger.info(f"Found existing paper: {existing_paper_dir.name}")
557
- # Update existing paper instead of creating new
558
- master_storage_path = existing_paper_dir
559
- paper_id = existing_paper_dir.name
560
- readable_name = None # Will be determined from existing symlinks
561
- else:
562
- # Call PathManager with individual parameters for new paper
563
- storage_path, readable_name, paper_id = (
564
- self.config.path_manager.get_paper_storage_paths(
565
- doi=doi,
566
- title=title,
567
- authors=authors or [],
568
- year=year,
569
- journal=journal,
570
- project="MASTER",
571
- )
572
- )
573
- master_storage_path = storage_path
574
-
575
- # Use provided library_id if available, otherwise use generated paper_id
576
- if library_id:
577
- paper_id = library_id
578
-
579
- master_metadata_file = master_storage_path / "metadata.json"
580
-
581
- existing_metadata = {}
582
- if master_metadata_file.exists():
583
- try:
584
- with open(master_metadata_file, "r") as file_:
585
- existing_metadata = json.load(file_)
586
- except (json.JSONDecodeError, IOError):
587
- existing_metadata = {}
588
-
589
- # Clean text fields
590
- clean_title = TextNormalizer.clean_metadata_text(
591
- existing_metadata.get("title", title)
592
- )
593
-
594
- # Use explicit abstract parameter first, then metadata dict, then existing
595
- clean_abstract = None
596
- if abstract:
597
- clean_abstract = TextNormalizer.clean_metadata_text(abstract)
598
- elif metadata and metadata.get("abstract"):
599
- clean_abstract = TextNormalizer.clean_metadata_text(metadata["abstract"])
600
- elif existing_metadata.get("abstract"):
601
- clean_abstract = TextNormalizer.clean_metadata_text(
602
- existing_metadata["abstract"]
603
- )
604
-
605
- # Handle doi_source - explicit parameter takes precedence
606
- doi_source_value = doi_source or existing_metadata.get("doi_source")
607
- if not doi_source_value and source:
608
- # Normalize legacy source parameter
609
- if "crossref" in source.lower():
610
- doi_source_value = "crossref"
611
- elif "semantic" in source.lower():
612
- doi_source_value = "semantic_scholar"
613
- elif "pubmed" in source.lower():
614
- doi_source_value = "pubmed"
615
- elif "openalex" in source.lower():
616
- doi_source_value = "openalex"
617
- else:
618
- doi_source_value = source
619
-
620
- comprehensive_metadata = {
621
- # Core bibliographic fields
622
- "title": clean_title,
623
- "title_source": title_source
624
- or existing_metadata.get("title_source", "input"),
625
- "doi": existing_metadata.get("doi", doi),
626
- "doi_source": doi_source_value,
627
- "year": existing_metadata.get("year", year),
628
- "year_source": year_source
629
- or existing_metadata.get("year_source", "input" if year else None),
630
- "authors": existing_metadata.get("authors", authors or []),
631
- "authors_source": authors_source
632
- or existing_metadata.get("authors_source", "input" if authors else None),
633
- "journal": existing_metadata.get("journal", journal),
634
- "journal_source": journal_source
635
- or existing_metadata.get("journal_source", "input" if journal else None),
636
- # Additional bibliographic fields from explicit parameters
637
- "volume": existing_metadata.get("volume", volume),
638
- "issue": existing_metadata.get("issue", issue),
639
- "pages": existing_metadata.get("pages", pages),
640
- "publisher": existing_metadata.get("publisher", publisher),
641
- "issn": existing_metadata.get("issn", issn),
642
- "short_journal": existing_metadata.get("short_journal", short_journal),
643
- # Abstract with source tracking
644
- "abstract": existing_metadata.get("abstract", clean_abstract),
645
- "abstract_source": abstract_source
646
- or existing_metadata.get("abstract_source", "input" if abstract else None),
647
- # Enrichment fields
648
- "citation_count": existing_metadata.get("citation_count", citation_count),
649
- "impact_factor": existing_metadata.get("impact_factor", impact_factor),
650
- "scitex_id": existing_metadata.get(
651
- "scitex_id", existing_metadata.get("scholar_id", paper_id)
652
- ),
653
- "created_at": existing_metadata.get(
654
- "created_at", datetime.now().isoformat()
655
- ),
656
- "created_by": existing_metadata.get("created_by", "SciTeX Scholar"),
657
- "updated_at": datetime.now().isoformat(),
658
- "projects": existing_metadata.get(
659
- "projects", [] if self.project == "master" else [self.project]
660
- ),
661
- "master_storage_path": str(master_storage_path),
662
- "readable_name": readable_name,
663
- "metadata_file": str(master_metadata_file),
664
- }
665
-
666
- # Store plain dict version for JSON serialization
667
- comprehensive_metadata_plain = self._dotdict_to_dict(comprehensive_metadata)
668
-
669
- # Convert to standardized format before saving
670
- standardized_metadata = self._convert_to_standardized_metadata(
671
- comprehensive_metadata_plain
672
- )
673
-
674
- # Wrap with Paper container properties
675
- final_structure = OrderedDict(
676
- [
677
- ("metadata", standardized_metadata),
678
- (
679
- "container",
680
- OrderedDict(
681
- [
682
- (
683
- "scitex_id",
684
- comprehensive_metadata_plain.get("scitex_id"),
685
- ),
686
- ("library_id", paper_id),
687
- (
688
- "created_at",
689
- comprehensive_metadata_plain.get("created_at"),
690
- ),
691
- (
692
- "created_by",
693
- comprehensive_metadata_plain.get("created_by"),
694
- ),
695
- (
696
- "updated_at",
697
- comprehensive_metadata_plain.get("updated_at"),
698
- ),
699
- (
700
- "projects",
701
- comprehensive_metadata_plain.get("projects", []),
702
- ),
703
- ("master_storage_path", str(master_storage_path)),
704
- ("readable_name", readable_name),
705
- ("metadata_file", str(master_metadata_file)),
706
- (
707
- "pdf_downloaded_at",
708
- comprehensive_metadata_plain.get("pdf_downloaded_at"),
709
- ),
710
- (
711
- "pdf_size_bytes",
712
- comprehensive_metadata_plain.get("pdf_size_bytes"),
713
- ),
714
- ]
715
- ),
716
- ),
717
- ]
718
- )
719
-
720
- with open(master_metadata_file, "w") as file_:
721
- json.dump(final_structure, file_, indent=2, ensure_ascii=False)
722
-
723
- logger.success(f"Saved paper to MASTER Scholar library: {paper_id}")
724
-
725
- # Create project symlink if project is specified and not MASTER
726
- if self.project and self.project not in ["master", "MASTER"]:
727
- try:
728
- # Use centralized naming logic - use original comprehensive_metadata (not plain)
729
- readable_name = self._generate_readable_name(
730
- comprehensive_metadata=comprehensive_metadata,
731
- master_storage_path=master_storage_path,
732
- authors=authors,
733
- year=year,
734
- journal=journal,
735
- )
736
-
737
- self._create_project_symlink(
738
- master_storage_path=master_storage_path,
739
- project=self.project,
740
- readable_name=readable_name,
741
- )
742
- except Exception as exc_:
743
- logger.error(f"Failed to create symlink for {paper_id}: {exc_}")
744
-
745
- return paper_id
746
-
747
- def save_unresolved_paper(
748
- self,
749
- title: str,
750
- year: Optional[int] = None,
751
- authors: Optional[List[str]] = None,
752
- reason: str = "DOI not found",
753
- bibtex_source: Optional[str] = None,
754
- ) -> None:
755
- """Save paper that couldn't be resolved to unresolved directory."""
756
- clean_title = TextNormalizer.clean_metadata_text(title) if title else ""
757
- unresolved_info = {
758
- "title": clean_title,
759
- "year": year,
760
- "authors": authors or [],
761
- "reason": reason,
762
- "bibtex_source": bibtex_source,
763
- "project": self.project,
764
- "created_at": datetime.now().isoformat(),
765
- "created_by": "SciTeX Scholar",
766
- }
767
-
768
- project_lib_path = (
769
- self.config.path_manager.get_scholar_library_path() / self.project
770
- )
771
- unresolved_dir = project_lib_path / "unresolved"
772
- unresolved_dir.mkdir(parents=True, exist_ok=True)
773
-
774
- safe_title = title or "untitled"
775
- safe_title = re.sub(r"[^\w\s-]", "", safe_title)[:50]
776
- safe_title = re.sub(r"[-\s]+", "_", safe_title)
777
- timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
778
- unresolved_file = unresolved_dir / f"{safe_title}_{timestamp}.json"
779
-
780
- with open(unresolved_file, "w") as file_:
781
- json.dump(unresolved_info, file_, indent=2, ensure_ascii=False)
782
-
783
- logger.warning(f"Saved unresolved entry: {unresolved_file.name}")
784
-
785
- async def resolve_and_create_library_structure_async(
786
- self,
787
- papers: List[Dict[str, Any]],
788
- project: str,
789
- sources: Optional[List[str]] = None,
790
- ) -> Dict[str, Dict[str, str]]:
791
- """Resolve DOIs and create full Scholar library structure with proper paths."""
792
- if not self.single_doi_resolver:
793
- raise ValueError("SingleDOIResolver is required for resolving DOIs")
794
-
795
- results = {}
796
- for paper in papers:
797
- title = paper.get("title")
798
- if not title:
799
- logger.warning(f"Skipping paper without title: {paper}")
800
- continue
801
-
802
- logger.info(f"Processing: {title[:50]}...")
803
-
804
- try:
805
- doi_result = await self.single_doi_resolver.metadata2doi_async(
806
- title=title,
807
- year=paper.get("year"),
808
- authors=paper.get("authors"),
809
- sources=sources,
810
- )
811
-
812
- enhanced_metadata = self._extract_enhanced_metadata(doi_result, paper)
813
- paper_info = {**paper, **enhanced_metadata}
814
-
815
- storage_paths = self._call_path_manager_get_storage_paths(
816
- paper_info=paper_info, collection_name="MASTER"
817
- )
818
- paper_id = storage_paths["unique_id"]
819
- storage_path = storage_paths["storage_path"]
820
- metadata_file = storage_path / "metadata.json"
821
-
822
- complete_metadata = self._create_complete_metadata(
823
- paper, doi_result, paper_id, enhanced_metadata
824
- )
825
-
826
- with open(metadata_file, "w") as file_:
827
- json.dump(complete_metadata, file_, indent=2)
828
-
829
- logger.success(
830
- f"Saved metadata.json for {paper_id} ({len(complete_metadata)} fields)"
831
- )
832
-
833
- project_symlink_path = self._create_project_symlink(
834
- master_storage_path=storage_path,
835
- project=project,
836
- readable_name=storage_paths["readable_name"],
837
- )
838
-
839
- bibtex_source_filename = getattr(self, "_source_filename", "papers")
840
- info_dir = self._create_bibtex_info_structure(
841
- project=project,
842
- paper_info={**paper, **enhanced_metadata},
843
- complete_metadata=complete_metadata,
844
- bibtex_source_filename=bibtex_source_filename,
845
- )
846
-
847
- results[title] = {
848
- "scitex_id": paper_id,
849
- "scholar_id": paper_id,
850
- "doi": complete_metadata.get("doi"),
851
- "master_storage_path": str(storage_path),
852
- "project_symlink_path": (
853
- str(project_symlink_path) if project_symlink_path else None
854
- ),
855
- "readable_name": storage_paths["readable_name"],
856
- "metadata_file": str(metadata_file),
857
- "info_dir": str(info_dir) if info_dir else None,
858
- }
859
-
860
- logger.info(f"Created library entry: {paper_id}")
861
- if complete_metadata.get("doi"):
862
- logger.info(f" DOI: {complete_metadata['doi']}")
863
- logger.info(f" Storage: {storage_path}")
864
-
865
- except Exception as exc_:
866
- logger.error(f"❌ Error processing '{title[:30]}...': {exc_}")
867
-
868
- logger.success(
869
- f"Created Scholar library entries for {len(results)}/{len(papers)} papers"
870
- )
871
- return results
872
-
873
- async def resolve_and_create_library_structure_with_source_async(
874
- self,
875
- papers: List[Dict[str, Any]],
876
- project: str,
877
- sources: Optional[List[str]] = None,
878
- bibtex_source_filename: str = "papers",
879
- ) -> Dict[str, Dict[str, str]]:
880
- """Enhanced version that passes source filename for BibTeX structure."""
881
- self._source_filename = bibtex_source_filename
882
- return await self.resolve_and_create_library_structure_async(
883
- papers=papers, project=project, sources=sources
884
- )
885
-
886
- def _extract_enhanced_metadata(
887
- self, doi_result: Optional[Dict], paper: Dict
888
- ) -> Dict[str, Any]:
889
- """Extract enhanced metadata from DOI resolution result."""
890
- enhanced = {}
891
- if doi_result and isinstance(doi_result, dict):
892
- metadata_source = doi_result.get("metadata", {})
893
- enhanced.update(
894
- {
895
- "doi": doi_result.get("doi"),
896
- "journal": metadata_source.get("journal")
897
- or doi_result.get("journal")
898
- or paper.get("journal"),
899
- "authors": metadata_source.get("authors")
900
- or doi_result.get("authors")
901
- or paper.get("authors"),
902
- "year": metadata_source.get("year")
903
- or doi_result.get("year")
904
- or paper.get("year"),
905
- "title": metadata_source.get("title")
906
- or doi_result.get("title")
907
- or paper.get("title"),
908
- "abstract": metadata_source.get("abstract")
909
- or doi_result.get("abstract"),
910
- "publisher": metadata_source.get("publisher")
911
- or doi_result.get("publisher"),
912
- "volume": metadata_source.get("volume") or doi_result.get("volume"),
913
- "issue": metadata_source.get("issue") or doi_result.get("issue"),
914
- "pages": metadata_source.get("pages") or doi_result.get("pages"),
915
- "issn": metadata_source.get("issn") or doi_result.get("issn"),
916
- "short_journal": metadata_source.get("short_journal")
917
- or doi_result.get("short_journal"),
918
- }
919
- )
920
-
921
- if doi_result.get("doi"):
922
- logger.success(
923
- f"Enhanced metadata from DOI source: {dict(metadata_source)}"
924
- )
925
-
926
- return enhanced
927
-
928
- def _create_complete_metadata(
929
- self,
930
- paper: Dict,
931
- doi_result: Optional[Dict],
932
- paper_id: str,
933
- enhanced_metadata: Dict,
934
- ) -> Dict[str, Any]:
935
- """Create complete metadata dictionary with source tracking."""
936
- raw_title = enhanced_metadata.get("title") or paper.get("title")
937
- clean_title = TextNormalizer.clean_metadata_text(raw_title) if raw_title else ""
938
- raw_abstract = None
939
- if enhanced_metadata.get("abstract"):
940
- raw_abstract = TextNormalizer.clean_metadata_text(
941
- enhanced_metadata["abstract"]
942
- )
943
-
944
- doi_source_value = None
945
- if doi_result and doi_result.get("source"):
946
- source = doi_result["source"]
947
- if "crossref" in source.lower():
948
- doi_source_value = "crossref"
949
- elif "semantic" in source.lower():
950
- doi_source_value = "semantic_scholar"
951
- elif "pubmed" in source.lower():
952
- doi_source_value = "pubmed"
953
- elif "openalex" in source.lower():
954
- doi_source_value = "openalex"
955
- else:
956
- doi_source_value = source
957
-
958
- complete_metadata = {
959
- "title": clean_title,
960
- "title_source": (
961
- doi_source_value
962
- if enhanced_metadata.get("title") != paper.get("title")
963
- else "manual"
964
- ),
965
- "authors": enhanced_metadata.get("authors") or paper.get("authors"),
966
- "authors_source": (
967
- doi_source_value
968
- if enhanced_metadata.get("authors") != paper.get("authors")
969
- else ("manual" if paper.get("authors") else None)
970
- ),
971
- "year": enhanced_metadata.get("year") or paper.get("year"),
972
- "year_source": (
973
- doi_source_value
974
- if enhanced_metadata.get("year") != paper.get("year")
975
- else ("manual" if paper.get("year") else None)
976
- ),
977
- "journal": enhanced_metadata.get("journal") or paper.get("journal"),
978
- "journal_source": (
979
- doi_source_value
980
- if enhanced_metadata.get("journal") != paper.get("journal")
981
- else ("manual" if paper.get("journal") else None)
982
- ),
983
- "abstract": raw_abstract,
984
- "abstract_source": (
985
- doi_source_value if enhanced_metadata.get("abstract") else None
986
- ),
987
- "scitex_id": paper_id,
988
- "created_at": datetime.now().isoformat(),
989
- "created_by": "SciTeX Scholar",
990
- }
991
-
992
- if doi_result and isinstance(doi_result, dict):
993
- safe_fields = [
994
- "publisher",
995
- "volume",
996
- "issue",
997
- "pages",
998
- "issn",
999
- "short_journal",
1000
- ]
1001
- for field in safe_fields:
1002
- value = enhanced_metadata.get(field)
1003
- if value is not None:
1004
- complete_metadata[field] = value
1005
- complete_metadata[f"{field}_source"] = (
1006
- doi_source_value or "unknown_api"
1007
- )
1008
-
1009
- if doi_result and doi_result.get("doi"):
1010
- complete_metadata.update(
1011
- {"doi": doi_result["doi"], "doi_source": doi_source_value}
1012
- )
1013
- logger.success(f"DOI resolved for {paper_id}: {doi_result['doi']}")
1014
- else:
1015
- complete_metadata.update(
1016
- {
1017
- "doi": None,
1018
- "doi_source": None,
1019
- "doi_resolution_failed": True,
1020
- }
1021
- )
1022
- logger.warning(
1023
- f"DOI resolution failed for {paper_id}: {paper.get('title', '')[:40]}..."
1024
- )
1025
-
1026
- standard_fields = {
1027
- "keywords": None,
1028
- "references": None,
1029
- "venue": None,
1030
- "publisher": None,
1031
- "volume": None,
1032
- "issue": None,
1033
- "pages": None,
1034
- "issn": None,
1035
- "short_journal": None,
1036
- }
1037
-
1038
- missing_fields = []
1039
- for field, default_value in standard_fields.items():
1040
- if field not in complete_metadata or complete_metadata[field] is None:
1041
- complete_metadata[field] = default_value
1042
- missing_fields.append(field)
1043
-
1044
- if missing_fields:
1045
- logger.info(
1046
- f"Missing fields for future enhancement: {', '.join(missing_fields)}"
1047
- )
1048
-
1049
- storage_paths = self._call_path_manager_get_storage_paths(
1050
- paper_info={**paper, **enhanced_metadata}, collection_name="MASTER"
1051
- )
1052
- storage_path = storage_paths["storage_path"]
1053
-
1054
- complete_metadata.update(
1055
- {
1056
- "master_storage_path": str(storage_path),
1057
- "readable_name": storage_paths["readable_name"],
1058
- "metadata_file": str(storage_path / "metadata.json"),
1059
- }
1060
- )
1061
-
1062
- return complete_metadata
1063
-
1064
- def _generate_readable_name(
1065
- self,
1066
- comprehensive_metadata: Dict,
1067
- master_storage_path: Path,
1068
- authors: Optional[List[str]] = None,
1069
- year: Optional[int] = None,
1070
- journal: Optional[str] = None,
1071
- ) -> str:
1072
- """Generate readable symlink name from metadata.
1073
-
1074
- Single source of truth for symlink naming format.
1075
- """
1076
- # Extract author
1077
- first_author = "Unknown"
1078
- if authors and len(authors) > 0:
1079
- author_parts = authors[0].split()
1080
- first_author = (
1081
- author_parts[-1] if len(author_parts) > 1 else author_parts[0]
1082
- )
1083
- first_author = "".join(c for c in first_author if c.isalnum() or c == "-")[
1084
- :20
1085
- ]
1086
-
1087
- # Format year (handle DotDict and other non-int types)
1088
- from scitex.dict import DotDict
1089
-
1090
- if isinstance(year, DotDict):
1091
- # Extract value if it's a DotDict
1092
- year = None # Can't extract year from DotDict structure, use Unknown
1093
-
1094
- # Convert to int if it's a string representation
1095
- if isinstance(year, str) and year.isdigit():
1096
- year = int(year)
1097
-
1098
- # Only use year if it's actually an int
1099
- if isinstance(year, int):
1100
- year_str = f"{year:04d}"
1101
- else:
1102
- year_str = "0000"
1103
-
1104
- # Clean journal name using PathManager (single source of truth)
1105
- journal_clean = "Unknown"
1106
- if journal:
1107
- journal_clean = self.config.path_manager._sanitize_filename(journal)[:30]
1108
- if not journal_clean:
1109
- journal_clean = "Unknown"
1110
-
1111
- # Get citation count and impact factor (handle both flat and nested formats)
1112
- # Check if this is the nested structure from file (has "metadata" key)
1113
- if "metadata" in comprehensive_metadata:
1114
- # Nested structure from file
1115
- metadata_section = comprehensive_metadata.get("metadata", {})
1116
-
1117
- # Extract citation count from nested structure
1118
- cc_val = metadata_section.get("citation_count", {})
1119
- if isinstance(cc_val, dict):
1120
- cc = cc_val.get("total", 0) or 0
1121
- else:
1122
- cc = cc_val or 0
1123
-
1124
- # Extract impact factor from nested structure
1125
- publication_section = metadata_section.get("publication", {})
1126
- if_val = publication_section.get("impact_factor", 0.0) or 0.0
1127
-
1128
- else:
1129
- # Flat structure (during initial save)
1130
- cc_val = comprehensive_metadata.get("citation_count", 0)
1131
- if isinstance(cc_val, dict):
1132
- cc = cc_val.get("total", 0) or 0
1133
- else:
1134
- cc = cc_val or 0
1135
-
1136
- # Try multiple paths for impact_factor
1137
- if_val = (
1138
- comprehensive_metadata.get("journal_impact_factor")
1139
- or comprehensive_metadata.get("impact_factor")
1140
- or comprehensive_metadata.get("publication", {}).get("impact_factor")
1141
- )
1142
- if isinstance(if_val, dict):
1143
- if_val = if_val.get("value", 0.0) or 0.0
1144
- else:
1145
- if_val = if_val or 0.0
1146
-
1147
- # Check PDF status with more granular states
1148
- pdf_files = list(master_storage_path.glob("*.pdf"))
1149
- screenshot_dir = master_storage_path / "screenshots"
1150
- has_screenshots = screenshot_dir.exists() and any(screenshot_dir.iterdir())
1151
- downloading_marker = master_storage_path / ".downloading"
1152
- attempted_marker = master_storage_path / ".download_attempted"
1153
-
1154
- # Extract DOI from metadata to check availability
1155
- doi = None
1156
- if "metadata" in comprehensive_metadata:
1157
- # Nested structure from file
1158
- doi = comprehensive_metadata.get("metadata", {}).get("id", {}).get("doi")
1159
- else:
1160
- # Flat structure (during initial save)
1161
- doi = comprehensive_metadata.get("doi")
1162
-
1163
- if downloading_marker.exists():
1164
- # Download in progress
1165
- pdf_status_letter = "r"
1166
- elif pdf_files:
1167
- # Has PDF = Successful
1168
- pdf_status_letter = "s"
1169
- elif has_screenshots:
1170
- # Has screenshots but no PDF = Failed (attempted but failed)
1171
- pdf_status_letter = "f"
1172
- elif attempted_marker.exists():
1173
- # Download was attempted but failed early (before screenshots)
1174
- pdf_status_letter = "f"
1175
- elif not doi:
1176
- # No DOI = Failed (cannot download without identifier)
1177
- pdf_status_letter = "f"
1178
- else:
1179
- # No PDF, no screenshots, no attempts, has DOI = Pending (not attempted yet)
1180
- pdf_status_letter = "p"
1181
-
1182
- pdf_status_id_map = {
1183
- "p": 0,
1184
- "r": 1,
1185
- "f": 2,
1186
- "s": 3,
1187
- }
1188
- pdf_status_str = f"{pdf_status_id_map[pdf_status_letter]}{pdf_status_letter}"
1189
- # Format: CC_000000-PDF_s-IF_032-2016-Author-Journal
1190
- # PDF status: r=running, s=successful, f=failed, p=pending
1191
- # readable_name = f"CC_{cc:06d}-PDF_{pdf_status_letter}-IF_{int(if_val):03d}-{year_str}-{first_author}-{journal_clean}"
1192
- readable_name = f"PDF-{pdf_status_str}_CC-{cc:06d}_IF-{int(if_val):03d}_{year_str}_{first_author}_{journal_clean}"
1193
-
1194
- return readable_name
1195
-
1196
- def update_symlink(
1197
- self,
1198
- master_storage_path: Path,
1199
- project: str,
1200
- metadata: Optional[Dict] = None,
1201
- ) -> Optional[Path]:
1202
- """Update project symlink to reflect current paper status.
1203
-
1204
- This should be called whenever paper status changes (pending → running → success/failed).
1205
- Generates new readable name based on current state (checking .downloading marker, PDFs, etc.)
1206
- and updates the symlink accordingly.
1207
-
1208
- Args:
1209
- master_storage_path: Path to paper in master library
1210
- project: Project name
1211
- metadata: Optional metadata dict (if not provided, will read from file)
1212
-
1213
- Returns:
1214
- Path to the created symlink, or None if failed
1215
- """
1216
- try:
1217
- # Load metadata if not provided
1218
- if metadata is None:
1219
- metadata_file = master_storage_path / "metadata.json"
1220
- if metadata_file.exists():
1221
- import json
1222
-
1223
- with open(metadata_file, "r") as f:
1224
- metadata = json.load(f)
1225
- else:
1226
- logger.warning(f"No metadata found for {master_storage_path.name}")
1227
- return None
1228
-
1229
- # Extract metadata from nested structure if needed
1230
- # Metadata file has structure: {"metadata": {"basic": {...}, "id": {...}, ...}, "container": {...}}
1231
- if "metadata" in metadata:
1232
- # Nested structure from file
1233
- meta_section = metadata.get("metadata", {})
1234
- basic_section = meta_section.get("basic", {})
1235
- pub_section = meta_section.get("publication", {})
1236
-
1237
- authors = basic_section.get("authors")
1238
- year = basic_section.get("year")
1239
- journal = pub_section.get("journal")
1240
- else:
1241
- # Flat structure (should not happen when reading from file, but handle it)
1242
- authors = metadata.get("authors")
1243
- year = metadata.get("year")
1244
- journal = metadata.get("journal")
1245
-
1246
- # Generate readable name based on current state
1247
- readable_name = self._generate_readable_name(
1248
- comprehensive_metadata=metadata,
1249
- master_storage_path=master_storage_path,
1250
- authors=authors,
1251
- year=year,
1252
- journal=journal,
1253
- )
1254
-
1255
- # Create/update symlink
1256
- return self._create_project_symlink(
1257
- master_storage_path=master_storage_path,
1258
- project=project,
1259
- readable_name=readable_name,
1260
- )
1261
- except Exception as exc_:
1262
- logger.error(
1263
- f"Failed to update symlink for {master_storage_path.name}: {exc_}"
1264
- )
1265
- return None
1266
-
1267
- def _create_project_symlink(
1268
- self, master_storage_path: Path, project: str, readable_name: str
1269
- ) -> Optional[Path]:
1270
- """Create symlink in project directory pointing to master storage.
1271
-
1272
- Removes old symlinks for the same paper with different statuses
1273
- (e.g., removes PDF_p when creating PDF_s).
1274
- """
1275
-
1276
- try:
1277
- project_dir = self.config.path_manager.get_library_project_dir(project)
1278
- symlink_path = project_dir / readable_name
1279
-
1280
- # Extract the master ID from the target path to find old symlinks
1281
- master_id = master_storage_path.name
1282
-
1283
- # Remove old symlinks pointing to the same master entry
1284
- # but with different statuses (PDF_p, PDF_f, PDF_s)
1285
- for existing_link in project_dir.iterdir():
1286
- if not existing_link.is_symlink():
1287
- continue
1288
-
1289
- # Check if this symlink points to the same master entry
1290
- try:
1291
- target = existing_link.resolve()
1292
- if target.name == master_id and existing_link.name != readable_name:
1293
- # This is an old symlink for the same paper
1294
- logger.debug(f"Removing old symlink: {existing_link.name}")
1295
- existing_link.unlink()
1296
- except Exception as e:
1297
- # Handle broken symlinks
1298
- logger.debug(f"Skipping broken symlink {existing_link.name}: {e}")
1299
- continue
1300
-
1301
- # Create new symlink
1302
- if not symlink_path.exists():
1303
- relative_path = os.path.relpath(master_storage_path, project_dir)
1304
- symlink_path.symlink_to(relative_path)
1305
- logger.success(
1306
- f"Created project symlink: {symlink_path} -> {relative_path}"
1307
- )
1308
- else:
1309
- logger.debug(f"Project symlink already exists: {symlink_path}")
1310
-
1311
- return symlink_path
1312
-
1313
- except Exception as exc_:
1314
- logger.warning(f"Failed to create project symlink: {exc_}")
1315
- return None
1316
-
1317
- def _create_bibtex_info_structure(
1318
- self,
1319
- project: str,
1320
- paper_info: Dict[str, Any],
1321
- complete_metadata: Dict[str, Any],
1322
- bibtex_source_filename: str = "papers",
1323
- ) -> Optional[Path]:
1324
- """Create info/papers_bib/pac.bib structure."""
1325
- try:
1326
- project_dir = self.config.path_manager.get_library_project_dir(project)
1327
- info_dir = project_dir / "info" / f"{bibtex_source_filename}_bib"
1328
- info_dir.mkdir(parents=True, exist_ok=True)
1329
-
1330
- bibtex_file = info_dir / f"{bibtex_source_filename}.bib"
1331
- unresolved_dir = info_dir / "unresolved"
1332
- unresolved_dir.mkdir(parents=True, exist_ok=True)
1333
-
1334
- first_author = "unknown"
1335
- if complete_metadata.get("authors"):
1336
- authors = complete_metadata["authors"]
1337
- if isinstance(authors, list) and authors:
1338
- first_author = str(authors[0]).split()[-1].lower()
1339
- elif isinstance(authors, str):
1340
- first_author = authors.split()[-1].lower()
1341
-
1342
- year = complete_metadata.get("year", "unknown")
1343
- entry_key = f"{first_author}{year}"
1344
-
1345
- bibtex_entry = self._generate_bibtex_entry(complete_metadata, entry_key)
1346
-
1347
- if bibtex_file.exists():
1348
- with open(bibtex_file, "a", encoding="utf-8") as file_:
1349
- file_.write(f"\n{bibtex_entry}")
1350
- else:
1351
- with open(bibtex_file, "w", encoding="utf-8") as file_:
1352
- file_.write(bibtex_entry)
1353
-
1354
- if not complete_metadata.get("doi"):
1355
- unresolved_file = unresolved_dir / f"{entry_key}.json"
1356
- unresolved_data = {
1357
- "title": complete_metadata.get("title", ""),
1358
- "authors": complete_metadata.get("authors", []),
1359
- "year": complete_metadata.get("year", ""),
1360
- "journal": complete_metadata.get("journal", ""),
1361
- "scholar_id": complete_metadata.get("scholar_id", ""),
1362
- "resolution_failed": True,
1363
- "timestamp": complete_metadata.get("created_at", ""),
1364
- }
1365
- with open(unresolved_file, "w", encoding="utf-8") as file_:
1366
- json.dump(unresolved_data, file_, indent=2)
1367
- logger.info(f"Added unresolved entry: {unresolved_file}")
1368
-
1369
- logger.success(f"Updated BibTeX info structure: {bibtex_file}")
1370
- return info_dir
1371
-
1372
- except Exception as exc_:
1373
- logger.warning(f"Failed to create BibTeX info structure: {exc_}")
1374
- return None
1375
-
1376
- def _generate_bibtex_entry(self, metadata: Dict[str, Any], entry_key: str) -> str:
1377
- """Generate BibTeX entry from metadata."""
1378
- entry_type = "article"
1379
- if metadata.get("journal"):
1380
- entry_type = "article"
1381
- elif metadata.get("booktitle"):
1382
- entry_type = "inproceedings"
1383
- elif metadata.get("publisher") and not metadata.get("journal"):
1384
- entry_type = "book"
1385
-
1386
- bibtex = f"@{entry_type}{{{entry_key},\n"
1387
-
1388
- field_mappings = {
1389
- "title": "title",
1390
- "authors": "author",
1391
- "year": "year",
1392
- "journal": "journal",
1393
- "doi": "doi",
1394
- "volume": "volume",
1395
- "issue": "number",
1396
- "pages": "pages",
1397
- "publisher": "publisher",
1398
- "booktitle": "booktitle",
1399
- "abstract": "abstract",
1400
- }
1401
-
1402
- for meta_field, bibtex_field in field_mappings.items():
1403
- value = metadata.get(meta_field)
1404
- if value:
1405
- if isinstance(value, list):
1406
- value = " and ".join(str(val_) for val_ in value)
1407
- value_escaped = str(value).replace("{", "\\{").replace("}", "\\}")
1408
- bibtex += f" {bibtex_field} = {{{value_escaped}}},\n"
1409
-
1410
- source_field = f"{meta_field}_source"
1411
- if source_field in metadata:
1412
- bibtex += f" % {bibtex_field}_source = {metadata[source_field]}\n"
1413
-
1414
- bibtex += f" % scholar_id = {metadata.get('scholar_id', 'unknown')},\n"
1415
- bibtex += f" % created_at = {metadata.get('created_at', 'unknown')},\n"
1416
- bibtex += f" % created_by = {metadata.get('created_by', 'unknown')},\n"
1417
- bibtex += "}\n"
1418
-
1419
- return bibtex
1420
-
1421
- # def _ensure_project_symlink(
1422
- # self,
1423
- # title: str,
1424
- # year: Optional[int] = None,
1425
- # authors: Optional[List[str]] = None,
1426
- # paper_id: str = None,
1427
- # master_storage_path: Path = None,
1428
- # ) -> None:
1429
- # """Ensure project symlink exists for paper in master library."""
1430
- # try:
1431
- # if not paper_id or not master_storage_path:
1432
- # return
1433
-
1434
- # project_lib_path = (
1435
- # self.config.path_manager.get_scholar_library_path()
1436
- # / self.project
1437
- # )
1438
- # project_lib_path.mkdir(parents=True, exist_ok=True)
1439
-
1440
- # paper_info = {
1441
- # "title": title,
1442
- # "year": year,
1443
- # "authors": authors or [],
1444
- # }
1445
- # readable_paths = self.config.path_manager.get_paper_storage_paths(
1446
- # paper_info=paper_info, collection_name=self.project
1447
- # )
1448
- # readable_name = readable_paths["readable_name"]
1449
- # symlink_path = project_lib_path / readable_name
1450
-
1451
- # relative_path = f"../MASTER/{paper_id}"
1452
- # if not symlink_path.exists():
1453
- # symlink_path.symlink_to(relative_path)
1454
- # logger.info(
1455
- # f"Created project symlink: {readable_name} -> {relative_path}"
1456
- # )
1457
-
1458
- # except Exception as exc_:
1459
- # logger.debug(f"Error creating project symlink: {exc_}")
1460
-
1461
- def _ensure_project_symlink(
1462
- self,
1463
- title: str,
1464
- year: Optional[int] = None,
1465
- authors: Optional[List[str]] = None,
1466
- paper_id: str = None,
1467
- master_storage_path: Path = None,
1468
- ) -> None:
1469
- try:
1470
- if not paper_id or not master_storage_path:
1471
- return
1472
-
1473
- project_lib_path = (
1474
- self.config.path_manager.get_scholar_library_path() / self.project
1475
- )
1476
- project_lib_path.mkdir(parents=True, exist_ok=True)
1477
-
1478
- paper_info = {
1479
- "title": title,
1480
- "year": year,
1481
- "authors": authors or [],
1482
- }
1483
- readable_paths = self._call_path_manager_get_storage_paths(
1484
- paper_info=paper_info, collection_name=self.project
1485
- )
1486
- readable_name = readable_paths["readable_name"]
1487
- symlink_path = project_lib_path / readable_name
1488
- relative_path = f"../MASTER/{paper_id}"
1489
-
1490
- if not symlink_path.exists():
1491
- symlink_path.symlink_to(relative_path)
1492
- logger.info(
1493
- f"Created project symlink: {readable_name} -> {relative_path}"
1494
- )
1495
- except Exception as exc_:
1496
- logger.debug(f"Error creating project symlink: {exc_}")
1497
-
1498
- def _is_title_similar(
1499
- self, title1: str, title2: str, threshold: float = 0.7
1500
- ) -> bool:
1501
- """Check if two titles are similar enough to be considered the same paper."""
1502
- if not title1 or not title2:
1503
- return False
1504
-
1505
- def normalize_title(title: str) -> str:
1506
- title = title.lower()
1507
- title = re.sub(r"[^\w\s]", " ", title)
1508
- title = re.sub(r"\s+", " ", title)
1509
- return title.strip()
1510
-
1511
- norm_title1 = normalize_title(title1)
1512
- norm_title2 = normalize_title(title2)
1513
-
1514
- words1 = set(norm_title1.split())
1515
- words2 = set(norm_title2.split())
1516
-
1517
- if not words1 or not words2:
1518
- return False
1519
-
1520
- intersection = len(words1.intersection(words2))
1521
- union = len(words1.union(words2))
1522
- similarity = intersection / union if union > 0 else 0.0
1523
-
1524
- return similarity >= threshold
1525
-
1526
- def update_library_metadata(
1527
- self,
1528
- paper_id: str,
1529
- project: str,
1530
- doi: str,
1531
- metadata: Dict[str, Any],
1532
- create_structure: bool = True,
1533
- ) -> bool:
1534
- """Update Scholar library metadata.json with resolved DOI."""
1535
- try:
1536
- library_path = self.config.path_manager.library_dir
1537
- paper_dir = library_path / project / paper_id
1538
- metadata_file = paper_dir / "metadata.json"
1539
-
1540
- if create_structure and not paper_dir.exists():
1541
- self.config.path_manager._ensure_directory(paper_dir)
1542
- logger.info(f"Created Scholar library structure: {paper_dir}")
1543
-
1544
- existing_metadata = {}
1545
- if metadata_file.exists():
1546
- try:
1547
- with open(metadata_file, "r") as file_:
1548
- existing_metadata = json.load(file_)
1549
- except Exception as exc_:
1550
- logger.warning(f"Error loading existing metadata: {exc_}")
1551
-
1552
- updated_metadata = {
1553
- **existing_metadata,
1554
- **metadata,
1555
- "doi": doi,
1556
- "doi_resolved_at": datetime.now().isoformat(),
1557
- "doi_source": "batch_doi_resolver",
1558
- }
1559
-
1560
- with open(metadata_file, "w") as file_:
1561
- json.dump(updated_metadata, file_, indent=2)
1562
-
1563
- logger.success(f"Updated metadata for {paper_id}: DOI {doi}")
1564
- return True
1565
-
1566
- except Exception as exc_:
1567
- logger.error(f"Error updating library metadata for {paper_id}: {exc_}")
1568
- return False
1569
-
1570
- def create_writer_directory_structure(self, paper_id: str, project: str) -> Path:
1571
- """Create basic paper directory structure."""
1572
- library_path = self.config.path_manager.library_dir
1573
- paper_dir = library_path / project / paper_id
1574
-
1575
- self.config.path_manager._ensure_directory(paper_dir)
1576
-
1577
- for subdir in ["attachments", "screenshots"]:
1578
- subdir_path = paper_dir / subdir
1579
- self.config.path_manager._ensure_directory(subdir_path)
1580
-
1581
- logger.info(f"Created Scholar library structure: {paper_dir}")
1582
- return paper_dir
1583
-
1584
- def validate_library_structure(self, project: str) -> Dict[str, Any]:
1585
- """Validate existing library structure for a project."""
1586
- validation = {
1587
- "valid": True,
1588
- "warnings": [],
1589
- "errors": [],
1590
- "paper_count": 0,
1591
- "missing_metadata": [],
1592
- }
1593
-
1594
- library_path = self.config.path_manager.library_dir
1595
- project_dir = library_path / project
1596
-
1597
- if not project_dir.exists():
1598
- validation["errors"].append(
1599
- f"Project directory does not exist: {project_dir}"
1600
- )
1601
- validation["valid"] = False
1602
- return validation
1603
-
1604
- for paper_dir in project_dir.iterdir():
1605
- if paper_dir.is_dir() and len(paper_dir.name) == 8:
1606
- validation["paper_count"] += 1
1607
-
1608
- metadata_file = paper_dir / "metadata.json"
1609
- if not metadata_file.exists():
1610
- validation["missing_metadata"].append(paper_dir.name)
1611
- validation["warnings"].append(
1612
- f"Missing metadata.json: {paper_dir.name}"
1613
- )
1614
-
1615
- return validation
1616
-
1617
- def resolve_and_update_library(
1618
- self,
1619
- papers_with_ids: List[Dict[str, Any]],
1620
- project: str,
1621
- sources: Optional[List[str]] = None,
1622
- ) -> Dict[str, str]:
1623
- """Resolve DOIs and update Scholar library metadata.json files."""
1624
- if not self.single_doi_resolver:
1625
- raise ValueError("SingleDOIResolver is required for resolving DOIs")
1626
-
1627
- results = {}
1628
- for paper in papers_with_ids:
1629
- paper_id = paper.get("paper_id")
1630
- if not paper_id:
1631
- logger.warning(
1632
- f"Skipping paper without paper_id: {paper.get('title', 'Unknown')}"
1633
- )
1634
- continue
1635
-
1636
- title = paper.get("title")
1637
- if not title:
1638
- logger.warning(f"Skipping paper {paper_id} without title")
1639
- continue
1640
-
1641
- logger.info(f"Resolving DOI for {paper_id}: {title[:50]}...")
1642
-
1643
- try:
1644
- result = asyncio.run(
1645
- self.single_doi_resolver.metadata2doi_async(
1646
- title=title,
1647
- year=paper.get("year"),
1648
- authors=paper.get("authors"),
1649
- sources=sources,
1650
- )
1651
- )
1652
-
1653
- if result and isinstance(result, dict) and result.get("doi"):
1654
- doi = result["doi"]
1655
-
1656
- success = self.update_library_metadata(
1657
- paper_id=paper_id,
1658
- project=project,
1659
- doi=doi,
1660
- metadata={
1661
- "title": title,
1662
- "title_source": "input",
1663
- "year": paper.get("year"),
1664
- "year_source": ("input" if paper.get("year") else None),
1665
- "authors": paper.get("authors"),
1666
- "authors_source": (
1667
- "input" if paper.get("authors") else None
1668
- ),
1669
- "journal": paper.get("journal"),
1670
- "journal_source": (
1671
- "input" if paper.get("journal") else None
1672
- ),
1673
- "doi_resolution_source": result.get("source"),
1674
- },
1675
- )
1676
-
1677
- if success:
1678
- results[paper_id] = doi
1679
- logger.success(f"✅ {paper_id}: {doi}")
1680
- else:
1681
- logger.error(
1682
- f"❌ {paper_id}: DOI resolved but metadata update failed"
1683
- )
1684
- else:
1685
- logger.warning(f"⚠️ {paper_id}: No DOI found")
1686
-
1687
- except Exception as exc_:
1688
- logger.error(f"❌ {paper_id}: Error during resolution: {exc_}")
1689
-
1690
- logger.success(
1691
- f"Resolved {len(results)}/{len(papers_with_ids)} DOIs and updated library metadata"
1692
- )
1693
- return results
1694
-
1695
- def resolve_and_create_library_structure(
1696
- self,
1697
- papers: List[Dict[str, Any]],
1698
- project: str,
1699
- sources: Optional[List[str]] = None,
1700
- ) -> Dict[str, Dict[str, str]]:
1701
- """Synchronous wrapper for resolve_and_create_library_structure_async."""
1702
- try:
1703
- loop = asyncio.get_event_loop()
1704
- if loop.is_running():
1705
- raise RuntimeError(
1706
- "Cannot run synchronous version in async context. "
1707
- "Use resolve_and_create_library_structure_async() instead."
1708
- )
1709
- else:
1710
- return loop.run_until_complete(
1711
- self.resolve_and_create_library_structure_async(
1712
- papers, project, sources
1713
- )
1714
- )
1715
- except RuntimeError:
1716
- return asyncio.run(
1717
- self.resolve_and_create_library_structure_async(
1718
- papers, project, sources
1719
- )
1720
- )
1721
-
1722
123
 
1723
124
  __all__ = ["LibraryManager"]
1724
125
 
126
+
1725
127
  # EOF