bachtrackapi 0.1.0__tar.gz

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,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Clark Maio
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,7 @@
1
+ include README.md
2
+ include LICENSE
3
+ include requirements.txt
4
+ include pyproject.toml
5
+ recursive-exclude * __pycache__
6
+ recursive-exclude * *.py[cod]
7
+ recursive-exclude * .DS_Store
@@ -0,0 +1,163 @@
1
+ Metadata-Version: 2.4
2
+ Name: bachtrackapi
3
+ Version: 0.1.0
4
+ Summary: A Python web scraper and REST API for extracting classical music opera events from Bachtrack.com
5
+ Author-email: Clark Maio <clark@example.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/clarkmaio/bachtrackapi
8
+ Project-URL: Repository, https://github.com/clarkmaio/bachtrackapi.git
9
+ Project-URL: Documentation, https://github.com/clarkmaio/bachtrackapi#readme
10
+ Project-URL: Issues, https://github.com/clarkmaio/bachtrackapi/issues
11
+ Keywords: scraper,api,opera,classical-music,fastapi,bachtrack
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Topic :: Internet :: WWW/HTTP
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Requires-Python: >=3.8
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: fastapi==0.104.1
27
+ Requires-Dist: uvicorn[standard]==0.24.0
28
+ Requires-Dist: pydantic==2.5.0
29
+ Requires-Dist: pydantic-settings==2.1.0
30
+ Requires-Dist: requests==2.31.0
31
+ Requires-Dist: beautifulsoup4==4.12.2
32
+ Requires-Dist: selenium==4.15.2
33
+ Requires-Dist: webdriver-manager==4.0.1
34
+ Requires-Dist: python-dotenv==1.0.0
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest==7.4.3; extra == "dev"
37
+ Requires-Dist: pytest-asyncio==0.21.1; extra == "dev"
38
+ Requires-Dist: black==23.12.0; extra == "dev"
39
+ Requires-Dist: flake8==6.1.0; extra == "dev"
40
+ Requires-Dist: mypy==1.7.0; extra == "dev"
41
+ Dynamic: license-file
42
+ Dynamic: requires-python
43
+
44
+ # BachtrackAPI
45
+
46
+ A Python web scraper and REST API for extracting classical music opera events from [Bachtrack.com](https://bachtrack.com/).
47
+
48
+ ## Overview
49
+
50
+ BachtrackAPI provides two complementary ways to access opera event data:
51
+
52
+ 1. **Scraper Module** - Direct web scraping of Bachtrack opera listings
53
+ 2. **FastAPI Backend** - RESTful API endpoints for searching and filtering events
54
+
55
+ Search by work ID (e.g., `12285` for Gianni Schicchi) or freetext (e.g., `"La Traviata"`).
56
+
57
+ ## Installation
58
+
59
+ ```bash
60
+ pip install -r requirements.txt
61
+ ```
62
+
63
+ ## Quick Start
64
+
65
+ ### 1. Using the Scraper Directly
66
+
67
+ ```python
68
+ from scraper.scraper import BachtrackScraper
69
+
70
+ scraper = BachtrackScraper()
71
+
72
+ # Search by work ID
73
+ events = scraper.search_operas(12285) # Gianni Schicchi
74
+ print(f"Found {len(events)} events")
75
+
76
+ # Search by freetext
77
+ events = scraper.search_operas("La Traviata")
78
+ for event in events:
79
+ print(f"{event['title']} - {event['city']} @ {event['venue']}")
80
+ ```
81
+
82
+ **Output:**
83
+ ```
84
+ Found 28 events
85
+ Gianni Schicchi - Berlin @ Deutsche Oper
86
+ Gianni Schicchi - Winterthur @ Stadttheater Winterthur
87
+ ...
88
+ ```
89
+
90
+ ### 2. Using the FastAPI Backend
91
+
92
+ Start the server:
93
+ ```bash
94
+ uvicorn api.main:app --reload
95
+ ```
96
+
97
+ **Example API Requests:**
98
+
99
+ ```bash
100
+ # Freetext search
101
+ curl "http://localhost:8000/api/v1/events/get_operas?q=gianni%20schicchi"
102
+
103
+ # Work ID search
104
+ curl "http://localhost:8000/api/v1/events/get_operas?q=12285"
105
+
106
+ # POST search
107
+ curl -X POST "http://localhost:8000/api/v1/events/search" \
108
+ -H "Content-Type: application/json" \
109
+ -d '{"work_id": 12285}'
110
+ ```
111
+
112
+ **Response:**
113
+ ```json
114
+ {
115
+ "query": "12285",
116
+ "total_results": 28,
117
+ "results": [
118
+ {
119
+ "title": "Gianni Schicchi",
120
+ "city": "Berlin",
121
+ "date": "2026-04-05T00:00:00",
122
+ "venue": "Deutsche Oper",
123
+ "detail_url": "https://bachtrack.com/opera-event/..."
124
+ }
125
+ ]
126
+ }
127
+ ```
128
+
129
+ ## Available Endpoints
130
+
131
+ - `GET /api/v1/events/get_operas?q=<search>` - Raw scraper output
132
+ - `GET /api/v1/events/search?work_id=<id>` - Search by work ID
133
+ - `GET /api/v1/events/search?q=<term>` - Freetext search
134
+ - `POST /api/v1/events/search` - JSON body search
135
+ - `GET /docs` - Interactive API documentation
136
+ - `GET /health` - Health check
137
+
138
+ ## Testing
139
+
140
+ ```bash
141
+ # Run scraper tests
142
+ python tests/test_scraper.py
143
+
144
+ # Run full API integration tests
145
+ pytest tests/test_api.py -v -s
146
+ ```
147
+
148
+ ## Project Structure
149
+
150
+ ```
151
+ scraper/scraper.py # Core scraping logic
152
+ api/
153
+ ├── main.py # FastAPI app factory
154
+ ├── routes/events.py # API endpoints
155
+ ├── models/event.py # Pydantic models
156
+ └── services/opera_service.py # Service layer
157
+ tests/ # Unit and integration tests
158
+ ```
159
+
160
+ ## License
161
+
162
+ MIT License - see [LICENSE](LICENSE) file for details
163
+
@@ -0,0 +1,120 @@
1
+ # BachtrackAPI
2
+
3
+ A Python web scraper and REST API for extracting classical music opera events from [Bachtrack.com](https://bachtrack.com/).
4
+
5
+ ## Overview
6
+
7
+ BachtrackAPI provides two complementary ways to access opera event data:
8
+
9
+ 1. **Scraper Module** - Direct web scraping of Bachtrack opera listings
10
+ 2. **FastAPI Backend** - RESTful API endpoints for searching and filtering events
11
+
12
+ Search by work ID (e.g., `12285` for Gianni Schicchi) or freetext (e.g., `"La Traviata"`).
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ pip install -r requirements.txt
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ ### 1. Using the Scraper Directly
23
+
24
+ ```python
25
+ from scraper.scraper import BachtrackScraper
26
+
27
+ scraper = BachtrackScraper()
28
+
29
+ # Search by work ID
30
+ events = scraper.search_operas(12285) # Gianni Schicchi
31
+ print(f"Found {len(events)} events")
32
+
33
+ # Search by freetext
34
+ events = scraper.search_operas("La Traviata")
35
+ for event in events:
36
+ print(f"{event['title']} - {event['city']} @ {event['venue']}")
37
+ ```
38
+
39
+ **Output:**
40
+ ```
41
+ Found 28 events
42
+ Gianni Schicchi - Berlin @ Deutsche Oper
43
+ Gianni Schicchi - Winterthur @ Stadttheater Winterthur
44
+ ...
45
+ ```
46
+
47
+ ### 2. Using the FastAPI Backend
48
+
49
+ Start the server:
50
+ ```bash
51
+ uvicorn api.main:app --reload
52
+ ```
53
+
54
+ **Example API Requests:**
55
+
56
+ ```bash
57
+ # Freetext search
58
+ curl "http://localhost:8000/api/v1/events/get_operas?q=gianni%20schicchi"
59
+
60
+ # Work ID search
61
+ curl "http://localhost:8000/api/v1/events/get_operas?q=12285"
62
+
63
+ # POST search
64
+ curl -X POST "http://localhost:8000/api/v1/events/search" \
65
+ -H "Content-Type: application/json" \
66
+ -d '{"work_id": 12285}'
67
+ ```
68
+
69
+ **Response:**
70
+ ```json
71
+ {
72
+ "query": "12285",
73
+ "total_results": 28,
74
+ "results": [
75
+ {
76
+ "title": "Gianni Schicchi",
77
+ "city": "Berlin",
78
+ "date": "2026-04-05T00:00:00",
79
+ "venue": "Deutsche Oper",
80
+ "detail_url": "https://bachtrack.com/opera-event/..."
81
+ }
82
+ ]
83
+ }
84
+ ```
85
+
86
+ ## Available Endpoints
87
+
88
+ - `GET /api/v1/events/get_operas?q=<search>` - Raw scraper output
89
+ - `GET /api/v1/events/search?work_id=<id>` - Search by work ID
90
+ - `GET /api/v1/events/search?q=<term>` - Freetext search
91
+ - `POST /api/v1/events/search` - JSON body search
92
+ - `GET /docs` - Interactive API documentation
93
+ - `GET /health` - Health check
94
+
95
+ ## Testing
96
+
97
+ ```bash
98
+ # Run scraper tests
99
+ python tests/test_scraper.py
100
+
101
+ # Run full API integration tests
102
+ pytest tests/test_api.py -v -s
103
+ ```
104
+
105
+ ## Project Structure
106
+
107
+ ```
108
+ scraper/scraper.py # Core scraping logic
109
+ api/
110
+ ├── main.py # FastAPI app factory
111
+ ├── routes/events.py # API endpoints
112
+ ├── models/event.py # Pydantic models
113
+ └── services/opera_service.py # Service layer
114
+ tests/ # Unit and integration tests
115
+ ```
116
+
117
+ ## License
118
+
119
+ MIT License - see [LICENSE](LICENSE) file for details
120
+
@@ -0,0 +1 @@
1
+ """FastAPI backend for Bachtrack opera events API."""
@@ -0,0 +1,35 @@
1
+ """FastAPI application factory."""
2
+ from fastapi import FastAPI
3
+ from fastapi.middleware.cors import CORSMiddleware
4
+ from api.routes.events import router as events_router
5
+
6
+
7
+ def create_app() -> FastAPI:
8
+ """Create and configure FastAPI application."""
9
+ app = FastAPI(
10
+ title="BachtrackAPI",
11
+ description="API to search and retrieve opera events from Bachtrack.com",
12
+ version="0.1.0",
13
+ )
14
+
15
+ # Add CORS middleware
16
+ app.add_middleware(
17
+ CORSMiddleware,
18
+ allow_origins=["*"],
19
+ allow_credentials=True,
20
+ allow_methods=["*"],
21
+ allow_headers=["*"],
22
+ )
23
+
24
+ # Include routers
25
+ app.include_router(events_router)
26
+
27
+ # Health check endpoint
28
+ @app.get("/health")
29
+ async def health_check():
30
+ return {"status": "ok"}
31
+
32
+ return app
33
+
34
+
35
+ app = create_app()
@@ -0,0 +1,163 @@
1
+ Metadata-Version: 2.4
2
+ Name: bachtrackapi
3
+ Version: 0.1.0
4
+ Summary: A Python web scraper and REST API for extracting classical music opera events from Bachtrack.com
5
+ Author-email: Clark Maio <clark@example.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/clarkmaio/bachtrackapi
8
+ Project-URL: Repository, https://github.com/clarkmaio/bachtrackapi.git
9
+ Project-URL: Documentation, https://github.com/clarkmaio/bachtrackapi#readme
10
+ Project-URL: Issues, https://github.com/clarkmaio/bachtrackapi/issues
11
+ Keywords: scraper,api,opera,classical-music,fastapi,bachtrack
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Topic :: Internet :: WWW/HTTP
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Requires-Python: >=3.8
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: fastapi==0.104.1
27
+ Requires-Dist: uvicorn[standard]==0.24.0
28
+ Requires-Dist: pydantic==2.5.0
29
+ Requires-Dist: pydantic-settings==2.1.0
30
+ Requires-Dist: requests==2.31.0
31
+ Requires-Dist: beautifulsoup4==4.12.2
32
+ Requires-Dist: selenium==4.15.2
33
+ Requires-Dist: webdriver-manager==4.0.1
34
+ Requires-Dist: python-dotenv==1.0.0
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest==7.4.3; extra == "dev"
37
+ Requires-Dist: pytest-asyncio==0.21.1; extra == "dev"
38
+ Requires-Dist: black==23.12.0; extra == "dev"
39
+ Requires-Dist: flake8==6.1.0; extra == "dev"
40
+ Requires-Dist: mypy==1.7.0; extra == "dev"
41
+ Dynamic: license-file
42
+ Dynamic: requires-python
43
+
44
+ # BachtrackAPI
45
+
46
+ A Python web scraper and REST API for extracting classical music opera events from [Bachtrack.com](https://bachtrack.com/).
47
+
48
+ ## Overview
49
+
50
+ BachtrackAPI provides two complementary ways to access opera event data:
51
+
52
+ 1. **Scraper Module** - Direct web scraping of Bachtrack opera listings
53
+ 2. **FastAPI Backend** - RESTful API endpoints for searching and filtering events
54
+
55
+ Search by work ID (e.g., `12285` for Gianni Schicchi) or freetext (e.g., `"La Traviata"`).
56
+
57
+ ## Installation
58
+
59
+ ```bash
60
+ pip install -r requirements.txt
61
+ ```
62
+
63
+ ## Quick Start
64
+
65
+ ### 1. Using the Scraper Directly
66
+
67
+ ```python
68
+ from scraper.scraper import BachtrackScraper
69
+
70
+ scraper = BachtrackScraper()
71
+
72
+ # Search by work ID
73
+ events = scraper.search_operas(12285) # Gianni Schicchi
74
+ print(f"Found {len(events)} events")
75
+
76
+ # Search by freetext
77
+ events = scraper.search_operas("La Traviata")
78
+ for event in events:
79
+ print(f"{event['title']} - {event['city']} @ {event['venue']}")
80
+ ```
81
+
82
+ **Output:**
83
+ ```
84
+ Found 28 events
85
+ Gianni Schicchi - Berlin @ Deutsche Oper
86
+ Gianni Schicchi - Winterthur @ Stadttheater Winterthur
87
+ ...
88
+ ```
89
+
90
+ ### 2. Using the FastAPI Backend
91
+
92
+ Start the server:
93
+ ```bash
94
+ uvicorn api.main:app --reload
95
+ ```
96
+
97
+ **Example API Requests:**
98
+
99
+ ```bash
100
+ # Freetext search
101
+ curl "http://localhost:8000/api/v1/events/get_operas?q=gianni%20schicchi"
102
+
103
+ # Work ID search
104
+ curl "http://localhost:8000/api/v1/events/get_operas?q=12285"
105
+
106
+ # POST search
107
+ curl -X POST "http://localhost:8000/api/v1/events/search" \
108
+ -H "Content-Type: application/json" \
109
+ -d '{"work_id": 12285}'
110
+ ```
111
+
112
+ **Response:**
113
+ ```json
114
+ {
115
+ "query": "12285",
116
+ "total_results": 28,
117
+ "results": [
118
+ {
119
+ "title": "Gianni Schicchi",
120
+ "city": "Berlin",
121
+ "date": "2026-04-05T00:00:00",
122
+ "venue": "Deutsche Oper",
123
+ "detail_url": "https://bachtrack.com/opera-event/..."
124
+ }
125
+ ]
126
+ }
127
+ ```
128
+
129
+ ## Available Endpoints
130
+
131
+ - `GET /api/v1/events/get_operas?q=<search>` - Raw scraper output
132
+ - `GET /api/v1/events/search?work_id=<id>` - Search by work ID
133
+ - `GET /api/v1/events/search?q=<term>` - Freetext search
134
+ - `POST /api/v1/events/search` - JSON body search
135
+ - `GET /docs` - Interactive API documentation
136
+ - `GET /health` - Health check
137
+
138
+ ## Testing
139
+
140
+ ```bash
141
+ # Run scraper tests
142
+ python tests/test_scraper.py
143
+
144
+ # Run full API integration tests
145
+ pytest tests/test_api.py -v -s
146
+ ```
147
+
148
+ ## Project Structure
149
+
150
+ ```
151
+ scraper/scraper.py # Core scraping logic
152
+ api/
153
+ ├── main.py # FastAPI app factory
154
+ ├── routes/events.py # API endpoints
155
+ ├── models/event.py # Pydantic models
156
+ └── services/opera_service.py # Service layer
157
+ tests/ # Unit and integration tests
158
+ ```
159
+
160
+ ## License
161
+
162
+ MIT License - see [LICENSE](LICENSE) file for details
163
+
@@ -0,0 +1,20 @@
1
+ LICENSE
2
+ MANIFEST.in
3
+ README.md
4
+ pyproject.toml
5
+ requirements.txt
6
+ setup.py
7
+ api/__init__.py
8
+ api/main.py
9
+ bachtrackapi.egg-info/PKG-INFO
10
+ bachtrackapi.egg-info/SOURCES.txt
11
+ bachtrackapi.egg-info/dependency_links.txt
12
+ bachtrackapi.egg-info/requires.txt
13
+ bachtrackapi.egg-info/top_level.txt
14
+ scraper/__init__.py
15
+ scraper/scraper.py
16
+ tests/test_api.py
17
+ tests/test_api_v2.py
18
+ tests/test_datetime.py
19
+ tests/test_freetext.py
20
+ tests/test_scraper.py
@@ -0,0 +1,16 @@
1
+ fastapi==0.104.1
2
+ uvicorn[standard]==0.24.0
3
+ pydantic==2.5.0
4
+ pydantic-settings==2.1.0
5
+ requests==2.31.0
6
+ beautifulsoup4==4.12.2
7
+ selenium==4.15.2
8
+ webdriver-manager==4.0.1
9
+ python-dotenv==1.0.0
10
+
11
+ [dev]
12
+ pytest==7.4.3
13
+ pytest-asyncio==0.21.1
14
+ black==23.12.0
15
+ flake8==6.1.0
16
+ mypy==1.7.0
@@ -0,0 +1,2 @@
1
+ api
2
+ scraper
@@ -0,0 +1,76 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "bachtrackapi"
7
+ version = "0.1.0"
8
+ description = "A Python web scraper and REST API for extracting classical music opera events from Bachtrack.com"
9
+ readme = "README.md"
10
+ requires-python = ">=3.8"
11
+ license = {text = "MIT"}
12
+ authors = [
13
+ {name = "Clark Maio", email = "clark@example.com"}
14
+ ]
15
+ keywords = ["scraper", "api", "opera", "classical-music", "fastapi", "bachtrack"]
16
+ classifiers = [
17
+ "Development Status :: 3 - Alpha",
18
+ "Intended Audience :: Developers",
19
+ "License :: OSI Approved :: MIT License",
20
+ "Operating System :: OS Independent",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3.8",
23
+ "Programming Language :: Python :: 3.9",
24
+ "Programming Language :: Python :: 3.10",
25
+ "Programming Language :: Python :: 3.11",
26
+ "Topic :: Internet :: WWW/HTTP",
27
+ "Topic :: Software Development :: Libraries :: Python Modules",
28
+ ]
29
+
30
+ dependencies = [
31
+ "fastapi==0.104.1",
32
+ "uvicorn[standard]==0.24.0",
33
+ "pydantic==2.5.0",
34
+ "pydantic-settings==2.1.0",
35
+ "requests==2.31.0",
36
+ "beautifulsoup4==4.12.2",
37
+ "selenium==4.15.2",
38
+ "webdriver-manager==4.0.1",
39
+ "python-dotenv==1.0.0",
40
+ ]
41
+
42
+ [project.optional-dependencies]
43
+ dev = [
44
+ "pytest==7.4.3",
45
+ "pytest-asyncio==0.21.1",
46
+ "black==23.12.0",
47
+ "flake8==6.1.0",
48
+ "mypy==1.7.0",
49
+ ]
50
+
51
+ [project.urls]
52
+ Homepage = "https://github.com/clarkmaio/bachtrackapi"
53
+ Repository = "https://github.com/clarkmaio/bachtrackapi.git"
54
+ Documentation = "https://github.com/clarkmaio/bachtrackapi#readme"
55
+ Issues = "https://github.com/clarkmaio/bachtrackapi/issues"
56
+
57
+ [tool.setuptools]
58
+ packages = ["api", "scraper"]
59
+
60
+ [tool.setuptools.package-data]
61
+ api = ["py.typed"]
62
+
63
+ [tool.black]
64
+ line-length = 100
65
+ target-version = ["py38", "py39", "py310", "py311"]
66
+
67
+ [tool.pytest.ini_options]
68
+ testpaths = ["tests"]
69
+ python_files = "test_*.py"
70
+ addopts = "-v --strict-markers"
71
+
72
+ [tool.mypy]
73
+ python_version = "3.10"
74
+ warn_return_any = true
75
+ warn_unused_configs = true
76
+ disallow_untyped_defs = false
@@ -0,0 +1,11 @@
1
+ fastapi==0.104.1
2
+ uvicorn[standard]==0.24.0
3
+ pydantic==2.5.0
4
+ pydantic-settings==2.1.0
5
+ requests==2.31.0
6
+ beautifulsoup4==4.12.2
7
+ selenium==4.15.2
8
+ webdriver-manager==4.0.1
9
+ python-dotenv==1.0.0
10
+ pytest==7.4.3
11
+ pytest-asyncio==0.21.1
@@ -0,0 +1,3 @@
1
+
2
+
3
+ from .scraper import BachtrackScraper