refactor: improve code quality - fix imports, type hints, and security issues

## Critical Fixes
- Create error_handler module with custom exceptions and recovery strategies
  - Adds RetryableError, NonRetryableError, NetworkError, DownloadError
  - Implements with_error_recovery decorator for automatic retry logic
  - Provides RecoveryStrategies and FileCorruptionDetector classes
  - Fixes critical import error in enhanced_provider.py

- Fix CORS security vulnerability in fastapi_app.py
  - Replace allow_origins=['*'] with environment-based config
  - Use settings.cors_origins for production configurability
  - Add security warnings in code comments

## Type Hints Improvements
- Fix invalid type hint syntax in Provider.py
  - Change (str, [str]) to tuple[str, dict[str, Any]]
  - Rename GetLink() to get_link() (PEP8 compliance)
  - Add comprehensive docstrings for abstract method

- Update streaming provider implementations
  - voe.py: Add full type hints, update method signature
  - doodstream.py: Add full type hints, update method signature
  - Fix parameter naming (embededLink -> embedded_link)
  - Both now return tuple with headers dict

- Enhance base_provider.py documentation
  - Add comprehensive type hints to all abstract methods
  - Add detailed parameter documentation
  - Add return type documentation with examples

## Files Modified
- Created: src/core/error_handler.py (error handling infrastructure)
- Modified: 9 source files (type hints, naming, imports)
- Added: QUALITY_IMPROVEMENTS.md (implementation details)
- Added: TEST_VERIFICATION_REPORT.md (test status)
- Updated: QualityTODO.md (progress tracking)

## Testing
- All tests passing (unit, integration, API)
- No regressions detected
- All 10+ type checking violations resolved
- Code follows PEP8 and PEP257 standards

## Quality Metrics
- Import errors: 1 -> 0
- CORS security: High Risk -> Resolved
- Type hint errors: 12+ -> 0
- Abstract method docs: Minimal -> Comprehensive
- Test coverage: Maintained with no regressions
This commit is contained in:
2025-10-22 13:00:09 +02:00
parent f64ba74d93
commit 7437eb4c02
18 changed files with 846 additions and 234 deletions

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -0,0 +1,21 @@
{
"name": "Aniworld",
"data_dir": "data",
"scheduler": {
"enabled": true,
"interval_minutes": 60
},
"logging": {
"level": "INFO",
"file": null,
"max_bytes": null,
"backup_count": 3
},
"backup": {
"enabled": false,
"path": "data/backups",
"keep_days": 30
},
"other": {},
"version": "1.0.0"
}

View File

@@ -1,7 +1,7 @@
{
"pending": [
{
"id": "ce5dbeb5-d872-437d-aefc-bb6aedf42cf0",
"id": "42233fa7-50b3-4941-882c-be23e776e88c",
"serie_id": "workflow-series",
"serie_name": "Workflow Test Series",
"episode": {
@@ -11,7 +11,7 @@
},
"status": "pending",
"priority": "high",
"added_at": "2025-10-22T10:30:01.007391Z",
"added_at": "2025-10-22T10:57:26.642934Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -20,7 +20,7 @@
"source_url": null
},
{
"id": "29dfed73-c0af-4159-9b24-1802dcecb7ca",
"id": "eeafcd93-9df7-4429-872c-1220a642b775",
"serie_id": "series-2",
"serie_name": "Series 2",
"episode": {
@@ -30,7 +30,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.724654Z",
"added_at": "2025-10-22T10:57:26.331686Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -39,7 +39,7 @@
"source_url": null
},
{
"id": "1afc358a-a606-45c4-a9e7-8306e95e1f3b",
"id": "21b6d879-7478-4711-8a91-647383cc2d64",
"serie_id": "series-1",
"serie_name": "Series 1",
"episode": {
@@ -49,7 +49,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.722784Z",
"added_at": "2025-10-22T10:57:26.326103Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -58,7 +58,7 @@
"source_url": null
},
{
"id": "66b03e8d-7556-44ef-a9c4-06ca99ed54e7",
"id": "68ade854-067f-4486-bfb3-f0d0ce2cdb88",
"serie_id": "series-0",
"serie_name": "Series 0",
"episode": {
@@ -68,7 +68,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.720703Z",
"added_at": "2025-10-22T10:57:26.321881Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -77,7 +77,7 @@
"source_url": null
},
{
"id": "0cce266d-a2a4-4b4f-a75d-ee1325a70645",
"id": "bf18f799-ce21-4f06-bf8c-cc4a26b815f5",
"serie_id": "series-high",
"serie_name": "Series High",
"episode": {
@@ -87,7 +87,7 @@
},
"status": "pending",
"priority": "high",
"added_at": "2025-10-22T10:30:00.494291Z",
"added_at": "2025-10-22T10:57:26.077002Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -96,7 +96,7 @@
"source_url": null
},
{
"id": "6db02bdc-3586-4b09-9647-a5d382698c3b",
"id": "daebc904-6c32-4ca5-947c-18d25d43fdfe",
"serie_id": "test-series-2",
"serie_name": "Another Series",
"episode": {
@@ -106,7 +106,7 @@
},
"status": "pending",
"priority": "high",
"added_at": "2025-10-22T10:30:00.466528Z",
"added_at": "2025-10-22T10:57:26.051169Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -115,7 +115,7 @@
"source_url": null
},
{
"id": "67c4483e-4bd1-4e4c-a57f-30b47b0ea103",
"id": "aee9fdf2-4436-43ad-8c08-1bcdc2013bb4",
"serie_id": "test-series-1",
"serie_name": "Test Anime Series",
"episode": {
@@ -125,7 +125,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.442074Z",
"added_at": "2025-10-22T10:57:26.023723Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -134,7 +134,7 @@
"source_url": null
},
{
"id": "531d6683-10d0-4148-9def-8b247d08aa3d",
"id": "c45a72c3-11af-48dd-ba23-2f2d93bd0d3c",
"serie_id": "test-series-1",
"serie_name": "Test Anime Series",
"episode": {
@@ -144,7 +144,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.442169Z",
"added_at": "2025-10-22T10:57:26.023820Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -153,7 +153,7 @@
"source_url": null
},
{
"id": "e406ccf7-5a03-41d9-99b2-7b033f642ab0",
"id": "83e1e2bc-a1b5-49a2-a183-421884c183ce",
"serie_id": "series-normal",
"serie_name": "Series Normal",
"episode": {
@@ -163,7 +163,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.496264Z",
"added_at": "2025-10-22T10:57:26.082663Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -172,7 +172,7 @@
"source_url": null
},
{
"id": "3a87ada4-deec-47a3-9628-e2f671e628f1",
"id": "9a78d1b5-9e23-4e79-b4e4-40bf0a4ce8a1",
"serie_id": "series-low",
"serie_name": "Series Low",
"episode": {
@@ -182,7 +182,7 @@
},
"status": "pending",
"priority": "low",
"added_at": "2025-10-22T10:30:00.500874Z",
"added_at": "2025-10-22T10:57:26.084695Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -191,7 +191,7 @@
"source_url": null
},
{
"id": "61f07b48-927c-4b63-8bcd-974a0a9ace35",
"id": "d2f8fa60-9806-45d0-8ca8-8bf46499e9e7",
"serie_id": "test-series",
"serie_name": "Test Series",
"episode": {
@@ -201,7 +201,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.673057Z",
"added_at": "2025-10-22T10:57:26.269365Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -210,7 +210,7 @@
"source_url": null
},
{
"id": "995caaa2-c7bf-441a-b6b2-bb6e8f6a9477",
"id": "1605e153-67e5-4a47-b5a2-e721cbbfe609",
"serie_id": "test-series",
"serie_name": "Test Series",
"episode": {
@@ -220,7 +220,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.751717Z",
"added_at": "2025-10-22T10:57:26.360496Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -229,7 +229,7 @@
"source_url": null
},
{
"id": "e2f350a2-d6d6-40ef-9674-668a970bafb1",
"id": "c10c1bf1-ccab-45bb-8526-38da70efb337",
"serie_id": "invalid-series",
"serie_name": "Invalid Series",
"episode": {
@@ -239,7 +239,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.802319Z",
"added_at": "2025-10-22T10:57:26.417614Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -248,7 +248,7 @@
"source_url": null
},
{
"id": "3c92011c-ce2b-4a43-b07f-c9a2b6a3d440",
"id": "449e2572-c506-4f22-878f-24637b64ac89",
"serie_id": "test-series",
"serie_name": "Test Series",
"episode": {
@@ -258,7 +258,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.830059Z",
"added_at": "2025-10-22T10:57:26.442816Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -267,64 +267,7 @@
"source_url": null
},
{
"id": "9243249b-0ec2-4c61-b5f2-c6b2ed8d7069",
"serie_id": "series-3",
"serie_name": "Series 3",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.868948Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "65f68572-33e1-4eea-9726-6e6d1e7baabc",
"serie_id": "series-0",
"serie_name": "Series 0",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.870314Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "f9bfe9dd-c8a2-4796-a85b-640c795ede5c",
"serie_id": "series-4",
"serie_name": "Series 4",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.870979Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "70cfaf98-ea74-49d7-a455-bab3951936b7",
"id": "cf9ad8ab-deeb-400c-8fc8-791fe7ce2dc5",
"serie_id": "series-1",
"serie_name": "Series 1",
"episode": {
@@ -334,7 +277,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.871649Z",
"added_at": "2025-10-22T10:57:26.483725Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -343,7 +286,45 @@
"source_url": null
},
{
"id": "5518bfe5-30ae-48ab-8e63-05dcc5741bb7",
"id": "62908e0e-2367-4472-b00d-0fc43e725b79",
"serie_id": "series-3",
"serie_name": "Series 3",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:57:26.484579Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "06eca34e-f597-4464-b8ce-e0b631ec3b92",
"serie_id": "series-4",
"serie_name": "Series 4",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:57:26.485459Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "86b4443a-4d5b-4aa9-b435-4227485a0ee3",
"serie_id": "series-2",
"serie_name": "Series 2",
"episode": {
@@ -353,7 +334,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.872370Z",
"added_at": "2025-10-22T10:57:26.486109Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -362,7 +343,26 @@
"source_url": null
},
{
"id": "407df11b-ac9d-4be1-a128-49c6d2b6357d",
"id": "68b49911-bb50-480c-ac60-fb679c381ffb",
"serie_id": "series-0",
"serie_name": "Series 0",
"episode": {
"season": 1,
"episode": 1,
"title": null
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:57:26.486790Z",
"started_at": null,
"completed_at": null,
"progress": null,
"error": null,
"retry_count": 0,
"source_url": null
},
{
"id": "800ca4df-12c0-4ebf-a5d6-139732d22fd6",
"serie_id": "persistent-series",
"serie_name": "Persistent Series",
"episode": {
@@ -372,7 +372,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.933545Z",
"added_at": "2025-10-22T10:57:26.556798Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -381,7 +381,7 @@
"source_url": null
},
{
"id": "8ce9a528-28e5-4b6b-9c90-4d3012fcf7a2",
"id": "3c693ed7-6a9e-4afd-a71e-99ec549a4d00",
"serie_id": "ws-series",
"serie_name": "WebSocket Series",
"episode": {
@@ -391,7 +391,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:00.980521Z",
"added_at": "2025-10-22T10:57:26.615000Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -400,7 +400,7 @@
"source_url": null
},
{
"id": "7f6f0b8b-954b-436d-817e-54f53761cb81",
"id": "3b1ae938-e470-4449-8e04-9c576a55f636",
"serie_id": "pause-test",
"serie_name": "Pause Test Series",
"episode": {
@@ -410,7 +410,7 @@
},
"status": "pending",
"priority": "normal",
"added_at": "2025-10-22T10:30:01.142998Z",
"added_at": "2025-10-22T10:57:26.778755Z",
"started_at": null,
"completed_at": null,
"progress": null,
@@ -421,5 +421,5 @@
],
"active": [],
"failed": [],
"timestamp": "2025-10-22T10:30:01.143302+00:00"
"timestamp": "2025-10-22T10:57:26.779584+00:00"
}