from django.contrib.auth.models import User from django.db import models class PodcastFeed(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='podcast_feeds') rss_url = models.URLField(max_length=1000) title = models.CharField(max_length=300) description = models.TextField(blank=True) artwork_url = models.URLField(max_length=1000, blank=True) author = models.CharField(max_length=300, blank=True) link = models.URLField(max_length=1000, blank=True) last_refreshed_at = models.DateTimeField(null=True, blank=True) added_at = models.DateTimeField(auto_now_add=True) auto_queue = models.BooleanField(default=False) class Meta: unique_together = ('user', 'rss_url') ordering = ['title'] def __str__(self): return self.title class PodcastEpisode(models.Model): feed = models.ForeignKey(PodcastFeed, on_delete=models.CASCADE, related_name='episodes') guid = models.CharField(max_length=1000) title = models.CharField(max_length=500) description = models.TextField(blank=True) audio_url = models.URLField(max_length=1000) duration_seconds = models.IntegerField(default=0) pub_date = models.DateTimeField(null=True, blank=True) episode_number = models.IntegerField(null=True, blank=True) season_number = models.IntegerField(null=True, blank=True) artwork_url = models.URLField(max_length=1000, blank=True) discovered_at = models.DateTimeField(auto_now_add=True) class Meta: unique_together = ('feed', 'guid') ordering = ['-pub_date'] def __str__(self): return self.title class EpisodeProgress(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='episode_progress') episode = models.ForeignKey(PodcastEpisode, on_delete=models.CASCADE, related_name='progress') position_seconds = models.IntegerField(default=0) played = models.BooleanField(default=False) dismissed = models.BooleanField(default=False) updated_at = models.DateTimeField(auto_now=True) class Meta: unique_together = ('user', 'episode') ordering = ['-updated_at'] def __str__(self): return f'{self.user} - {self.episode}' class PodcastQueue(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='podcast_queue') episode = models.ForeignKey(PodcastEpisode, on_delete=models.CASCADE, related_name='queued_by') position = models.PositiveIntegerField(default=0) added_at = models.DateTimeField(auto_now_add=True) class Meta: unique_together = ('user', 'episode') ordering = ['position'] def __str__(self): return f'{self.user} queue pos {self.position}: {self.episode}' class PodcastSettings(models.Model): """A user's podcast preferences. Where episodes go in the queue: when added by hand (also when played from outside the queue), and when a feed with auto_queue brings new ones.""" BACK = 'back' FRONT = 'front' AFTER_CURRENT = 'after_current' POSITIONS = [ (BACK, 'Ans Ende'), (FRONT, 'An den Anfang'), (AFTER_CURRENT, 'Nach der laufenden Folge'), ] user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='podcast_settings') enqueue_position = models.CharField(max_length=20, choices=POSITIONS, default=BACK) # front = how auto-queue always worked before this setting existed auto_queue_position = models.CharField(max_length=20, choices=POSITIONS, default=FRONT) @classmethod def for_user(cls, user): obj, _ = cls.objects.get_or_create(user=user) return obj def __str__(self): return f'Podcast settings of {self.user}'