Files
fastmovieai/fastmovie-admin/plugin/shortplay/app/api/controller/DramaController.php
T

291 lines
13 KiB
PHP

<?php
namespace plugin\shortplay\app\api\controller;
use app\Basic;
use app\expose\helper\Config;
use app\expose\utils\Str;
use app\model\Uploads as ModelUploads;
use plugin\control\expose\helper\Uploads;
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\PluginShortplayDramaScene;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboard;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardActor;
use plugin\shortplay\app\model\PluginShortplayDramaStoryboardProp;
use plugin\shortplay\utils\enum\VoiceLanguage;
use Shopwwi\WebmanFilesystem\Storage;
use support\Log;
use support\Request;
use support\think\Db;
use Webman\Http\UploadFile;
use Workerman\Coroutine;
class DramaController extends Basic
{
public function uploadChunkCheck(Request $request)
{
$drama_id = $request->post('drama_id');
$episode_id = $request->post('episode_id');
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $drama_id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
$PluginShortplayDramaEpisode = PluginShortplayDramaEpisode::where(['id' => $episode_id, 'drama_id' => $PluginShortplayDrama->id])->find();
if (!$PluginShortplayDramaEpisode) {
return $this->fail('分集不存在');
}
// 保存分片目录
$tempDir = runtime_path('temp/chunks/' . $drama_id . '_' . $episode_id);
if (!is_dir($tempDir)) {
mkdir($tempDir, 0777, true);
} else {
# 清空目录
shell_exec('rm -rf ' . $tempDir . '/*');
}
return $this->success();
}
public function uploadChunk(Request $request)
{
$drama_id = $request->post('drama_id');
$episode_id = $request->post('episode_id');
$chunkIndex = intval($request->post('chunkIndex', 0));
$totalChunks = intval($request->post('totalChunks', 0));
if (!$drama_id || !$episode_id || $totalChunks <= 0) {
return $this->fail('参数错误');
}
// 上传的文件片段
$chunkFile = $request->file('chunkData');
if (!$chunkFile || $chunkFile->isValid() !== true) {
return $this->fail('分片上传失败');
}
// 保存分片目录
$tempDir = runtime_path('temp/chunks/' . $drama_id . '_' . $episode_id);
if (!is_dir($tempDir)) {
mkdir($tempDir, 0777, true);
}
// 分片保存路径
$chunkPath = $tempDir . '/' . $chunkIndex;
$chunkFile->move($chunkPath);
return $this->success('分片上传成功');
}
public function mergeChunks(Request $request)
{
Coroutine::create(function () use ($request) {
try {
$drama_id = $request->post('drama_id');
$episode_id = $request->post('episode_id');
$totalChunks = intval($request->post('totalChunks', 0));
$channels_uid = (int)$request->channels_uid;
if (empty($channels_uid)) {
throw new \Exception('渠道用户ID不存在');
}
if (!$drama_id || !$episode_id || $totalChunks <= 0) {
throw new \Exception('参数错误');
}
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $drama_id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
throw new \Exception('短剧不存在');
}
$PluginShortplayDramaEpisode = PluginShortplayDramaEpisode::where(['id' => $episode_id, 'drama_id' => $PluginShortplayDrama->id])->find();
if (!$PluginShortplayDramaEpisode) {
throw new \Exception('分集不存在');
}
$tempDir = runtime_path('temp/chunks/' . $drama_id . '_' . $episode_id);
if (!is_dir($tempDir)) {
throw new \Exception('分片目录不存在');
}
$targetDir = runtime_path('temp/videos/');
if (!is_dir($targetDir)) mkdir($targetDir, 0777, true);
$targetPath = $targetDir . $drama_id . '_' . $episode_id . '.mp4';
if (file_exists($targetPath)) {
\unlink($targetPath);
}
$out = fopen($targetPath, 'ab');
if (!$out) {
throw new \Exception('打开文件失败');
}
// 合并分片
for ($i = 0; $i < $totalChunks; $i++) {
$chunkPath = $tempDir . '/' . $i;
if (!file_exists($chunkPath)) {
fclose($out);
throw new \Exception("分片 {$i} 不存在");
}
$in = fopen($chunkPath, 'rb');
stream_copy_to_stream($in, $out);
fclose($in);
// 删除分片
unlink($chunkPath);
}
fclose($out);
// 删除分片目录
rmdir($tempDir);
try {
$file = new UploadFile($targetPath, $drama_id . '_' . $episode_id . '.mp4', 'video/mp4', 0);
$config = new Config('filesystem', '', $channels_uid);
$classify = Uploads::getClassify($channels_uid, 'uploads/drama/video', '短剧', $config->default);
$Storage = new Storage($config->toArray());
$date_path = date('Ymd');
$result = $Storage->adapter($classify->channels)->path($classify->dir_name . '/' . $date_path)->upload($file);
\unlink($targetPath);
$Uploads = new ModelUploads();
$Uploads->classify_id = $classify->id;
$Uploads->filename = $result->origin_name;
$Uploads->path = $result->file_name;
$Uploads->ext = $result->extension;
$Uploads->mime = $result->mime_type;
$Uploads->size = $result->size;
$Uploads->channels = $classify->channels;
$Uploads->channels_uid = $channels_uid;
$Uploads->save();
} catch (\Throwable $th) {
\unlink($targetPath);
throw $th;
}
$PluginShortplayDramaEpisode->video_path = $result->file_url;
$PluginShortplayDramaStoryboard = PluginShortplayDramaStoryboard::where(['drama_id' => $PluginShortplayDrama->id, 'episode_id' => $PluginShortplayDramaEpisode->id])->whereNotNull('image')->order('sort ASC')->find();
$PluginShortplayDramaEpisode->cover = $PluginShortplayDramaStoryboard->image;
$PluginShortplayDramaEpisode->save();
} catch (\Throwable $th) {
Log::error('合并分片失败:' . $th->getMessage(), $th->getTrace());
}
});
return $this->success('合并成功');
}
public function update(Request $request)
{
$id = $request->post('id');
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
$D = $request->post();
if (!empty($D['style_id'])) {
$PluginShortplayDrama->style_id = $D['style_id'];
}
if (!empty($D['aspect_ratio'])) {
$PluginShortplayDrama->aspect_ratio = $D['aspect_ratio'];
}
if (!empty($D['title'])) {
$PluginShortplayDrama->title = $D['title'];
}
if (!empty($D['overall_hook'])) {
$PluginShortplayDrama->overall_hook = $D['overall_hook'];
}
if (!empty($D['core_catharsis_mechanism'])) {
$PluginShortplayDrama->core_catharsis_mechanism = $D['core_catharsis_mechanism'];
}
if (!empty($D['main_conflict'])) {
$PluginShortplayDrama->main_conflict = $D['main_conflict'];
}
if (!empty($D['relationship_mainline'])) {
$PluginShortplayDrama->relationship_mainline = $D['relationship_mainline'];
}
if (!empty($D['description'])) {
$PluginShortplayDrama->description = $D['description'];
}
if (!empty($D['background_description'])) {
$PluginShortplayDrama->background_description = $D['background_description'];
}
if (!empty($D['outline'])) {
$PluginShortplayDrama->outline = $D['outline'];
}
$PluginShortplayDrama->save();
return $this->success('更新成功');
}
public function delete(Request $request)
{
$id = $request->post('id');
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
Db::startTrans();
try {
PluginShortplayDramaActor::where(['drama_id' => $PluginShortplayDrama->id])->delete();
$PluginShortplayDramaEpisodes = PluginShortplayDramaEpisode::where(['drama_id' => $PluginShortplayDrama->id])->select();
foreach ($PluginShortplayDramaEpisodes as $PluginShortplayDramaEpisode) {
PluginShortplayDramaEpisodeActor::where(['episode_id' => $PluginShortplayDramaEpisode->id])->delete();
$PluginShortplayDramaEpisode->delete();
}
PluginShortplayDramaScene::where(['drama_id' => $PluginShortplayDrama->id])->delete();
$PluginShortplayDramaStoryboards = PluginShortplayDramaStoryboard::where(['drama_id' => $PluginShortplayDrama->id])->select();
foreach ($PluginShortplayDramaStoryboards as $PluginShortplayDramaStoryboard) {
PluginShortplayDramaStoryboardActor::where(['storyboard_id' => $PluginShortplayDramaStoryboard->id])->delete();
PluginShortplayDramaStoryboardProp::where(['storyboard_id' => $PluginShortplayDramaStoryboard->id])->delete();
$PluginShortplayDramaStoryboard->delete();
}
$PluginShortplayDrama->delete();
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
return $this->fail($th->getMessage());
}
return $this->success('删除成功');
}
public function voice(Request $request)
{
$drama_id = $request->post('drama_id');
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $drama_id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
Db::startTrans();
try {
$voice = $request->post('voice');
if (!empty($voice['emotions_enum']) && empty($voice['selected_emotion'])) {
$voice['selected_emotion'] = $voice['emotions_enum'][0];
}
if (empty($voice['selected_language'])) {
$voice['selected_language'] = VoiceLanguage::ZH;
}
$PluginShortplayDrama->voice = $voice;
$PluginShortplayDrama->save();
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
return $this->fail($th->getMessage());
}
return $this->success('更新成功');
}
public function deleteActor(Request $request)
{
$id = $request->post('id');
$drama_id = $request->post('drama_id');
$PluginShortplayDrama = PluginShortplayDrama::where(['id' => $drama_id, 'uid' => $request->uid])->find();
if (!$PluginShortplayDrama) {
return $this->fail('短剧不存在');
}
$PluginShortplayDramaActor = PluginShortplayDramaActor::where(['actor_id' => $id, 'drama_id' => $PluginShortplayDrama->id])->find();
if (!$PluginShortplayDramaActor) {
return $this->fail('演员不存在');
}
Db::startTrans();
try {
$PluginShortplayDramaActor->delete();
PluginShortplayDramaEpisodeActor::where(['drama_id' => $PluginShortplayDrama->id, 'actor_id' => $PluginShortplayDramaActor->actor_id])->delete();
PluginShortplayDramaStoryboardActor::where(['drama_id' => $PluginShortplayDrama->id, 'actor_id' => $PluginShortplayDramaActor->actor_id])->delete();
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
return $this->fail($th->getMessage());
}
return $this->success('删除成功');
}
}