新款导入节目单,自动匹配时间(需提前导入分P信息)
This commit is contained in:
parent
00acb688c5
commit
5cbf9ff177
@ -5,6 +5,9 @@ namespace App\Http\Controllers;
|
|||||||
use App\Models\Programs;
|
use App\Models\Programs;
|
||||||
use App\Models\ProgramVideos;
|
use App\Models\ProgramVideos;
|
||||||
use App\Models\VideoComments;
|
use App\Models\VideoComments;
|
||||||
|
use App\Models\VideoParts;
|
||||||
|
use App\Util\TimeUtil;
|
||||||
|
use Carbon\Carbon;
|
||||||
use Illuminate\Database\QueryException;
|
use Illuminate\Database\QueryException;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Routing\Controller as BaseController;
|
use Illuminate\Routing\Controller as BaseController;
|
||||||
@ -12,6 +15,7 @@ use Illuminate\Support\Facades\DB;
|
|||||||
|
|
||||||
class ProgramConstructController extends BaseController
|
class ProgramConstructController extends BaseController
|
||||||
{
|
{
|
||||||
|
// region Views
|
||||||
public function index(Request $request) {
|
public function index(Request $request) {
|
||||||
$status = $request->get("status", "0");
|
$status = $request->get("status", "0");
|
||||||
$query = Programs::query()->with(["appends", "video_pivots.video"])->where("status", $status, 0)->orderByDesc("created_at");
|
$query = Programs::query()->with(["appends", "video_pivots.video"])->where("status", $status, 0)->orderByDesc("created_at");
|
||||||
@ -27,6 +31,25 @@ class ProgramConstructController extends BaseController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function from_comment(Request $request, VideoComments $comment) {
|
||||||
|
return redirect(route("program.construct.batch_add"))->withInput([
|
||||||
|
"bvid"=>$comment->video->bvid,
|
||||||
|
"content"=>$comment->content
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function batch_add(Request $request) {
|
||||||
|
return view("program.construct.batch_add");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit(Request $request, Programs $program) {
|
||||||
|
return view("program.construct.create", [
|
||||||
|
"program"=>$program
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
// region Form Submit
|
||||||
public function create(Request $request) {
|
public function create(Request $request) {
|
||||||
$request->validate([
|
$request->validate([
|
||||||
"name" => ["required"]
|
"name" => ["required"]
|
||||||
@ -39,17 +62,6 @@ class ProgramConstructController extends BaseController
|
|||||||
return redirect(route("program.construct.edit", ["program"=>$program->id]));
|
return redirect(route("program.construct.edit", ["program"=>$program->id]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function from_comment(Request $request, VideoComments $comment) {
|
|
||||||
return redirect(route("program.construct.batch_add"))->withInput([
|
|
||||||
"bvid"=>$comment->video->bvid,
|
|
||||||
"content"=>$comment->content
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function batch_add(Request $request) {
|
|
||||||
return view("program.construct.batch_add");
|
|
||||||
}
|
|
||||||
|
|
||||||
public function batch_create(Request $request) {
|
public function batch_create(Request $request) {
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'bvid' => ['required'],
|
'bvid' => ['required'],
|
||||||
@ -63,7 +75,8 @@ class ProgramConstructController extends BaseController
|
|||||||
"bvid" => "该BVID下已有{$count}个节目关联,请手动添加"
|
"bvid" => "该BVID下已有{$count}个节目关联,请手动添加"
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$regex = "/^p(?P<part>\d{1,2})[-# _:,)]+(?P<time>(0?1[::])?\d{1,3}[::]\d{1,2}) ?(?P<content>.+)$/ui";
|
$regex = "/^p(?P<part>\d{1,2})[-# _:,)]+(?P<time>(0?1[::])?\d{1,3}[::]\d{1,2})\s*(?P<content>.+)$/ui";
|
||||||
|
$video_parts = VideoParts::query()->where("bvid", "=", $bvid)->get();
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
try {
|
try {
|
||||||
foreach (explode("\n", $content) as $line) {
|
foreach (explode("\n", $content) as $line) {
|
||||||
@ -84,6 +97,30 @@ class ProgramConstructController extends BaseController
|
|||||||
$video_pivot->start_part = $match["part"];
|
$video_pivot->start_part = $match["part"];
|
||||||
$video_pivot->start_time = $time;
|
$video_pivot->start_time = $time;
|
||||||
$video_pivot->stop_part = $match["part"];
|
$video_pivot->stop_part = $match["part"];
|
||||||
|
if (sizeof($video_parts) > 0) {
|
||||||
|
/**
|
||||||
|
* 计算开始时间
|
||||||
|
* @var VideoParts $cur_part
|
||||||
|
*/
|
||||||
|
$cur_part = $video_parts->where("part_num", "=", $match["part"])->first();
|
||||||
|
if ($cur_part) {
|
||||||
|
// 根据标题名称,判断开始时间
|
||||||
|
$title = $cur_part->title;
|
||||||
|
$date_str = substr($title, 0, 13);
|
||||||
|
$base_time = Carbon::createFromFormat("Ymd_Hi", $date_str);
|
||||||
|
$start_time = Carbon::createFromFormat("H:i:s", $time);
|
||||||
|
$video_pivot->created_at = TimeUtil::calculate_program_time(
|
||||||
|
$base_time,
|
||||||
|
$start_time->secondsSinceMidnight()
|
||||||
|
);
|
||||||
|
if ($cur_part->duration->diffInMinutes($start_time) < 20) {
|
||||||
|
$video_pivot->stop_part += 1;
|
||||||
|
if ($video_pivot->stop_part > $video_parts->pluck("part_num")->max()) {
|
||||||
|
$video_pivot->stop_part = $video_parts->pluck("part_num")->max();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
$program->save();
|
$program->save();
|
||||||
$program->video_pivots()->save($video_pivot);
|
$program->video_pivots()->save($video_pivot);
|
||||||
}
|
}
|
||||||
@ -97,12 +134,6 @@ class ProgramConstructController extends BaseController
|
|||||||
return redirect(route("program.construct.list"));
|
return redirect(route("program.construct.list"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit(Request $request, Programs $program) {
|
|
||||||
return view("program.construct.create", [
|
|
||||||
"program"=>$program
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function submit(Request $request, Programs $program) {
|
public function submit(Request $request, Programs $program) {
|
||||||
$request->validate([
|
$request->validate([
|
||||||
"name" => ["required"]
|
"name" => ["required"]
|
||||||
@ -114,4 +145,5 @@ class ProgramConstructController extends BaseController
|
|||||||
"program"=>$program
|
"program"=>$program
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
// endregion
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ namespace App\Http\Controllers;
|
|||||||
|
|
||||||
use App\Models\Programs;
|
use App\Models\Programs;
|
||||||
use App\Models\ProgramVideos;
|
use App\Models\ProgramVideos;
|
||||||
|
use App\Util\TimeUtil;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Routing\Controller as BaseController;
|
use Illuminate\Routing\Controller as BaseController;
|
||||||
@ -134,21 +135,17 @@ class ProgramVideoConstructController extends BaseController
|
|||||||
$query->where("created_at", ">", $program_video->created_at)->orWhere("created_at", "=", null);
|
$query->where("created_at", ">", $program_video->created_at)->orWhere("created_at", "=", null);
|
||||||
})
|
})
|
||||||
->get();
|
->get();
|
||||||
/**
|
|
||||||
* @var $created_at Carbon
|
|
||||||
*/
|
|
||||||
$created_at = $program_video->created_at;
|
$created_at = $program_video->created_at;
|
||||||
$base_time = $created_at->subSeconds($program_video->start_sec)->subSeconds(($program_video->start_part - 1) * $each_time_sec);
|
$base_time = $created_at->subSeconds($program_video->start_sec)->subSeconds(($program_video->start_part - 1) * $each_time_sec);
|
||||||
foreach ($program_videos as $video) {
|
foreach ($program_videos as $video) {
|
||||||
if ($video->id === $program_video->id) {
|
if ($video->id === $program_video->id) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$time = $base_time->copy()->addSeconds(($video->start_part - 1) * $each_time_sec)->addSeconds($video->start_sec);
|
$video->created_at = TimeUtil::calculate_program_time(
|
||||||
if ($time->second > 30) {
|
$base_time,
|
||||||
$time->addMinute();
|
$video->start_sec,
|
||||||
}
|
($video->start_part - 1) * $each_time_sec
|
||||||
$time->seconds(0);
|
);
|
||||||
$video->created_at = $time;
|
|
||||||
$video->update();
|
$video->update();
|
||||||
}
|
}
|
||||||
return redirect(route("program.construct.list"));
|
return redirect(route("program.construct.list"));
|
||||||
|
@ -10,11 +10,27 @@ use Illuminate\Support\Facades\Hash;
|
|||||||
|
|
||||||
class UserController extends BaseController
|
class UserController extends BaseController
|
||||||
{
|
{
|
||||||
|
// region Views
|
||||||
public function login_page(Request $request)
|
public function login_page(Request $request)
|
||||||
{
|
{
|
||||||
return view("user.login");
|
return view("user.login");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function logout(Request $request)
|
||||||
|
{
|
||||||
|
Auth::logout();
|
||||||
|
$request->session()->invalidate();
|
||||||
|
$request->session()->regenerateToken();
|
||||||
|
return redirect("/");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register_page(Request $request)
|
||||||
|
{
|
||||||
|
return view("user.register");
|
||||||
|
}
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
// region Form Submit
|
||||||
public function authenticate(Request $request): \Illuminate\Http\RedirectResponse
|
public function authenticate(Request $request): \Illuminate\Http\RedirectResponse
|
||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
@ -38,19 +54,6 @@ class UserController extends BaseController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function logout(Request $request)
|
|
||||||
{
|
|
||||||
Auth::logout();
|
|
||||||
$request->session()->invalidate();
|
|
||||||
$request->session()->regenerateToken();
|
|
||||||
return redirect("/");
|
|
||||||
}
|
|
||||||
|
|
||||||
public function register_page(Request $request)
|
|
||||||
{
|
|
||||||
return view("user.register");
|
|
||||||
}
|
|
||||||
|
|
||||||
public function register(Request $request)
|
public function register(Request $request)
|
||||||
{
|
{
|
||||||
$request_payload = $request->validate([
|
$request_payload = $request->validate([
|
||||||
@ -64,4 +67,5 @@ class UserController extends BaseController
|
|||||||
$user->save();
|
$user->save();
|
||||||
return redirect(route("login"));
|
return redirect(route("login"));
|
||||||
}
|
}
|
||||||
|
// endregion
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,13 @@ use Illuminate\Database\Eloquent\Casts\Attribute;
|
|||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @property Carbon $created_at
|
||||||
|
* @property int $stop_part
|
||||||
|
* @property int $start_part
|
||||||
|
* @property int $startSec
|
||||||
|
* @property int $stopSec
|
||||||
|
*/
|
||||||
class ProgramVideos extends Model
|
class ProgramVideos extends Model
|
||||||
{
|
{
|
||||||
protected $fillable = ["video_bvid", "start_part", "start_time", "stop_part", "stop_time"];
|
protected $fillable = ["video_bvid", "start_part", "start_time", "stop_part", "stop_time"];
|
||||||
|
@ -4,9 +4,15 @@ namespace App\Models;
|
|||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @property \Carbon\Carbon $duration
|
||||||
|
*/
|
||||||
class VideoParts extends Model
|
class VideoParts extends Model
|
||||||
{
|
{
|
||||||
public $timestamps = false;
|
public $timestamps = false;
|
||||||
|
protected $casts = [
|
||||||
|
"duration" => "datetime",
|
||||||
|
];
|
||||||
public function video(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
public function video(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Videos::class, "bvid", "bvid");
|
return $this->belongsTo(Videos::class, "bvid", "bvid");
|
||||||
|
19
app/Util/TimeUtil.php
Normal file
19
app/Util/TimeUtil.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Util;
|
||||||
|
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
|
class TimeUtil
|
||||||
|
{
|
||||||
|
public static function calculate_program_time(Carbon $base_time, int $seconds, int $bias = 0): Carbon
|
||||||
|
{
|
||||||
|
$time = $base_time->copy()->addSeconds($seconds)->addSeconds($bias);
|
||||||
|
if ($time->second > 30) {
|
||||||
|
$time->addMinute();
|
||||||
|
}
|
||||||
|
$time->seconds(0);
|
||||||
|
return $time;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user