李帅

1.首页接口实现。

2.支持用户端上传。
......@@ -3,6 +3,7 @@
namespace App\Http\Controllers\V1;
use App\Http\Controllers\Controller;
use App\Models\Immerse;
use App\Models\PackPoem;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
......@@ -17,8 +18,11 @@ class HomeController extends Controller
*/
public function index()
{
//
return Response::success();
// admin video
// user video
return Response::success(Immerse::query()->get());
}
......
......@@ -3,7 +3,12 @@
namespace App\Http\Controllers\V1;
use App\Http\Controllers\Controller;
use App\Models\Immerse;
use App\Models\UserMakeVideo;
use App\Jobs\UserMakeVideo as MakeVideo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Jiannei\Response\Laravel\Support\Facades\Response;
class ImmerseController extends Controller
{
......@@ -21,16 +26,46 @@ class ImmerseController extends Controller
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
* @throws \Illuminate\Validation\ValidationException
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
//todo 发布流程
// if type == 1
// 写入audio-show表,写入immerse表,发送异步转码任务,
// if type == 2
// 写入video-show表,写入immerse表,发送异步转码合成视频水印任务
$validator = Validator::make($request->all(),[
'video_url' => 'required|string',
'video_id' => 'required',
'content' => 'sometimes',
'weather' => 'sometimes',
'thumbnail_url' => 'sometimes',
]);
if ($validator->fails()){
return Response::fail('',500,$validator->errors());
}
$validated = $validator->validated();
$immerse = Immerse::query()->find($request->video_id);
$video = UserMakeVideo::query()->create([
'poem_id' => $immerse->poem_id,
'type' => $immerse->type,
'video_url' => $validated['video_url'],
'image_url' => $immerse->image_url,
'bg_music' => $immerse->bg_music,
'bgm_url' => $immerse->bgm_url,
'feel' => $validated['content'],
'weather' => $validated['weather'],
'temp_id' => $immerse->temp_id,
'thumbnail' => $validated['thumbnail_url'] ? 1 : 0,
'thumbnail_url' => $validated['thumbnail_url'],
]);
// 添加至队列
MakeVideo::dispatch($video);
return Response::created();
}
/**
......
......@@ -37,7 +37,7 @@ class SettingController extends Controller
return Response::success($array);
}
public function upload(Request $request)
public function uploadImage(Request $request)
{
$validator = Validator::make($request->all(),[
'image' => 'required|mimes:jpeg,png,bmp,gif'
......@@ -59,12 +59,41 @@ class SettingController extends Controller
$dir_l2 = hexdec($hash_hex_l2) % 512;
$dir = 'uploads/'. $dir_l1. '/' . $dir_l2;
if( !Storage::disk('public')->exists($dir)) {
if( !Storage::disk('public')->exists($dir)) Storage::disk('public')->makeDirectory($dir);
Storage::disk('public')->makeDirectory($dir);
$file = $request->file('image')->store($dir,'public');
return Response::success([
'relative_path' => $file,
'absolute_path' => Storage::disk('public')->url($file),
]);
}
$file = $request->file('image')->store($dir,'public');
public function uploadVideo(Request $request)
{
$validator = Validator::make($request->all(),[
'video' => 'required|mimes:mp4,flv,mov,avi'
]);
if ($validator->fails()){
return Response::fail('',500,$validator->errors());
}
$hashName = $request->file('video')->hashName();
$hash_hex = md5($hashName);
// 16进制表示的字符串一共32字节,表示16个二进制字节。
// 前16个字符用来第一级求摸,后16个用做第二级
$hash_hex_l1 = substr($hash_hex, 0, 8);
$hash_hex_l2 = substr($hash_hex, 8, 8);
$dir_l1 = hexdec($hash_hex_l1) % 256;
$dir_l2 = hexdec($hash_hex_l2) % 512;
$dir = 'uploads/'. $dir_l1. '/' . $dir_l2;
if( !Storage::disk('public')->exists($dir)) Storage::disk('public')->makeDirectory($dir);
$file = $request->file('video')->store($dir,'public');
return Response::success([
'relative_path' => $file,
......
......@@ -604,7 +604,7 @@ class MakeVideo implements ShouldQueue
foreach ($components as $component) {
switch ($component->name){
case 'one_poem':
$content = $this->adminMakeVideo->poem->content . PHP_EOL;
$content = $this->adminMakeVideo->poem->content;
$text_file = $this->getTempPath('txt');
file_put_contents($text_file, $content);
......@@ -619,7 +619,7 @@ class MakeVideo implements ShouldQueue
'fontcolor=' . $text_color . '@1.0:' .
'x=' . escapeshellarg(VideoTemp::POSITION_FFMPEG[$component->position][0]) . ':' .
'y=' . escapeshellarg(VideoTemp::POSITION_FFMPEG[$component->position][1]) . ':' .
'box=1:boxcolor=' . $text_bg_color . '@' . $opacity . '", ';
'box=1:boxborderw=1:boxcolor=' . $text_bg_color . '@' . $opacity . '", ';
break;
case 'every_poem':
......
This diff is collapsed. Click to expand it.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class UserMakeVideo extends Model
{
use HasFactory;
protected $guarded = [''];
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUserMakeVideosTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('user_make_videos', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('user_id')->comment('用户id');
$table->string('poem_id')->default('')->comment('一言id');
$table->unsignedTinyInteger('type')->comment('类型');
$table->string('video_url')->nullable()->comment('视频地址');
$table->string('images_url')->nullable()->comment('图片地址');
$table->unsignedTinyInteger('bg_music')->comment('是否背景音');
$table->string('bgm_url')->nullable()->comment('背景音地址');
$table->text('feel')->nullable()->comment('有感');
$table->text('weather')->nullable()->comment('天气');
$table->string('temp_id')->default('')->comment('模板id');
$table->unsignedTinyInteger('thumbnail')->comment('封面图');
$table->string('thumbnail_url')->nullable()->comment('封面图地址');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('user_make_videos');
}
}
......@@ -59,6 +59,9 @@ Route::prefix('v1')->namespace('App\Http\Controllers\V1')->group(function (Route
/** 会员页 */
$api->apiResource('/membership', 'MembershipController');
/** 文件上传 */
$api->post('/upload/image', 'SettingController@upload');
/** 图片上传 */
$api->post('/upload/image', 'SettingController@uploadImage');
/** 视频上传 */
$api->post('/upload/video', 'SettingController@uploadVideo');
});
\ No newline at end of file
......