diff --git a/assets/pasted-20260129-210745-654c6eb5.jpg b/assets/pasted-20260129-210745-654c6eb5.jpg new file mode 100644 index 0000000..65d6329 Binary files /dev/null and b/assets/pasted-20260129-210745-654c6eb5.jpg differ diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392..f8bb067 100644 Binary files a/core/__pycache__/admin.cpython-311.pyc and b/core/__pycache__/admin.cpython-311.pyc differ diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640..99ee6cd 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd6..124620c 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/admin.py b/core/admin.py index 8c38f3f..908ec16 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,3 +1,14 @@ from django.contrib import admin +from .models import Station, Track -# Register your models here. +@admin.register(Station) +class StationAdmin(admin.ModelAdmin): + list_display = ('name', 'is_active', 'color') + list_filter = ('is_active',) + search_fields = ('name',) + +@admin.register(Track) +class TrackAdmin(admin.ModelAdmin): + list_display = ('title', 'artist', 'station', 'created_at') + list_filter = ('station',) + search_fields = ('title', 'artist') \ No newline at end of file diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..188a938 --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 5.2.7 on 2026-01-29 21:05 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Station', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('stream_url', models.URLField(help_text='URL for the radio stream')), + ('description', models.TextField(blank=True)), + ('color', models.CharField(default='#FF007F', help_text='Hex color for the vinyl', max_length=7)), + ('image', models.FileField(blank=True, null=True, upload_to='stations/')), + ('is_active', models.BooleanField(default=True)), + ], + ), + migrations.CreateModel( + name='Track', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('artist', models.CharField(max_length=200)), + ('audio_file', models.FileField(blank=True, null=True, upload_to='tracks/')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('station', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tracks', to='core.station')), + ], + ), + ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000..bf5aae4 Binary files /dev/null and b/core/migrations/__pycache__/0001_initial.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index 71a8362..a441a2d 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,22 @@ from django.db import models -# Create your models here. +class Station(models.Model): + name = models.CharField(max_length=100) + stream_url = models.URLField(help_text="URL for the radio stream") + description = models.TextField(blank=True) + color = models.CharField(max_length=7, default="#FF007F", help_text="Hex color for the vinyl") + image = models.FileField(upload_to="stations/", blank=True, null=True) + is_active = models.BooleanField(default=True) + + def __str__(self): + return self.name + +class Track(models.Model): + station = models.ForeignKey(Station, related_name="tracks", on_delete=models.CASCADE) + title = models.CharField(max_length=200) + artist = models.CharField(max_length=200) + audio_file = models.FileField(upload_to="tracks/", blank=True, null=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"{self.artist} - {self.title}" diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..03a7f9d 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,25 +1,56 @@ - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}Lili Record's{% endblock %} + {% if project_description %} + + {% endif %} + {% load static %} + + + + + + + + {% block head %}{% endblock %} + + - - {% block content %}{% endblock %} +
+ {% block content %}{% endblock %} +
+ + + + + {% block scripts %}{% endblock %} - - + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..93dc0de 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,183 @@ {% extends "base.html" %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} +{% block content %} +
+
+ +
+
+
+
+ Logo +
+
+
+
+
+ + +
+
+
+ Logo +
+

Lili Record's

+

Virtual Broadcast

+
+
+ +
+ +
+ +
+ + +
+ 50% +
+
+ +
+
Available Stations
+
+ {% for station in stations %} + + {% empty %} +
+ +

No stations added yet.
Add some in Admin!

+
+ {% endfor %} +
+
+
+
+
+
-{% block head %} - - - {% endblock %} -{% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… -
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
- +{% block scripts %} + {% endblock %} \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..eba74df 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,12 @@ -import os -import platform - -from django import get_version as django_version from django.shortcuts import render -from django.utils import timezone - +from .models import Station +import time def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() - + stations = Station.objects.filter(is_active=True) context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + "stations": stations, + "project_name": "Lili Record's", + "deployment_timestamp": int(time.time()), } return render(request, "core/index.html", context) diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..37690e4 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,183 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +/* Lili Record's Custom Styles - Metallic & Neon Edition */ + +:root { + --primary-neon: #FF007F; + --secondary-neon: #00F2FF; + --metallic-silver: #c0c0c0; + --metallic-dark: #2c2c2c; + --vinyl-black: #050505; +} + +body { + background-color: #050505; + background-image: + radial-gradient(at 0% 0%, rgba(255, 0, 127, 0.15) 0px, transparent 50%), + radial-gradient(at 100% 100%, rgba(0, 242, 255, 0.15) 0px, transparent 50%); + min-height: 100vh; + color: #eee; +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary-neon), #e60072); + border: none; + box-shadow: 0 0 20px rgba(255, 0, 127, 0.4); + transition: all 0.3s ease; +} + +.btn-primary:hover { + transform: scale(1.05); + box-shadow: 0 0 30px rgba(255, 0, 127, 0.7); +} + +/* Vinyl Record Player */ +.player-container { + position: relative; + width: 400px; + height: 400px; + margin: 0 auto; + background: linear-gradient(145deg, #333, #111); + border-radius: 30px; + padding: 25px; + border: 2px solid rgba(255,255,255,0.05); + box-shadow: + inset 0 0 80px #000, + 0 20px 60px rgba(0,0,0,0.8), + 0 0 40px rgba(0, 242, 255, 0.05); +} + +.vinyl-disk { + width: 350px; + height: 350px; + background: radial-gradient(circle, #222 0%, #111 20%, #050505 100%); + border-radius: 50%; + position: relative; + box-shadow: 0 0 30px rgba(0,0,0,1); + display: flex; + align-items: center; + justify-content: center; + background-image: repeating-radial-gradient( + circle, + rgba(255,255,255,0.03) 0, + rgba(255,255,255,0.03) 1px, + transparent 1px, + transparent 3px + ); + overflow: hidden; +} + +/* Metallic Shine */ +.vinyl-disk::after { + content: ''; + position: absolute; + top: 0; left: 0; right: 0; bottom: 0; + border-radius: 50%; + background: conic-gradient( + from 0deg, + transparent 0deg, + rgba(255,255,255,0.05) 45deg, + transparent 90deg, + rgba(255,255,255,0.05) 135deg, + transparent 180deg, + rgba(255,255,255,0.05) 225deg, + transparent 270deg, + rgba(255,255,255,0.05) 315deg, + transparent 360deg + ); + pointer-events: none; +} + +.vinyl-label { + width: 140px; + height: 140px; + background-color: var(--primary-neon); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.5s ease; + border: 6px solid #111; + z-index: 2; + overflow: hidden; + background: #fff; /* White bg for logo fallback */ +} + +.tonearm { + position: absolute; + top: 30px; + right: 40px; + width: 24px; + height: 200px; + background: linear-gradient(to right, #666, #999, #666); + border-radius: 12px; + transform-origin: 50% 15px; + transform: rotate(-35deg); + transition: transform 1.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); + z-index: 10; + box-shadow: 4px 4px 10px rgba(0,0,0,0.6); + border: 1px solid rgba(255,255,255,0.1); +} + +.tonearm::after { + content: ''; + position: absolute; + bottom: -10px; + left: 50%; + transform: translateX(-50%); + width: 30px; + height: 40px; + background: #333; + border-radius: 4px; + border: 2px solid #555; +} + +.tonearm.active { + transform: rotate(10deg); +} + +/* Animations */ +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +.vinyl-disk.spinning { + animation: spin 3.5s linear infinite; +} + +/* Responsive adjustments */ +@media (max-width: 992px) { + .player-container { + width: 320px; + height: 320px; + } + .vinyl-disk { + width: 270px; + height: 270px; + } + .vinyl-label { + width: 100px; + height: 100px; + } + .tonearm { + height: 160px; + right: 30px; + } +} + +@media (max-width: 576px) { + .player-container { + width: 280px; + height: 280px; + } + .vinyl-disk { + width: 230px; + height: 230px; + } + .vinyl-label { + width: 80px; + height: 80px; + } + .tonearm { + height: 140px; + } } diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..37690e4 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,183 @@ +/* Lili Record's Custom Styles - Metallic & Neon Edition */ :root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); + --primary-neon: #FF007F; + --secondary-neon: #00F2FF; + --metallic-silver: #c0c0c0; + --metallic-dark: #2c2c2c; + --vinyl-black: #050505; } + body { - margin: 0; - font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); - color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; + background-color: #050505; + background-image: + radial-gradient(at 0% 0%, rgba(255, 0, 127, 0.15) 0px, transparent 50%), + radial-gradient(at 100% 100%, rgba(0, 242, 255, 0.15) 0px, transparent 50%); min-height: 100vh; - text-align: center; - overflow: hidden; - position: relative; + color: #eee; +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary-neon), #e60072); + border: none; + box-shadow: 0 0 20px rgba(255, 0, 127, 0.4); + transition: all 0.3s ease; +} + +.btn-primary:hover { + transform: scale(1.05); + box-shadow: 0 0 30px rgba(255, 0, 127, 0.7); +} + +/* Vinyl Record Player */ +.player-container { + position: relative; + width: 400px; + height: 400px; + margin: 0 auto; + background: linear-gradient(145deg, #333, #111); + border-radius: 30px; + padding: 25px; + border: 2px solid rgba(255,255,255,0.05); + box-shadow: + inset 0 0 80px #000, + 0 20px 60px rgba(0,0,0,0.8), + 0 0 40px rgba(0, 242, 255, 0.05); +} + +.vinyl-disk { + width: 350px; + height: 350px; + background: radial-gradient(circle, #222 0%, #111 20%, #050505 100%); + border-radius: 50%; + position: relative; + box-shadow: 0 0 30px rgba(0,0,0,1); + display: flex; + align-items: center; + justify-content: center; + background-image: repeating-radial-gradient( + circle, + rgba(255,255,255,0.03) 0, + rgba(255,255,255,0.03) 1px, + transparent 1px, + transparent 3px + ); + overflow: hidden; +} + +/* Metallic Shine */ +.vinyl-disk::after { + content: ''; + position: absolute; + top: 0; left: 0; right: 0; bottom: 0; + border-radius: 50%; + background: conic-gradient( + from 0deg, + transparent 0deg, + rgba(255,255,255,0.05) 45deg, + transparent 90deg, + rgba(255,255,255,0.05) 135deg, + transparent 180deg, + rgba(255,255,255,0.05) 225deg, + transparent 270deg, + rgba(255,255,255,0.05) 315deg, + transparent 360deg + ); + pointer-events: none; +} + +.vinyl-label { + width: 140px; + height: 140px; + background-color: var(--primary-neon); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.5s ease; + border: 6px solid #111; + z-index: 2; + overflow: hidden; + background: #fff; /* White bg for logo fallback */ +} + +.tonearm { + position: absolute; + top: 30px; + right: 40px; + width: 24px; + height: 200px; + background: linear-gradient(to right, #666, #999, #666); + border-radius: 12px; + transform-origin: 50% 15px; + transform: rotate(-35deg); + transition: transform 1.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); + z-index: 10; + box-shadow: 4px 4px 10px rgba(0,0,0,0.6); + border: 1px solid rgba(255,255,255,0.1); +} + +.tonearm::after { + content: ''; + position: absolute; + bottom: -10px; + left: 50%; + transform: translateX(-50%); + width: 30px; + height: 40px; + background: #333; + border-radius: 4px; + border: 2px solid #555; +} + +.tonearm.active { + transform: rotate(10deg); +} + +/* Animations */ +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +.vinyl-disk.spinning { + animation: spin 3.5s linear infinite; +} + +/* Responsive adjustments */ +@media (max-width: 992px) { + .player-container { + width: 320px; + height: 320px; + } + .vinyl-disk { + width: 270px; + height: 270px; + } + .vinyl-label { + width: 100px; + height: 100px; + } + .tonearm { + height: 160px; + right: 30px; + } +} + +@media (max-width: 576px) { + .player-container { + width: 280px; + height: 280px; + } + .vinyl-disk { + width: 230px; + height: 230px; + } + .vinyl-label { + width: 80px; + height: 80px; + } + .tonearm { + height: 140px; + } } diff --git a/staticfiles/pasted-20260129-210745-654c6eb5.jpg b/staticfiles/pasted-20260129-210745-654c6eb5.jpg new file mode 100644 index 0000000..65d6329 Binary files /dev/null and b/staticfiles/pasted-20260129-210745-654c6eb5.jpg differ