love_php/app/Services/MediaLibraryService.php
2026-04-02 09:20:51 +08:00

494 lines
17 KiB
PHP

<?php
namespace App\Services;
use App\Models\MediaLibraryGroup;
use App\Models\MediaLibraryMedia;
use Exception;
use Illuminate\Support\Facades\DB;
use function Clue\StreamFilter\fun;
class MediaLibraryService
{
/**
* 创建分组(初次创建时同时创建默认分组 回收站两个分组)
* @param $userId
* @param $groupName
* @param $mediaType
*/
public function createGroup($userId, $groupName, $mediaType)
{
//查询有没有回收站分组,没有就创建
$recycle_group = MediaLibraryGroup::where("user_id", $userId)
->where("media_type",$mediaType)
->where("group_name", "回收站")
->first();
if (!$recycle_group) {
$MediaLibraryGroup = new MediaLibraryGroup();
$MediaLibraryGroup->user_id = $userId;
$MediaLibraryGroup->group_name = "回收站";
$MediaLibraryGroup->media_type = $mediaType;
$MediaLibraryGroup->save();
}
$unclassified_group = MediaLibraryGroup::where("user_id", $userId)
->where("media_type",$mediaType)
->where("group_name", "默认分组")
->first();
if (!$unclassified_group) {
$MediaLibraryGroup = new MediaLibraryGroup();
$MediaLibraryGroup->user_id = $userId;
$MediaLibraryGroup->group_name = "默认分组";
$MediaLibraryGroup->media_type = $mediaType;
$MediaLibraryGroup->save();
}
$user_group = MediaLibraryGroup::where("user_id", $userId)
->where("group_name", $groupName)
->where("media_type", $mediaType)
->withTrashed()
->first();
if ($user_group) {
if ($user_group->deleted_at) {
$user_group->restore();
}
} else {
$MediaLibraryGroup = new MediaLibraryGroup();
$MediaLibraryGroup->user_id = $userId;
$MediaLibraryGroup->group_name = $groupName;
$MediaLibraryGroup->media_type = $mediaType;
$MediaLibraryGroup->save();
}
}
/**
* 重命名分组
* @param int $userId
* @param string $groupName
* @param int $mediaType
* @param int $groupId
*/
public function renameGroup(int $userId, string $groupName, int $mediaType, int $groupId)
{
//查询要重命名的分组是否存在
$user_group = MediaLibraryGroup::where("id", $groupId)
->where("user_id", $userId)
->where("media_type", $mediaType)
->withTrashed()
->first();
if ($user_group) {
if ($user_group['deleted_at']) {
$user_group->restore();
}
if ($user_group->group_name == '回收站' || $user_group->group_name == '默认分组') {
return;
}
if ($groupName == "回收站" || $groupName == "默认分组") {
return;
}
//查询是否有同名分组
$same_name_group = MediaLibraryGroup::where("user_id", $userId)
->where("media_type", $mediaType)
->where("group_name", $groupName)
->withTrashed()
->first();
if ($same_name_group) {
if ($same_name_group['deleted_at']) {
$user_group->restore();
return;
} else {
return;
}
}
$user_group->group_name = $groupName;
$user_group->save();
}
}
/**
* 删除分组(分组下的图片移到回收站)
* @param int $userId
* @param int $mediaType
* @param int $groupId
* @throws Exception
*/
public function deleteGroup(int $userId, int $mediaType, int $groupId)
{
$user_group = MediaLibraryGroup::where("id", $groupId)
->where("user_id", $userId)
->where("media_type", $mediaType)
->first();
if ($user_group->group_name == '回收站' || $user_group->group_name == '默认分组') {
return;
}
$recycle_group_id = MediaLibraryGroup::where("user_id", $userId)
->where("media_type", $mediaType)
->where("group_name", "回收站")
->value("id");
if ($user_group && $recycle_group_id) {
try {
DB::beginTransaction();
MediaLibraryMedia::where("user_id", $userId)->where("id", $groupId)
->update(["group_id" => $recycle_group_id]);
$user_group->delete();
DB::commit();
} catch (Exception $e) {
DB::rollback();
throw new Exception($e);
}
}
}
/**
* 查询分组列表
* @param int $user_id
* @param int $mediaType
* @param int|null $group_id
* @param null $keyword
* @return array
*/
public function queryGroupList(int $user_id, int $mediaType, int $group_id = null, $keyword = null)
{
$group_list['data'] = MediaLibraryGroup::withCount("media")
->where("user_id", $user_id)
->when($mediaType, function ($query) use ($mediaType) {
$query->where("media_type", $mediaType);
})
->when($group_id, function ($query) use ($group_id) {
$query->where("group_id", $group_id);
})
->when($keyword, function ($query) use ($keyword) {
$query->where('group_name', 'like', "%$keyword%");
})
->get()->toArray();
$group_list['total_file'] = MediaLibraryMedia::where("user_id", $user_id)
->where("media_type", $mediaType)
->count();
return $group_list;
}
/**
* 移动到分组(包括移到回收站)
* @param $user_id
* @param $mediaType
* @param $fileList
* @param $old_group_id
* @param $new_group_id
* @throws Exception
*/
public function moveToGroup($user_id, $mediaType, $old_group_id, $new_group_id,$fileList = null)
{
if ($old_group_id === $new_group_id) {
throw new Exception("新分类和旧分类是同一分类");
}
//查询旧分组是否存在
$old_group = null;
if ($old_group_id) {
$old_group = MediaLibraryGroup::where('id', $old_group_id)
->where('user_id', $user_id)
->where("media_type", $mediaType)
->first();
}
$new_group = MediaLibraryGroup::where('id', $new_group_id)
->where('user_id', $user_id)
->where("media_type", $mediaType)
->first();
if ($new_group) {
if ($old_group) {
if ($old_group->media_type !== $new_group->media_type) {
throw new Exception("媒体类型不相同");
}
}
MediaLibraryMedia::where('user_id', $user_id)
->where("media_type", $mediaType)
->when($old_group_id,function ($query) use($old_group_id){
$query->where('group_id',$old_group_id);
})
->when($fileList,function ($query) use ($fileList){
$query->whereIn('id',$fileList);
})
->update([
"group_id" => $new_group_id,
]);
}
}
/**
* 查询分组文件(时间 关键字 名称)
* @param $user_id
* @param $mediaType
* @param $group_id
* @param $page
* @param null $start_time
* @param null $end_time
* @param null $keyword
* @param null $order_by_created_time
* @return mixed
*/
public function queryFile($user_id, $mediaType, $group_id, $page, $start_time = null, $end_time = null, $keyword = null, $order_by_created_time = null)
{
$perPage = $this->getPerPage($mediaType);
$model = MediaLibraryMedia::where('user_id', $user_id)
->when($group_id, function ($query) use ($group_id) {
$query->where("group_id", $group_id);
})
->when($mediaType, function ($query) use ($mediaType) {
$query->where("media_type", $mediaType);
})
->when($start_time, function ($query) use ($start_time) {
$query->where("created_at", ">=", $start_time);
})
->when($end_time, function ($query) use ($end_time) {
$query->where("created_at", "<=", $end_time);
})
->when($keyword, function ($query) use ($keyword) {
$query->where("media_name", "like", "%$keyword%");
})
->when($order_by_created_time, function ($query) use ($order_by_created_time) {
$query->orderBy('created_at', $order_by_created_time);
})
->orderBy('id', 'desc');
if($page){
$data = $model->paginate($perPage, ['*'], 'page', $page);
}else{
$data['data'] = $model->get();
}
return $data;
}
/**
* 获取不同分类的分页数据
* @param $mediaType
* @return int
*/
private function getPerPage($mediaType)
{
switch ($mediaType) {
case 1:
case 3:
$perPage = 8;
break;
case 2:
$perPage = 16;
break;
default:
$perPage = 10;
}
return $perPage;
}
/**
* 删除文件(不经回收站或回收站删除,软删除)
* @param $user_id
* @param $mediaType
* @param $file_id_list
*/
public function deleteFile($user_id, $mediaType, $file_id_list)
{
MediaLibraryMedia::whereIn('id', $file_id_list)
->where('user_id', $user_id)
->where("media_type", $mediaType)
->delete();
}
/**
* 通过阿里云ID获取播放URL并写入媒体库
* @param $user_id
* @param $video_id
* @param $group_id
* @param $media_name
* @return array
* @throws Exception
*/
public function merchantGetVideoUrl($user_id, $video_id, $group_id, $media_name)
{
$result = \AliyunService::getPlayInfo($video_id);
$play_url = $result['PlayInfoList']['PlayInfo'][0]['PlayURL'];
$cover_url = $result['VideoBase']['CoverURL'] ?? '';
//调用媒体库方法写数据库表
$media_library['user_id'] = $user_id;
$media_library['group_id'] = $group_id;
$media_library['media_name'] = $media_name;
$media_library['video_id'] = $video_id;
$media_library['current_url'] = $play_url;
$media_library['media_type'] = $result['VideoBase']['MediaType'] == "video" ? 3 : 2;
$media_library['video_data'] = json_encode($result['PlayInfoList']['PlayInfo'][0]);
$this->updateMediaLibrary($media_library);
return array("play_url" => $play_url, 'cover_url' => $cover_url);
}
/**
* 写表,上传文件时被调用
* @param $data
* @throws Exception
*/
public function updateMediaLibrary($data)
{
//查询旧分组是否存在
$group = MediaLibraryGroup::where('id', $data['group_id'])
->where('user_id', $data['user_id'])
->where("media_type", $data['media_type'])
->first();
if (!$group) {
throw new Exception("媒体分组不存在或已删除");
}
MediaLibraryMedia::create($data);
}
/**
* 保存上传的文件
* @param $user_id
* @param $video_id
* @param $group_id
* @param $media_name
* @param $play_url
* @param $media_type
* @throws Exception
*/
public function saveMediaInfo($user_id, $video_id, $group_id, $media_name, $play_url, $media_type)
{
//查询旧分组是否存在
$group = MediaLibraryGroup::where('id', $group_id)
->where('user_id', $user_id)
->where("media_type", $media_type)
->first();
if (!$group) {
throw new Exception("媒体分组不存在或已删除");
}
$media_library['user_id'] = $user_id;
$media_library['group_id'] = $group_id;
$media_library['media_name'] = $media_name;
$media_library['video_id'] = $video_id;
$media_library['current_url'] = $play_url;
$media_library['media_type'] = $media_type;
MediaLibraryMedia::create($media_library);
//提交视频转码作业
if($media_type == 3){
try {
$result = \AliyunService::SubmitTranscodeJobs($video_id);
}catch ( Exception $e){
return;
}
}
}
/**
* 移动到新分组
* @param $user_id
* @param $file_id
* @param $group_name
* @param $media_type
* @throws Exception
*/
public function moveToNewGroup($user_id, $file_id, $group_name, $media_type)
{
//检查文件是否存在
$file = MediaLibraryMedia::where("user_id", $user_id)
->where('id', $file_id)
->first();
//检查文件类型是否与分组相符
if ($file) {
if ($file['media_type'] != $media_type) {
throw new Exception('分组类型与文件类型不符');
}
//检查分组名称是否已存在
$group = MediaLibraryGroup::where('user_id', $user_id)
->where('group_name', $group_name)
->where("media_type", $media_type)
->first();
if ($group) {
throw new Exception('分组已经存在');
}
try {
DB::beginTransaction();
$mediaLibraryGroup = MediaLibraryGroup::create([
"user_id" => $user_id,
"media_type" => $media_type,
"group_name" => $group_name,
]);
$file->update(["group_id" => $mediaLibraryGroup->id]);
DB::commit();
} catch (Exception $e) {
DB::rollBack();
throw new Exception('操作数据库失败');
}
} else {
throw new Exception('文件不存在');
}
}
/**
* 添加到新分组
* @param $user_id
* @param $file_id
* @param $group_name
* @param $media_type
* @throws Exception
*/
public function addToNewGroup($user_id, $file_id, $group_name, $media_type)
{
//检查文件是否存在
$file = MediaLibraryMedia::where('id', $file_id)
->where("user_id", $user_id)
->first();
//检查文件类型是否与分组相符
if ($file) {
if ($file['media_type'] != $media_type) {
throw new Exception('分组类型与文件类型不符');
}
//检查分组名称是否已存在
$group = MediaLibraryGroup::where('user_id', $user_id)
->where('group_name', $group_name)
->where("media_type", $media_type)
->first();
if ($group) {
throw new Exception('分组已经存在');
}
try {
DB::beginTransaction();
$mediaLibraryGroup = MediaLibraryGroup::create([
"user_id" => $user_id,
"media_type" => $media_type,
"group_name" => $group_name,
]);
MediaLibraryMedia::create([
"user_id" => $user_id,
"media_type" => $media_type,
'group_id' => $mediaLibraryGroup->id,
'current_url' => $file['current_url'],
'video_id' => $file['video_id'],
'video_data' => $file['video_data'],
'media_name' => $file['media_name']
]);
DB::commit();
} catch (Exception $e) {
DB::rollBack();
throw new Exception('操作数据库失败');
}
} else {
throw new Exception('文件不存在');
}
}
/**
* 修改媒体文件备注信息
* @param $user_id
* @param $file_id
* @param $media_name
* @throws Exception
*/
public function modifyMediaFileInfo($user_id, $file_id, $media_name)
{
$media = MediaLibraryMedia::where('user_id', $user_id)
->where("id", (int)$file_id)
->first();
if ($media) {
$media->media_name = $media_name;
$media->save();
} else {
throw new Exception('媒体文件不存在');
}
}
}