FastMovieAI AI短剧创作平台 二开基线

- 源码: xhadmincn/FastMovieAI (Apache 2.0)
- 二开: Docker部署, Swoole改Select, route.php修复, 补update/VERSION
- vendor/示例资源已gitignore
This commit is contained in:
李建琦
2026-08-26 18:37:36 +08:00
commit eae151fd57
888 changed files with 105571 additions and 0 deletions
@@ -0,0 +1,101 @@
<?php
namespace plugin\model\process\audio;
use plugin\control\expose\helper\Uploads;
use plugin\model\app\model\PluginModelTask;
use plugin\model\app\model\PluginModelTaskResult;
use plugin\model\utils\enum\ModelScene;
use plugin\model\utils\enum\ModelTaskStatus;
use plugin\model\utils\enum\ModelType;
use plugin\notification\expose\helper\Push;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboard;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardDialogue;
use support\Log;
use think\facade\Db;
use Workerman\Coroutine;
use Workerman\Crontab\Crontab;
use Workerman\Timer;
class AudioTransfer
{
public function onWorkerStart($worker)
{
$id = $worker->id;
new Crontab('*/5 * * * * *', function () use ($id) {
try {
if ($id) {
Timer::sleep(0.3 * $id);
}
Coroutine::create(function () {
$PluginModelTask = PluginModelTask::where(['status' => ModelTaskStatus::WAIT_DOWNLOAD['value'], 'model_type' => ModelType::AUDIO['value']])->order('last_heartbeat asc,id asc')->lock(true)->find();
if (!$PluginModelTask) {
return;
}
$PluginModelTask->status = ModelTaskStatus::DOWNLOADING['value'];
$PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+5 seconds'));
$PluginModelTask->save();
$PluginModelTaskResult = PluginModelTaskResult::where('task_id', $PluginModelTask->id)->find();
if (!$PluginModelTaskResult) {
return;
}
try {
$ModelScene = ModelScene::get($PluginModelTask->scene);
$classify = Uploads::getClassify($PluginModelTask->channels_uid, 'uploads/' . $PluginModelTask->scene, $ModelScene['label']);
$result = Uploads::download($PluginModelTask->channels_uid, $PluginModelTaskResult->audio, $classify);
} catch (\Throwable $th) {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->status = ModelTaskStatus::WAIT_DOWNLOAD['value'];
$PluginModelTask->save();
Log::error("音频转存处理失败:" . $th->getMessage(), $th->getTrace());
return;
}
$pushData = [
'task_id' => $PluginModelTask->id,
'id' => $PluginModelTask->alias_id,
'audio' => $result->file_url
];
$event = 'generate' . strtolower(str_replace('_', '', $PluginModelTask->scene));
Db::startTrans();
try {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->status = ModelTaskStatus::SUCCESS['value'];
$PluginModelTask->save();
$PluginModelTaskResult = PluginModelTaskResult::where('task_id', $PluginModelTask->id)->find();
$PluginModelTaskResult->audio_path = $result->file_name;
$PluginModelTaskResult->save();
switch ($PluginModelTask->scene) {
case ModelScene::DIALOGUE_VOICE['value']:
$PluginShortplayDramaStoryboardDialogue = PluginShortplayDramaStoryboardDialogue::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayDramaStoryboardDialogue->audio = $result->file_name;
$PluginShortplayDramaStoryboardDialogue->save();
$event = 'generatestoryboard';
$pushData['event'] = ModelScene::DIALOGUE_VOICE['value'];
$pushData['id']=$PluginShortplayDramaStoryboardDialogue->storyboard_id;
$pushData['dialogue_id']=$PluginShortplayDramaStoryboardDialogue->id;
break;
case ModelScene::STORYBOARD_NARRATION_VOICE['value']:
$PluginShortplayDramaStoryboard = PluginShortplayDramaStoryboard::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayDramaStoryboard->narration_audio = $result->file_name;
$PluginShortplayDramaStoryboard->save();
$event = 'generatestoryboard';
$pushData['event'] = ModelScene::STORYBOARD_NARRATION_VOICE['value'];
break;
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
Log::error("音频转存保存失败:" . $th->getMessage(), $th->getTrace());
}
Push::send([
'uid' => $PluginModelTask->uid,
'channels_uid' => $PluginModelTask->channels_uid,
'event' => $event
], $pushData);
});
} catch (\Throwable $th) {
Log::error("音频转存定时任务失败:" . $th->getMessage(), $th->getTrace());
}
});
}
}
@@ -0,0 +1,450 @@
<?php
namespace plugin\model\process\chat;
use plugin\control\utils\yidevs\Yidevs;
use plugin\finance\expose\helper\Account;
use plugin\finance\utils\enum\PointsBillScene;
use plugin\model\app\model\PluginModel;
use plugin\model\app\model\PluginModelTask;
use plugin\model\app\model\PluginModelTaskResult;
use plugin\model\utils\enum\ModelScene;
use plugin\model\utils\enum\ModelTaskStatus;
use plugin\model\utils\enum\ModelType;
use plugin\notification\expose\helper\Push;
use plugin\shortplay\app\model\PluginShortplayActor;
use plugin\shortplay\app\model\PluginShortplayDrama;
use plugin\shortplay\app\model\PluginShortplayDramaActor;
use plugin\shortplay\app\model\PluginShortplayDramaEpisode;
use plugin\shortplay\app\model\PluginShortplayDramaEpisodeActor;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboard;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardActor;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardDialogue;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardProp;
use plugin\shortplay\app\model\PluginShortplayProp;
use plugin\shortplay\utils\enum\ActorStatus;
use plugin\shortplay\utils\enum\PropStatus;
use support\Log;
use think\facade\Db;
use Workerman\Coroutine;
use Workerman\Crontab\Crontab;
use Workerman\Timer;
class Submit
{
public function onWorkerStart($worker)
{
$id = $worker->id;
new Crontab('*/5 * * * * *', function () use (&$id) {
try {
if ($id) {
Timer::sleep(0.3 * $id);
}
Coroutine::create(function () {
$PluginModelTask = PluginModelTask::where(['status' => ModelTaskStatus::WAIT['value'], 'model_type' => ModelType::CHAT['value']])->order('last_heartbeat asc,id asc')->lock(true)->find();
if (!$PluginModelTask) {
return;
}
if ($PluginModelTask->expectation_execution_count !== null) {
$PluginModelTask->execution_count = Db::raw('execution_count + 1');
}
$PluginModelTask->status = ModelTaskStatus::PROCESSING['value'];
$PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+5 seconds'));
$PluginModelTask->save();
p($PluginModelTask->id);
$event = 'generate' . strtolower(str_replace('_', '', $PluginModelTask->scene));
$PluginModelTaskResult = PluginModelTaskResult::where('task_id', $PluginModelTask->id)->find();
if (!$PluginModelTaskResult) {
$PluginModelTask->status = ModelTaskStatus::FAIL['value'];
$PluginModelTask->save();
Push::send([
'uid' => $PluginModelTask->uid,
'channels_uid' => $PluginModelTask->channels_uid,
'event' => $event
], [
'task_id' => $PluginModelTask->id,
'id' => $PluginModelTask->alias_id
]);
return;
}
$data = $PluginModelTaskResult->params;
switch ($PluginModelTask->scene) {
case ModelScene::CREATIVE_EPISODE['value']:
try {
$data['params']['form_data']['episode_no'] = $data['params']['form_data']['episode_no'] + 1;
p($PluginModelTask->id, $data['params']['form_data']['episode_no'], 'start');
$result = Yidevs::ChatAssistantCompletions($data['channels_uid'], $data['params']);
p($PluginModelTask->id, $data['params']['form_data']['episode_no'], 'success');
} catch (\Throwable $th) {
Log::error('CREATIVE_EPISODE Error:' . $th->getMessage() . PHP_EOL . $th->getTraceAsString());
}
$taksStatus = ModelTaskStatus::FAIL['value'];
if (!empty($result)) {
Db::startTrans();
try {
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $data['drama_id']])->find();
$episode_num = $PluginShortplayDrama->episode_num + 1;
$PluginShortplayDrama->episode_num = Db::raw('episode_num + 1');
$PluginShortplayDrama->save();
$PluginShortplayDramaEpisode = new PluginShortplayDramaEpisode();
$PluginShortplayDramaEpisode->channels_uid = $data['channels_uid'];
$PluginShortplayDramaEpisode->drama_id = $data['drama_id'];
$PluginShortplayDramaEpisode->episode_no = $episode_num;
$PluginShortplayDramaEpisode->title = $result['title'];
$PluginShortplayDramaEpisode->outline = $result['description'];
$PluginShortplayDramaEpisode->content = $result['content'];
$PluginShortplayDramaEpisode->save();
if (!empty($result['actor'])) {
$PluginShortplayActors = PluginShortplayActor::whereIn('actor_id', $result['actor'])->field('id,actor_id')->select();
foreach ($PluginShortplayActors as $PluginShortplayActor) {
if (!PluginShortplayDramaActor::where(['drama_id' => $PluginShortplayDrama->id, 'actor_id' => $PluginShortplayActor->id])->count()) {
$PluginShortplayDramaActor = new PluginShortplayDramaActor();
$PluginShortplayDramaActor->channels_uid = $data['channels_uid'];
$PluginShortplayDramaActor->drama_id = $PluginShortplayDrama->id;
$PluginShortplayDramaActor->actor_id = $PluginShortplayActor->id;
$PluginShortplayDramaActor->save();
}
$PluginShortplayDramaEpisodeActor = new PluginShortplayDramaEpisodeActor();
$PluginShortplayDramaEpisodeActor->channels_uid = $data['channels_uid'];
$PluginShortplayDramaEpisodeActor->drama_id = $PluginShortplayDrama->id;
$PluginShortplayDramaEpisodeActor->episode_id = $PluginShortplayDramaEpisode->id;
$PluginShortplayDramaEpisodeActor->actor_id = $PluginShortplayActor->id;
$PluginShortplayDramaEpisodeActor->save();
}
}
$updateActors = [];
if (!empty($result['create_actor'])) {
foreach ($result['create_actor'] as $actor) {
$PluginShortplayActor = PluginShortplayActor::where(['name' => $actor['name'], 'channels_uid' => $data['channels_uid'], 'drama_id' => $PluginShortplayDrama->id])->field('id,actor_id')->find();
if (!$PluginShortplayActor) {
if (empty($actor['description'])) {
continue;
}
$PluginShortplayActor = new PluginShortplayActor();
$PluginShortplayActor->channels_uid = $data['channels_uid'];
$PluginShortplayActor->drama_id = $PluginShortplayDrama->id;
$PluginShortplayActor->episode_id = $PluginShortplayDramaEpisode->id;
$PluginShortplayActor->uid = $data['uid'];
$PluginShortplayActor->actor_id = uniqid();
$PluginShortplayActor->name = $actor['name'];
$PluginShortplayActor->species_type = $actor['species'];
$PluginShortplayActor->gender = $actor['gender'];
$PluginShortplayActor->age = $actor['age'];
$PluginShortplayActor->remarks = $actor['description'];
$PluginShortplayActor->status = ActorStatus::INITIALIZING['value'];
$PluginShortplayActor->save();
$updateActors[] = "{$PluginShortplayActor->name}{{$PluginShortplayActor->actor_id}}";
}
$PluginShortplayDramaActor = new PluginShortplayDramaActor();
$PluginShortplayDramaActor->channels_uid = $data['channels_uid'];
$PluginShortplayDramaActor->drama_id = $PluginShortplayDrama->id;
$PluginShortplayDramaActor->actor_id = $PluginShortplayActor->id;
$PluginShortplayDramaActor->save();
$PluginShortplayDramaEpisodeActor = new PluginShortplayDramaEpisodeActor();
$PluginShortplayDramaEpisodeActor->channels_uid = $data['channels_uid'];
$PluginShortplayDramaEpisodeActor->drama_id = $PluginShortplayDrama->id;
$PluginShortplayDramaEpisodeActor->episode_id = $PluginShortplayDramaEpisode->id;
$PluginShortplayDramaEpisodeActor->actor_id = $PluginShortplayActor->id;
$PluginShortplayDramaEpisodeActor->save();
}
}
$PluginModelTask = PluginModelTask::where(['id' => $PluginModelTask->id])->with(['result'])->find();
if (
$PluginModelTask->expectation_execution_count === null
|| ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->success_execution_count + 1 >= $PluginModelTask->expectation_execution_count)
) {
$PluginModelTask->status = ModelTaskStatus::SUCCESS['value'];
$PluginModelTask->success_execution_count = Db::raw('success_execution_count + 1');
$PluginModelTask->result->result = $result;
$PluginModelTask->together(['result'])->save();
} else {
$PluginModelTask->status = ModelTaskStatus::WAIT['value'];
$PluginModelTask->success_execution_count = Db::raw('success_execution_count + 1');
$PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+10 seconds'));
$data['params']['form_data']['pre_episode'] = $result['content'];
if (!empty($updateActors)) {
$data['params']['form_data']['actors'] .= "," . implode(',', $updateActors);
}
$PluginModelTask->result->params = $data;
$PluginModelTask->together(['result'])->save();
}
$taksStatus = ModelTaskStatus::SUCCESS['value'];
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
Log::error('续写分集失败 Error:' . $th->getMessage() . PHP_EOL . $th->getTraceAsString());
}
}
if ($taksStatus == ModelTaskStatus::FAIL['value']) {
$PluginModelTask = PluginModelTask::where(['id' => $PluginModelTask->id])->find();
if (
$PluginModelTask->expectation_execution_count === null
|| ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->success_execution_count + 1 >= $PluginModelTask->expectation_execution_count)
|| ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->execution_count >= $PluginModelTask->expectation_execution_count * 2)
) {
$PluginModelTask->status = ModelTaskStatus::FAIL['value'];
$PluginModelTask->save();
Push::send([
'uid' => $data['uid'],
'channels_uid' => $data['channels_uid'],
'event' => 'continueepisode',
], [
'drama_id' => $data['drama_id']
]);
} else {
$PluginModelTask->status = ModelTaskStatus::WAIT['value'];
$PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+10 seconds'));
$PluginModelTask->save();
}
} else {
Push::send([
'uid' => $data['uid'],
'channels_uid' => $data['channels_uid'],
'event' => 'continueepisode',
], [
'drama_id' => $data['drama_id']
]);
}
break;
case ModelScene::CREATIVE_STORYBOARDS['value']:
try {
p('start');
$result = Yidevs::ChatAssistantCompletions($data['channels_uid'], $data['params']);
p($result);
} catch (\Throwable $th) {
Log::error('CREATIVE_STORYBOARDS Error:' . $th->getMessage() . PHP_EOL . $th->getTraceAsString());
}
$taksStatus = ModelTaskStatus::FAIL['value'];
if (!empty($result)) {
Db::startTrans();
try {
$previous_dialogues = '';
$whereOr = [];
$whereOr[] = ['uid', '=', null];
$whereOr[] = ['uid', '=', $data['uid']];
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $data['drama_id']])->find();
$sort = PluginShortplayDramaStoryboard::where(['drama_id' => $data['drama_id'], 'episode_id' => $data['episode_id']])->max('sort') + 1 ?? 1;
$PluginShortplayDramaStoryboard = new PluginShortplayDramaStoryboard;
$PluginShortplayDramaStoryboard->channels_uid = $data['channels_uid'];
$PluginShortplayDramaStoryboard->drama_id = $data['drama_id'];
$PluginShortplayDramaStoryboard->episode_id = $data['episode_id'];
$PluginShortplayDramaStoryboard->scene_id = $result['scene_id'];
$PluginShortplayDramaStoryboard->sort = $sort;
$PluginShortplayDramaStoryboard->description = $result['description'];
if (!empty($result['image_prompt'])) {
$PluginShortplayDramaStoryboard->image_prompt = $result['image_prompt'];
}
if (!empty($result['video_prompt'])) {
$PluginShortplayDramaStoryboard->video_prompt = $result['video_prompt'];
}
$PluginShortplayDramaStoryboard->shot_type = $result['shot_type'];
$PluginShortplayDramaStoryboard->shot_angle = $result['shot_angle'];
$PluginShortplayDramaStoryboard->shot_motion = $result['shot_motion'];
if (empty($result['narration'])) {
$PluginShortplayDramaStoryboard->narration = $result['narration'];
}
// $PluginShortplayDramaStoryboard->sfx = $storyboard['sfx'];
$PluginShortplayDramaStoryboard->duration = $result['duration'];
$PluginShortplayDramaStoryboard->save();
$updateActors = [];
if (!empty($result['actor'])) {
foreach ($result['actor'] as $actor_key => $actor) {
$PluginShortplayActor = null;
if (!empty($actor['actor_id'])) {
$PluginShortplayActor = PluginShortplayActor::where(['actor_id' => $actor['actor_id']])->find();
}
if (!$PluginShortplayActor) {
$PluginShortplayActor = PluginShortplayActor::where(['channels_uid' => $data['channels_uid'], 'name' => $actor['name']])->whereOr($whereOr)->find();
}
if (!$PluginShortplayActor && !empty($actor['description'])) {
$PluginShortplayActor = new PluginShortplayActor;
$PluginShortplayActor->channels_uid = $data['channels_uid'];
$PluginShortplayActor->uid = $data['uid'];
$PluginShortplayActor->drama_id = $data['drama_id'];
$PluginShortplayActor->episode_id = $data['episode_id'];
$PluginShortplayActor->actor_id = uniqid();
$PluginShortplayActor->name = $actor['name'];
$PluginShortplayActor->remarks = $actor['description'];
$PluginShortplayActor->status = ActorStatus::INITIALIZING['value'];
$PluginShortplayActor->save();
$PluginShortplayDramaActor = new PluginShortplayDramaActor();
$PluginShortplayDramaActor->channels_uid = $data['channels_uid'];
$PluginShortplayDramaActor->drama_id = $data['drama_id'];
$PluginShortplayDramaActor->actor_id = $PluginShortplayActor->id;
$PluginShortplayDramaActor->save();
$PluginShortplayDramaEpisodeActor = new PluginShortplayDramaEpisodeActor;
$PluginShortplayDramaEpisodeActor->channels_uid = $data['channels_uid'];
$PluginShortplayDramaEpisodeActor->drama_id = $data['drama_id'];
$PluginShortplayDramaEpisodeActor->episode_id = $data['episode_id'];
$PluginShortplayDramaEpisodeActor->actor_id = $PluginShortplayActor->id;
$PluginShortplayDramaEpisodeActor->save();
$updateActors[] = "{$PluginShortplayActor->name}{{$PluginShortplayActor->actor_id}}";
}
if ($PluginShortplayActor) {
$PluginShortplayDramaStoryboardActor = new PluginShortplayDramaStoryboardActor();
$PluginShortplayDramaStoryboardActor->channels_uid = $data['channels_uid'];
$PluginShortplayDramaStoryboardActor->drama_id = $data['drama_id'];
$PluginShortplayDramaStoryboardActor->episode_id = $data['episode_id'];
$PluginShortplayDramaStoryboardActor->storyboard_id = $PluginShortplayDramaStoryboard->id;
$PluginShortplayDramaStoryboardActor->actor_id = $PluginShortplayActor->id;
$PluginShortplayDramaStoryboardActor->save();
}
}
}
$PluginShortplayActor = null;
if (!empty($result['dialogues'])) {
foreach ($result['dialogues'] as $dialogue_key => $dialogue) {
if (!empty($dialogue['actor']['actor_id'])) {
$PluginShortplayActor = PluginShortplayActor::where(['actor_id' => $dialogue['actor']['actor_id']])->find();
}
if (!$PluginShortplayActor) {
$PluginShortplayActor = PluginShortplayActor::where(['channels_uid' => $data['channels_uid'], 'name' => $dialogue['actor']['name']])->whereOr($whereOr)->find();
}
if (!$PluginShortplayActor) {
continue;
}
$PluginShortplayDramaStoryboardDialogue = new PluginShortplayDramaStoryboardDialogue();
$PluginShortplayDramaStoryboardDialogue->channels_uid = $data['channels_uid'];
$PluginShortplayDramaStoryboardDialogue->storyboard_id = $PluginShortplayDramaStoryboard->id;
$PluginShortplayDramaStoryboardDialogue->actor_id = $PluginShortplayActor->id;
$PluginShortplayDramaStoryboardDialogue->prosody_speed = $dialogue['prosody_speed'];
$PluginShortplayDramaStoryboardDialogue->prosody_volume = $dialogue['prosody_volume'];
$PluginShortplayDramaStoryboardDialogue->emotion = $dialogue['emotion'];
$PluginShortplayDramaStoryboardDialogue->start_time = $dialogue['start_time'];
$PluginShortplayDramaStoryboardDialogue->end_time = $dialogue['end_time'];
$PluginShortplayDramaStoryboardDialogue->inner_monologue = empty($dialogue['inner_monologue']) ? 0 : 1;
$content = $dialogue['content'];
if (empty($content)) {
$content = '……';
}
$PluginShortplayDramaStoryboardDialogue->content = $content;
$PluginShortplayDramaStoryboardDialogue->save();
$previous_dialogues .= "{$PluginShortplayActor->name}{$content}\n";
}
}
$updateProps = [];
if (!empty($result['prop'])) {
foreach ($result['prop'] as $prop_key => $prop) {
$PluginShortplayProp = null;
if (!empty($prop['prop_id'])) {
$PluginShortplayProp = PluginShortplayProp::where(['prop_id' => $prop['prop_id']])->find();
}
if (!$PluginShortplayProp) {
$PluginShortplayProp = PluginShortplayProp::where(['name' => $prop['name'], 'channels_uid' => $data['channels_uid'], 'drama_id' => $data['drama_id']])->find();
}
if (!$PluginShortplayProp && !empty($prop['description'])) {
$PluginShortplayProp = new PluginShortplayProp;
$PluginShortplayProp->channels_uid = $data['channels_uid'];
$PluginShortplayProp->uid = $data['uid'];
$PluginShortplayProp->drama_id = $data['drama_id'];
$PluginShortplayProp->episode_id = $data['episode_id'];
$PluginShortplayProp->prop_id = uniqid();
$PluginShortplayProp->name = $prop['name'];
$PluginShortplayProp->description = $prop['description'];
$PluginShortplayProp->status = PropStatus::INITIALIZING['value'];
$PluginShortplayProp->save();
$updateProps[] = "{$PluginShortplayProp->name}{{$PluginShortplayProp->prop_id}}";
}
if ($PluginShortplayProp) {
$PluginShortplayDramaStoryboardProp = new PluginShortplayDramaStoryboardProp();
$PluginShortplayDramaStoryboardProp->channels_uid = $data['channels_uid'];
$PluginShortplayDramaStoryboardProp->storyboard_id = $PluginShortplayDramaStoryboard->id;
$PluginShortplayDramaStoryboardProp->prop_id = $PluginShortplayProp->id;
$PluginShortplayDramaStoryboardProp->save();
}
}
}
$success_execution_count = $PluginModelTask->success_execution_count + 1;
$PluginModelTask = PluginModelTask::where(['id' => $PluginModelTask->id])->with(['result'])->find();
if ($result['is_end']) {
$PluginModelTask->success_execution_count = $PluginModelTask->expectation_execution_count;
}
if (
$PluginModelTask->expectation_execution_count === null
|| ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->success_execution_count + 1 >= $PluginModelTask->expectation_execution_count)
) {
$PluginModel = PluginModel::where(['id' => $PluginModelTask->model_id])->find();
$point = $PluginModel->point * $success_execution_count;
Account::decPoints($PluginShortplayDrama->uid, $PluginShortplayDrama->channels_uid, $point > 200 ? 200 : $point, PointsBillScene::CONSUME['value'], null, '生成分镜', true, true);
$PluginModelTask->status = ModelTaskStatus::SUCCESS['value'];
$PluginModelTask->success_execution_count = Db::raw('success_execution_count + 1');
$PluginModelTask->result->result = $result;
$PluginModelTask->together(['result'])->save();
} else {
$storyboards = '';
if (!empty($data['params']['form_data']['storyboards'])) {
$storyboards = $data['params']['form_data']['storyboards'];
}
$storyboards .= "- 序号:" . $PluginShortplayDramaStoryboard->sort . "\n- 画面描述:" . $PluginShortplayDramaStoryboard->description . "\n";
$storyboards .= "- 对话:" . $previous_dialogues . "\n\n";
$PluginModelTask->status = ModelTaskStatus::WAIT['value'];
$PluginModelTask->success_execution_count = Db::raw('success_execution_count + 1');
$PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+10 seconds'));
if (!empty($updateActors)) {
$data['params']['form_data']['actors'] .= "," . implode(',', $updateActors);
}
if (!empty($updateProps)) {
$data['params']['form_data']['props'] .= "," . implode(',', $updateProps);
}
$data['params']['form_data']['previous_description'] = $PluginShortplayDramaStoryboard->description;
$data['params']['form_data']['previous_dialogues'] = $previous_dialogues;
$data['params']['form_data']['previous_sort'] = $PluginShortplayDramaStoryboard->sort;
$data['params']['form_data']['sort'] = $sort + 1;
$data['params']['form_data']['storyboards'] = $storyboards;
$PluginModelTask->result->params = $data;
$PluginModelTask->result->result = $result;
$PluginModelTask->together(['result'])->save();
}
$taksStatus = ModelTaskStatus::SUCCESS['value'];
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
Log::error('CREATIVE_STORYBOARDS RESULT:', $result);
Log::error('Generate Storyboard Error:' . $th->getMessage() . PHP_EOL . $th->getTraceAsString());
}
}
if ($taksStatus == ModelTaskStatus::FAIL['value']) {
$PluginModelTask = PluginModelTask::where(['id' => $PluginModelTask->id])->find();
if (
$PluginModelTask->expectation_execution_count === null
|| ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->success_execution_count + 1 >= $PluginModelTask->expectation_execution_count)
|| ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->execution_count >= $PluginModelTask->expectation_execution_count * 2)
) {
$PluginModelTask->status = ModelTaskStatus::FAIL['value'];
$PluginModelTask->save();
Push::send([
'uid' => $data['uid'],
'channels_uid' => $data['channels_uid'],
'hash' => $data['drama_id'],
'event' => 'generatescenestoryboard',
], [
'drama_id' => $data['drama_id'],
'episode_id' => $data['episode_id'],
]);
} else {
$PluginModelTask->status = ModelTaskStatus::WAIT['value'];
$PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+10 seconds'));
$PluginModelTask->save();
}
} else {
Push::send([
'uid' => $data['uid'],
'channels_uid' => $data['channels_uid'],
'hash' => $data['drama_id'],
'event' => 'generatescenestoryboard',
], [
'drama_id' => $data['drama_id'],
'episode_id' => $data['episode_id'],
]);
}
break;
default:
break;
}
});
} catch (\Throwable $th) {
Log::error("Chat Submit Process Error:" . $th->getMessage(), $th->getTrace());
}
});
}
}
@@ -0,0 +1,271 @@
<?php
namespace plugin\model\process\draw;
use app\expose\enum\State;
use plugin\control\expose\helper\Uploads;
use plugin\control\utils\yidevs\Yidevs;
use plugin\model\app\model\PluginModelTask;
use plugin\model\app\model\PluginModelTaskResult;
use plugin\model\utils\enum\ModelScene;
use plugin\model\utils\enum\ModelTaskStatus;
use plugin\model\utils\enum\ModelType;
use plugin\notification\expose\helper\Push;
use plugin\shortplay\app\model\PluginShortplayActor;
use plugin\shortplay\app\model\PluginShortplayActorCharacterLook;
use plugin\shortplay\app\model\PluginShortplayCharacterLook;
use plugin\shortplay\app\model\PluginShortplayDrama;
use plugin\shortplay\app\model\PluginShortplayDramaActor;
use plugin\shortplay\app\model\PluginShortplayDramaEpisodeActor;
use plugin\shortplay\app\model\PluginShortplayDramaScene;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboard;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardActor;
use plugin\shortplay\app\model\PluginShortplayProp;
use plugin\shortplay\utils\enum\ActorStatus;
use plugin\shortplay\utils\enum\PropStatus;
use support\Log;
use think\facade\Db;
use Workerman\Coroutine;
use Workerman\Crontab\Crontab;
use Workerman\Timer;
class ImageTransfer
{
public function onWorkerStart($worker)
{
$id = $worker->id;
new Crontab('*/5 * * * * *', function () use ($id) {
try {
if ($id) {
Timer::sleep(0.3 * $id);
}
Coroutine::create(function () {
$PluginModelTask = PluginModelTask::where(['status' => ModelTaskStatus::WAIT_DOWNLOAD['value'], 'model_type' => ModelType::DRAW['value']])->order('last_heartbeat asc,id asc')->lock(true)->find();
if (!$PluginModelTask) {
return;
}
$PluginModelTask->status = ModelTaskStatus::DOWNLOADING['value'];
$PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+5 seconds'));
$PluginModelTask->save();
$event = 'generate' . strtolower(str_replace('_', '', $PluginModelTask->scene));
$pushData = [
'task_id' => $PluginModelTask->id,
'id' => $PluginModelTask->alias_id
];
$PluginModelTaskResult = PluginModelTaskResult::where('task_id', $PluginModelTask->id)->find();
if (!$PluginModelTaskResult) {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->status = ModelTaskStatus::FAIL['value'];
$PluginModelTask->save();
Push::send([
'uid' => $PluginModelTask->uid,
'channels_uid' => $PluginModelTask->channels_uid,
'event' => $event
], $pushData);
return;
}
try {
$ModelScene = ModelScene::get($PluginModelTask->scene);
$classify = Uploads::getClassify($PluginModelTask->channels_uid, 'uploads/' . $PluginModelTask->scene, $ModelScene['label']);
$result = Uploads::download($PluginModelTask->channels_uid, $PluginModelTaskResult->image, $classify);
} catch (\Throwable $th) {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->status = ModelTaskStatus::WAIT_DOWNLOAD['value'];
$PluginModelTask->save();
Log::error("图片转存处理失败:" . $th->getMessage(), $th->getTrace());
return;
}
$pushData['image'] = $result->file_url;
Db::startTrans();
try {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->status = ModelTaskStatus::SUCCESS['value'];
$PluginModelTask->save();
$PluginModelTaskResult = PluginModelTaskResult::where('task_id', $PluginModelTask->id)->find();
$PluginModelTaskResult->image_path = $result->file_name;
$PluginModelTaskResult->save();
switch ($PluginModelTask->scene) {
case ModelScene::DRAMA_COVER['value']:
$PluginShortplayDrama = PluginShortplayDrama::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayDrama->cover = $result->file_name;
$PluginShortplayDrama->save();
break;
case ModelScene::SCENE_IMAGE['value']:
$PluginShortplayDramaScene = PluginShortplayDramaScene::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayDramaScene->image = $result->file_name;
$PluginShortplayDramaScene->save();
break;
case ModelScene::ACTOR_IMAGE['value']:
$PluginShortplayActor = PluginShortplayActor::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayActor->headimg = $result->file_name;
$PluginShortplayActor->status = $PluginShortplayActor->headimg && $PluginShortplayActor->three_view_image ? ActorStatus::GENERATED['value'] : ActorStatus::INITIALIZING['value'];
$PluginShortplayActor->save();
$threeViewImageState = PluginModelTask::processing(['alias_id' => $PluginShortplayActor->id, 'scene' => ModelScene::ACTOR_THREE_VIEW_IMAGE['value']]);
if ($threeViewImageState > 0) {
$pushData['status'] = ActorStatus::PENDING;
} else {
$pushData['status'] = ActorStatus::get($PluginShortplayActor->status);
}
break;
case ModelScene::ACTOR_THREE_VIEW_IMAGE['value']:
$PluginShortplayActor = PluginShortplayActor::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayActor->three_view_image = $result->file_name;
$PluginShortplayActor->status = $PluginShortplayActor->headimg && $PluginShortplayActor->three_view_image ? ActorStatus::GENERATED['value'] : ActorStatus::INITIALIZING['value'];
$PluginShortplayActor->save();
$pushData['status'] = ActorStatus::get($PluginShortplayActor->status);
break;
case ModelScene::STORYBOARD_IMAGE['value']:
$PluginShortplayDramaStoryboard = PluginShortplayDramaStoryboard::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayDramaStoryboard->image = $result->file_name;
$PluginShortplayDramaStoryboard->use_material_type='image';
$PluginShortplayDramaStoryboard->save();
$event = 'generatestoryboard';
$pushData['event'] = ModelScene::STORYBOARD_IMAGE['value'];
break;
case ModelScene::ACTOR_COSTUME['value']:
$PluginShortplayActorCharacterLook = PluginShortplayActorCharacterLook::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayActorCharacterLook->headimg = $result->file_name;
$PluginShortplayActorCharacterLook->save();
$event = 'generatestoryboard';
$pushData['storyboard_id'] = $PluginShortplayActorCharacterLook->storyboard_id;
$pushData['episode_id'] = $PluginShortplayActorCharacterLook->episode_id;
$pushData['drama_id'] = $PluginShortplayActorCharacterLook->drama_id;
$pushData['id'] = $PluginShortplayActorCharacterLook->actor_id;
$pushData['event'] = ModelScene::ACTOR_COSTUME['value'];
break;
case ModelScene::ACTOR_COSTUME_THREE_VIEW['value']:
$PluginShortplayActorCharacterLook = PluginShortplayActorCharacterLook::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayActorCharacterLook->three_view_image = $result->file_name;
$PluginShortplayActorCharacterLook->status = ActorStatus::GENERATED['value'];
$PluginShortplayActorCharacterLook->save();
$event = 'generatestoryboard';
$pushData['event'] = ModelScene::ACTOR_COSTUME_THREE_VIEW['value'];
$pushData['storyboard_id'] = $PluginShortplayActorCharacterLook->storyboard_id;
$pushData['episode_id'] = $PluginShortplayActorCharacterLook->episode_id;
$pushData['drama_id'] = $PluginShortplayActorCharacterLook->drama_id;
$pushData['id'] = $PluginShortplayActorCharacterLook->actor_id;
if ($PluginShortplayActorCharacterLook->storyboard_id) {
$PluginShortplayDramaStoryboardActor = PluginShortplayDramaStoryboardActor::where(['storyboard_id' => $PluginShortplayActorCharacterLook->storyboard_id, 'actor_id' => $PluginShortplayActorCharacterLook->actor_id])->find();
$PluginShortplayDramaStoryboardActor->character_look_id = $PluginShortplayActorCharacterLook->id;
$PluginShortplayDramaStoryboardActor->headimg = $PluginShortplayActorCharacterLook->headimg;
$PluginShortplayDramaStoryboardActor->three_view_image = $PluginShortplayActorCharacterLook->three_view_image;
$PluginShortplayDramaStoryboardActor->save();
} elseif ($PluginShortplayActorCharacterLook->episode_id) {
$PluginShortplayDramaEpisodeActor = PluginShortplayDramaEpisodeActor::where(['episode_id' => $PluginShortplayActorCharacterLook->episode_id, 'actor_id' => $PluginShortplayActorCharacterLook->actor_id])->find();
$PluginShortplayDramaEpisodeActor->character_look_id = $PluginShortplayActorCharacterLook->id;
$PluginShortplayDramaEpisodeActor->headimg = $PluginShortplayActorCharacterLook->headimg;
$PluginShortplayDramaEpisodeActor->three_view_image = $PluginShortplayActorCharacterLook->three_view_image;
$PluginShortplayDramaEpisodeActor->save();
} elseif ($PluginShortplayActorCharacterLook->drama_id) {
$PluginShortplayDramaActor = PluginShortplayDramaActor::where(['drama_id' => $PluginShortplayActorCharacterLook->drama_id, 'actor_id' => $PluginShortplayActorCharacterLook->actor_id])->find();
$PluginShortplayDramaActor->character_look_id = $PluginShortplayActorCharacterLook->id;
$PluginShortplayDramaActor->headimg = $PluginShortplayActorCharacterLook->headimg;
$PluginShortplayDramaActor->three_view_image = $PluginShortplayActorCharacterLook->three_view_image;
$PluginShortplayDramaActor->save();
}
break;
case ModelScene::PROP_IMAGE['value']:
$PluginShortplayProp = PluginShortplayProp::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayProp->image = $result->file_name;
$PluginShortplayProp->status = $PluginShortplayProp->image && $PluginShortplayProp->three_view_image ? PropStatus::GENERATED['value'] : PropStatus::INITIALIZING['value'];
$PluginShortplayProp->save();
$threeViewImageState = PluginModelTask::processing(['alias_id' => $PluginShortplayProp->id, 'scene' => ModelScene::PROP_THREE_VIEW_IMAGE['value']]);
if ($threeViewImageState > 0) {
$pushData['status'] = PropStatus::PENDING;
} else {
$pushData['status'] = PropStatus::get($PluginShortplayProp->status);
}
break;
case ModelScene::PROP_THREE_VIEW_IMAGE['value']:
$PluginShortplayProp = PluginShortplayProp::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayProp->three_view_image = $result->file_name;
$PluginShortplayProp->status = $PluginShortplayProp->image && $PluginShortplayProp->three_view_image ? PropStatus::GENERATED['value'] : PropStatus::INITIALIZING['value'];
$PluginShortplayProp->save();
$pushData['status'] = PropStatus::get($PluginShortplayProp->status);
break;
case ModelScene::CHARACTER_LOOK_COSTUME['value']:
$PluginShortplayCharacterLook = PluginShortplayCharacterLook::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayCharacterLook->costume_url = $result->file_name;
$PluginShortplayCharacterLook->status = PropStatus::GENERATED['value'];
$PluginShortplayCharacterLook->save();
$pushData['status'] = PropStatus::get($PluginShortplayCharacterLook->status);
break;
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
Log::error("图片转存保存失败:" . $th->getMessage(), $th->getTrace());
return;
}
Push::send([
'uid' => $PluginModelTask->uid,
'channels_uid' => $PluginModelTask->channels_uid,
'event' => $event
], $pushData);
switch ($PluginModelTask->scene) {
case ModelScene::ACTOR_IMAGE['value']:
try {
$PluginModelTask = PluginModelTask::where(['pre_task_id' => $PluginModelTask->id, 'status' => ModelTaskStatus::WAIT['value']])->with(['result'])->find();
if ($PluginModelTask) {
$data = $PluginModelTask->result->params;
$data['form_data']['images'] = [$result->file_url];
$result = Yidevs::DrawAssistantTIGI($PluginModelTask->channels_uid, $data);
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->task_id = $result['task_id'];
$PluginModelTask->status = ModelTaskStatus::PROCESSING['value'];
$PluginModelTask->save();
}
} catch (\Throwable $e) {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->pre_task_status = ModelTaskStatus::SUCCESS['value'];
$PluginModelTask->save();
Log::error('GenerateActorThreeView Error:' . $e->getMessage());
}
break;
case ModelScene::PROP_IMAGE['value']:
try {
$PluginModelTask = PluginModelTask::where(['pre_task_id' => $PluginModelTask->id, 'status' => ModelTaskStatus::WAIT['value']])->with(['result'])->find();
if ($PluginModelTask) {
$data = $PluginModelTask->result->params;
$data['form_data']['images'] = [$result->file_url];
$result = Yidevs::DrawAssistantTIGI($PluginModelTask->channels_uid, $data);
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->task_id = $result['task_id'];
$PluginModelTask->status = ModelTaskStatus::PROCESSING['value'];
$PluginModelTask->save();
}
} catch (\Throwable $e) {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->pre_task_status = ModelTaskStatus::SUCCESS['value'];
$PluginModelTask->save();
Log::error('GeneratePropThreeView Error:' . $e->getMessage());
}
break;
case ModelScene::ACTOR_COSTUME['value']:
try {
$PluginModelTask = PluginModelTask::where(['pre_task_id' => $PluginModelTask->id, 'status' => ModelTaskStatus::WAIT['value']])->with(['result'])->find();
if ($PluginModelTask) {
$data = $PluginModelTask->result->params;
$data['form_data']['images'] = [$result->file_url];
$result = Yidevs::DrawAssistantTIGI($PluginModelTask->channels_uid, $data);
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->task_id = $result['task_id'];
$PluginModelTask->status = ModelTaskStatus::PROCESSING['value'];
$PluginModelTask->save();
}
} catch (\Throwable $e) {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->pre_task_status = ModelTaskStatus::SUCCESS['value'];
$PluginModelTask->save();
Log::error('GenerateActorThreeView Error:' . $e->getMessage());
}
break;
}
});
} catch (\Throwable $th) {
Log::error("图片转存定时任务失败:" . $th->getMessage(), $th->getTrace());
}
});
}
}
@@ -0,0 +1,92 @@
<?php
namespace plugin\model\process\video;
use plugin\control\expose\helper\Uploads;
use plugin\model\app\model\PluginModelTask;
use plugin\model\app\model\PluginModelTaskResult;
use plugin\model\utils\enum\ModelScene;
use plugin\model\utils\enum\ModelTaskStatus;
use plugin\model\utils\enum\ModelType;
use plugin\notification\expose\helper\Push;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboard;
use support\Log;
use think\facade\Db;
use Workerman\Coroutine;
use Workerman\Crontab\Crontab;
use Workerman\Timer;
class VideoTransfer
{
public function onWorkerStart($worker)
{
$id = $worker->id;
new Crontab('*/5 * * * * *', function () use ($id) {
try {
if ($id) {
Timer::sleep(0.3 * $id);
}
Coroutine::create(function () {
$PluginModelTask = PluginModelTask::where(['status' => ModelTaskStatus::WAIT_DOWNLOAD['value'], 'model_type' => ModelType::TOVIDEO['value']])->order('last_heartbeat asc,id asc')->lock(true)->find();
if (!$PluginModelTask) {
return;
}
$PluginModelTask->status = ModelTaskStatus::DOWNLOADING['value'];
$PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+5 seconds'));
$PluginModelTask->save();
$PluginModelTaskResult = PluginModelTaskResult::where('task_id', $PluginModelTask->id)->find();
if (!$PluginModelTaskResult) {
return;
}
try {
$ModelScene = ModelScene::get($PluginModelTask->scene);
$classify = Uploads::getClassify($PluginModelTask->channels_uid, 'uploads/' . $PluginModelTask->scene, $ModelScene['label']);
$result = Uploads::download($PluginModelTask->channels_uid, $PluginModelTaskResult->video, $classify);
} catch (\Throwable $th) {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->status = ModelTaskStatus::WAIT_DOWNLOAD['value'];
$PluginModelTask->save();
Log::error("视频转存处理失败:" . $th->getMessage(), $th->getTrace());
return;
}
$pushData = [
'task_id' => $PluginModelTask->id,
'id' => $PluginModelTask->alias_id,
'video' => $result->file_url
];
$event = 'generate' . strtolower(str_replace('_', '', $PluginModelTask->scene));
Db::startTrans();
try {
$PluginModelTask = PluginModelTask::where('id', $PluginModelTask->id)->find();
$PluginModelTask->status = ModelTaskStatus::SUCCESS['value'];
$PluginModelTask->save();
$PluginModelTaskResult = PluginModelTaskResult::where('task_id', $PluginModelTask->id)->find();
$PluginModelTaskResult->video_path = $result->file_name;
$PluginModelTaskResult->save();
switch ($PluginModelTask->scene) {
case ModelScene::STORYBOARD_VIDEO['value']:
$PluginShortplayDramaStoryboard = PluginShortplayDramaStoryboard::where('id', $PluginModelTask->alias_id)->find();
$PluginShortplayDramaStoryboard->video = $result->file_name;
$PluginShortplayDramaStoryboard->use_material_type='video';
$PluginShortplayDramaStoryboard->save();
$event = 'generatestoryboard';
$pushData['event'] = ModelScene::STORYBOARD_VIDEO['value'];
break;
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
Log::error("视频转存保存失败:" . $th->getMessage(), $th->getTrace());
}
Push::send([
'uid' => $PluginModelTask->uid,
'channels_uid' => $PluginModelTask->channels_uid,
'event' => $event
], $pushData);
});
} catch (\Throwable $th) {
Log::error("视频转存定时任务失败:" . $th->getMessage(), $th->getTrace());
}
});
}
}