Initial commit - SoundWave v1.0

- Full PWA support with offline capabilities
- Comprehensive search across songs, playlists, and channels
- Offline playlist manager with download tracking
- Pre-built frontend for zero-build deployment
- Docker-based deployment with docker compose
- Material-UI dark theme interface
- YouTube audio download and management
- Multi-user authentication support
This commit is contained in:
Iulian 2025-12-16 23:43:07 +00:00
commit 51679d1943
254 changed files with 37281 additions and 0 deletions

71
backend/channel/models.py Normal file
View file

@ -0,0 +1,71 @@
"""Channel models"""
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Channel(models.Model):
"""YouTube channel model"""
# User isolation
owner = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='channels',
help_text="User who owns this channel subscription"
)
youtube_account = models.ForeignKey(
'user.UserYouTubeAccount',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='channels',
help_text="YouTube account used to subscribe to this channel"
)
channel_id = models.CharField(max_length=50, db_index=True)
channel_name = models.CharField(max_length=200)
channel_description = models.TextField(blank=True)
channel_thumbnail = models.URLField(max_length=500, blank=True)
subscribed = models.BooleanField(default=True)
subscriber_count = models.IntegerField(default=0)
video_count = models.IntegerField(default=0)
last_refreshed = models.DateTimeField(auto_now=True)
created_date = models.DateTimeField(auto_now_add=True)
# Status tracking
active = models.BooleanField(default=True, help_text="Channel is active and available")
sync_status = models.CharField(
max_length=20,
choices=[
('pending', 'Pending'),
('syncing', 'Syncing'),
('success', 'Success'),
('failed', 'Failed'),
('stale', 'Stale'),
],
default='pending',
help_text="Current sync status"
)
error_message = models.TextField(blank=True, help_text="Last error message if sync failed")
downloaded_count = models.IntegerField(default=0, help_text="Downloaded videos count")
# Download settings per channel
auto_download = models.BooleanField(default=True, help_text="Auto-download new videos from this channel")
download_quality = models.CharField(
max_length=20,
default='auto',
choices=[('auto', 'Auto'), ('low', 'Low'), ('medium', 'Medium'), ('high', 'High'), ('ultra', 'Ultra')]
)
class Meta:
ordering = ['channel_name']
unique_together = ('owner', 'channel_id') # Each user can subscribe once per channel
indexes = [
models.Index(fields=['owner', 'channel_id']),
models.Index(fields=['owner', 'subscribed']),
]
def __str__(self):
return f"{self.owner.username} - {self.channel_name}"