Fix: Include backend/audio Django app in repository
This commit is contained in:
parent
d04e726373
commit
644cfab298
37 changed files with 6632 additions and 4 deletions
100
backend/audio/models.py
Normal file
100
backend/audio/models.py
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
"""Audio models"""
|
||||
|
||||
from django.db import models
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
class Audio(models.Model):
|
||||
"""Audio file model"""
|
||||
# User isolation
|
||||
owner = models.ForeignKey(
|
||||
User,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='audio_files',
|
||||
help_text="User who owns this audio file"
|
||||
)
|
||||
|
||||
youtube_id = models.CharField(max_length=50, db_index=True)
|
||||
title = models.CharField(max_length=500)
|
||||
description = models.TextField(blank=True)
|
||||
channel_id = models.CharField(max_length=50, db_index=True)
|
||||
channel_name = models.CharField(max_length=200)
|
||||
duration = models.IntegerField(help_text="Duration in seconds")
|
||||
file_path = models.CharField(max_length=500)
|
||||
file_size = models.BigIntegerField(help_text="File size in bytes")
|
||||
thumbnail_url = models.URLField(max_length=500, blank=True)
|
||||
published_date = models.DateTimeField()
|
||||
downloaded_date = models.DateTimeField(auto_now_add=True)
|
||||
view_count = models.IntegerField(default=0)
|
||||
like_count = models.IntegerField(default=0)
|
||||
audio_format = models.CharField(max_length=20, default='m4a')
|
||||
bitrate = models.IntegerField(null=True, blank=True, help_text="Bitrate in kbps")
|
||||
|
||||
# Playback tracking
|
||||
play_count = models.IntegerField(default=0)
|
||||
last_played = models.DateTimeField(null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['-published_date']
|
||||
unique_together = ('owner', 'youtube_id') # Each user can have one copy of each video
|
||||
indexes = [
|
||||
models.Index(fields=['owner', 'youtube_id']),
|
||||
models.Index(fields=['owner', 'channel_id']),
|
||||
models.Index(fields=['owner', '-published_date']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.owner.username} - {self.title}"
|
||||
|
||||
@property
|
||||
def downloaded(self):
|
||||
"""Check if audio file has been downloaded"""
|
||||
return bool(self.file_path)
|
||||
|
||||
@property
|
||||
def has_lyrics(self):
|
||||
"""Check if audio has lyrics"""
|
||||
return hasattr(self, 'lyrics') and self.lyrics.has_lyrics
|
||||
|
||||
|
||||
class Channel(models.Model):
|
||||
"""YouTube channel model"""
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='audio_channels')
|
||||
channel_id = models.CharField(max_length=100)
|
||||
channel_name = models.CharField(max_length=255)
|
||||
channel_description = models.TextField(blank=True)
|
||||
channel_thumbnail = models.URLField(blank=True)
|
||||
subscribed = models.BooleanField(default=False)
|
||||
subscriber_count = models.IntegerField(default=0)
|
||||
video_count = models.IntegerField(default=0)
|
||||
last_updated = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('user', 'channel_id')
|
||||
indexes = [
|
||||
models.Index(fields=['user', 'channel_id']),
|
||||
models.Index(fields=['user', 'subscribed']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.channel_name} ({self.user.username})"
|
||||
|
||||
|
||||
class AudioProgress(models.Model):
|
||||
"""Track user progress on audio files"""
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='audio_progress')
|
||||
audio = models.ForeignKey(Audio, on_delete=models.CASCADE, related_name='user_progress')
|
||||
position = models.IntegerField(default=0, help_text="Current position in seconds")
|
||||
completed = models.BooleanField(default=False)
|
||||
last_updated = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('user', 'audio')
|
||||
indexes = [
|
||||
models.Index(fields=['user', 'audio']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.user.username} - {self.audio.title}"
|
||||
Loading…
Add table
Add a link
Reference in a new issue