Skip to content

Commit ec76406

Browse files
committed
Merge branch 'feature/ui-redesign' into 3.2-dev
# Conflicts: # backend/requirements.txt
2 parents b4d90e2 + 5a1a1cc commit ec76406

79 files changed

Lines changed: 5553 additions & 961 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

backend/pyproject.toml

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,64 @@
1+
[project]
2+
name = "auto-bangumi"
3+
version = "3.1.0"
4+
description = "AutoBangumi - Automated anime download manager"
5+
requires-python = ">=3.10"
6+
dependencies = [
7+
"anyio>=4.0.0",
8+
"beautifulsoup4>=4.12.0",
9+
"certifi>=2023.5.7",
10+
"charset-normalizer>=3.1.0",
11+
"click>=8.1.3",
12+
"fastapi>=0.109.0",
13+
"h11>=0.14.0",
14+
"idna>=3.4",
15+
"pydantic>=2.0.0",
16+
"sniffio>=1.3.0",
17+
"soupsieve>=2.4.1",
18+
"typing_extensions>=4.0.0",
19+
"urllib3>=2.0.3",
20+
"uvicorn>=0.27.0",
21+
"Jinja2>=3.1.2",
22+
"python-dotenv>=1.0.0",
23+
"python-jose>=3.3.0",
24+
"passlib>=1.7.4",
25+
"bcrypt>=4.0.1,<4.1",
26+
"python-multipart>=0.0.6",
27+
"sqlmodel>=0.0.14",
28+
"sse-starlette>=1.6.5",
29+
"semver>=3.0.1",
30+
"openai>=1.54.3",
31+
"httpx>=0.25.0",
32+
"httpx-socks>=0.9.0",
33+
"aiosqlite>=0.19.0",
34+
"sqlalchemy[asyncio]>=2.0.0",
35+
"webauthn>=2.0.0",
36+
]
37+
38+
[project.optional-dependencies]
39+
dev = [
40+
"pytest>=8.0.0",
41+
"pytest-asyncio>=0.23.0",
42+
"ruff>=0.1.0",
43+
"black>=24.0.0",
44+
]
45+
46+
[tool.pytest.ini_options]
47+
testpaths = ["src/test"]
48+
asyncio_mode = "auto"
49+
150
[tool.ruff]
251
select = [
352
# pycodestyle(E): https://beta.ruff.rs/docs/rules/#pycodestyle-e-w
4-
"E",
53+
"E",
554
# Pyflakes(F): https://beta.ruff.rs/docs/rules/#pyflakes-f
6-
"F",
55+
"F",
756
# isort(I): https://beta.ruff.rs/docs/rules/#isort-i
857
"I"
958
]
1059
ignore = [
1160
# E501: https://beta.ruff.rs/docs/rules/line-too-long/
12-
'E501',
61+
'E501',
1362
# F401: https://beta.ruff.rs/docs/rules/unused-import/
1463
# avoid unused imports lint in `__init__.py`
1564
'F401',

backend/requirements.txt

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
1-
anyio==3.7.0
1+
anyio>=4.0.0
22
bs4==0.0.1
3-
certifi==2023.5.7
4-
charset-normalizer==3.1.0
5-
click==8.1.3
6-
fastapi==0.97.0
7-
h11==0.14.0
8-
idna==3.4
9-
pydantic~=1.10
10-
PySocks==1.7.1
11-
qbittorrent-api==2023.9.53
12-
requests==2.31.0
13-
six==1.16.0
14-
sniffio==1.3.0
15-
soupsieve==2.4.1
16-
typing_extensions
17-
urllib3==2.0.3
18-
uvicorn==0.22.0
19-
attrdict==2.0.1
20-
Jinja2==3.1.2
21-
python-dotenv==1.0.0
22-
python-jose==3.3.0
23-
passlib==1.7.4
24-
bcrypt==4.0.1
25-
python-multipart==0.0.6
26-
sqlmodel==0.0.8
27-
sse-starlette==1.6.5
28-
semver==3.0.1
29-
openai==1.54.3
3+
certifi>=2023.5.7
4+
charset-normalizer>=3.1.0
5+
click>=8.1.3
6+
fastapi>=0.109.0
7+
h11>=0.14.0
8+
idna>=3.4
9+
pydantic>=2.0.0
10+
six>=1.16.0
11+
sniffio>=1.3.0
12+
soupsieve>=2.4.1
13+
typing_extensions>=4.0.0
14+
urllib3>=2.0.3
15+
uvicorn>=0.27.0
16+
Jinja2>=3.1.2
17+
python-dotenv>=1.0.0
18+
python-jose>=3.3.0
19+
passlib>=1.7.4
20+
bcrypt>=4.0.1
21+
python-multipart>=0.0.6
22+
sqlmodel>=0.0.14
23+
sse-starlette>=1.6.5
24+
semver>=3.0.1
25+
openai>=1.54.3
26+
httpx>=0.25.0
27+
httpx-socks>=0.9.0
28+
aiosqlite>=0.19.0
29+
sqlalchemy[asyncio]>=2.0.0
30+
webauthn>=2.0.0

backend/src/dev_server.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"""Minimal dev server that skips downloader check for UI testing."""
2+
import uvicorn
3+
from fastapi import FastAPI
4+
from fastapi.middleware.cors import CORSMiddleware
5+
from fastapi import APIRouter
6+
7+
from module.database.combine import Database
8+
from module.database.engine import engine
9+
10+
# Initialize DB + migrations + default user
11+
with Database(engine) as db:
12+
db.create_table()
13+
db.user.add_default_user()
14+
15+
# Build v1 router without program router (which blocks on downloader check)
16+
from module.api.auth import router as auth_router
17+
from module.api.bangumi import router as bangumi_router
18+
from module.api.config import router as config_router
19+
from module.api.log import router as log_router
20+
from module.api.rss import router as rss_router
21+
from module.api.search import router as search_router
22+
23+
v1 = APIRouter(prefix="/v1")
24+
v1.include_router(auth_router)
25+
v1.include_router(bangumi_router)
26+
v1.include_router(config_router)
27+
v1.include_router(log_router)
28+
v1.include_router(rss_router)
29+
v1.include_router(search_router)
30+
31+
# Stub status endpoint (real one lives in program router which blocks on downloader)
32+
@v1.get("/status")
33+
async def stub_status():
34+
return {"status": True, "version": "dev"}
35+
36+
app = FastAPI()
37+
app.add_middleware(
38+
CORSMiddleware,
39+
allow_origins=["*"],
40+
allow_credentials=True,
41+
allow_methods=["*"],
42+
allow_headers=["*"],
43+
)
44+
app.include_router(v1, prefix="/api")
45+
46+
if __name__ == "__main__":
47+
uvicorn.run(app, host="127.0.0.1", port=7892)

backend/src/module/api/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from .bangumi import router as bangumi_router
55
from .config import router as config_router
66
from .log import router as log_router
7+
from .passkey import router as passkey_router
78
from .program import router as program_router
89
from .rss import router as rss_router
910
from .search import router as search_router
@@ -13,6 +14,7 @@
1314
# API 1.0
1415
v1 = APIRouter(prefix="/v1")
1516
v1.include_router(auth_router)
17+
v1.include_router(passkey_router)
1618
v1.include_router(log_router)
1719
v1.include_router(program_router)
1820
v1.include_router(bangumi_router)

backend/src/module/api/bangumi.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,17 @@ async def refresh_poster(bangumi_id: int):
127127
return u_response(resp)
128128

129129

130+
@router.get(
131+
path="/refresh/calendar",
132+
response_model=APIResponse,
133+
dependencies=[Depends(get_current_user)],
134+
)
135+
async def refresh_calendar():
136+
with TorrentManager() as manager:
137+
resp = manager.refresh_calendar()
138+
return u_response(resp)
139+
140+
130141
@router.get(
131142
"/reset/all", response_model=APIResponse, dependencies=[Depends(get_current_user)]
132143
)

0 commit comments

Comments
 (0)