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,16 +1,6 @@
1
1
  #!/usr/bin/env python3
2
- # Timestamp: "2025-10-13 08:11:40 (ywatanabe)"
3
- # File: /home/ywatanabe/proj/scitex_repo/src/scitex/scholar/core/Scholar.py
4
- # ----------------------------------------
5
- from __future__ import annotations
6
-
7
- import os
8
-
9
- __FILE__ = "./src/scitex/scholar/core/Scholar.py"
10
- __DIR__ = os.path.dirname(__FILE__)
11
- # ----------------------------------------
12
-
13
- __FILE__ = __file__
2
+ # Timestamp: "2026-01-24 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-python/src/scitex/scholar/core/Scholar.py
14
4
 
15
5
  """
16
6
  Unified Scholar class for scientific literature management.
@@ -22,43 +12,42 @@ This is the main entry point for all scholar functionality, providing:
22
12
  - Progressive disclosure of advanced features
23
13
  """
24
14
 
25
- import asyncio
26
- import json
27
- import shutil
28
- from copy import deepcopy
29
- from datetime import datetime
30
- from pathlib import Path
31
- from typing import Any, Dict, List, Optional, Union
15
+ from __future__ import annotations
32
16
 
33
- import nest_asyncio
17
+ from pathlib import Path
18
+ from typing import Optional, Union
34
19
 
35
20
  from scitex import logging
36
-
37
- # PDF extraction is now handled by scitex.io
38
- from scitex.logging import ScholarError
39
-
40
- # Updated imports for current architecture
41
- from scitex.scholar.auth import ScholarAuthManager
42
- from scitex.scholar.auth.core.AuthenticationGateway import (
43
- AuthenticationGateway,
44
- )
45
- from scitex.scholar.browser import ScholarBrowserManager
46
21
  from scitex.scholar.config import ScholarConfig
47
- from scitex.scholar.impact_factor.ImpactFactorEngine import ImpactFactorEngine
48
- from scitex.scholar.metadata_engines.ScholarEngine import ScholarEngine
49
- from scitex.scholar.pdf_download.ScholarPDFDownloader import (
50
- ScholarPDFDownloader,
51
- )
52
- from scitex.scholar.storage import LibraryManager, ScholarLibrary
53
- from scitex.scholar.url_finder.ScholarURLFinder import ScholarURLFinder
54
22
 
55
- from .Paper import Paper
56
- from .Papers import Papers
23
+ from ._mixins import (
24
+ EnricherMixin,
25
+ LibraryHandlerMixin,
26
+ LoaderMixin,
27
+ PDFDownloadMixin,
28
+ PipelineMixin,
29
+ ProjectHandlerMixin,
30
+ SaverMixin,
31
+ SearchMixin,
32
+ ServiceMixin,
33
+ URLFindingMixin,
34
+ )
57
35
 
58
36
  logger = logging.getLogger(__name__)
59
37
 
60
38
 
61
- class Scholar:
39
+ class Scholar(
40
+ EnricherMixin,
41
+ URLFindingMixin,
42
+ PDFDownloadMixin,
43
+ LoaderMixin,
44
+ SearchMixin,
45
+ SaverMixin,
46
+ ProjectHandlerMixin,
47
+ LibraryHandlerMixin,
48
+ PipelineMixin,
49
+ ServiceMixin,
50
+ ):
62
51
  """
63
52
  Main interface for SciTeX Scholar - scientific literature management made simple.
64
53
 
@@ -103,8 +92,7 @@ class Scholar:
103
92
  project_description: Optional[str] = None,
104
93
  browser_mode: Optional[str] = None,
105
94
  ):
106
- """
107
- Initialize Scholar with configuration.
95
+ """Initialize Scholar with configuration.
108
96
 
109
97
  Args:
110
98
  config: Can be:
@@ -115,29 +103,15 @@ class Scholar:
115
103
  project_description: Optional description for the project
116
104
  browser_mode: Browser mode ('stealth', 'interactive', 'manual')
117
105
  """
118
-
119
106
  self.config = self._init_config(config)
120
-
121
- # Store browser mode for later use
122
107
  self.browser_mode = browser_mode or "stealth"
123
108
 
124
- # Set project and workspace
125
109
  self.project = self.config.resolve("project", project, "default")
126
110
  self.workspace_dir = self.config.path_manager.get_workspace_dir()
127
111
 
128
- # Auto-create project directory if it doesn't exist
129
112
  if project:
130
113
  self._ensure_project_exists(project, project_description)
131
114
 
132
- # Initialize service components (lazy loading for better performance)
133
- # Use mangled names for private properties
134
- self._Scholar__scholar_engine = None # Replaces DOIResolver and LibraryEnricher
135
- self._Scholar__auth_manager = None
136
- self._Scholar__browser_manager = None
137
- self._Scholar__library_manager = None
138
- self._Scholar__library = None # ScholarLibrary for high-level operations
139
-
140
- # Show user-friendly initialization message with library location
141
115
  library_path = self.config.get_library_project_dir(self.project)
142
116
  if project:
143
117
  project_path = library_path / project
@@ -147,1711 +121,100 @@ class Scholar:
147
121
  else:
148
122
  logger.info(f"{self.name}: Scholar initialized (library: {library_path})")
149
123
 
150
- # ----------------------------------------
151
- # Enrichers
152
- # ----------------------------------------
153
- async def enrich_papers_async(self, papers: Papers) -> Papers:
154
- """Async version of enrich_papers for use in async contexts.
155
-
156
- Args:
157
- papers: Papers collection to enrich.
158
-
159
- Returns:
160
- Enriched Papers collection
161
- """
162
- enriched_list = []
163
-
164
- for paper in papers:
165
- try:
166
- # Use ScholarEngine to search and enrich
167
- results = await self._scholar_engine.search_async(
168
- title=paper.metadata.basic.title,
169
- year=paper.metadata.basic.year,
170
- authors=(
171
- paper.metadata.basic.authors[0]
172
- if paper.metadata.basic.authors
173
- else None
174
- ),
175
- )
176
-
177
- # Create a copy to avoid modifying original
178
- enriched_paper = self._merge_enrichment_data(paper, results)
179
- enriched_list.append(enriched_paper)
180
- title = paper.metadata.basic.title or "No title"
181
- logger.info(f"{self.name}: Enriched: {title[:50]}...")
182
-
183
- except Exception as e:
184
- title = paper.metadata.basic.title or "No title"
185
- logger.warning(
186
- f"{self.name}: Failed to enrich paper '{title[:50]}...': {e}"
187
- )
188
- enriched_list.append(paper) # Keep original if enrichment fails
189
-
190
- enriched_papers = Papers(enriched_list, project=self.project)
191
-
192
- # Add impact factors as post-processing step
193
- if self.config.resolve("enrich_impact_factors", None, True):
194
- enriched_papers = self._enrich_impact_factors(enriched_papers)
195
-
196
- return enriched_papers
197
-
198
- def enrich_papers(
199
- self, papers: Optional[Papers] = None
200
- ) -> Union[Papers, Dict[str, int]]:
201
- """Enrich papers with metadata from multiple sources.
202
-
203
- Args:
204
- papers: Papers collection to enrich. If None, enriches all papers in current project.
205
-
206
- Returns:
207
- - If papers provided: Returns enriched Papers collection
208
- - If no papers: Returns dict with enrichment statistics for project
209
- """
210
-
211
- # If no papers provided, enrich entire project
212
- if papers is None:
213
- return self._enrich_current_project()
214
-
215
- # Enrich the provided papers collection
216
- enriched_list = []
217
-
218
- nest_asyncio.apply() # Allow nested event loops
219
-
220
- for paper in papers:
221
- try:
222
- # Use ScholarEngine to search and enrich
223
- results = asyncio.run(
224
- self._scholar_engine.search_async(
225
- title=paper.metadata.basic.title,
226
- year=paper.metadata.basic.year,
227
- authors=(
228
- paper.metadata.basic.authors[0]
229
- if paper.metadata.basic.authors
230
- else None
231
- ),
232
- )
233
- )
234
-
235
- # Create a copy to avoid modifying original
236
- enriched_paper = self._merge_enrichment_data(paper, results)
237
- enriched_list.append(enriched_paper)
238
- title = paper.metadata.basic.title or "No title"
239
- logger.info(f"{self.name}: Enriched: {title[:50]}...")
240
-
241
- except Exception as e:
242
- title = paper.metadata.basic.title or "No title"
243
- logger.warning(
244
- f"{self.name}: Failed to enrich paper '{title[:50]}...': {e}"
245
- )
246
- enriched_list.append(paper) # Keep original if enrichment fails
247
-
248
- enriched_papers = Papers(enriched_list, project=self.project)
249
-
250
- # Add impact factors as post-processing step
251
- if self.config.resolve("enrich_impact_factors", None, True):
252
- enriched_papers = self._enrich_impact_factors(enriched_papers)
253
-
254
- return enriched_papers
255
-
256
- def _enrich_impact_factors(self, papers: Papers) -> Papers:
257
- """Add journal impact factors to papers.
258
-
259
- Args:
260
- papers: Papers collection to enrich with impact factors
261
-
262
- Returns:
263
- Papers collection with impact factors added where available
264
- """
265
- try:
266
- # Try JCR database first (fast)
267
- jcr_engine = ImpactFactorEngine()
268
- papers = jcr_engine.enrich_papers(papers)
269
- return papers
270
- except Exception as e:
271
- logger.debug(
272
- f"{self.name}: JCR engine unavailable: {e}, falling back to calculation method"
273
- )
274
-
275
- return papers
276
-
277
- def _merge_enrichment_data(self, paper: Paper, results: Dict) -> Paper:
278
- """Merge enrichment results into paper object.
279
-
280
- Creates a new Paper object with merged data to avoid modifying the original.
281
- """
282
- # Import here to avoid circular dependency
283
-
284
- enriched = deepcopy(paper)
285
-
286
- # Results from ScholarEngine is already combined metadata, not individual engine results
287
- if not results:
288
- return enriched
289
-
290
- # Extract from the combined metadata structure
291
- # ID section
292
- if "id" in results:
293
- if results["id"].get("doi") and not enriched.metadata.id.doi:
294
- enriched.metadata.set_doi(results["id"]["doi"])
295
- if results["id"].get("pmid") and not enriched.metadata.id.pmid:
296
- enriched.metadata.id.pmid = results["id"]["pmid"]
297
- if results["id"].get("arxiv_id") and not enriched.metadata.id.arxiv_id:
298
- enriched.metadata.id.arxiv_id = results["id"]["arxiv_id"]
299
- # Note: corpus_id, semantic_id, ieee_id are in results but not in Paper dataclass
300
-
301
- # Basic metadata section
302
- if "basic" in results:
303
- # Always update abstract if found (key enrichment goal)
304
- if results["basic"].get("abstract"):
305
- enriched.metadata.basic.abstract = results["basic"]["abstract"]
306
-
307
- # Update title if more complete
308
- if results["basic"].get("title"):
309
- new_title = results["basic"]["title"]
310
- current_title = enriched.metadata.basic.title or ""
311
- if not current_title or len(new_title) > len(current_title):
312
- enriched.metadata.basic.title = new_title
313
-
314
- # Update authors if found
315
- if results["basic"].get("authors") and not enriched.metadata.basic.authors:
316
- enriched.metadata.basic.authors = results["basic"]["authors"]
317
-
318
- # Update year if found
319
- if results["basic"].get("year") and not enriched.metadata.basic.year:
320
- enriched.metadata.basic.year = results["basic"]["year"]
321
-
322
- # Update keywords if found
323
- if (
324
- results["basic"].get("keywords")
325
- and not enriched.metadata.basic.keywords
326
- ):
327
- enriched.metadata.basic.keywords = results["basic"]["keywords"]
328
-
329
- # Publication metadata
330
- if "publication" in results:
331
- if (
332
- results["publication"].get("journal")
333
- and not enriched.metadata.publication.journal
334
- ):
335
- enriched.metadata.publication.journal = results["publication"][
336
- "journal"
337
- ]
338
- if (
339
- results["publication"].get("publisher")
340
- and not enriched.metadata.publication.publisher
341
- ):
342
- enriched.metadata.publication.publisher = results["publication"][
343
- "publisher"
344
- ]
345
- if (
346
- results["publication"].get("volume")
347
- and not enriched.metadata.publication.volume
348
- ):
349
- enriched.metadata.publication.volume = results["publication"]["volume"]
350
- if (
351
- results["publication"].get("issue")
352
- and not enriched.metadata.publication.issue
353
- ):
354
- enriched.metadata.publication.issue = results["publication"]["issue"]
355
- if (
356
- results["publication"].get("pages")
357
- and not enriched.metadata.publication.pages
358
- ):
359
- enriched.metadata.publication.pages = results["publication"]["pages"]
360
-
361
- # Citation metadata
362
- if "citation_count" in results:
363
- # Try both "count" and "total" fields
364
- count = results["citation_count"].get("count") or results[
365
- "citation_count"
366
- ].get("total")
367
- if count:
368
- # Always take the maximum citation count
369
- current_count = enriched.metadata.citation_count.total or 0
370
- if not current_count or count > current_count:
371
- enriched.metadata.citation_count.total = count
372
- # Note: influential_citation_count is in results but not in Paper dataclass
373
-
374
- # URL metadata
375
- if "url" in results:
376
- if results["url"].get("pdf"):
377
- # Check if this PDF is not already in the list
378
- pdf_url = results["url"]["pdf"]
379
- if not any(p.get("url") == pdf_url for p in enriched.metadata.url.pdfs):
380
- enriched.metadata.url.pdfs.append(
381
- {"url": pdf_url, "source": "enrichment"}
382
- )
383
- if results["url"].get("url") and not enriched.metadata.url.publisher:
384
- enriched.metadata.url.publisher = results["url"]["url"]
385
-
386
- # Note: Metrics section (journal_impact_factor, h_index) not stored in Paper dataclass
387
-
388
- return enriched
389
-
390
- def _enrich_current_project(self) -> Dict[str, int]:
391
- """Enrich all papers in the current project.
392
-
393
- Returns:
394
- Dictionary with enrichment statistics
395
- """
396
- if not self.project:
397
- raise ValueError(
398
- "No project specified. Use Scholar(project='name') or provide papers to enrich()."
399
- )
400
-
401
- # Load papers from project library
402
- papers = self.load_project(self.project)
403
- logger.info(
404
- f"{self.name}: Enriching {len(papers)} papers in project '{self.project}'"
405
- )
406
-
407
- # Enrich the papers
408
- enriched_papers = self.enrich_papers(papers)
409
-
410
- # Count successes
411
- enriched_count = sum(
412
- 1
413
- for i, p in enumerate(enriched_papers)
414
- if p.abstract and not papers[i].abstract # Check if abstract was added
415
- )
416
-
417
- # Save enriched papers back to library
418
- saved_ids = self.save_papers_to_library(enriched_papers)
419
-
420
- return {
421
- "enriched": enriched_count,
422
- "failed": len(papers) - enriched_count,
423
- "total": len(papers),
424
- "saved": len(saved_ids),
425
- }
426
-
427
- # ----------------------------------------
428
- # URL Finding (Orchestration)
429
- # ----------------------------------------
430
- async def _find_urls_for_doi_async(self, doi: str, context) -> Dict[str, Any]:
431
- """Find all URLs for a DOI (orchestration layer).
432
-
433
- Workflow:
434
- DOI → Publisher URL → PDF URLs → OpenURL (fallback)
435
-
436
- Args:
437
- doi: DOI string
438
- context: Authenticated browser context
439
-
440
- Returns:
441
- Dictionary with URL information: {
442
- "url_doi": "https://doi.org/...",
443
- "url_publisher": "https://publisher.com/...",
444
- "urls_pdf": [{"url": "...", "source": "zotero_translator"}],
445
- "url_openurl_resolved": "..." (if fallback used)
446
- }
447
- """
448
- from scitex.scholar.auth.gateway import (
449
- OpenURLResolver,
450
- normalize_doi_as_http,
451
- resolve_publisher_url_by_navigating_to_doi_page,
452
- )
453
-
454
- # Initialize result
455
- urls = {"url_doi": normalize_doi_as_http(doi)}
456
-
457
- # Step 1: Resolve publisher URL
458
- page = await context.new_page()
459
- try:
460
- url_publisher = await resolve_publisher_url_by_navigating_to_doi_page(
461
- doi, page
462
- )
463
- urls["url_publisher"] = url_publisher
464
- finally:
465
- await page.close()
466
-
467
- # Step 2: Find PDF URLs from publisher URL
468
- url_finder = ScholarURLFinder(context, config=self.config)
469
- urls_pdf = []
470
-
471
- if url_publisher:
472
- urls_pdf = await url_finder.find_pdf_urls(url_publisher)
473
-
474
- # Step 3: Try OpenURL fallback if no PDFs found
475
- if not urls_pdf:
476
- openurl_resolver = OpenURLResolver(config=self.config)
477
- page = await context.new_page()
478
- try:
479
- url_openurl_resolved = await openurl_resolver.resolve_doi(doi, page)
480
- urls["url_openurl_resolved"] = url_openurl_resolved
481
-
482
- if url_openurl_resolved and url_openurl_resolved != "skipped":
483
- urls_pdf = await url_finder.find_pdf_urls(url_openurl_resolved)
484
- finally:
485
- await page.close()
486
-
487
- # Deduplicate and store
488
- urls["urls_pdf"] = self._deduplicate_pdf_urls(urls_pdf) if urls_pdf else []
489
-
490
- return urls
491
-
492
- def _deduplicate_pdf_urls(self, urls_pdf: List[Dict]) -> List[Dict]:
493
- """Remove duplicate PDF URLs.
494
-
495
- Args:
496
- urls_pdf: List of PDF URL dicts
497
-
498
- Returns:
499
- Deduplicated list of PDF URL dicts
500
- """
501
- seen = set()
502
- unique = []
503
- for pdf in urls_pdf:
504
- url = pdf.get("url") if isinstance(pdf, dict) else pdf
505
- if url not in seen:
506
- seen.add(url)
507
- unique.append(pdf)
508
- return unique
509
-
510
- # ----------------------------------------
511
- # PDF Downloaders
512
- # ----------------------------------------
513
- async def download_pdfs_from_dois_async(
514
- self,
515
- dois: List[str],
516
- output_dir: Optional[Path] = None,
517
- max_concurrent: int = 1,
518
- ) -> Dict[str, int]:
519
- """Download PDFs for given DOIs using ScholarPDFDownloader.
520
-
521
- Args:
522
- dois: List of DOI strings
523
- output_dir: Output directory (not used - downloads to library MASTER)
524
- max_concurrent: Maximum concurrent downloads (default: 1 for sequential)
525
-
526
- Returns:
527
- Dictionary with download statistics
528
- """
529
- if not dois:
530
- return {"downloaded": 0, "failed": 0, "errors": 0}
531
-
532
- # Get authenticated browser context
533
- (
534
- browser,
535
- context,
536
- ) = await self._browser_manager.get_authenticated_browser_and_context_async()
537
-
538
- try:
539
- # Initialize PDF downloader with browser context
540
- pdf_downloader = ScholarPDFDownloader(
541
- context=context,
542
- config=self.config,
543
- )
544
-
545
- # Use download_from_dois from ScholarPDFDownloader
546
- # This handles parallel downloads with semaphore control
547
- logger.info(
548
- f"{self.name}: Starting PDF download for {len(dois)} DOIs (max_concurrent={max_concurrent})"
549
- )
550
-
551
- results = await pdf_downloader.download_from_dois(
552
- dois=dois,
553
- output_dir=str(output_dir) if output_dir else "/tmp/",
554
- max_concurrent=max_concurrent,
555
- )
556
-
557
- # Process results and organize in library
558
- stats = {"downloaded": 0, "failed": 0, "errors": 0}
559
- library_dir = self.config.path_manager.library_dir
560
- master_dir = library_dir / "MASTER"
561
- master_dir.mkdir(parents=True, exist_ok=True)
562
-
563
- for doi, downloaded_paths in zip(dois, results):
564
- try:
565
- if downloaded_paths and len(downloaded_paths) > 0:
566
- # PDF was downloaded successfully
567
- # Take the first downloaded PDF (if multiple)
568
- temp_pdf_path = downloaded_paths[0]
569
-
570
- # Generate paper ID and create storage
571
- paper_id = self.config.path_manager._generate_paper_id(doi=doi)
572
- storage_path = master_dir / paper_id
573
- storage_path.mkdir(parents=True, exist_ok=True)
574
-
575
- # Move PDF to MASTER library
576
- pdf_filename = (
577
- f"DOI_{doi.replace('/', '_').replace(':', '_')}.pdf"
578
- )
579
- master_pdf_path = storage_path / pdf_filename
580
- shutil.move(str(temp_pdf_path), str(master_pdf_path))
581
-
582
- # Create/update metadata
583
- metadata_file = storage_path / "metadata.json"
584
- if metadata_file.exists():
585
- with open(metadata_file) as f:
586
- metadata = json.load(f)
587
- else:
588
- metadata = {
589
- "doi": doi,
590
- "scitex_id": paper_id,
591
- "created_at": datetime.now().isoformat(),
592
- "created_by": "SciTeX Scholar",
593
- }
594
-
595
- # Update metadata with PDF info
596
- metadata["pdf_path"] = str(
597
- master_pdf_path.relative_to(library_dir)
598
- )
599
- metadata["pdf_downloaded_at"] = datetime.now().isoformat()
600
- metadata["pdf_size_bytes"] = master_pdf_path.stat().st_size
601
- metadata["updated_at"] = datetime.now().isoformat()
602
-
603
- with open(metadata_file, "w") as f:
604
- json.dump(metadata, f, indent=2, ensure_ascii=False)
605
-
606
- # Update symlink using LibraryManager
607
- if self.project not in ["master", "MASTER"]:
608
- self._library_manager.update_symlink(
609
- master_storage_path=storage_path,
610
- project=self.project,
611
- )
612
-
613
- logger.success(
614
- f"{self.name}: Downloaded and organized PDF for {doi}: {master_pdf_path}"
615
- )
616
- stats["downloaded"] += 1
617
- else:
618
- logger.warning(f"{self.name}: No PDF downloaded for DOI: {doi}")
619
- stats["failed"] += 1
620
-
621
- except Exception as e:
622
- logger.error(f"{self.name}: Failed to organize PDF for {doi}: {e}")
623
- stats["errors"] += 1
624
- stats["failed"] += 1
625
-
626
- return stats
627
-
628
- finally:
629
- # Always close browser
630
- await self._browser_manager.close()
631
-
632
- async def _download_pdfs_sequential(
633
- self, dois: List[str], output_dir: Optional[Path] = None
634
- ) -> Dict[str, int]:
635
- """Sequential PDF download with authentication gateway."""
636
- results = {"downloaded": 0, "failed": 0, "errors": 0}
637
-
638
- # Get authenticated browser context
639
- (
640
- browser,
641
- context,
642
- ) = await self._browser_manager.get_authenticated_browser_and_context_async()
643
-
644
- # Initialize authentication gateway (NEW)
645
- auth_gateway = AuthenticationGateway(
646
- auth_manager=self._auth_manager,
647
- browser_manager=self._browser_manager,
648
- config=self.config,
649
- )
650
-
651
- # Use simple downloader for sequential downloads
652
- pdf_downloader = ScholarPDFDownloader(
653
- context=context,
654
- config=self.config,
655
- )
656
-
657
- library_dir = self.config.path_manager.library_dir
658
- master_dir = library_dir / "MASTER"
659
- project_dir = library_dir / self.project
660
- master_dir.mkdir(parents=True, exist_ok=True)
661
- project_dir.mkdir(parents=True, exist_ok=True)
662
-
663
- for doi in dois:
664
- try:
665
- logger.info(f"{self.name}: Processing DOI: {doi}")
666
-
667
- # NEW: Prepare authentication context BEFORE URL finding
668
- # This establishes publisher-specific cookies if needed
669
- _url_context = await auth_gateway.prepare_context_async(
670
- doi=doi, context=context
671
- )
672
-
673
- # Step 1: Find URLs for the DOI (orchestration)
674
- urls = await self._find_urls_for_doi_async(doi, context)
675
-
676
- # Step 2: Get PDF URLs
677
- pdf_urls = urls.get("urls_pdf", [])
678
-
679
- if not pdf_urls:
680
- logger.warning(f"{self.name}: No PDF URLs found for DOI: {doi}")
681
- results["failed"] += 1
682
- continue
683
-
684
- # Step 3: Try to download from each PDF URL
685
- downloaded_path = None
686
- for pdf_entry in pdf_urls:
687
- # Handle both dict and string formats
688
- pdf_url = (
689
- pdf_entry.get("url")
690
- if isinstance(pdf_entry, dict)
691
- else pdf_entry
692
- )
693
-
694
- if not pdf_url:
695
- continue
696
-
697
- # Download to temp location first
698
- temp_output = (
699
- Path("/tmp") / f"{doi.replace('/', '_').replace(':', '_')}.pdf"
700
- )
701
-
702
- # Download PDF using simple downloader
703
- result = await pdf_downloader.download_from_url(
704
- pdf_url=pdf_url, output_path=temp_output
705
- )
706
-
707
- if result and result.exists():
708
- downloaded_path = result
709
- break
710
-
711
- if downloaded_path:
712
- # Step 4: Store PDF in MASTER library with proper organization
713
-
714
- # Generate unique ID from DOI using PathManager
715
- paper_id = self.config.path_manager._generate_paper_id(doi=doi)
716
-
717
- # Create MASTER storage directory
718
- storage_path = master_dir / paper_id
719
- storage_path.mkdir(parents=True, exist_ok=True)
720
-
721
- # Try to get paper metadata to generate readable name
722
- readable_name = None
723
- temp_paper = None
724
- try:
725
- # Try to load paper from DOI to get metadata
726
- from scitex.scholar.core.Paper import Paper
727
- from scitex.scholar.core.Papers import Papers
728
-
729
- temp_paper = Paper()
730
- temp_paper.metadata.id.doi = doi
731
- # Try to enrich to get author/year/journal using async method
732
- temp_papers = Papers([temp_paper])
733
- enriched = await self.enrich_papers_async(temp_papers)
734
- if enriched and len(enriched) > 0:
735
- temp_paper = enriched[0]
736
-
737
- # Generate readable name from metadata
738
- first_author = "Unknown"
739
- authors = temp_paper.metadata.basic.authors
740
- if authors and len(authors) > 0:
741
- author_parts = authors[0].split()
742
- if len(author_parts) > 1:
743
- first_author = author_parts[-1] # Last name
744
- else:
745
- first_author = author_parts[0]
746
-
747
- year = temp_paper.metadata.basic.year
748
- year_str = str(year) if year else "Unknown"
749
-
750
- journal_clean = "Unknown"
751
- journal = temp_paper.metadata.publication.journal
752
- if journal:
753
- # Clean journal name - remove special chars, keep alphanumeric
754
- journal_clean = "".join(
755
- c for c in journal if c.isalnum() or c in " "
756
- ).replace(" ", "")
757
- if not journal_clean:
758
- journal_clean = "Unknown"
759
-
760
- # Format: Author-Year-Journal
761
- readable_name = f"{first_author}-{year_str}-{journal_clean}"
762
- except:
763
- pass
764
-
765
- # Fallback to DOI if metadata extraction failed
766
- if not readable_name:
767
- readable_name = f"DOI_{doi.replace('/', '_').replace(':', '_')}"
768
-
769
- # Copy PDF to MASTER storage with ORIGINAL filename to track how downloaded
770
- # The PDF filename preserves the DOI format for tracking
771
- pdf_filename = f"DOI_{doi.replace('/', '_').replace(':', '_')}.pdf"
772
- master_pdf_path = storage_path / pdf_filename
773
- shutil.copy2(downloaded_path, master_pdf_path)
774
-
775
- # Load existing metadata or create minimal new metadata
776
- metadata_file = storage_path / "metadata.json"
777
- if metadata_file.exists():
778
- # Load existing rich metadata - DO NOT OVERWRITE IT
779
- with open(metadata_file) as f:
780
- metadata = json.load(f)
781
- logger.debug(
782
- f"{self.name}: Loaded existing metadata for {paper_id}"
783
- )
784
- else:
785
- # Create new minimal metadata only if none exists
786
- metadata = {
787
- "doi": doi,
788
- "scitex_id": paper_id,
789
- "created_at": datetime.now().isoformat(),
790
- "created_by": "SciTeX Scholar",
791
- }
792
-
793
- # Add enriched paper metadata for new papers only
794
- if temp_paper:
795
- # Use Pydantic to_dict() for Paper
796
- paper_dict = temp_paper.to_dict()
797
- # Merge paper metadata
798
- for key, value in paper_dict.items():
799
- if value is not None and key not in [
800
- "doi",
801
- "scitex_id",
802
- ]:
803
- metadata[key] = value
804
-
805
- # Add PDF information
806
- metadata["pdf_path"] = str(master_pdf_path.relative_to(library_dir))
807
- metadata["pdf_downloaded_at"] = datetime.now().isoformat()
808
- metadata["pdf_size_bytes"] = master_pdf_path.stat().st_size
809
- metadata["updated_at"] = datetime.now().isoformat()
810
-
811
- # Save updated metadata
812
- with open(metadata_file, "w") as f:
813
- json.dump(metadata, f, indent=2, ensure_ascii=False)
814
-
815
- # Update symlink using LibraryManager
816
- if self.project not in ["master", "MASTER"]:
817
- self._library_manager.update_symlink(
818
- master_storage_path=storage_path,
819
- project=self.project,
820
- )
821
-
822
- # Clean up temp file
823
- downloaded_path.unlink()
824
-
825
- logger.success(
826
- f"{self.name}: Downloaded PDF for {doi}: MASTER/{paper_id}/{pdf_filename}"
827
- )
828
- results["downloaded"] += 1
829
- else:
830
- logger.warning(
831
- f"{self.name}: Failed to download any PDF for DOI: {doi}"
832
- )
833
- results["failed"] += 1
834
-
835
- except Exception as e:
836
- logger.error(f"{self.name}: Failed to process {doi}: {e}")
837
- results["errors"] += 1
838
- results["failed"] += 1
839
-
840
- await self._browser_manager.close()
841
- logger.info(f"{self.name}: PDF download complete: {results}")
842
- return results
843
-
844
- def download_pdfs_from_dois(
845
- self, dois: List[str], output_dir: Optional[Path] = None
846
- ) -> Dict[str, int]:
847
- """Download PDFs for given DOIs.
848
-
849
- Args:
850
- dois: List of DOI strings
851
- output_dir: Output directory (uses config default if None)
852
-
853
- Returns:
854
- Dictionary with download statistics
855
- """
856
- import asyncio
857
-
858
- return asyncio.run(self.download_pdfs_from_dois_async(dois, output_dir))
859
-
860
- def download_pdfs_from_bibtex(
861
- self,
862
- bibtex_input: Union[str, Path, Papers],
863
- output_dir: Optional[Path] = None,
864
- ) -> Dict[str, int]:
865
- """Download PDFs from BibTeX file or Papers collection.
866
-
867
- Args:
868
- bibtex_input: BibTeX file path, content string, or Papers collection
869
- output_dir: Output directory (uses config default if None)
870
-
871
- Returns:
872
- Dictionary with download statistics
873
- """
874
- # Load papers if bibtex_input is not already Papers
875
- if isinstance(bibtex_input, Papers):
876
- papers = bibtex_input
877
- else:
878
- papers = self.load_bibtex(bibtex_input)
879
-
880
- # Extract DOIs from papers
881
- dois = [paper.metadata.id.doi for paper in papers if paper.metadata.id.doi]
882
-
883
- if not dois:
884
- logger.warning(f"{self.name}: No papers with DOIs found in BibTeX input")
885
- return {"downloaded": 0, "failed": 0, "errors": 0}
886
-
887
- logger.info(
888
- f"{self.name}: Found {len(dois)} papers with DOIs out of {len(papers)} total papers"
889
- )
890
-
891
- # Download PDFs using DOI method
892
- return self.download_pdfs_from_dois(dois, output_dir)
893
-
894
- # ----------------------------------------
895
- # Loaders
896
- # ----------------------------------------
897
- def load_project(self, project: Optional[str] = None) -> Papers:
898
- """Load papers from a project using library manager service.
899
-
900
- Args:
901
- project: Project name (uses self.project if None)
902
-
903
- Returns:
904
- Papers collection from the project
905
- """
906
- project_name = project or self.project
907
- if not project_name:
908
- raise ValueError("No project specified")
909
-
910
- # Load papers from library by reading symlinks in project directory
911
- import json
912
-
913
- from ..core.Paper import Paper
914
- from ..core.Papers import Papers
915
-
916
- logger.info(f"{self.name}: Loading papers from project: {project_name}")
917
-
918
- library_dir = self.config.path_manager.library_dir
919
- project_dir = library_dir / project_name
920
-
921
- if not project_dir.exists():
922
- logger.warning(
923
- f"{self.name}: Project directory does not exist: {project_dir}"
924
- )
925
- return Papers([], project=project_name)
926
-
927
- papers = []
928
- for item in project_dir.iterdir():
929
- # Skip info directory and metadata files
930
- if item.name in ["info", "project_metadata.json", "README.md"]:
931
- continue
932
-
933
- # Follow symlink to MASTER directory
934
- if item.is_symlink():
935
- master_path = item.resolve()
936
- if master_path.exists():
937
- # Load metadata.json from MASTER directory
938
- metadata_file = master_path / "metadata.json"
939
- if metadata_file.exists():
940
- try:
941
- with open(metadata_file) as f:
942
- metadata = json.load(f)
943
-
944
- # Create Paper object using from_dict class method
945
- paper = Paper.from_dict(metadata)
946
-
947
- papers.append(paper)
948
- except Exception as e:
949
- logger.warning(
950
- f"{self.name}: Failed to load metadata from {metadata_file}: {e}"
951
- )
952
-
953
- logger.info(
954
- f"{self.name}: Loaded {len(papers)} papers from project: {project_name}"
955
- )
956
- return Papers(papers, project=project_name)
957
-
958
- def load_bibtex(self, bibtex_input: Union[str, Path]) -> Papers:
959
- """Load Papers collection from BibTeX file or content.
960
-
961
- Args:
962
- bibtex_input: BibTeX file path or content string
963
-
964
- Returns:
965
- Papers collection
966
- """
967
- # Use the internal library to load papers
968
- papers = self._library.papers_from_bibtex(bibtex_input)
969
-
970
- # Convert to Papers collection
971
- from .Papers import Papers
972
-
973
- papers_collection = Papers(papers, config=self.config, project=self.project)
974
- papers_collection.library = self._library # Attach library for save operations
975
124
 
976
- return papers_collection
977
-
978
- # ----------------------------------------
979
- # Searchers
980
- # ----------------------------------------
981
- def search_library(self, query: str, project: Optional[str] = None) -> Papers:
982
- """
983
- Search papers in local library.
984
-
985
- For new literature search (not in library), use AI2 Scholar QA:
986
- https://scholarqa.allen.ai/chat/ then process with:
987
- papers = scholar.load_bibtex('file.bib') followed by scholar.enrich(papers)
988
-
989
- Args:
990
- query: Search query
991
- project: Project filter (uses self.project if None)
992
-
993
- Returns:
994
- Papers collection matching the query
995
- """
996
- # For now, return empty Papers until search is implemented
997
- from ..core.Papers import Papers
998
-
999
- logger.info(f"{self.name}: Searching library for: {query}")
1000
- return Papers([], project=project or self.project)
1001
-
1002
- def search_across_projects(
1003
- self, query: str, projects: Optional[List[str]] = None
1004
- ) -> Papers:
1005
- """Search for papers across multiple projects or the entire library.
1006
-
1007
- Args:
1008
- query: Search query
1009
- projects: List of project names to search (None for all)
1010
-
1011
- Returns:
1012
- Papers collection with search results
1013
- """
1014
- if projects is None:
1015
- # Search all projects
1016
- all_projects = [p["name"] for p in self.list_projects()]
1017
- else:
1018
- all_projects = projects
1019
-
1020
- all_papers = []
1021
- for project in all_projects:
1022
- try:
1023
- project_dir = self.config.get_library_project_dir(project)
1024
- # Load papers from metadata.json files in project directory
1025
- for item in project_dir.iterdir():
1026
- if item.is_symlink() or item.is_dir():
1027
- # Follow symlink to MASTER or use direct dir
1028
- paper_dir = item.resolve() if item.is_symlink() else item
1029
- metadata_file = paper_dir / "metadata.json"
1030
- if metadata_file.exists():
1031
- try:
1032
- paper = Paper.model_validate_json(
1033
- metadata_file.read_text()
1034
- )
1035
- # Simple text search
1036
- query_lower = query.lower()
1037
- title = (paper.metadata.basic.title or "").lower()
1038
- abstract = (paper.metadata.basic.abstract or "").lower()
1039
- authors = paper.metadata.basic.authors or []
1040
- if (
1041
- query_lower in title
1042
- or query_lower in abstract
1043
- or any(
1044
- query_lower in (a or "").lower()
1045
- for a in authors
1046
- )
1047
- ):
1048
- all_papers.append(paper)
1049
- except Exception as e:
1050
- logger.debug(
1051
- f"{self.name}: Failed to load {metadata_file}: {e}"
1052
- )
1053
- except Exception as e:
1054
- logger.debug(f"{self.name}: Failed to search project {project}: {e}")
1055
-
1056
- return Papers(all_papers, config=self.config, project="search_results")
1057
-
1058
- # ----------------------------------------
1059
- # Savers
1060
- # ----------------------------------------
1061
- def save_papers_to_library(self, papers: Papers) -> List[str]:
1062
- """Save papers collection to library.
1063
-
1064
- Args:
1065
- papers: Papers collection to save
1066
-
1067
- Returns:
1068
- List of paper IDs saved
1069
- """
1070
- saved_ids = []
1071
- for paper in papers:
1072
- try:
1073
- paper_id = self._library.save_paper(paper)
1074
- saved_ids.append(paper_id)
1075
- except Exception as e:
1076
- logger.warning(f"{self.name}: Failed to save paper: {e}")
1077
-
1078
- logger.info(
1079
- f"{self.name}: Saved {len(saved_ids)}/{len(papers)} papers to library"
1080
- )
1081
- return saved_ids
1082
-
1083
- def save_papers_as_bibtex(
1084
- self, papers: Papers, output_path: Optional[Union[str, Path]] = None
1085
- ) -> str:
1086
- """Save papers to BibTeX format with enrichment metadata.
1087
-
1088
- Args:
1089
- papers: Papers collection to save
1090
- output_path: Optional path to save the BibTeX file
1091
-
1092
- Returns:
1093
- BibTeX content as string with enrichment metadata included
1094
- """
1095
- from ..storage.BibTeXHandler import BibTeXHandler
1096
-
1097
- bibtex_handler = BibTeXHandler(project=self.project, config=self.config)
1098
- return bibtex_handler.papers_to_bibtex(papers, output_path)
1099
-
1100
- # ----------------------------------------
1101
- # Project Handlers
1102
- # ----------------------------------------
1103
- def _ensure_project_exists(
1104
- self, project: str, description: Optional[str] = None
1105
- ) -> Path:
1106
- """Ensure project directory exists, create if needed (PRIVATE).
1107
-
1108
- Args:
1109
- project: Project name
1110
- description: Optional project description
1111
-
1112
- Returns:
1113
- Path to the project directory
1114
- """
1115
- project_dir = self.config.get_library_project_dir(project)
1116
- info_dir = project_dir / "info"
1117
-
1118
- # Create project and info directories
1119
- if not project_dir.exists():
1120
- project_dir.mkdir(parents=True, exist_ok=True)
1121
- logger.info(f"{self.name}: Auto-created project directory: {project}")
1122
-
1123
- # Ensure info directory exists
1124
- info_dir.mkdir(parents=True, exist_ok=True)
1125
-
1126
- # Create/move metadata file to info directory
1127
- old_metadata_file = project_dir / "project_metadata.json" # Old location
1128
- metadata_file = info_dir / "project_metadata.json" # New location
1129
-
1130
- # Move existing metadata file if it exists in old location
1131
- if old_metadata_file.exists() and not metadata_file.exists():
1132
- shutil.move(str(old_metadata_file), str(metadata_file))
1133
- logger.info(f"{self.name}: Moved project metadata to info directory")
1134
-
1135
- # Create metadata file if it doesn't exist
1136
- if not metadata_file.exists():
1137
- metadata = {
1138
- "name": project,
1139
- "description": description or f"Papers for {project} project",
1140
- "created": datetime.now().isoformat(),
1141
- "created_by": "SciTeX Scholar",
1142
- "auto_created": True,
1143
- }
1144
-
1145
- with open(metadata_file, "w") as f:
1146
- json.dump(metadata, f, indent=2)
1147
-
1148
- logger.info(
1149
- f"{self.name}: Created project metadata in info directory: {project}"
1150
- )
1151
-
1152
- return project_dir
1153
-
1154
- def _create_project_metadata(
1155
- self, project: str, description: Optional[str] = None
1156
- ) -> Path:
1157
- """Create project directory and metadata (PRIVATE).
1158
-
1159
- DEPRECATED: Use _ensure_project_exists instead.
1160
-
1161
- Args:
1162
- project: Project name
1163
- description: Optional project description
1164
-
1165
- Returns:
1166
- Path to the created project directory
1167
- """
1168
- # Just use the new method that puts metadata in info directory
1169
- return self._ensure_project_exists(project, description)
1170
-
1171
- def list_projects(self) -> List[Dict[str, Any]]:
1172
- """List all projects in the Scholar library.
1173
-
1174
- Returns:
1175
- List of project information dictionaries
1176
- """
1177
- library_dir = self.config.path_manager.library_dir
1178
- projects = []
1179
-
1180
- for item in library_dir.iterdir():
1181
- if item.is_dir() and item.name != "MASTER":
1182
- project_info = {
1183
- "name": item.name,
1184
- "path": str(item),
1185
- "papers_count": len(list(item.glob("*"))),
1186
- "created": None,
1187
- "description": None,
1188
- }
1189
-
1190
- # Load metadata if exists
1191
- metadata_file = item / "project_metadata.json"
1192
- if metadata_file.exists():
1193
- try:
1194
- with open(metadata_file) as f:
1195
- metadata = json.load(f)
1196
- project_info.update(metadata)
1197
- except Exception as e:
1198
- logger.debug(f"Failed to load metadata for {item.name}: {e}")
1199
-
1200
- projects.append(project_info)
1201
-
1202
- return sorted(projects, key=lambda x: x["name"])
1203
-
1204
- # ----------------------------------------
1205
- # Library Handlers
1206
- # ----------------------------------------
1207
- def get_library_statistics(self) -> Dict[str, Any]:
1208
- """Get comprehensive statistics for the entire Scholar library.
1209
-
1210
- Returns:
1211
- Dictionary with library-wide statistics
1212
- """
1213
- master_dir = self.config.get_library_master_dir()
1214
- projects = self.list_projects()
1215
-
1216
- stats = {
1217
- "total_projects": len(projects),
1218
- "total_papers": (
1219
- len(list(master_dir.glob("*"))) if master_dir.exists() else 0
1220
- ),
1221
- "projects": projects,
1222
- "library_path": str(self.config.path_manager.library_dir),
1223
- "master_path": str(master_dir),
1224
- }
1225
-
1226
- # Calculate storage usage
1227
- if master_dir.exists():
1228
- total_size = sum(
1229
- f.stat().st_size for f in master_dir.rglob("*") if f.is_file()
1230
- )
1231
- stats["storage_mb"] = total_size / (1024 * 1024)
1232
- else:
1233
- stats["storage_mb"] = 0
1234
-
1235
- return stats
1236
-
1237
- def backup_library(self, backup_path: Union[str, Path]) -> Dict[str, Any]:
1238
- """Create a backup of the Scholar library.
1239
-
1240
- Args:
1241
- backup_path: Path for the backup
1242
-
1243
- Returns:
1244
- Dictionary with backup information
1245
- """
1246
- backup_path = Path(backup_path)
1247
- library_path = self.config.path_manager.library_dir
1248
-
1249
- if not library_path.exists():
1250
- raise ScholarError("Library directory does not exist")
1251
-
1252
- # Create timestamped backup
1253
- timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
1254
- backup_dir = backup_path / f"scholar_library_backup_{timestamp}"
1255
-
1256
- logger.info(f"{self.name}: Creating library backup at {backup_dir}")
1257
- shutil.copytree(library_path, backup_dir)
1258
-
1259
- # Create backup metadata
1260
- backup_info = {
1261
- "timestamp": timestamp,
1262
- "source": str(library_path),
1263
- "backup": str(backup_dir),
1264
- "size_mb": sum(
1265
- f.stat().st_size for f in backup_dir.rglob("*") if f.is_file()
1266
- )
1267
- / (1024 * 1024),
1268
- }
1269
-
1270
- metadata_file = backup_dir / "backup_metadata.json"
1271
- with open(metadata_file, "w") as f:
1272
- json.dump(backup_info, f, indent=2)
1273
-
1274
- logger.info(
1275
- f"{self.name}: Library backup completed: {backup_info['size_mb']:.2f} MB"
1276
- )
1277
- return backup_info
1278
-
1279
- # =========================================================================
1280
- # PIPELINE METHODS (Phase 2)
1281
- # =========================================================================
1282
-
1283
- async def process_paper_async(
1284
- self,
1285
- title: Optional[str] = None,
1286
- doi: Optional[str] = None,
1287
- project: Optional[str] = None,
1288
- ) -> Paper:
1289
- """
1290
- Complete sequential pipeline for processing a single paper.
1291
-
1292
- Accepts either title OR doi. Uses storage-first approach:
1293
- each stage checks storage before processing.
1294
-
1295
- Workflow:
1296
- Stage 0: Resolve DOI from title (if needed)
1297
- Stage 1: Load or create Paper from storage
1298
- Stage 2: Find PDF URLs → save to storage
1299
- Stage 3: Download PDF → save to storage
1300
- Stage 4: Update project symlinks
1301
-
1302
- Args:
1303
- title: Paper title (will resolve DOI using engine)
1304
- doi: DOI of the paper (preferred if available)
1305
- project: Project name (uses self.project if None)
1306
-
1307
- Returns:
1308
- Fully processed Paper object
1309
-
1310
- Examples:
1311
- # With DOI (direct)
1312
- paper = await scholar.process_paper_async(doi="10.1038/s41598-017-02626-y")
1313
-
1314
- # With title (resolves DOI first)
1315
- paper = await scholar.process_paper_async(
1316
- title="Attention Is All You Need"
1317
- )
1318
- """
1319
- from scitex.scholar.core.Paper import Paper
1320
-
1321
- # Validate input
1322
- if not title and not doi:
1323
- raise ValueError("Must provide either title or doi")
1324
-
1325
- project = project or self.project
1326
-
1327
- logger.info(f"{'=' * 60}")
1328
- logger.info("Processing paper")
1329
- if title:
1330
- logger.info(f"Title: {title[:50]}...")
1331
- if doi:
1332
- logger.info(f"DOI: {doi}")
1333
- logger.info(f"{'=' * 60}")
1334
-
1335
- # Stage 0: Resolve DOI from title (if needed)
1336
- if not doi and title:
1337
- logger.info("Stage 0: Resolving DOI from title...")
1338
-
1339
- # Use ScholarEngine to search and get DOI
1340
- results = await self._scholar_engine.search_async(title=title)
1341
-
1342
- if results and results.get("id", {}).get("doi"):
1343
- doi = results["id"]["doi"]
1344
- logger.success(f"Resolved DOI: {doi}")
1345
- else:
1346
- logger.error(f"Could not resolve DOI from title: {title}")
1347
- raise ValueError(f"Could not resolve DOI from title: {title}")
1348
-
1349
- # Generate paper ID from DOI
1350
- paper_id = self.config.path_manager._generate_paper_id(doi=doi)
1351
- storage_path = self.config.get_library_master_dir() / paper_id
1352
-
1353
- logger.info(f"Paper ID: {paper_id}")
1354
- logger.info(f"Storage: {storage_path}")
1355
-
1356
- # Stage 1: Load or create Paper from storage
1357
- logger.info("\nStage 1: Loading/creating metadata...")
1358
- if self._library_manager.has_metadata(paper_id):
1359
- # Load existing from storage
1360
- paper = self._library_manager.load_paper_from_id(paper_id)
1361
- logger.info("Loaded existing metadata from storage")
1362
- else:
1363
- # Create new Paper
1364
- paper = Paper()
1365
- paper.metadata.set_doi(doi)
1366
- paper.container.scitex_id = paper_id
1367
-
1368
- # If we have title, save it
1369
- if title:
1370
- paper.metadata.basic.title = title
1371
-
1372
- # Create storage and save
1373
- self._library_manager.save_paper_incremental(paper_id, paper)
1374
- logger.success("Created new paper entry in storage")
1375
-
1376
- # Stage 2: Check/find URLs
1377
- logger.info("\nStage 2: Checking/finding PDF URLs...")
1378
- if not self._library_manager.has_urls(paper_id):
1379
- logger.info(f"Finding PDF URLs for DOI: {doi}")
1380
- (
1381
- browser,
1382
- context,
1383
- ) = await self._browser_manager.get_authenticated_browser_and_context_async()
1384
- try:
1385
- url_finder = ScholarURLFinder(context, config=self.config)
1386
- urls = await url_finder.find_pdf_urls(doi)
1387
-
1388
- paper.metadata.url.pdfs = urls
1389
- self._library_manager.save_paper_incremental(paper_id, paper)
1390
- logger.success(f"Found {len(urls)} PDF URLs, saved to storage")
1391
- finally:
1392
- await self._browser_manager.close()
1393
- else:
1394
- logger.info(
1395
- f"PDF URLs already in storage ({len(paper.metadata.url.pdfs)} URLs)"
1396
- )
1397
-
1398
- # Stage 3: Check/download PDF
1399
- logger.info("\nStage 3: Checking/downloading PDF...")
1400
- if not self._library_manager.has_pdf(paper_id):
1401
- logger.info("Downloading PDF...")
1402
- if paper.metadata.url.pdfs:
1403
- (
1404
- browser,
1405
- context,
1406
- ) = await self._browser_manager.get_authenticated_browser_and_context_async()
1407
- try:
1408
- downloader = ScholarPDFDownloader(context, config=self.config)
1409
-
1410
- pdf_url = (
1411
- paper.metadata.url.pdfs[0]["url"]
1412
- if isinstance(paper.metadata.url.pdfs[0], dict)
1413
- else paper.metadata.url.pdfs[0]
1414
- )
1415
- temp_path = storage_path / "main.pdf"
1416
-
1417
- result = await downloader.download_from_url(
1418
- pdf_url, temp_path, doi=doi
1419
- )
1420
- if result and result.exists():
1421
- paper.metadata.path.pdfs.append(str(result))
1422
- self._library_manager.save_paper_incremental(paper_id, paper)
1423
- logger.success(f"{self.name}: Downloaded PDF, saved to storage")
1424
- else:
1425
- logger.warning(f"{self.name}: Failed to download PDF")
1426
- finally:
1427
- await self._browser_manager.close()
1428
- else:
1429
- logger.warning(f"{self.name}: No PDF URLs available for download")
1430
- else:
1431
- logger.info(f"{self.name}: PDF already in storage")
1432
-
1433
- # Stage 4: Update project symlinks
1434
- if project and project not in ["master", "MASTER"]:
1435
- logger.info(f"{self.name}: \nStage 4: Updating project symlinks...")
1436
- self._library_manager.update_symlink(
1437
- master_storage_path=storage_path,
1438
- project=project,
1439
- )
1440
- logger.success(f"{self.name}: Updated symlink in project: {project}")
1441
-
1442
- logger.info(f"\n{'=' * 60}")
1443
- logger.success(f"{self.name}: Paper processing complete")
1444
- logger.info(f"{'=' * 60}\n")
1445
-
1446
- return paper
1447
-
1448
- def process_paper(
1449
- self,
1450
- title: Optional[str] = None,
1451
- doi: Optional[str] = None,
1452
- project: Optional[str] = None,
1453
- ) -> Paper:
1454
- """
1455
- Synchronous wrapper for process_paper_async.
1456
-
1457
- See process_paper_async() for full documentation.
1458
- """
1459
- return asyncio.run(
1460
- self.process_paper_async(title=title, doi=doi, project=project)
1461
- )
1462
-
1463
- # =========================================================================
1464
- # PIPELINE METHODS (Phase 3) - Parallel Papers Processing
1465
- # =========================================================================
1466
-
1467
- async def process_papers_async(
1468
- self,
1469
- papers: Union[Papers, List[str]],
1470
- project: Optional[str] = None,
1471
- max_concurrent: int = 3,
1472
- ) -> Papers:
1473
- """
1474
- Process multiple papers with controlled parallelism.
1475
-
1476
- Each paper goes through complete sequential pipeline.
1477
- Semaphore controls how many papers process concurrently.
1478
-
1479
- Architecture:
1480
- - Parallel papers (max_concurrent at a time)
1481
- - Sequential stages per paper
1482
- - Storage checks before each stage
1483
-
1484
- Args:
1485
- papers: Papers collection or list of DOIs
1486
- project: Project name (uses self.project if None)
1487
- max_concurrent: Maximum concurrent papers (default: 3)
1488
- Set to 1 for purely sequential processing
1489
-
1490
- Returns:
1491
- Papers collection with processed papers
1492
-
1493
- Examples:
1494
- # Process Papers collection (parallel)
1495
- papers = scholar.load_bibtex("papers.bib")
1496
- processed = await scholar.process_papers_async(papers, max_concurrent=3)
1497
-
1498
- # Process DOI list (sequential)
1499
- dois = ["10.1038/...", "10.1016/...", "10.1109/..."]
1500
- processed = await scholar.process_papers_async(dois, max_concurrent=1)
1501
- """
1502
- from scitex.scholar.core.Papers import Papers
1503
-
1504
- project = project or self.project
1505
-
1506
- # Convert input to Papers collection
1507
- if isinstance(papers, list):
1508
- # List of DOI strings
1509
- papers_list = []
1510
- for doi in papers:
1511
- from scitex.scholar.core.Paper import Paper
1512
-
1513
- p = Paper()
1514
- p.metadata.set_doi(doi)
1515
- papers_list.append(p)
1516
- papers = Papers(papers_list, project=project, config=self.config)
1517
-
1518
- total = len(papers)
1519
- logger.info(f"{self.name}: \n{'=' * 60}")
1520
- logger.info(
1521
- f"{self.name}: Processing {total} papers (max_concurrent={max_concurrent})"
1522
- )
1523
- logger.info(f"{self.name}: Project: {project}")
1524
- logger.info(f"{self.name}: {'=' * 60}\n")
1525
-
1526
- # Use semaphore for controlled parallelism
1527
- semaphore = asyncio.Semaphore(max_concurrent)
1528
-
1529
- async def process_with_semaphore(paper, index):
1530
- """Process one paper with semaphore control."""
1531
- async with semaphore:
1532
- logger.info(f"{self.name}: \n[{index}/{total}] Starting paper...")
1533
- try:
1534
- result = await self.process_paper_async(
1535
- title=paper.metadata.basic.title,
1536
- doi=paper.metadata.id.doi,
1537
- project=project,
1538
- )
1539
- logger.success(f"{self.name}: [{index}/{total}] Completed")
1540
- return result
1541
- except Exception as e:
1542
- logger.error(f"{self.name}: [{index}/{total}] Failed: {e}")
1543
- return None
1544
-
1545
- # Create tasks for all papers
1546
- tasks = [process_with_semaphore(paper, i + 1) for i, paper in enumerate(papers)]
1547
-
1548
- # Process with controlled parallelism
1549
- results = await asyncio.gather(*tasks, return_exceptions=True)
1550
-
1551
- # Filter successful results
1552
- processed_papers = []
1553
- errors = 0
1554
- for i, result in enumerate(results):
1555
- if isinstance(result, Exception):
1556
- logger.error(f"{self.name}: Paper {i + 1} raised exception: {result}")
1557
- errors += 1
1558
- elif result is not None:
1559
- processed_papers.append(result)
1560
-
1561
- # Summary
1562
- logger.info(f"{self.name}: \n{'=' * 60}")
1563
- logger.info(f"{self.name}: Batch Processing Complete")
1564
- logger.info(f"{self.name}: Total: {total}")
1565
- logger.info(f"{self.name}: Successful: {len(processed_papers)}")
1566
- logger.info(f"{self.name}: Failed: {total - len(processed_papers)}")
1567
- logger.info(f"{self.name}: Errors: {errors}")
1568
- logger.info(f"{self.name}: {'=' * 60}\n")
1569
-
1570
- return Papers(processed_papers, project=project, config=self.config)
1571
-
1572
- def process_papers(
1573
- self,
1574
- papers: Union[Papers, List[str]],
1575
- project: Optional[str] = None,
1576
- max_concurrent: int = 3,
1577
- ) -> Papers:
1578
- """
1579
- Synchronous wrapper for process_papers_async.
1580
-
1581
- See process_papers_async() for full documentation.
1582
- """
1583
- return asyncio.run(
1584
- self.process_papers_async(
1585
- papers=papers,
1586
- project=project,
1587
- max_concurrent=max_concurrent,
1588
- )
1589
- )
1590
-
1591
- # =========================================================================
1592
- # INTERNAL SERVICES (PRIVATE - users should not access these directly)
1593
- # =========================================================================
1594
- def _init_config(self, config):
1595
- # Handle different config input types
1596
- if config is None:
1597
- return ScholarConfig.load() # Auto-detect config
1598
- elif isinstance(config, (str, Path)):
1599
- return ScholarConfig.from_yaml(config)
1600
- elif isinstance(config, ScholarConfig):
1601
- return config
1602
- else:
1603
- raise TypeError(f"Invalid config type: {type(config)}")
1604
-
1605
- @property
1606
- def _scholar_engine(self) -> ScholarEngine:
1607
- """Get Scholar engine for search and enrichment (PRIVATE)."""
1608
- if not hasattr(self, "__scholar_engine") or self.__scholar_engine is None:
1609
- self.__scholar_engine = ScholarEngine(config=self.config)
1610
- return self.__scholar_engine
1611
-
1612
- @property
1613
- def _auth_manager(self) -> ScholarAuthManager:
1614
- """Get authentication manager service (PRIVATE)."""
1615
- if not hasattr(self, "__auth_manager") or self.__auth_manager is None:
1616
- self.__auth_manager = ScholarAuthManager()
1617
- return self.__auth_manager
1618
-
1619
- @property
1620
- def _browser_manager(self) -> ScholarBrowserManager:
1621
- """Get browser manager service (PRIVATE)."""
1622
- if not hasattr(self, "__browser_manager") or self.__browser_manager is None:
1623
- self.__browser_manager = ScholarBrowserManager(
1624
- auth_manager=self._auth_manager,
1625
- chrome_profile_name="system",
1626
- browser_mode=self.browser_mode,
1627
- )
1628
- return self.__browser_manager
1629
-
1630
- @property
1631
- def _library_manager(self) -> LibraryManager:
1632
- """Get library manager service - low-level operations (PRIVATE)."""
1633
- if not hasattr(self, "__library_manager") or self.__library_manager is None:
1634
- self.__library_manager = LibraryManager(
1635
- project=self.project, config=self.config
1636
- )
1637
- return self.__library_manager
1638
-
1639
- @property
1640
- def _library(self) -> ScholarLibrary:
1641
- """Get Scholar library service - high-level operations (PRIVATE)."""
1642
- if not hasattr(self, "__library") or self.__library is None:
1643
- self.__library = ScholarLibrary(project=self.project, config=self.config)
1644
- return self.__library
1645
-
1646
-
1647
- # Export all classes and functions
1648
125
  __all__ = ["Scholar"]
1649
126
 
127
+
1650
128
  if __name__ == "__main__":
1651
- from scitex.scholar.core.Paper import Paper
1652
- from scitex.scholar.core.Papers import Papers
129
+ from .Paper import Paper
130
+ from .Papers import Papers
1653
131
 
1654
132
  def main():
1655
133
  """Demonstrate Scholar class usage - Clean API Demo."""
1656
134
  print("\n" + "=" * 60)
1657
- print("🎓 Scholar Module Demo - Clean API")
135
+ print("Scholar Module Demo - Clean API")
1658
136
  print("=" * 60 + "\n")
1659
137
 
1660
- # ----------------------------------------
1661
138
  # 1. Initialize Scholar
1662
- # ----------------------------------------
1663
- print("1️⃣ Initialize Scholar")
139
+ print("1. Initialize Scholar")
1664
140
  print("-" * 60)
1665
141
  scholar = Scholar(
1666
142
  project="demo_project",
1667
143
  project_description="Demo project for testing Scholar API",
1668
144
  )
1669
- print("Scholar initialized")
145
+ print("Scholar initialized")
1670
146
  print(f" Project: {scholar.project}")
1671
- print(f" Workspace: {scholar.get_workspace_dir()}")
1672
147
  print()
1673
148
 
1674
- # Demonstrate project management
149
+ # 2. Project Management
1675
150
  print("2. Project Management:")
1676
151
  try:
1677
- # Create a new project
1678
152
  project_dir = scholar._create_project_metadata(
1679
153
  "neural_networks_2024",
1680
154
  description="Collection of neural network papers from 2024",
1681
155
  )
1682
- print(" Created project: neural_networks_2024")
1683
- print(f" 📂 Project directory: {project_dir}")
156
+ print(" Created project: neural_networks_2024")
157
+ print(f" Project directory: {project_dir}")
1684
158
 
1685
- # List all projects
1686
159
  projects = scholar.list_projects()
1687
- print(f" 📋 Total projects in library: {len(projects)}")
1688
- for project in projects[:3]: # Show first 3
1689
- print(
1690
- f" - {project['name']}: {project.get('description', 'No description')}"
1691
- )
160
+ print(f" Total projects in library: {len(projects)}")
161
+ for proj in projects[:3]:
162
+ print(f" - {proj['name']}: {proj.get('description', 'No desc')}")
1692
163
  if len(projects) > 3:
1693
164
  print(f" ... and {len(projects) - 3} more")
1694
165
 
1695
166
  except Exception as e:
1696
- print(f" ⚠️ Project management demo skipped: {e}")
167
+ print(f" Project management demo skipped: {e}")
1697
168
  print()
1698
169
 
1699
- # Demonstrate library statistics
170
+ # 3. Library Statistics
1700
171
  print("3. Library Statistics:")
1701
172
  try:
1702
173
  stats = scholar.get_library_statistics()
1703
- print(f" 📊 Total projects: {stats['total_projects']}")
1704
- print(f" 📚 Total papers: {stats['total_papers']}")
1705
- print(f" 💾 Storage usage: {stats['storage_mb']:.2f} MB")
1706
- print(f" 📁 Library path: {stats['library_path']}")
174
+ print(f" Total projects: {stats['total_projects']}")
175
+ print(f" Total papers: {stats['total_papers']}")
176
+ print(f" Storage usage: {stats['storage_mb']:.2f} MB")
177
+ print(f" Library path: {stats['library_path']}")
1707
178
 
1708
179
  except Exception as e:
1709
- print(f" ⚠️ Library statistics demo skipped: {e}")
180
+ print(f" Library statistics demo skipped: {e}")
1710
181
  print()
1711
182
 
1712
- # Demonstrate paper and project operations
183
+ # 4. Working with Papers
1713
184
  print("4. Working with Papers:")
1714
-
1715
- # Create some sample papers with Pydantic structure
1716
185
  p1 = Paper()
1717
186
  p1.metadata.basic.title = "Vision Transformer: An Image Is Worth 16x16 Words"
1718
187
  p1.metadata.basic.authors = ["Dosovitskiy, Alexey", "Beyer, Lucas"]
1719
188
  p1.metadata.basic.year = 2021
1720
- p1.metadata.basic.keywords = [
1721
- "vision transformer",
1722
- "computer vision",
1723
- "attention",
1724
- ]
1725
189
  p1.metadata.publication.journal = "ICLR"
1726
190
  p1.metadata.set_doi("10.48550/arXiv.2010.11929")
1727
- p1.container.projects = ["neural_networks_2024"]
1728
191
 
1729
- p2 = Paper()
1730
- p2.metadata.basic.title = "Scaling Laws for Neural Language Models"
1731
- p2.metadata.basic.authors = ["Kaplan, Jared", "McCandlish, Sam"]
1732
- p2.metadata.basic.year = 2020
1733
- p2.metadata.basic.keywords = ["scaling laws", "language models", "GPT"]
1734
- p2.metadata.publication.journal = "arXiv preprint"
1735
- p2.metadata.set_doi("10.48550/arXiv.2001.08361")
1736
- p2.container.projects = ["neural_networks_2024"]
1737
-
1738
- sample_papers = [p1, p2]
1739
-
1740
- # Create Papers collection
192
+ sample_papers = [p1]
1741
193
  papers = Papers(
1742
194
  sample_papers,
1743
195
  project="neural_networks_2024",
1744
196
  config=scholar.config,
1745
197
  )
1746
- print(f" 📝 Created collection with {len(papers)} papers")
1747
-
1748
- # Use Scholar to work with the collection
1749
- # Switch project by creating new instance (cleaner pattern)
1750
- scholar = Scholar(project="neural_networks_2024")
1751
- print(f" 🎯 Set Scholar project to: {scholar.project}")
1752
- print()
1753
-
1754
- # Demonstrate DOI resolution workflow
1755
- print("5. Scholar Workflow Integration:")
1756
- try:
1757
- # Create a sample BibTeX content for demonstration
1758
- sample_bibtex = """
1759
- @article{sample2024,
1760
- title = {Sample Paper for Demo},
1761
- author = {Demo, Author},
1762
- year = {2024},
1763
- journal = {Demo Journal}
1764
- }
1765
- """
1766
-
1767
- # Demonstrate BibTeX loading
1768
- papers_from_bibtex = scholar.load_bibtex(sample_bibtex.strip())
1769
- print(f" 📄 Loaded {len(papers_from_bibtex)} papers from BibTeX")
1770
-
1771
- # Demonstrate project loading
1772
- if scholar.project:
1773
- try:
1774
- project_papers = scholar.load_project()
1775
- print(
1776
- f" 📂 Loaded {len(project_papers)} papers from current project"
1777
- )
1778
- except:
1779
- print(" 📂 Current project is empty or doesn't exist yet")
1780
-
1781
- except Exception as e:
1782
- print(f" ⚠️ Workflow demo partially skipped: {e}")
1783
- print()
1784
-
1785
- # Demonstrate search capabilities
1786
- print("6. Search Capabilities:")
1787
- try:
1788
- # Search across projects
1789
- search_results = scholar.search_across_projects("transformer")
1790
- print(
1791
- f" 🔍 Search for 'transformer': {len(search_results)} results across all projects"
1792
- )
1793
-
1794
- # Search in current library (existing papers)
1795
- library_search = scholar.search_library("vision")
1796
- print(f" 🔍 Library search for 'vision': {len(library_search)} results")
1797
-
1798
- except Exception as e:
1799
- print(f" ⚠️ Search demo skipped: {e}")
1800
- print()
1801
-
1802
- # Demonstrate configuration access
1803
- print("7. Configuration Management:")
1804
- print(f" ⚙️ Scholar directory: {scholar.config.paths.scholar_dir}")
1805
- print(f" ⚙️ Library directory: {scholar.config.get_library_project_dir()}")
1806
- print(
1807
- f" ⚙️ Debug mode: {scholar.config.resolve('debug_mode', default=False)}"
1808
- )
198
+ print(f" Created collection with {len(papers)} papers")
1809
199
  print()
1810
200
 
1811
- # Demonstrate service access (internal components)
1812
- print("8. Service Components (Internal):")
1813
- print(f" 🔧 Scholar Engine: {type(scholar._scholar_engine).__name__}")
1814
- print(f" 🔧 Auth Manager: {type(scholar._auth_manager).__name__}")
1815
- print(f" 🔧 Browser Manager: {type(scholar._browser_manager).__name__}")
1816
- print(f" 🔧 Library Manager: {type(scholar._library_manager).__name__}")
201
+ # 5. Configuration
202
+ print("5. Configuration Management:")
203
+ print(f" Scholar directory: {scholar.config.paths.scholar_dir}")
204
+ print(f" Library directory: {scholar.config.get_library_project_dir()}")
1817
205
  print()
1818
206
 
1819
- # Demonstrate backup capabilities
1820
- print("9. Backup and Maintenance:")
1821
- try:
1822
- import tempfile
1823
-
1824
- # Create a temporary backup location
1825
- backup_dir = Path(tempfile.mkdtemp()) / "scholar_backup"
1826
- backup_info = scholar.backup_library(backup_dir)
1827
- print(" 💾 Library backup created:")
1828
- print(f" 📁 Location: {backup_info['backup']}")
1829
- print(f" 📊 Size: {backup_info['size_mb']:.2f} MB")
1830
- print(f" 🕐 Timestamp: {backup_info['timestamp']}")
1831
-
1832
- # Clean up
1833
- import shutil
1834
-
1835
- shutil.rmtree(backup_dir, ignore_errors=True)
1836
-
1837
- except Exception as e:
1838
- print(f" ⚠️ Backup demo skipped: {e}")
207
+ # 6. Service Components
208
+ print("6. Service Components (Internal):")
209
+ print(f" Scholar Engine: {type(scholar._scholar_engine).__name__}")
210
+ print(f" Auth Manager: {type(scholar._auth_manager).__name__}")
211
+ print(f" Browser Manager: {type(scholar._browser_manager).__name__}")
212
+ print(f" Library Manager: {type(scholar._library_manager).__name__}")
1839
213
  print()
1840
214
 
1841
- print("Scholar global management demo completed!")
1842
- print()
1843
- print("💡 Key Scholar Capabilities:")
1844
- print(" • Global library management and statistics")
1845
- print(" • Project creation and organization")
1846
- print(" • Cross-project search and analysis")
1847
- print(" • Integration with Paper and Papers classes")
1848
- print(" • DOI resolution and metadata enrichment")
1849
- print(" • PDF download and browser automation")
1850
- print(" • Backup and maintenance operations")
1851
- print()
215
+ print("Scholar demo completed!")
1852
216
 
1853
217
  main()
1854
218
 
1855
- # python -m scitex.scholar.core.Scholar
1856
219
 
1857
220
  # EOF