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 %}
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+

+
+
Lili Record's
+
Virtual Broadcast
+
+
+
+
+
+
+
+
+
+
+
+
50%
+
+
+
+
+
+
+
+
-{% 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