api / db_init.py
jamelloverz-sketch
PopCorn API v3.5 - Media metadata, people, images, open CORS
c18e004
Raw
History Blame Contribute Delete
18.3 kB
INIT_SQLS = [
# โ”€โ”€ Archives โ”€โ”€
"""CREATE TABLE IF NOT EXISTS archives (
id INTEGER PRIMARY KEY AUTOINCREMENT,
archive_id TEXT,
media_id INTEGER,
media_type TEXT,
file_name TEXT,
dataset_name TEXT,
account TEXT,
account_key TEXT,
title TEXT,
year INTEGER,
season_number INTEGER,
episode_number INTEGER,
quality TEXT,
file_size INTEGER,
status TEXT DEFAULT 'archived',
telegram_file_unique_id TEXT,
timestamp TEXT,
genres TEXT,
rating REAL,
progress_status TEXT,
progress_details TEXT,
archive_space TEXT,
source TEXT,
audio TEXT,
network TEXT,
highlights TEXT,
full_metadata TEXT,
storage_channel_id INTEGER,
storage_msg_id INTEGER,
created_at TEXT DEFAULT (datetime('now'))
)""",
# โ”€โ”€ User-related โ”€โ”€
"""CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER UNIQUE NOT NULL,
username TEXT, first_name TEXT, last_name TEXT,
photo_url TEXT, language_code TEXT DEFAULT 'en',
stars_balance INTEGER DEFAULT 0, kernels_balance INTEGER DEFAULT 0,
total_earned_kernels INTEGER DEFAULT 0, total_spent_kernels INTEGER DEFAULT 0,
is_premium INTEGER DEFAULT 0, last_active_at TEXT,
total_watch_time INTEGER DEFAULT 0, points INTEGER DEFAULT 0,
created_at TEXT DEFAULT (datetime('now'))
)""",
# โ”€โ”€ Watch history โ”€โ”€
"""CREATE TABLE IF NOT EXISTS watch_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, tmdb_id INTEGER NOT NULL,
media_type TEXT NOT NULL, season_number INTEGER, episode_number INTEGER,
progress_seconds INTEGER DEFAULT 0, duration_seconds INTEGER DEFAULT 0,
watch_count INTEGER DEFAULT 1, completed INTEGER DEFAULT 0,
last_watched_at TEXT,
UNIQUE(user_id, tmdb_id, media_type, COALESCE(season_number, 0), COALESCE(episode_number, 0))
)""",
# โ”€โ”€ Watch list โ”€โ”€
"""CREATE TABLE IF NOT EXISTS user_list (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, tmdb_id INTEGER NOT NULL,
media_type TEXT NOT NULL CHECK(media_type IN ('movie', 'tv')),
title TEXT NOT NULL DEFAULT '', poster_url TEXT,
added_at TEXT DEFAULT (datetime('now')),
UNIQUE(user_id, tmdb_id, media_type)
)""",
# โ”€โ”€ Ratings โ”€โ”€
"""CREATE TABLE IF NOT EXISTS ratings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, tmdb_id INTEGER NOT NULL,
media_type TEXT NOT NULL, rating INTEGER NOT NULL CHECK(rating >= 1 AND rating <= 10),
review TEXT, created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now')),
UNIQUE(user_id, tmdb_id, media_type)
)""",
# โ”€โ”€ Friendships โ”€โ”€
"""CREATE TABLE IF NOT EXISTS friendships (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, friend_id INTEGER NOT NULL,
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','accepted','rejected')),
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(user_id, friend_id)
)""",
# โ”€โ”€ Conversations โ”€โ”€
"""CREATE TABLE IF NOT EXISTS conversations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, participant_id INTEGER NOT NULL,
last_message TEXT, last_message_at TEXT, unread_count INTEGER DEFAULT 0,
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(user_id, participant_id)
)""",
# โ”€โ”€ Messages โ”€โ”€
"""CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
conversation_id INTEGER NOT NULL, sender_id INTEGER NOT NULL,
content TEXT NOT NULL, created_at TEXT DEFAULT (datetime('now'))
)""",
# โ”€โ”€ Watch parties โ”€โ”€
"""CREATE TABLE IF NOT EXISTS watch_parties (
id INTEGER PRIMARY KEY AUTOINCREMENT,
room_code TEXT UNIQUE NOT NULL, host_id INTEGER NOT NULL,
tmdb_id INTEGER, media_type TEXT, title TEXT,
is_public INTEGER DEFAULT 1, password TEXT DEFAULT '',
max_participants INTEGER DEFAULT 10,
status TEXT DEFAULT 'waiting' CHECK(status IN ('waiting','playing','paused','ended')),
created_at TEXT DEFAULT (datetime('now'))
)""",
"""CREATE TABLE IF NOT EXISTS party_members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
party_id INTEGER NOT NULL, user_id INTEGER NOT NULL,
role TEXT DEFAULT 'member' CHECK(role IN ('host','member')),
joined_at TEXT DEFAULT (datetime('now')),
UNIQUE(party_id, user_id)
)""",
"""CREATE TABLE IF NOT EXISTS party_chat (
id INTEGER PRIMARY KEY AUTOINCREMENT,
party_id INTEGER NOT NULL, user_id INTEGER NOT NULL,
user_name TEXT NOT NULL DEFAULT '', content TEXT NOT NULL,
created_at TEXT DEFAULT (datetime('now'))
)""",
# โ”€โ”€ Store โ”€โ”€
"""CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name_en TEXT NOT NULL, name_ar TEXT NOT NULL,
description_en TEXT, description_ar TEXT,
category TEXT, rarity TEXT,
price_stars INTEGER DEFAULT 0, price_kernels INTEGER DEFAULT 0,
image_url TEXT, sort_order INTEGER DEFAULT 0, active INTEGER DEFAULT 1,
is_purchasable INTEGER DEFAULT 1, preview_images TEXT DEFAULT '[]',
tags TEXT DEFAULT '', payment_method TEXT DEFAULT 'stars',
created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now'))
)""",
"""CREATE TABLE IF NOT EXISTS asset_items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_id INTEGER, type TEXT, name_en TEXT,
image_url TEXT, rarity TEXT, sort_order INTEGER DEFAULT 0,
file_url TEXT DEFAULT '', preview_url TEXT DEFAULT '',
metadata TEXT DEFAULT '{}'
)""",
"""CREATE TABLE IF NOT EXISTS user_assets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, asset_type TEXT, asset_id INTEGER,
is_active INTEGER DEFAULT 0, acquired_at TEXT DEFAULT (datetime('now'))
)""",
"""CREATE TABLE IF NOT EXISTS purchases (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, product_id INTEGER,
stars_amount INTEGER DEFAULT 0, status TEXT DEFAULT 'completed',
purchased_at TEXT DEFAULT (datetime('now'))
)""",
# โ”€โ”€ Notifications โ”€โ”€
"""CREATE TABLE IF NOT EXISTS notifications (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, title TEXT NOT NULL, body TEXT,
type TEXT DEFAULT 'info', is_read INTEGER DEFAULT 0,
created_at TEXT DEFAULT (datetime('now'))
)""",
# โ”€โ”€ Achievements โ”€โ”€
"""CREATE TABLE IF NOT EXISTS achievements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL, description TEXT, icon TEXT,
category TEXT, total_required INTEGER DEFAULT 1
)""",
"""CREATE TABLE IF NOT EXISTS user_achievements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, achievement_id INTEGER NOT NULL,
progress INTEGER DEFAULT 0, total INTEGER DEFAULT 1,
is_unlocked INTEGER DEFAULT 0, unlocked_at TEXT,
UNIQUE(user_id, achievement_id)
)""",
# โ”€โ”€ Daily streaks โ”€โ”€
"""CREATE TABLE IF NOT EXISTS daily_streaks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL UNIQUE, streak_count INTEGER DEFAULT 0,
last_claim_date TEXT
)""",
# โ”€โ”€ Comments โ”€โ”€
"""CREATE TABLE IF NOT EXISTS comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL, tmdb_id INTEGER NOT NULL,
media_type TEXT NOT NULL, content TEXT NOT NULL,
rating INTEGER, created_at TEXT DEFAULT (datetime('now'))
)""",
"""CREATE TABLE IF NOT EXISTS comment_likes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
comment_id INTEGER NOT NULL, user_id INTEGER NOT NULL,
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(comment_id, user_id)
)""",
"""CREATE TABLE IF NOT EXISTS comment_reports (
id INTEGER PRIMARY KEY AUTOINCREMENT,
comment_id INTEGER NOT NULL, user_id INTEGER NOT NULL,
reason TEXT NOT NULL, created_at TEXT DEFAULT (datetime('now'))
)""",
"""CREATE TABLE IF NOT EXISTS rating_helpful (
id INTEGER PRIMARY KEY AUTOINCREMENT,
rating_id INTEGER NOT NULL, user_id INTEGER NOT NULL,
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(rating_id, user_id)
)""",
# โ”€โ”€ Archive progress (survives restarts) โ”€โ”€
"""CREATE TABLE IF NOT EXISTS archive_progress (
archive_id TEXT PRIMARY KEY,
status TEXT DEFAULT 'pending',
file_name TEXT, account TEXT, account_key TEXT, quality TEXT,
file_unique_id TEXT, step TEXT, progress_pct INTEGER DEFAULT 0,
message TEXT, updated_at REAL
)""",
]
INDEX_SQLS = [
"CREATE INDEX IF NOT EXISTS idx_archives_media_id ON archives(media_id)",
"CREATE INDEX IF NOT EXISTS idx_archives_media_type ON archives(media_type)",
"CREATE INDEX IF NOT EXISTS idx_archives_status ON archives(status)",
"CREATE INDEX IF NOT EXISTS idx_archives_type_status ON archives(media_type, status)",
"CREATE INDEX IF NOT EXISTS idx_archives_account ON archives(account_key)",
"CREATE INDEX IF NOT EXISTS idx_archives_unique_id ON archives(telegram_file_unique_id)",
"CREATE INDEX IF NOT EXISTS idx_watch_history_user ON watch_history(user_id)",
"CREATE INDEX IF NOT EXISTS idx_watch_history_tmdb ON watch_history(tmdb_id, media_type)",
"CREATE INDEX IF NOT EXISTS idx_friendships_user ON friendships(user_id, status)",
"CREATE INDEX IF NOT EXISTS idx_friendships_friend ON friendships(friend_id, status)",
"CREATE INDEX IF NOT EXISTS idx_messages_conv ON messages(conversation_id)",
"CREATE INDEX IF NOT EXISTS idx_notifications_user ON notifications(user_id, is_read)",
"CREATE INDEX IF NOT EXISTS idx_user_assets_user ON user_assets(user_id)",
"CREATE INDEX IF NOT EXISTS idx_purchases_user ON purchases(user_id)",
"CREATE INDEX IF NOT EXISTS idx_party_members_party ON party_members(party_id)",
"CREATE INDEX IF NOT EXISTS idx_party_chat_party ON party_chat(party_id)",
"CREATE INDEX IF NOT EXISTS idx_conversations_user ON conversations(user_id)",
]
FTS_SQLS = [
"CREATE VIRTUAL TABLE IF NOT EXISTS archives_fts USING fts5(title, overview, content='archives', content_rowid='id')",
]
SEED_SQLS = [
"""INSERT OR IGNORE INTO products (id, name_en, name_ar, category, rarity, price_stars, price_kernels, image_url, sort_order)
VALUES
(1, 'Gold Frame', 'ุฅุทุงุฑ ุฐู‡ุจูŠ', 'frames', 'legendary', 500, 50, '/assets/badges/gold-frame.svg', 1),
(2, 'Silver Frame', 'ุฅุทุงุฑ ูุถูŠ', 'frames', 'epic', 300, 30, '/assets/badges/silver-frame.svg', 2),
(3, 'Neon Theme', 'ุณู…ุฉ ู†ูŠูˆู†', 'themes', 'epic', 400, 40, '/assets/badges/neon-theme.svg', 3),
(4, 'Dark Mode Pro', 'ุงู„ูˆุถุน ุงู„ุฏุงูƒู† ุจุฑูˆ', 'themes', 'rare', 200, 20, '/assets/badges/dark-pro.svg', 4),
(5, 'Rainbow Badge', 'ุดุงุฑุฉ ู‚ูˆุณ ู‚ุฒุญ', 'badges', 'legendary', 1000, 100, '/assets/badges/rainbow.svg', 5),
(6, 'PopCorn Crown', 'ุชุงุฌ ุจูˆุจูƒูˆุฑู†', 'badges', 'legendary', 2000, 200, '/assets/badges/crown.svg', 6)
""",
"""INSERT OR IGNORE INTO asset_items (product_id, type, name_en, image_url, rarity, sort_order)
VALUES
(1, 'frame', 'Gold Frame', '/assets/badges/gold-frame.svg', 'legendary', 1),
(2, 'frame', 'Silver Frame', '/assets/badges/silver-frame.svg', 'epic', 2),
(3, 'theme', 'Neon Theme', '/assets/badges/neon-theme.svg', 'epic', 3),
(4, 'theme', 'Dark Mode Pro', '/assets/badges/dark-pro.svg', 'rare', 4),
(5, 'badge', 'Rainbow Badge', '/assets/badges/rainbow.svg', 'legendary', 5),
(6, 'badge', 'PopCorn Crown', '/assets/badges/crown.svg', 'legendary', 6)
""",
"""INSERT OR IGNORE INTO achievements (id, name, description, icon, category, total_required) VALUES
(1, 'First Watch', 'Watch your first movie', '\U0001f3ac', 'watching', 1),
(2, 'Movie Marathon', 'Watch 10 movies', '\U0001f4fa', 'watching', 10),
(3, 'PopCorn Lover', 'Watch 50 movies', '\U0001f37f', 'watching', 50),
(4, 'Binge Watcher', 'Watch 100 movies', '\U0001f525', 'watching', 100),
(5, 'Social Butterfly', 'Make 5 friends', '\U0001f98b', 'social', 5),
(6, 'Party Starter', 'Create 3 watch parties', '\U0001f389', 'social', 3),
(7, 'Collector', 'Buy 5 items from the store', '\U0001f48e', 'store', 5),
(8, 'High Roller', 'Earn 1000 kernels', '\U0001f4b0', 'earning', 1000)
""",
# โ”€โ”€ Social Feed โ”€โ”€
"""CREATE TABLE IF NOT EXISTS social_posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
post_type TEXT DEFAULT 'status',
content TEXT,
media_type TEXT,
media_id INTEGER,
image_url TEXT,
is_spoiler INTEGER DEFAULT 0,
tags TEXT,
likes_count INTEGER DEFAULT 0,
comments_count INTEGER DEFAULT 0,
shares_count INTEGER DEFAULT 0,
views_count INTEGER DEFAULT 0,
status TEXT DEFAULT 'active',
created_at TEXT DEFAULT (datetime('now'))
)""",
"""CREATE TABLE IF NOT EXISTS social_likes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
post_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(post_id, user_id)
)""",
"""CREATE TABLE IF NOT EXISTS social_saves (
id INTEGER PRIMARY KEY AUTOINCREMENT,
post_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(post_id, user_id)
)""",
# โ”€โ”€ Clubs โ”€โ”€
"""CREATE TABLE IF NOT EXISTS clubs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
description TEXT,
cover_image TEXT,
owner_user_id INTEGER NOT NULL,
is_private INTEGER DEFAULT 0,
tags TEXT,
weekly_movie_tmdb_id INTEGER,
member_count INTEGER DEFAULT 0,
rules TEXT,
status TEXT DEFAULT 'active',
created_at TEXT DEFAULT (datetime('now'))
)""",
"""CREATE TABLE IF NOT EXISTS club_members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
club_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
role TEXT DEFAULT 'member',
joined_at TEXT DEFAULT (datetime('now')),
UNIQUE(club_id, user_id)
)""",
# โ”€โ”€ Gamification โ”€โ”€
"""CREATE TABLE IF NOT EXISTS daily_quests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
xp_reward INTEGER DEFAULT 50,
stars_reward INTEGER DEFAULT 0,
kernels_reward INTEGER DEFAULT 0,
icon TEXT,
sort_order INTEGER DEFAULT 0,
is_active INTEGER DEFAULT 1
)""",
"""CREATE TABLE IF NOT EXISTS user_quests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
quest_id INTEGER NOT NULL,
progress INTEGER DEFAULT 0,
completed INTEGER DEFAULT 0,
date TEXT DEFAULT (datetime('now', 'start of day')),
UNIQUE(user_id, quest_id, date)
)""",
"""CREATE TABLE IF NOT EXISTS weekly_challenges (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
xp_reward INTEGER DEFAULT 200,
stars_reward INTEGER DEFAULT 50,
kernels_reward INTEGER DEFAULT 10,
icon TEXT,
is_active INTEGER DEFAULT 1,
starts_at TEXT,
ends_at TEXT
)""",
"""CREATE TABLE IF NOT EXISTS season_pass_levels (
id INTEGER PRIMARY KEY AUTOINCREMENT,
level_num INTEGER NOT NULL UNIQUE,
xp_required INTEGER NOT NULL,
free_reward TEXT,
premium_reward TEXT
)""",
"""CREATE TABLE IF NOT EXISTS user_season_pass (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
level_num INTEGER NOT NULL,
claimed INTEGER DEFAULT 0,
claimed_at TEXT,
UNIQUE(user_id, level_num)
)""",
# โ”€โ”€ Seed Data โ”€โ”€
"""INSERT OR IGNORE INTO daily_quests (id, title, description, xp_reward, icon, sort_order) VALUES
(1, 'ุดุงู‡ุฏ ููŠู„ู…ุงู‹', 'ุดุงู‡ุฏ ุฃูŠ ููŠู„ู… ุงู„ูŠูˆู…', 50, '\U0001f3ac', 1),
(2, 'ู‚ูŠู… 3 ุฃูู„ุงู…', 'ุฃุถู ุชู‚ูŠูŠู…ูƒ ู„ุซู„ุงุซุฉ ุฃูู„ุงู…', 30, '\u2b50', 2),
(3, 'ุดุงุฑูƒ ููŠ ุญูู„ุฉ', 'ุงู†ุถู… ุฃูˆ ุฃู†ุดุฆ ุญูู„ุฉ ู…ุดุงู‡ุฏุฉ', 60, '\U0001f465', 3),
(4, 'ุงูƒุชุจ ู…ุฑุงุฌุนุฉ', 'ุดุงุฑูƒ ุฑุฃูŠูƒ ุจููŠู„ู… ุดุงู‡ุฏุชู‡', 40, '\U0001f4dd', 4),
(5, 'ุชุตูุญ 10 ุฏู‚ุงุฆู‚', 'ุชุตูุญ ุงู„ุชุทุจูŠู‚ ู„ู…ุฏุฉ 10 ุฏู‚ุงุฆู‚', 20, '\u23f1\ufe0f', 5)
""",
"""INSERT OR IGNORE INTO weekly_challenges (id, title, description, xp_reward, stars_reward, icon) VALUES
(1, 'ู…ุงุฑุงุซูˆู† ุฃูู„ุงู…', 'ุดุงู‡ุฏ 5 ุฃูู„ุงู… ู‡ุฐุง ุงู„ุฃุณุจูˆุน', 200, 50, '\U0001f3c3'),
(2, 'ู…ุณุชูƒุดู ุงู„ุฃู†ูˆุงุน', 'ุฌุฑุจ 3 ุฃู†ูˆุงุน ู…ุฎุชู„ูุฉ ู…ู† ุงู„ุฃูู„ุงู…', 150, 30, '\U0001f9ed'),
(3, 'ุงุฌุชู…ุงุนูŠ', 'ุดุงุฑูƒ ููŠ 3 ุญูู„ุงุช ู…ุดุงู‡ุฏุฉ', 180, 40, '\U0001f91d')
""",
"""INSERT OR IGNORE INTO season_pass_levels (level_num, xp_required, free_reward, premium_reward) VALUES
(1, 0, '10 Stars', '20 Stars'),
(2, 100, '5 Kernels', '15 Kernels'),
(3, 250, '20 Stars', '๐ŸŽจ Asset Common'),
(4, 500, '10 Kernels', '30 Stars'),
(5, 800, '50 Stars', '๐ŸŽจ Asset Rare'),
(6, 1200, '15 Kernels', '100 Stars'),
(7, 1800, '100 Stars', '๐Ÿ‘‘ Premium 1 Month'),
(8, 2500, '30 Kernels', '๐ŸŽจ Asset Epic'),
(9, 4000, '200 Stars', '๐Ÿ’Ž 500 Kernels'),
(10, 6000, '๐ŸŽจ Asset Legendary', '๐Ÿ‘‘ Premium 3 Months')
""",
]