Skip to content

Commit 3de03f3

Browse files
chore: upgrade Python version to 3.12 and update dependencies
1 parent b53fc05 commit 3de03f3

File tree

8 files changed

+184
-294
lines changed

8 files changed

+184
-294
lines changed

.python-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.10
1+
3.12

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM python:3.11-slim
1+
FROM python:3.12-slim
22

33
WORKDIR /app
44

app/static/index.html

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,25 @@
101101
overscroll-behavior: contain;
102102
}
103103

104+
/* Desktop: Sidebar fixed, main content scrolls independently */
105+
@media (min-width: 768px) {
106+
#mainSidebar {
107+
position: fixed;
108+
top: 0;
109+
left: 0;
110+
height: 100dvh;
111+
overflow-y: auto;
112+
}
113+
main {
114+
position: fixed;
115+
top: 0;
116+
right: 0;
117+
left: 288px; /* w-72 = 18rem = 288px */
118+
height: 100dvh;
119+
overflow-y: auto;
120+
}
121+
}
122+
104123
/* High-contrast text selection to avoid blending with blue OS highlight */
105124
::selection {
106125
background: rgba(59, 130, 246, 0.35); /* blue-500 @ 35% */
@@ -161,7 +180,7 @@
161180
</style>
162181
</head>
163182

164-
<body class="min-h-screen text-slate-200 font-sans antialiased overflow-x-hidden flex flex-col md:flex-row">
183+
<body class="min-h-screen text-slate-200 font-sans antialiased overflow-x-hidden">
165184

166185
<!-- Mobile Header -->
167186
<div id="mobileHeader"
@@ -180,7 +199,7 @@ <h1 class="font-bold text-xl text-white">Watchly</h1>
180199
<div id="mobileNavBackdrop" class="fixed inset-0 bg-black/50 z-30 hidden md:hidden"></div>
181200
<!-- Sidebar Navigation -->
182201
<aside id="mainSidebar"
183-
class="fixed inset-y-0 left-0 z-40 w-72 transform -translate-x-full transition-transform duration-300 ease-out bg-neutral-950/50 backdrop-blur-xl border-b md:border-b-0 md:border-r border-slate-800 flex flex-col flex-shrink-0 md:relative md:translate-x-0 md:flex pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]">
202+
class="fixed inset-y-0 left-0 z-40 w-72 transform -translate-x-full transition-transform duration-300 ease-out bg-neutral-950/50 backdrop-blur-xl border-b md:border-b-0 md:border-r border-slate-800 flex flex-col flex-shrink-0 md:translate-x-0 pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]">
184203
<div class="p-6 md:p-8 flex-col items-start gap-4 hidden md:flex">
185204
<div class="flex items-center gap-3">
186205
<img src="/app/static/logo.png" alt="Watchly"
@@ -304,7 +323,8 @@ <h1 class="font-bold text-2xl text-transparent bg-clip-text bg-gradient-to-r fro
304323
</aside>
305324

306325
<!-- Main Content Area -->
307-
<main class="flex-grow min-h-[100dvh] overflow-y-auto relative no-scrollbar">
326+
<main
327+
class="min-h-[100dvh] md:fixed md:inset-y-0 md:right-0 md:left-72 overflow-y-auto relative no-scrollbar pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]">
308328
<div class="max-w-2xl mx-auto px-4 py-8 md:py-16 pb-[calc(env(safe-area-inset-bottom)+8rem)]">
309329

310330
<form id="configForm">

app/static/script.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ function updateMobileLayout() {
7171
sidebarEl.style.height = `calc(100dvh - ${h}px)`;
7272
} else {
7373
mainEl.style.paddingTop = '';
74-
sidebarEl.style.top = '';
75-
sidebarEl.style.height = '';
74+
sidebarEl.style.top = '0';
75+
sidebarEl.style.height = '100dvh';
7676
}
7777
} catch (e) { /* noop */ }
7878
}

main.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import os
22

3-
import uvicorn
4-
53
from app.core.app import app # noqa: F401
64
from app.core.config import settings
75

8-
if __name__ == "__main__" and settings.APP_ENV != "vercel":
6+
if __name__ == "__main__":
7+
import uvicorn
8+
99
PORT = os.getenv("PORT", settings.PORT)
1010
reload = settings.APP_ENV == "development"
1111
uvicorn.run("app.core.app:app", host="0.0.0.0", port=int(PORT), reload=reload)

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ dynamic = ["version"]
33
name = "watchly"
44
description = "Personalized movie and series recommendations based on your library"
55
readme = "README.md"
6-
requires-python = ">=3.10"
6+
requires-python = ">=3.12"
77
dependencies = [
88
"apscheduler>=3.11.1",
99
"async-lru>=2.0.5",
@@ -39,7 +39,7 @@ app = "app.core.app:app"
3939
# ==== black ====
4040
[tool.black]
4141
line-length = 120
42-
target-version = ['py311']
42+
target-version = ['py312']
4343

4444

4545
# ==== isort ====

requirements.txt

Lines changed: 151 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,151 @@
1-
apscheduler>=3.11.1
2-
async-lru>=2.0.5
3-
cachetools>=6.2.2
4-
cryptography>=46.0.3
5-
deep-translator>=1.11.4
6-
fastapi>=0.104.1
7-
google-genai>=1.54.0
8-
httpx>=0.25.2
9-
loguru>=0.7.2
10-
pydantic>=2.5.0
11-
pydantic-settings>=2.1.0
12-
pydantic_core>=2.41.5
13-
redis>=5.0.1
14-
tomli>=2.3.0
15-
uvicorn[standard]>=0.24.0
1+
# This file was autogenerated by uv via the following command:
2+
# uv pip compile pyproject.toml -o requirements.txt
3+
annotated-doc==0.0.4
4+
# via fastapi
5+
annotated-types==0.7.0
6+
# via pydantic
7+
anyio==4.12.0
8+
# via
9+
# google-genai
10+
# httpx
11+
# starlette
12+
# watchfiles
13+
apscheduler==3.11.2
14+
# via watchly (pyproject.toml)
15+
async-lru==2.0.5
16+
# via watchly (pyproject.toml)
17+
async-timeout==5.0.1
18+
# via redis
19+
beautifulsoup4==4.14.3
20+
# via deep-translator
21+
cachetools==6.2.4
22+
# via
23+
# watchly (pyproject.toml)
24+
# google-auth
25+
certifi==2025.11.12
26+
# via
27+
# httpcore
28+
# httpx
29+
# requests
30+
cffi==2.0.0
31+
# via cryptography
32+
charset-normalizer==3.4.4
33+
# via requests
34+
click==8.3.1
35+
# via uvicorn
36+
cryptography==46.0.3
37+
# via watchly (pyproject.toml)
38+
deep-translator==1.11.4
39+
# via watchly (pyproject.toml)
40+
distro==1.9.0
41+
# via google-genai
42+
exceptiongroup==1.3.1
43+
# via anyio
44+
fastapi==0.127.0
45+
# via watchly (pyproject.toml)
46+
google-auth==2.45.0
47+
# via google-genai
48+
google-genai==1.56.0
49+
# via watchly (pyproject.toml)
50+
h11==0.16.0
51+
# via
52+
# httpcore
53+
# uvicorn
54+
h2==4.3.0
55+
# via httpx
56+
hpack==4.1.0
57+
# via h2
58+
httpcore==1.0.9
59+
# via httpx
60+
httptools==0.7.1
61+
# via uvicorn
62+
httpx==0.28.1
63+
# via
64+
# watchly (pyproject.toml)
65+
# google-genai
66+
hyperframe==6.1.0
67+
# via h2
68+
idna==3.11
69+
# via
70+
# anyio
71+
# httpx
72+
# requests
73+
loguru==0.7.3
74+
# via watchly (pyproject.toml)
75+
pyasn1==0.6.1
76+
# via
77+
# pyasn1-modules
78+
# rsa
79+
pyasn1-modules==0.4.2
80+
# via google-auth
81+
pycparser==2.23
82+
# via cffi
83+
pydantic==2.12.5
84+
# via
85+
# watchly (pyproject.toml)
86+
# fastapi
87+
# google-genai
88+
# pydantic-settings
89+
pydantic-core==2.41.5
90+
# via
91+
# watchly (pyproject.toml)
92+
# pydantic
93+
pydantic-settings==2.12.0
94+
# via watchly (pyproject.toml)
95+
python-dotenv==1.2.1
96+
# via
97+
# pydantic-settings
98+
# uvicorn
99+
pyyaml==6.0.3
100+
# via uvicorn
101+
redis==7.1.0
102+
# via watchly (pyproject.toml)
103+
requests==2.32.5
104+
# via
105+
# deep-translator
106+
# google-auth
107+
# google-genai
108+
rsa==4.9.1
109+
# via google-auth
110+
sniffio==1.3.1
111+
# via google-genai
112+
soupsieve==2.8.1
113+
# via beautifulsoup4
114+
starlette==0.50.0
115+
# via fastapi
116+
tenacity==9.1.2
117+
# via google-genai
118+
tomli==2.3.0
119+
# via watchly (pyproject.toml)
120+
typing-extensions==4.15.0
121+
# via
122+
# anyio
123+
# async-lru
124+
# beautifulsoup4
125+
# cryptography
126+
# exceptiongroup
127+
# fastapi
128+
# google-genai
129+
# pydantic
130+
# pydantic-core
131+
# starlette
132+
# typing-inspection
133+
# uvicorn
134+
typing-inspection==0.4.2
135+
# via
136+
# pydantic
137+
# pydantic-settings
138+
tzlocal==5.3.1
139+
# via apscheduler
140+
urllib3==2.6.2
141+
# via requests
142+
uvicorn==0.40.0
143+
# via watchly (pyproject.toml)
144+
uvloop==0.22.1
145+
# via uvicorn
146+
watchfiles==1.1.1
147+
# via uvicorn
148+
websockets==15.0.1
149+
# via
150+
# google-genai
151+
# uvicorn

0 commit comments

Comments
 (0)