def __init__(self, *args, **kwargs): super(Song, self).__init__(*args, **kwargs) self.audio_handler = FileHandlerSongAudio() if self.audio: self.audio_handler.load(self.audio)
def audio_url(self): if not self.audio: return if not self.audio_handler: self.audio_handler = FileHandlerSongAudio() return self.audio_handler.single_url()
class Song(models.Model): name = models.CharField(max_length=128) description = models.CharField(max_length=255, null=True, blank=True) about = models.TextField(null=True, blank=True) album = models.ForeignKey(Album, related_name='songs') lyrics = models.TextField(null=True, blank=True) duration = models.IntegerField() position = models.CharField(max_length=5, null=True, blank=True) composer = models.ManyToManyField(ComposerRole) signature = models.CharField(max_length=10, null=True, blank=True) tempo = models.IntegerField(choices=Tempo.choices(), null=True, blank=True) tonality = models.CharField(max_length=10, null=True, blank=True, choices=Tonality.choices()) audio = models.CharField(max_length=255, null=True, blank=True) class Meta: unique_together = ('name', 'album') def __unicode__(self): duration = " (%s)" % self.duration_display if self.duration else "" return "%s - %s%s" % (self.position, self.name, duration) def __init__(self, *args, **kwargs): super(Song, self).__init__(*args, **kwargs) self.audio_handler = FileHandlerSongAudio() if self.audio: self.audio_handler.load(self.audio) @property def audio_url(self): if not self.audio: return if not self.audio_handler: self.audio_handler = FileHandlerSongAudio() return self.audio_handler.single_url() @property def lyrics_html_display(self): return '<br />'.join(self.lyrics.splitlines()) @property def tempo_display(self): if self.tempo and self.tempo >= 10: return "%s bpm"% Tempo.display(self.tempo) else: return "N/A" @property def tempo_html_display(self): d = self.tempo_display tempo = self.tempo or 0 return '<span class="tempo%s">%s</span>' % (tempo, d) @property def signature_html_display(self): return self.signature @property def signature_tuple(self): if not self.signature: return (4, 4) return tuple(map(int, self.signature.split('/'))) @property def signature_beats(self): return self.signature_tuple[0] @property def signature_value(self): return self.signature_tuple[1] @property def signature_beats_range(self): return range(self.signature_tuple[0]) @property def tonality_html_display(self): return Tonality.html_display(self.tonality) @property def duration_display(self): if not self.duration: return "" z = lambda x: str(x).zfill(2) return "%s:%s" % (z(self.duration / 60), z(self.duration % 60)) @property def composer_display(self): return ', '.join([str(c.composer) for c in self.composer.all()])