diff --git a/src/videoag_common/objects/medium.py b/src/videoag_common/objects/medium.py index c79916e9f5884222662c18371608eead20935252..e643c1ba8539250820b03ae3005ae86cc9e5566c 100644 --- a/src/videoag_common/objects/medium.py +++ b/src/videoag_common/objects/medium.py @@ -74,9 +74,10 @@ class SourceMedium(DeletableApiObject, Base): data_notes="Only calculated once this is sorted" ) ) - metadata: Mapped[JsonTypes] = api_mapped( + # metadata is reserved + file_metadata: Mapped[JsonTypes] = api_mapped( mapped_column(sql.JSON, nullable=True), - ApiDataField( + ApiJsonField( include_in_data=True, # See source file sorter for contents data_notes="Only calculated once this is sorted. There are no guarantees regarding the content" @@ -195,8 +196,8 @@ class TargetMedium(DeletableApiObject, Base): return options -class FileTargetMedium(TargetMedium): - file_path: Mapped[str] = mapped_column(String(collation=STRING_COLLATION), nullable=True, index=True) # TODO move? +class FileMedium(ApiObject): + file_path: Mapped[str] = mapped_column(String(collation=STRING_COLLATION), nullable=True, use_existing_column=True, index=True) # TODO move? @api_include_in_data( type_id="string", @@ -212,81 +213,80 @@ class FileTargetMedium(TargetMedium): return f"{self.process_target_id}.{self.id}" -class SingleAudioContainingMedium(TargetMedium): +class SingleAudioContainingMedium(ApiObject): audio_sample_rate: Mapped[int] = api_mapped( - mapped_column(nullable=True), + mapped_column(nullable=True, use_existing_column=True), ApiIntegerField( include_in_data=True, - help="In Hz" + data_notes="In Hz" ) ) audio_channel_count: Mapped[int] = api_mapped( - mapped_column(nullable=True), + mapped_column(nullable=True, use_existing_column=True), ApiIntegerField( include_in_data=True ) ) -class SingleVideoContainingMedium(TargetMedium): +class SingleVideoContainingMedium(ApiObject): video_vertical_resolution: Mapped[int] = api_mapped( - mapped_column(nullable=True), + mapped_column(nullable=True, use_existing_column=True), ApiIntegerField( include_in_data=True ) ) video_horizontal_resolution: Mapped[int] = api_mapped( - mapped_column(nullable=True), + mapped_column(nullable=True, use_existing_column=True), ApiIntegerField( include_in_data=True ) ) video_frame_rate_numerator: Mapped[int] = api_mapped( - mapped_column(nullable=True), + mapped_column(nullable=True, use_existing_column=True), ApiIntegerField( include_in_data=True ) ) video_frame_rate_denominator: Mapped[int] = api_mapped( - mapped_column(nullable=True), + mapped_column(nullable=True, use_existing_column=True), ApiIntegerField( include_in_data=True ) ) -class PlainVideoTargetMedium(FileTargetMedium, SingleVideoContainingMedium, SingleAudioContainingMedium): +class PlainVideoTargetMedium(TargetMedium, FileMedium, SingleVideoContainingMedium, SingleAudioContainingMedium): __tablename__ = None # Prevent our own base from adding a table name. This should be a single-table inheritance __mapper_args__ = { "polymorphic_identity": TargetMediumType.PLAIN_VIDEO } - duration_sec: Mapped[int] = api_mapped( - mapped_column(nullable=True), + mapped_column(nullable=True, use_existing_column=True), ApiIntegerField( include_in_data=True ) ) + # TODO check vars not null (except audio) -class PlainAudioTargetMedium(FileTargetMedium, SingleAudioContainingMedium): +class PlainAudioTargetMedium(TargetMedium, FileMedium, SingleAudioContainingMedium): __tablename__ = None # Prevent our own base from adding a table name. This should be a single-table inheritance __mapper_args__ = { "polymorphic_identity": TargetMediumType.PLAIN_AUDIO } - duration_sec: Mapped[int] = api_mapped( - mapped_column(nullable=True), + mapped_column(nullable=True, use_existing_column=True), ApiIntegerField( include_in_data=True ) ) -class ThumbnailTargetMedium(FileTargetMedium): +class ThumbnailTargetMedium(FileMedium): __tablename__ = None # Prevent our own base from adding a table name. This should be a single-table inheritance __mapper_args__ = { "polymorphic_identity": TargetMediumType.THUMBNAIL