diff --git a/controller/api/bilirecorder_blueprint.py b/controller/api/bilirecorder_blueprint.py index 8a37585..b3f88ea 100644 --- a/controller/api/bilirecorder_blueprint.py +++ b/controller/api/bilirecorder_blueprint.py @@ -2,18 +2,19 @@ import os.path import threading from datetime import datetime from glob import glob -from flask import Blueprint, jsonify, request, current_app from typing import Optional +from flask import Blueprint, jsonify, request, current_app + from config import BILILIVE_RECORDER_DIRECTORY, VIDEO_TITLE, XIGUALIVE_RECORDER_DIRECTORY +from exception.danmaku import DanmakuException from model import db from model.DanmakuClip import DanmakuClip from model.VideoClip import VideoClip from model.Workflow import Workflow -from workflow.worker import do_workflow from workflow.danmaku import get_file_start from workflow.video import get_video_real_duration -from exception.danmaku import DanmakuException +from workflow.worker import do_workflow blueprint = Blueprint("api_bilirecorder", __name__, url_prefix="/api/bilirecorder") @@ -25,12 +26,14 @@ def auto_submit_task(): if bili_record_workflow_item is None: return if not bili_record_workflow_item.editing: - if len(bili_record_workflow_item.video_clips) > 0 and len(bili_record_workflow_item.danmaku_clips) > 0: - threading.Thread(target=do_workflow, args=( - bili_record_workflow_item.video_clips[0].full_path, - bili_record_workflow_item.danmaku_clips[0].full_path, - *[clip.full_path for clip in bili_record_workflow_item.danmaku_clips[1:]] - )).start() + if len(bili_record_workflow_item.video_clips) > 0: + for video_clip in bili_record_workflow_item.video_clips: + if len(video_clip.danmaku_clips) > 0: + threading.Thread(target=do_workflow, args=( + video_clip.full_path, + video_clip.danmaku_clips[0].full_path, + *[clip.full_path for clip in video_clip.danmaku_clips[1:]] + )).start() clear_item() @@ -98,9 +101,9 @@ def collect_danmaku_files(workflow: Optional[Workflow]): danmaku.file = relpath danmaku.base_path = BILILIVE_RECORDER_DIRECTORY danmaku.offset = 0 - danmaku.workflow = workflow + danmaku.video_clip = clip db.session.add(danmaku) - workflow.danmaku_clips.append(danmaku) + clip.danmaku_clips.append(danmaku) if start_time_ts is None: if clip.duration is None or clip.duration == 0: clip.duration = get_video_real_duration(clip.full_path) @@ -123,9 +126,9 @@ def collect_danmaku_files(workflow: Optional[Workflow]): danmaku.file = relpath danmaku.base_path = XIGUALIVE_RECORDER_DIRECTORY danmaku.offset = bias - danmaku.workflow = workflow + danmaku.video_clip = clip db.session.add(danmaku) - workflow.danmaku_clips.append(danmaku) + clip.danmaku_clips.append(danmaku) commit_item() diff --git a/model/DanmakuClip.py b/model/DanmakuClip.py index df96539..cb5f690 100644 --- a/model/DanmakuClip.py +++ b/model/DanmakuClip.py @@ -2,8 +2,9 @@ import os from typing import TYPE_CHECKING from . import db + if TYPE_CHECKING: - from .Workflow import Workflow + from .VideoClip import VideoClip class DanmakuClip(db.Model): @@ -11,8 +12,8 @@ class DanmakuClip(db.Model): base_path = db.Column(db.String(255)) file = db.Column(db.String(255)) offset = db.Column(db.Float, nullable=False, default=0) - workflow_id = db.Column(db.Integer, db.ForeignKey('workflow.id')) - workflow: "Workflow" = db.relationship("Workflow", uselist=False, backref=db.backref("danmaku_clips")) + video_clip_id = db.Column(db.Integer, db.ForeignKey('video_clip.id')) + video_clip: "VideoClip" = db.relationship("VideoClip", uselist=False, backref=db.backref("danmaku_clips")) @property def full_path(self): diff --git a/model/VideoClip.py b/model/VideoClip.py index 2dc5a36..71f16ef 100644 --- a/model/VideoClip.py +++ b/model/VideoClip.py @@ -2,11 +2,15 @@ import os.path from typing import TYPE_CHECKING from . import db + if TYPE_CHECKING: from .Workflow import Workflow + from .DanmakuClip import DanmakuClip class VideoClip(db.Model): + danmaku_clips: list["DanmakuClip"] + id = db.Column(db.Integer, primary_key=True, autoincrement=True) base_path = db.Column(db.String(255)) file = db.Column(db.String(255)) @@ -30,4 +34,5 @@ class VideoClip(db.Model): "duration": self.duration, "offset": self.offset, "workflow_id": self.workflow_id, + "danmaku_clips": [i.to_json() for i in self.danmaku_clips], } diff --git a/model/Workflow.py b/model/Workflow.py index 1d8510e..7496352 100644 --- a/model/Workflow.py +++ b/model/Workflow.py @@ -2,15 +2,14 @@ from datetime import datetime, timedelta from typing import TYPE_CHECKING from . import db + if TYPE_CHECKING: from .VideoClip import VideoClip from .VideoPart import VideoPart - from .DanmakuClip import DanmakuClip class Workflow(db.Model): video_clips: list["VideoClip"] - danmaku_clips: list["DanmakuClip"] video_parts: list["VideoPart"] id = db.Column(db.Integer, primary_key=True, autoincrement=True) @@ -42,5 +41,4 @@ class Workflow(db.Model): "editing": self.editing, "start_after_time": self.start_after_time.strftime("%Y/%m/%d %H:%M:%S") if self.start_after_time else None, "video_clips": [i.to_json() for i in self.video_clips], - "danmaku_clips": [i.to_json() for i in self.danmaku_clips], }