Files
PYTV/core/management/commands/seed.py

210 lines
7.3 KiB
Python

import random
from datetime import time, timedelta
from django.core.management.base import BaseCommand
from django.utils import timezone
from core.models import (
AppUser, Library, Genre, ContentRating, MediaSource,
Series, MediaItem, Channel, ScheduleTemplate, ScheduleBlock, Airing
)
class Command(BaseCommand):
help = 'Seeds the database with mock PYTV data including users, libraries, media, and channels.'
def handle(self, *args, **kwargs):
self.stdout.write("Flushing existing data...")
# Since we cascade everything, deleting users usually drops almost everything
AppUser.objects.filter(username__startswith='mock_').delete()
Genre.objects.all().delete()
ContentRating.objects.all().delete()
self.stdout.write("Seeding Users...")
admin_user = AppUser.objects.create_superuser('mock_admin', 'admin@pytv.local', 'admin')
viewer_user = AppUser.objects.create_user('mock_viewer', 'viewer@pytv.local', 'password')
self.stdout.write("Seeding Genres & Ratings...")
g_action = Genre.objects.create(name="Action")
g_comedy = Genre.objects.create(name="Comedy")
g_drama = Genre.objects.create(name="Drama")
g_scifi = Genre.objects.create(name="Sci-Fi")
g_promo = Genre.objects.create(name="Promo/Bumper")
r_pg = ContentRating.objects.create(system_name="TV Parental Guidelines", code="TV-PG", min_age=8)
r_14 = ContentRating.objects.create(system_name="TV Parental Guidelines", code="TV-14", min_age=14)
r_ma = ContentRating.objects.create(system_name="TV Parental Guidelines", code="TV-MA", min_age=17)
self.stdout.write("Seeding Library & Media Sources...")
lib = Library.objects.create(
owner_user=admin_user,
name="Main Broadcasting Library",
visibility="public",
description="The core streaming library for PYTV mock."
)
source_movies = MediaSource.objects.create(
library=lib,
name="Mocked Local Movies",
source_type="local_directory",
uri="/mock/movies"
)
source_tv = MediaSource.objects.create(
library=lib,
name="Mocked Local TV Shows",
source_type="local_directory",
uri="/mock/tv"
)
source_bumpers = MediaSource.objects.create(
library=lib,
name="Network Bumpers",
source_type="local_directory",
uri="/mock/bumpers"
)
self.stdout.write("Seeding Series & Media Items...")
# Movies
m1 = MediaItem.objects.create(
media_source=source_movies,
title="Space Rangers 3000",
item_kind="movie",
release_year=1999,
runtime_seconds=5400, # 1.5 hours
file_path="/mock/movies/space_rangers.mp4",
content_rating=r_pg
)
m1.genres.add(g_action, g_scifi)
m2 = MediaItem.objects.create(
media_source=source_movies,
title="The Laughing Policeman",
item_kind="movie",
release_year=2005,
runtime_seconds=6300, # 1.75 hours
file_path="/mock/movies/laughing_policeman.mp4",
content_rating=r_14
)
m2.genres.add(g_comedy, g_action)
# Series
s1 = Series.objects.create(title="Neon City Nights", description="Cyberpunk detective drama.", release_year=2024)
for ep in range(1, 6):
ep_item = MediaItem.objects.create(
media_source=source_tv,
series=s1,
title=f"Episode {ep}",
item_kind="episode",
season_number=1,
episode_number=ep,
runtime_seconds=2700, # 45 mins
file_path=f"/mock/tv/neon_city_nights/s01e0{ep}.mkv",
content_rating=r_ma
)
ep_item.genres.add(g_drama, g_scifi)
# Bumpers
for b in range(1, 4):
bump = MediaItem.objects.create(
media_source=source_bumpers,
title=f"Station Bumper {b}",
item_kind="bumper",
runtime_seconds=15,
file_path=f"/mock/bumpers/ident_{b}.mp4"
)
bump.genres.add(g_promo)
self.stdout.write("Seeding Channels and Scheduling Blocks...")
ch1 = Channel.objects.create(
owner_user=admin_user,
library=lib,
name="PYTV One",
slug="pytv-1",
channel_number=1,
description="The flagship generic network.",
scheduling_mode="template_driven",
visibility="public"
)
template = ScheduleTemplate.objects.create(
channel=ch1,
name="Standard Weekday",
timezone_name="UTC",
priority=10
)
# Prime time block
b_prime = ScheduleBlock.objects.create(
schedule_template=template,
name="Prime Time Drama",
block_type="programming",
start_local_time=time(20, 0),
end_local_time=time(23, 0),
day_of_week_mask=127, # Everyday
default_genre=g_drama,
rotation_strategy="sequential",
pad_strategy="fill_with_interstitials"
)
ch2 = Channel.objects.create(
owner_user=admin_user,
library=lib,
name="Tears of Steel Channel",
slug="tears-of-steel",
channel_number=2,
description="All Sci-Fi all the time.",
scheduling_mode="template_driven",
visibility="public"
)
template2 = ScheduleTemplate.objects.create(
channel=ch2,
name="Sci-Fi Everyday",
timezone_name="UTC",
priority=10
)
ScheduleBlock.objects.create(
schedule_template=template2,
name="Sci-Fi Block",
block_type="programming",
start_local_time=time(0, 0),
end_local_time=time(23, 59, 59),
day_of_week_mask=127,
default_genre=g_scifi,
rotation_strategy="random",
pad_strategy="none"
)
ch3 = Channel.objects.create(
owner_user=admin_user,
library=lib,
name="Sintel Classics",
slug="sintel-classics",
channel_number=3,
description="Classic movies and animation.",
scheduling_mode="template_driven",
visibility="public"
)
template3 = ScheduleTemplate.objects.create(
channel=ch3,
name="Comedy and Action",
timezone_name="UTC",
priority=10
)
ScheduleBlock.objects.create(
schedule_template=template3,
name="Action Comedy",
block_type="programming",
start_local_time=time(0, 0),
end_local_time=time(23, 59, 59),
day_of_week_mask=127,
default_genre=g_action,
rotation_strategy="random",
pad_strategy="none"
)
self.stdout.write(self.style.SUCCESS("Successfully seeded the PYTV database with mock data."))