494 lines
17 KiB
PHP
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('媒体文件不存在');
|
|
}
|
|
}
|
|
|
|
}
|