forked from Vito0912/abs-bigfinish
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoutdated_scraper-api.py
79 lines (63 loc) · 2.25 KB
/
outdated_scraper-api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from fastapi import FastAPI, Query
from typing import List, Optional
from pydantic import BaseModel
from fuzzywuzzy import fuzz
import sqlite3
app = FastAPI()
class AudioBookResponse(BaseModel):
title: Optional[str]
subtitle: Optional[str] = None
author: Optional[list[str]]
narrator: Optional[list[str]]
publisher: str = "Big Finish"
cover: Optional[str]
series: Optional[list[object]]
language: str = "English"
duration: Optional[int]
abridged: bool = False
explicit: bool = False
def get_db_connection():
conn = sqlite3.connect('bigfinish.db')
conn.row_factory = sqlite3.Row
return conn
@app.get("/search/", response_model=List[AudioBookResponse])
async def search_audiobooks(query: str = Query(..., description="Title to search for")):
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute('''
SELECT url, title, series, release_date, about, background,
production, duration, isbn, written_by, narrated_by, cover_url, series_tag
FROM content
''')
results = cursor.fetchall()
matched_results = []
for row in results:
if row['title']:
ratio = fuzz.ratio(query.lower(), row['title'].lower())
if ratio > 60:
matched_results.append((ratio, row))
matched_results.sort(reverse=True, key=lambda x: x[0])
top_matches = matched_results[:5]
response_data = []
for _, row in top_matches:
duration_minutes = None
if row['duration']:
try:
duration_minutes = int(row['duration'])
except ValueError:
pass
book_data = AudioBookResponse(
title=row['title'],
subtitle=None,
author=row['written_by'].split(', ') if row['written_by'] else None,
narrator=row['narrated_by'].split(', ') if row['narrated_by'] else None,
cover=row['cover_url'],
series=[{'series': row['series'], 'sequence': row['series_tag']}],
duration=duration_minutes * 60 if duration_minutes else None,
)
response_data.append(book_data)
conn.close()
return response_data
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)