[go: up one dir, main page]

File: track.py

package info (click to toggle)
cozy 1.3.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,140 kB
  • sloc: python: 8,014; xml: 392; makefile: 2
file content (137 lines) | stat: -rw-r--r-- 4,089 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import logging

from peewee import SqliteDatabase, DoesNotExist

from cozy.db.file import File
from cozy.db.track import Track as TrackModel
from cozy.db.track_to_file import TrackToFile
from cozy.model.chapter import Chapter

NS_TO_SEC = 10 ** 9

log = logging.getLogger("TrackModel")


class TrackInconsistentData(Exception):
    pass


class Track(Chapter):
    def __init__(self, db: SqliteDatabase, track: TrackModel):
        super().__init__()
        self._db: SqliteDatabase = db
        self.id: int = track.id

        self._db_object: TrackModel = track
        try:
            self._track_to_file_db_object: TrackToFile = track.track_to_file.get()
        except DoesNotExist:
            log.error("Inconsistent DB, TrackToFile object is missing. Deleting this track.")
            self._db_object.delete_instance(recursive=True, delete_nullable=False)
            raise TrackInconsistentData

    @property
    def name(self):
        if self._db_object.name:
            return self._db_object.name

        return f"{_('Chapter')} {self.number}"

    @name.setter
    def name(self, new_name: str):
        self._db_object.name = new_name
        self._db_object.save(

    @property
    def number(self):
        return self._db_object.number

    @number.setter
    def number(self, new_number: int):
        self._db_object.number = new_number
        self._db_object.save(

    @property
    def disk(self):
        return self._db_object.disk

    @disk.setter
    def disk(self, new_disk: int):
        self._db_object.disk = new_disk
        self._db_object.save(

    @property
    def position(self):
        return self._db_object.position

    @position.setter
    def position(self, new_position: int):
        self._db_object.position = new_position
        self._db_object.save(

    @property
    def start_position(self) -> int:
        return self._track_to_file_db_object.start_at

    @property
    def end_position(self) -> int:
        return self.start_position + (int(self.length) * NS_TO_SEC)

    @property
    def file(self):
        return self._track_to_file_db_object.file.path

    @file.setter
    def file(self, new_file: str):
        file_query = File.select().where(File.path == new_file)

        if file_query.count() > 0:
            self._exchange_file(file_query.get())
        else:
            self._create_new_file(new_file)

    @property
    def file_id(self):
        return self._track_to_file_db_object.file.id

    @property
    def length(self) -> float:
        return self._db_object.length

    @length.setter
    def length(self, new_length: float):
        self._db_object.length = new_length
        self._db_object.save(

    @property
    def modified(self):
        return self._track_to_file_db_object.file.modified

    @modified.setter
    def modified(self, new_modified: int):
        file = self._track_to_file_db_object.file
        file.modified = new_modified
        file.save(

    def delete(self):
        file_id = self.file_id
        self._db_object.delete_instance(recursive=True)

        if TrackToFile.select().join(File).where(TrackToFile.file.id == file_id).count() == 0:
            File.delete().where(File.id == file_id).execute()

        self.emit_event("chapter-deleted", self)
        self.destroy_listeners()

    def _exchange_file(self, file: File):
        old_file_id = self._track_to_file_db_object.file.id
        self._track_to_file_db_object.file = file
        self._track_to_file_db_object.save(

        if TrackToFile.select().join(File).where(TrackToFile.file.id == old_file_id).count() == 0:
            File.delete().where(File.id == old_file_id).execute()

    def _create_new_file(self, new_file: str):
        file = self._track_to_file_db_object.file
        file.path = new_file
        file.save(