scitex 2.4.2__py3-none-any.whl → 2.4.3__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.
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: ./src/scitex/scholar/pdf_download/strategies/open_access_download.py
4
+ """
5
+ Open Access PDF Download Strategy.
6
+
7
+ Downloads PDFs from known Open Access sources with appropriate handling
8
+ for each source type (arXiv, PubMed Central, OpenAlex OA URLs, etc.).
9
+ """
10
+
11
+ from pathlib import Path
12
+ from typing import Optional, Dict, Any
13
+ import aiohttp
14
+
15
+ from scitex import logging
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ # Known OA source patterns and their handlers
21
+ OA_SOURCE_PATTERNS = {
22
+ 'arxiv': {
23
+ 'patterns': ['arxiv.org'],
24
+ 'pdf_transform': lambda url: url.replace('/abs/', '/pdf/') + '.pdf' if '/abs/' in url else url,
25
+ },
26
+ 'pmc': {
27
+ 'patterns': ['ncbi.nlm.nih.gov/pmc', 'europepmc.org'],
28
+ 'pdf_transform': lambda url: url, # PMC links are usually direct
29
+ },
30
+ 'biorxiv': {
31
+ 'patterns': ['biorxiv.org', 'medrxiv.org'],
32
+ 'pdf_transform': lambda url: url + '.full.pdf' if not url.endswith('.pdf') else url,
33
+ },
34
+ 'doaj': {
35
+ 'patterns': ['doaj.org'],
36
+ 'pdf_transform': lambda url: url,
37
+ },
38
+ 'zenodo': {
39
+ 'patterns': ['zenodo.org'],
40
+ 'pdf_transform': lambda url: url,
41
+ },
42
+ }
43
+
44
+
45
+ def _identify_oa_source(url: str) -> Optional[str]:
46
+ """Identify which OA source a URL belongs to."""
47
+ url_lower = url.lower()
48
+ for source_name, config in OA_SOURCE_PATTERNS.items():
49
+ for pattern in config['patterns']:
50
+ if pattern in url_lower:
51
+ return source_name
52
+ return None
53
+
54
+
55
+ def _transform_to_pdf_url(url: str, source: str) -> str:
56
+ """Transform URL to direct PDF URL based on source."""
57
+ if source in OA_SOURCE_PATTERNS:
58
+ transform_func = OA_SOURCE_PATTERNS[source]['pdf_transform']
59
+ return transform_func(url)
60
+ return url
61
+
62
+
63
+ async def try_download_open_access_async(
64
+ oa_url: str,
65
+ output_path: Path,
66
+ metadata: Optional[Dict[str, Any]] = None,
67
+ func_name: str = "try_download_open_access_async",
68
+ timeout: int = 60,
69
+ ) -> Optional[Path]:
70
+ """
71
+ Download PDF from an Open Access URL.
72
+
73
+ This strategy is simpler than browser-based strategies because OA PDFs
74
+ are typically directly accessible without authentication.
75
+
76
+ Args:
77
+ oa_url: Open Access URL (from OpenAlex oa_url, arXiv, PMC, etc.)
78
+ output_path: Path to save the downloaded PDF
79
+ metadata: Optional paper metadata for logging
80
+ func_name: Function name for logging
81
+ timeout: Download timeout in seconds
82
+
83
+ Returns:
84
+ Path to downloaded PDF if successful, None otherwise
85
+ """
86
+ if not oa_url:
87
+ logger.debug(f"{func_name}: No OA URL provided")
88
+ return None
89
+
90
+ # Identify source and transform URL if needed
91
+ source = _identify_oa_source(oa_url)
92
+ pdf_url = _transform_to_pdf_url(oa_url, source) if source else oa_url
93
+
94
+ logger.info(f"{func_name}: Attempting OA download from {source or 'unknown'}: {pdf_url[:80]}...")
95
+
96
+ try:
97
+ # Create output directory if needed
98
+ output_path = Path(output_path)
99
+ output_path.parent.mkdir(parents=True, exist_ok=True)
100
+
101
+ # Use aiohttp for async download
102
+ async with aiohttp.ClientSession() as session:
103
+ headers = {
104
+ 'User-Agent': 'SciTeX/1.0 (Academic Research Tool; mailto:contact@scitex.io)',
105
+ 'Accept': 'application/pdf,*/*',
106
+ }
107
+
108
+ async with session.get(pdf_url, headers=headers, timeout=aiohttp.ClientTimeout(total=timeout)) as response:
109
+ if response.status != 200:
110
+ logger.warning(f"{func_name}: HTTP {response.status} from {pdf_url}")
111
+ return None
112
+
113
+ content_type = response.headers.get('Content-Type', '')
114
+
115
+ # Verify we're getting a PDF
116
+ if 'pdf' not in content_type.lower() and not pdf_url.endswith('.pdf'):
117
+ # Some servers don't set content-type correctly, check magic bytes
118
+ first_bytes = await response.content.read(5)
119
+ if first_bytes != b'%PDF-':
120
+ logger.warning(f"{func_name}: Response is not a PDF (content-type: {content_type})")
121
+ return None
122
+ # Reset for full download
123
+ content = first_bytes + await response.content.read()
124
+ else:
125
+ content = await response.read()
126
+
127
+ # Validate PDF content
128
+ if len(content) < 1000: # PDF should be at least 1KB
129
+ logger.warning(f"{func_name}: Downloaded content too small ({len(content)} bytes)")
130
+ return None
131
+
132
+ if not content.startswith(b'%PDF-'):
133
+ logger.warning(f"{func_name}: Downloaded content is not a valid PDF")
134
+ return None
135
+
136
+ # Save to file
137
+ with open(output_path, 'wb') as f:
138
+ f.write(content)
139
+
140
+ size_mb = len(content) / 1024 / 1024
141
+ logger.info(f"{func_name}: Successfully downloaded {size_mb:.2f} MB to {output_path}")
142
+ return output_path
143
+
144
+ except aiohttp.ClientError as e:
145
+ logger.warning(f"{func_name}: HTTP client error: {e}")
146
+ return None
147
+ except TimeoutError:
148
+ logger.warning(f"{func_name}: Download timed out after {timeout}s")
149
+ return None
150
+ except Exception as e:
151
+ logger.error(f"{func_name}: Download failed: {e}")
152
+ return None
153
+
154
+
155
+ def try_download_open_access_sync(
156
+ oa_url: str,
157
+ output_path: Path,
158
+ metadata: Optional[Dict[str, Any]] = None,
159
+ timeout: int = 60,
160
+ ) -> Optional[Path]:
161
+ """
162
+ Synchronous wrapper for try_download_open_access_async.
163
+
164
+ Args:
165
+ oa_url: Open Access URL
166
+ output_path: Path to save the downloaded PDF
167
+ metadata: Optional paper metadata
168
+ timeout: Download timeout in seconds
169
+
170
+ Returns:
171
+ Path to downloaded PDF if successful, None otherwise
172
+ """
173
+ import asyncio
174
+
175
+ try:
176
+ loop = asyncio.get_event_loop()
177
+ except RuntimeError:
178
+ loop = asyncio.new_event_loop()
179
+ asyncio.set_event_loop(loop)
180
+
181
+ return loop.run_until_complete(
182
+ try_download_open_access_async(oa_url, output_path, metadata, timeout=timeout)
183
+ )
184
+
185
+
186
+ # EOF
@@ -32,6 +32,7 @@ from datetime import datetime
32
32
 
33
33
  from scitex import logging
34
34
  from scitex.scholar.core import Paper
35
+ from scitex.scholar.core import normalize_journal_name
35
36
  from scitex.scholar.search_engines.individual.PubMedSearchEngine import PubMedSearchEngine
36
37
  from scitex.scholar.search_engines.individual.CrossRefSearchEngine import CrossRefSearchEngine
37
38
  from scitex.scholar.search_engines.individual.ArXivSearchEngine import ArXivSearchEngine
@@ -331,12 +332,18 @@ class ScholarPipelineSearchParallel:
331
332
  if 'metrics' in result:
332
333
  if result['metrics'].get('citation_count'):
333
334
  paper.metadata.citation_count.total = result['metrics']['citation_count']
334
- # Note: is_open_access not in Paper structure
335
+ if 'is_open_access' in result['metrics']:
336
+ paper.metadata.access.is_open_access = result['metrics']['is_open_access']
337
+ paper.metadata.access.is_open_access_engines = [engine_name]
335
338
 
336
339
  if 'urls' in result:
337
340
  if result['urls'].get('pdf'):
338
341
  # pdfs is a list of dicts with url/source keys
339
342
  paper.metadata.url.pdfs = [{'url': result['urls']['pdf'], 'source': 'search'}]
343
+ # If this is an open access paper, also store the PDF URL as oa_url
344
+ if paper.metadata.access.is_open_access:
345
+ paper.metadata.access.oa_url = result['urls']['pdf']
346
+ paper.metadata.access.oa_url_engines = [engine_name]
340
347
  if result['urls'].get('publisher'):
341
348
  paper.metadata.url.publisher = result['urls']['publisher']
342
349
  if result['urls'].get('doi_url'):
@@ -733,13 +740,21 @@ class ScholarPipelineSearchParallel:
733
740
 
734
741
  # Publication info
735
742
  if hasattr(meta, 'publication'):
736
- result['journal'] = meta.publication.journal or ''
743
+ journal_raw = meta.publication.journal or ''
744
+ result['journal'] = normalize_journal_name(journal_raw) if journal_raw else ''
737
745
  result['impact_factor'] = meta.publication.impact_factor
738
746
 
739
747
  # Metrics
740
748
  if hasattr(meta, 'citation_count'):
741
749
  result['citation_count'] = meta.citation_count.total or 0
742
- result['is_open_access'] = False # Not stored in current Paper structure
750
+
751
+ # Access metadata
752
+ if hasattr(meta, 'access'):
753
+ result['is_open_access'] = meta.access.is_open_access or False
754
+ result['oa_status'] = meta.access.oa_status
755
+ result['oa_url'] = meta.access.oa_url
756
+ else:
757
+ result['is_open_access'] = False
743
758
 
744
759
  # URLs
745
760
  if hasattr(meta, 'url'):
@@ -268,12 +268,18 @@ class ScholarPipelineSearchSingle:
268
268
  if 'metrics' in result:
269
269
  if result['metrics'].get('citation_count'):
270
270
  paper.metadata.citation_count.total = result['metrics']['citation_count']
271
- # Note: is_open_access not in Paper structure
271
+ if 'is_open_access' in result['metrics']:
272
+ paper.metadata.access.is_open_access = result['metrics']['is_open_access']
273
+ paper.metadata.access.is_open_access_engines = [engine_name]
272
274
 
273
275
  if 'urls' in result:
274
276
  if result['urls'].get('pdf'):
275
277
  # pdfs is a list of dicts with url/source keys
276
278
  paper.metadata.url.pdfs = [{'url': result['urls']['pdf'], 'source': 'search'}]
279
+ # If this is an open access paper, also store the PDF URL as oa_url
280
+ if paper.metadata.access.is_open_access:
281
+ paper.metadata.access.oa_url = result['urls']['pdf']
282
+ paper.metadata.access.oa_url_engines = [engine_name]
277
283
  if result['urls'].get('publisher'):
278
284
  paper.metadata.url.publisher = result['urls']['publisher']
279
285
  if result['urls'].get('doi_url'):
@@ -461,7 +467,14 @@ class ScholarPipelineSearchSingle:
461
467
  # Metrics
462
468
  if hasattr(meta, 'citation_count'):
463
469
  result['citation_count'] = meta.citation_count.total or 0
464
- result['is_open_access'] = False # Not stored in current Paper structure
470
+
471
+ # Access metadata
472
+ if hasattr(meta, 'access'):
473
+ result['is_open_access'] = meta.access.is_open_access or False
474
+ result['oa_status'] = meta.access.oa_status
475
+ result['oa_url'] = meta.access.oa_url
476
+ else:
477
+ result['is_open_access'] = False
465
478
 
466
479
  # URLs
467
480
  if hasattr(meta, 'url'):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scitex
3
- Version: 2.4.2
3
+ Version: 2.4.3
4
4
  Summary: A comprehensive Python library for scientific computing and data analysis
5
5
  Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-code
6
6
  Project-URL: Documentation, https://scitex.readthedocs.io
@@ -1,7 +1,7 @@
1
1
  scitex/.mcp.json,sha256=ge1NDrBZkRIxJgx_tCS9QvcEa_P_ay8AAAafraZVRP4,1259
2
2
  scitex/__init__.py,sha256=8MkZBGNQrJj9Iy0qKI5aVUYWXyFW8I2HCIdxG8O9WuY,5778
3
3
  scitex/__main__.py,sha256=m0B6tnYHtUnkY7tXQab7qlqfNsLTtHqtWOs1Sg-wnhw,488
4
- scitex/__version__.py,sha256=lH8tHpaUufmR8xJZbWuMiClgRz_ZaOPAKQsQbIyY6Do,400
4
+ scitex/__version__.py,sha256=9jMqN4MJ8401QbqhffA5qUyQAvmSxbq3WRWDLytDssY,400
5
5
  scitex/_optional_deps.py,sha256=oHwPdE6uJ4MmWNgt7JXojNtbwkUjR4c0mCCNMOK4k-w,3696
6
6
  scitex/errors.py,sha256=sgl1csU2sfHCINxO9jwPCdNA6hr-CqaT8tQMiuH93sQ,15247
7
7
  scitex/units.py,sha256=2T6VCwcjHBT_zPr_DG3JhUIF7a7TU1pUxMQPDBKZNCw,10373
@@ -142,7 +142,7 @@ scitex/benchmark/benchmark.py,sha256=5WEubBdW4jqZAqd1AFrlDeKjTg15DvUc7wTjtNgL8Aw
142
142
  scitex/benchmark/monitor.py,sha256=ge7eLEl3mtLprdtIT4liWqim9cquMekgQY4xyaVlTRI,11609
143
143
  scitex/benchmark/profiler.py,sha256=aC8Cb_AZdtTS2T-HWj3srUk-unGpZ_y4hz-6K387jcw,8633
144
144
  scitex/browser/README.md,sha256=xpYYwib632qOyLCeAIBNtwE2o8frDiLXTyacw2fAz6k,4436
145
- scitex/browser/__init__.py,sha256=IJmGAT7y263VGawwlLpe4gc5aozIqcEAkr9gdnnA0Ws,1024
145
+ scitex/browser/__init__.py,sha256=piiLZLPHPzeW0QrTPx2aiRS7_6TzDptAomDMn1ffs10,2725
146
146
  scitex/browser/auth/__init__.py,sha256=mSHD6yUmDsgADN9U4D2Hm5Pi7y4mWYBCsdRnTcB9BHY,910
147
147
  scitex/browser/auth/google.py,sha256=a9TTxAhry6fezLv5JAGKFMgDtuRy5a-1HWpsTSO3Qcw,13054
148
148
  scitex/browser/automation/CookieHandler.py,sha256=EAWEOQwdneVHCrN-evtrouYBw7wsT0rG472DpeimBVM,6810
@@ -159,10 +159,14 @@ scitex/browser/collaboration/visual_feedback.py,sha256=0UOLczpMV408AU4zcToOKK3J0
159
159
  scitex/browser/core/BrowserMixin.py,sha256=P1CNBj0Rx9op6cONfwZMs575A6J2Bsp1TGaO7Dy51n0,10968
160
160
  scitex/browser/core/ChromeProfileManager.py,sha256=vWfGQF05dAmmQBcRVmuUV9axoST7RDIczNDPvQq1KUo,14542
161
161
  scitex/browser/core/__init__.py,sha256=bl533RumUuDg4-zrzr5X8BbTn_wIMcc4wkuG5A0QN9U,200
162
- scitex/browser/debugging/__init__.py,sha256=j32aq6AK7UkCtTguDcksnPc-s-Y4jtukoakpacTP_Zw,443
162
+ scitex/browser/debugging/__init__.py,sha256=q7e1tYecO3nJflNHfur2JkLXZazJW4AZT-Dxz3vnc8k,1971
163
163
  scitex/browser/debugging/_browser_logger.py,sha256=ZhQQ5ohZHpeWZ6fRBFjPV6zLWnKP5ZiCxW1PIIDW0SU,20406
164
+ scitex/browser/debugging/_failure_capture.py,sha256=qc5xIkkjYDVge-74bRh60X9MARVe9GVisbOlnt9pjWQ,11662
164
165
  scitex/browser/debugging/_highlight_element.py,sha256=EXYInkCGwbKM2NWxX1_aWWSiQNFTwu03zneNsBF9U_w,3925
165
166
  scitex/browser/debugging/_show_grid.py,sha256=dyBvAZFAeD5-EgldlC8mfcPDYA9J28K4hVY4YFdidUI,4042
167
+ scitex/browser/debugging/_sync_session.py,sha256=GXJsr20rEVY71bbQpmlBFx13Bi0S0frridLFQdZUs8s,8044
168
+ scitex/browser/debugging/_test_monitor.py,sha256=_1yiDXcPRP6iEA8304lagXs38N_2yAM65OKzf7ydkUE,8227
169
+ scitex/browser/debugging/_visual_cursor.py,sha256=e-bC5Zf4tW8GPpFc4l4aGxvHKFGIZvfFHUKAj1enBYs,13855
166
170
  scitex/browser/docs/ABOUT_PLAYWRIGHT.md,sha256=3ovUznFqms50F1CuRr-3lNC2Xk86TR_ytItNO2mDNAQ,1418
167
171
  scitex/browser/interaction/__init__.py,sha256=wT0bf6VlTuuyyazN3SDrKelIaIlUYjpD1aBM3HOcGqY,586
168
172
  scitex/browser/interaction/click_center.py,sha256=sXFHnSuSohYlbOyVWzkviKjnBjtqB_JkBU1ut0O8jvo,3514
@@ -1591,7 +1595,7 @@ scitex/scholar/browser/utils/wait_redirects.py,sha256=5FZgp4qKZuwEA1wyFrvpu8EGNI
1591
1595
  scitex/scholar/citation_graph/README.md,sha256=CGEU_W15eLfu3iV33cQT3jwSHmagA3UmSYI5vAaDW2A,3316
1592
1596
  scitex/scholar/citation_graph/__init__.py,sha256=dmA79jVRsVlghbl2SlXS-i2FS-x1QJknCZZDM6Kidog,831
1593
1597
  scitex/scholar/citation_graph/builder.py,sha256=dAXksvgiwyxnEeW9gYuC_vOgjYzVghMQHUR7MN28wkw,6618
1594
- scitex/scholar/citation_graph/database.py,sha256=M2GLVa8O_2sG9tC974ywuSqv3KAfEHBb9m00vk7W6S8,6863
1598
+ scitex/scholar/citation_graph/database.py,sha256=NYoLF7VauK8RiEFt8_0ijp5T9fG-ZMl1Q5Lx6CCC0Z8,7067
1595
1599
  scitex/scholar/citation_graph/example.py,sha256=HtvSBnm41cdYycSzwXmRomL7qxxPIOkKQN6A0nvBhKw,2859
1596
1600
  scitex/scholar/citation_graph/models.py,sha256=qz2KgTq85-7QqzdjzTnk6Vho7bclQemxC6SMWzHgQww,2158
1597
1601
  scitex/scholar/cli/README.md,sha256=Qp9UBx4XHFwIhn61rq4pwXxmVwMNyAPHruSi8DowkiM,10946
@@ -1610,9 +1614,9 @@ scitex/scholar/cli/handlers/doi_handler.py,sha256=aEBa6imcAq9aeQRymBWlNgSUhfokyv
1610
1614
  scitex/scholar/cli/handlers/project_handler.py,sha256=lA9IUuHO3C3ZPhHKEkcMTpFgS9UppMCebOwhN5J5FEc,10120
1611
1615
  scitex/scholar/config/PublisherRules.py,sha256=wumxQXIaiFqG5gdSzd1_7bPytXZu2-WBpHZas4koHts,4570
1612
1616
  scitex/scholar/config/README.md,sha256=318vSWix8XiZCNSjahq6Cswww7ZmHPKB3eYi54XyZfM,880
1613
- scitex/scholar/config/ScholarConfig.py,sha256=KbiwbTPH-3S-1fpNbksog3XRSEVyfmyTZ9JhhhiAZCA,4320
1617
+ scitex/scholar/config/ScholarConfig.py,sha256=WsmDzLjJhNXYjjMsDs3yIWyco5s4qKHm-4XEz89DL28,5233
1614
1618
  scitex/scholar/config/__init__.py,sha256=xSQfplE2KxqFHxtAS44V-sNabAnK9JIxM68_9GFVIqI,499
1615
- scitex/scholar/config/default.yaml,sha256=Jgyq08_C6sKk-QeFrqEEJiRi9nsmXVYAUBP1-GfQjLI,17064
1619
+ scitex/scholar/config/default.yaml,sha256=DLO0pzCn_xFKr08rqOEFndQh_xs-Qkezt9RAENzvi-k,18693
1616
1620
  scitex/scholar/config/_categories/README.md,sha256=swb9Y-fSDK5IBst3bF96xH_syrRWpv7N8jz7gYQCyeQ,4806
1617
1621
  scitex/scholar/config/_categories/api_keys.yaml,sha256=wo2fAxXqQYU6JLkAf4VxvcIiJPIc1qOjx2LMp2hK-k8,739
1618
1622
  scitex/scholar/config/_categories/auth_gateway.yaml,sha256=resIZWaEyCRg0HIk0yJV194I4_Ur_OIQ2hLDswC-PqM,3448
@@ -1628,11 +1632,14 @@ scitex/scholar/config/_categories/url_finder_openurl.yaml,sha256=qIStUtKD1cII6g1
1628
1632
  scitex/scholar/config/_categories/url_finder_selectors.yaml,sha256=Hn_Amb1egy-2_9UxOqSd_g85zLwy0J8pIoztFGANsCo,3446
1629
1633
  scitex/scholar/config/core/_CascadeConfig.py,sha256=DR28mG-dvb4vTgk2bCTZKdT0oOKX3JSxlcmqmp-zAvQ,4855
1630
1634
  scitex/scholar/config/core/_PathManager.py,sha256=ddH2Ik2jeHGA6DKEaDZmrLO3AJz5bUNmhGojjYriISE,20899
1631
- scitex/scholar/core/Paper.py,sha256=sSQ9J02fw2JN4rrfdqYBxoITgMgEZAA6gJYBayP1LvQ,23044
1635
+ scitex/scholar/core/Paper.py,sha256=qhe_HKN6MI0CnY08uWTHReNhBA-pxcw6KMrvLpCeXbc,26806
1632
1636
  scitex/scholar/core/Papers.py,sha256=qrlXQIHuISCSEeKnvaSFQw8VgH6ujP946TH1dcu70mM,25123
1633
1637
  scitex/scholar/core/README.md,sha256=lzkBX327j4yo_R2cdAmLczzYqn9-tbewEWB91fUBrmo,3197
1634
1638
  scitex/scholar/core/Scholar.py,sha256=TVXJP0lpVCLR1NIB1gCi_R8kqPRf5IzLXJ4WsoYz2_k,73367
1635
- scitex/scholar/core/__init__.py,sha256=mbBTPyuv6Rnva7NXLB0-Y9H92FOY7DKXKUH6Hdims-A,138
1639
+ scitex/scholar/core/__init__.py,sha256=ZkI7H7n_VXHc_GW_oduRh8OERStv03iLyoM4hfvc4A8,1139
1640
+ scitex/scholar/core/journal_normalizer.py,sha256=dGkAA1fao-6h5Ofcm7EIudRY8EruRoZv6pQ2Up0Opbc,17497
1641
+ scitex/scholar/core/oa_cache.py,sha256=foPNOgdNkm2olSKDQp7Df_yuTdlJf3PdQdAYFyMrx7g,9826
1642
+ scitex/scholar/core/open_access.py,sha256=rVm_T1dvcYClnZtjUqI2dlTRl4RyFgz_kPnofOubAuw,14263
1636
1643
  scitex/scholar/docs/DETAILS_FOR_DEVELOPERS.md,sha256=E-Tv_xjaUlwzC8tGNEgQQCQTYxXhSCkccaCwMigxFAM,12878
1637
1644
  scitex/scholar/docs/IMPACT_FACTOR_CITATION_INTEGRATION.md,sha256=g2UPSSOzkt7V_kr3GqhFcrDWfBOFfTGHy22Slycziks,8986
1638
1645
  scitex/scholar/docs/PIPELINE_IMPLEMENTATION_COMPLETE.md,sha256=jG9MnwMjIbU8LFXrlaWhbTVeVudDpf7rrykivhMbsb8,9056
@@ -1875,21 +1882,22 @@ scitex/scholar/metadata_engines/utils/__init__.py,sha256=itAfU-rDnO51wPH1HvjKIwE
1875
1882
  scitex/scholar/metadata_engines/utils/_metadata2bibtex.py,sha256=3yDA29NYtrsyiDWAc2ARPflvrdHvcSZPE-D_GAPyWi8,3092
1876
1883
  scitex/scholar/metadata_engines/utils/_standardize_metadata.py,sha256=32j_GlqkyRXlM9tIXOojlWrvIgmwoDezW78vSDiVXRw,12319
1877
1884
  scitex/scholar/pdf_download/README.md,sha256=W-Xz3CcSPnZU9qLnUiA7s3nd-yH8SReG15sBttp7Gt0,1429
1878
- scitex/scholar/pdf_download/ScholarPDFDownloader.py,sha256=Isb4FOFbPZLXNYzhejLrtcr-BUa7kL6rraIJF_BGe68,18985
1885
+ scitex/scholar/pdf_download/ScholarPDFDownloader.py,sha256=Obam1sw8mqXydHmO_l9iAjNb68W-CbverWu8T6vWrrw,24468
1879
1886
  scitex/scholar/pdf_download/__init__.py,sha256=i5mmHd1wUKmTYRu3yUKxPrnRpWVW1OGDwAK-7r2Kma4,98
1880
- scitex/scholar/pdf_download/strategies/__init__.py,sha256=f5x3V3TJzpwrmYTGYXXZiea_PDsawD-9kRgYa2C26oI,1165
1887
+ scitex/scholar/pdf_download/strategies/__init__.py,sha256=7Mi9YWDXy5jd0WyDARvCwRHSA7iyd4zxYeRcVttqyC8,1349
1881
1888
  scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py,sha256=kq7nuIdrrKvvsPIApQcwVtFm8kyRgHaTYTLasY__a5c,14399
1882
1889
  scitex/scholar/pdf_download/strategies/direct_download.py,sha256=48cqMB4g85BKSoBNXTKdpiyv7Gbx3XZOTTRuzVyzruE,4419
1883
1890
  scitex/scholar/pdf_download/strategies/manual_download_fallback.py,sha256=ep8FnhRr7neihaSILZ_ux1I_oWaTXX9tMxWwkiXtdmA,5286
1884
1891
  scitex/scholar/pdf_download/strategies/manual_download_utils.py,sha256=j5holl_qjIGqN0WTyOVwmyv2sFOZAxcAdTglTDUhnFM,35759
1892
+ scitex/scholar/pdf_download/strategies/open_access_download.py,sha256=ISPPMsER66ChTvbjwLF-48idFAWLvam3Vf1UAxPacs4,6319
1885
1893
  scitex/scholar/pdf_download/strategies/response_body.py,sha256=fpk0GGiOLQk2Yll76G5YPE5S0a8hde4NQLk8OIrghck,6928
1886
1894
  scitex/scholar/pipelines/README.md,sha256=nvTlfY7qP084iZo93-qXfic8jjmbR4qqUZOtmuH391U,4478
1887
1895
  scitex/scholar/pipelines/ScholarPipelineBibTeX.py,sha256=OQ_CDAj9x5ZPK8gHdLUlBe9UvYCJXX7IJnp555X69CU,11017
1888
1896
  scitex/scholar/pipelines/ScholarPipelineMetadataParallel.py,sha256=IM97YAXHu05uXh3hsa_TuWwBaf2Trjx-kjsEf1qV5t0,9306
1889
1897
  scitex/scholar/pipelines/ScholarPipelineMetadataSingle.py,sha256=Cjo-A1pTEegmYm-EhkvkUDIdiSSCI_ke3BBw1JhSfI0,15550
1890
1898
  scitex/scholar/pipelines/ScholarPipelineParallel.py,sha256=qmMIaocwP1QIvckQKiPjvnOKzvbO5TnFFiLly5ncBNk,14854
1891
- scitex/scholar/pipelines/ScholarPipelineSearchParallel.py,sha256=3-38SC2iEvY6PnVc5BqDxXpWuHp9sSAxKut7Qm1QErA,30411
1892
- scitex/scholar/pipelines/ScholarPipelineSearchSingle.py,sha256=tibeMD5hf_J3_gqUFE7R8dYYtzy0f2IlkjO-iVhScok,18379
1899
+ scitex/scholar/pipelines/ScholarPipelineSearchParallel.py,sha256=In8x3hgzlwIyegD4LOJD-I9NZ0k7_8aZWJZ99cXDjT4,31271
1900
+ scitex/scholar/pipelines/ScholarPipelineSearchSingle.py,sha256=Qd5SloT5vhXEiOGCPFeBLwzzIjxobrDpQH5C920SoHs,19099
1893
1901
  scitex/scholar/pipelines/ScholarPipelineSingle.py,sha256=M0iFVCtgDWV5yzd-vUBedmxIdc1hoB1PbCNjzZUj62Q,27295
1894
1902
  scitex/scholar/pipelines/SearchQueryParser.py,sha256=7FGjO4Lj7zp-8o8JJjc8qXudY3-pYIjrQarcYFI_lBQ,10018
1895
1903
  scitex/scholar/pipelines/__init__.py,sha256=2739ioL2pNmtGCLmDr0mVd2M5c-N_9z27IfG8xVyKKY,2079
@@ -2925,8 +2933,8 @@ scitex/writer/utils/__init__.py,sha256=wizvQZbOWHsNnkdDsB8J4-lPInRM3gDdwOCRg1fLI
2925
2933
  scitex/writer/utils/_parse_latex_logs.py,sha256=_KfTzSw2IYhUzdZBJsZreAvQZk_BJHUBe2qIUNJfd-s,3154
2926
2934
  scitex/writer/utils/_parse_script_args.py,sha256=vVMQE-AHCs2Q2uVQDuZVN8N3Eft0sxuPtNmnyPXVgnc,4625
2927
2935
  scitex/writer/utils/_watch.py,sha256=qSBbwbeCPmXEWXn-ozCrar43rp664Wo65JzwIMWx7wE,2575
2928
- scitex-2.4.2.dist-info/METADATA,sha256=81TQLW57ldzvO0fvMM1bapwESLdYisGzh6QtaNaQZ7s,29660
2929
- scitex-2.4.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
2930
- scitex-2.4.2.dist-info/entry_points.txt,sha256=jmgM0XEEIfCoMvwDSUNwRHBHaX_cfcJWQgi-lFc-BNU,48
2931
- scitex-2.4.2.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
2932
- scitex-2.4.2.dist-info/RECORD,,
2936
+ scitex-2.4.3.dist-info/METADATA,sha256=2Cl9m8PVii8rfVZqZceefYFQeYZHW5XTpLiXtmgWA88,29660
2937
+ scitex-2.4.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
2938
+ scitex-2.4.3.dist-info/entry_points.txt,sha256=jmgM0XEEIfCoMvwDSUNwRHBHaX_cfcJWQgi-lFc-BNU,48
2939
+ scitex-2.4.3.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
2940
+ scitex-2.4.3.dist-info/RECORD,,
File without changes