easteregg #9

Merged
gru merged 2 commits from easteregg_marcin into master 2026-05-28 22:48:05 +02:00
7 changed files with 66 additions and 6 deletions

View File

@@ -62,6 +62,9 @@ CREATE TABLE IF NOT EXISTS user_preferences (
title_speed_enabled INTEGER DEFAULT 0,
automation_toasts_enabled INTEGER DEFAULT 1,
smart_queue_toasts_enabled INTEGER DEFAULT 1,
easter_egg_enabled INTEGER DEFAULT 0,
easter_egg_loading_image_url TEXT DEFAULT '',
easter_egg_click_image_url TEXT DEFAULT '',
interface_scale INTEGER DEFAULT 100,
detail_panel_height INTEGER DEFAULT 255,
created_at TEXT NOT NULL,
@@ -527,6 +530,9 @@ MIGRATIONS = [
"ALTER TABLE user_preferences ADD COLUMN title_speed_enabled INTEGER DEFAULT 0",
"ALTER TABLE user_preferences ADD COLUMN interface_scale INTEGER DEFAULT 100",
"ALTER TABLE user_preferences ADD COLUMN detail_panel_height INTEGER DEFAULT 255",
"ALTER TABLE user_preferences ADD COLUMN easter_egg_enabled INTEGER DEFAULT 0",
"ALTER TABLE user_preferences ADD COLUMN easter_egg_loading_image_url TEXT DEFAULT ''",
"ALTER TABLE user_preferences ADD COLUMN easter_egg_click_image_url TEXT DEFAULT ''",
"ALTER TABLE rtorrent_profiles ADD COLUMN max_parallel_jobs INTEGER DEFAULT 5",
"ALTER TABLE rtorrent_profiles ADD COLUMN light_parallel_jobs INTEGER DEFAULT 4",
"ALTER TABLE rtorrent_profiles ADD COLUMN light_job_timeout_seconds INTEGER DEFAULT 300",

View File

@@ -88,6 +88,15 @@ def _int_setting(data: dict, key: str, default: int, minimum: int, maximum: int)
return max(minimum, min(maximum, value))
def _url_setting(data: dict, key: str, default: str = "") -> str:
value = str(data.get(key) if data.get(key) is not None else default).strip()
if len(value) > 2048:
value = value[:2048]
if value and not (value.startswith("https://") or value.startswith("http://")):
return ""
return value
def list_profiles(user_id: int | None = None):
user_id = user_id or auth.current_user_id() or default_user_id()
visible = auth.visible_profile_ids(user_id)
@@ -454,6 +463,9 @@ def save_preferences(data: dict, user_id: int | None = None):
title_speed_enabled = data.get("title_speed_enabled")
automation_toasts_enabled = data.get("automation_toasts_enabled")
smart_queue_toasts_enabled = data.get("smart_queue_toasts_enabled")
easter_egg_enabled = data.get("easter_egg_enabled")
easter_egg_loading_image_url = data.get("easter_egg_loading_image_url")
easter_egg_click_image_url = data.get("easter_egg_click_image_url")
disk_monitor_paths_json = data.get("disk_monitor_paths_json")
disk_monitor_mode = data.get("disk_monitor_mode")
disk_monitor_selected_path = data.get("disk_monitor_selected_path")
@@ -487,6 +499,12 @@ def save_preferences(data: dict, user_id: int | None = None):
if smart_queue_toasts_enabled is not None:
# Note: Smart Queue toast noise can be disabled independently from automation notifications.
conn.execute("UPDATE user_preferences SET smart_queue_toasts_enabled=?, updated_at=? WHERE user_id=?", (1 if smart_queue_toasts_enabled else 0, now, user_id))
if easter_egg_enabled is not None:
conn.execute("UPDATE user_preferences SET easter_egg_enabled=?, updated_at=? WHERE user_id=?", (1 if easter_egg_enabled else 0, now, user_id))
if easter_egg_loading_image_url is not None:
conn.execute("UPDATE user_preferences SET easter_egg_loading_image_url=?, updated_at=? WHERE user_id=?", (_url_setting(data, "easter_egg_loading_image_url"), now, user_id))
if easter_egg_click_image_url is not None:
conn.execute("UPDATE user_preferences SET easter_egg_click_image_url=?, updated_at=? WHERE user_id=?", (_url_setting(data, "easter_egg_click_image_url"), now, user_id))
if interface_scale is not None:
scale = int(interface_scale or 100)
if scale < 80: scale = 80

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -271,6 +271,29 @@ body {
.initial-loader-spinner {
margin: 1.4rem 0 1rem;
}
.initial-loader-prank img {
max-width: min(100%, 320px);
max-height: 220px;
object-fit: contain;
border-radius: 14px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35);
}
.prank-click-image {
position: fixed;
z-index: 9500;
max-width: min(42vw, 260px);
max-height: min(42vh, 220px);
pointer-events: none;
border-radius: 14px;
filter: drop-shadow(0 14px 28px rgba(0, 0, 0, 0.45));
animation: prank-click-pop 1.25s ease-out forwards;
}
@keyframes prank-click-pop {
0% { opacity: 0; transform: translate(-50%, -50%) scale(0.72) rotate(-5deg); }
12% { opacity: 1; transform: translate(-50%, -50%) scale(1.08) rotate(3deg); }
70% { opacity: 1; transform: translate(-50%, -54%) scale(1) rotate(-2deg); }
100% { opacity: 0; transform: translate(-50%, -62%) scale(0.9) rotate(4deg); }
}
.initial-loader-title {
font-size: 1rem;
font-weight: 700;
@@ -5464,3 +5487,10 @@ body.compact-torrent-list .mobile-progress .torrent-progress {
flex-wrap: wrap;
gap: 0.3rem 0.75rem;
}
.loading-easter-egg img {
max-width: 92px;
max-height: 70px;
object-fit: contain;
border-radius: 10px;
filter: drop-shadow(0 8px 18px rgba(0, 0, 0, 0.28));
}

File diff suppressed because one or more lines are too long