lubo_comment_query/app/Http/Controllers/ProgramConstructController.php
2022-08-24 21:13:34 +08:00

128 lines
4.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers;
use App\Models\Programs;
use App\Models\ProgramVideos;
use App\Models\VideoComments;
use App\Models\VideoParts;
use App\Util\ProgramVideoUtil;
use App\Util\TimeUtil;
use Carbon\Carbon;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\DB;
class ProgramConstructController extends BaseController
{
// region Views
public function index(Request $request) {
$status = $request->get("status", "0");
$query = Programs::query()->with(["appends", "video_pivots.video"])->where("status", $status, 0)->orderByDesc("created_at");
$programs = $query->paginate(10)->withQueryString();;
return view("program.construct.index", [
"programs"=>$programs,
]);
}
public function add(Request $request) {
return view("program.construct.create", [
"program"=>new Programs()
]);
}
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) {
$request->validate([
"name" => ["required"]
]);
$program = new Programs();
$createPayload = $request->only(["name", "difficulty", "desc"]);
$program->fill($createPayload);
$program->status = $request->post("status", 0);
$program->save();
return redirect(route("program.construct.edit", ["program"=>$program->id]));
}
public function batch_create(Request $request) {
$request->validate([
'bvid' => ['required'],
'content' => ['required'],
]);
$bvid = $request->post("bvid");
$content = $request->post("content");
$count = ProgramVideos::query()->where("video_bvid", "=", $bvid)->count();
if ($count > 0) {
return back()->withInput()->withErrors([
"bvid" => "该BVID下已有{$count}个节目关联,请手动添加"
]);
}
$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();
try {
foreach (explode("\n", $content) as $line) {
$match = [];
$match_count = preg_match($regex, $line, $match);
if ($match_count === 0) {
continue;
}
$time = $match["time"];
$time = str_replace("", ":", $time);
while (substr_count($time, ":") < 2) {
$time = "0:".$time;
}
$program = new Programs();
$program->name = $match["content"];
$video_pivot = new ProgramVideos();
$video_pivot->video_bvid = $bvid;
$video_pivot->start_part = $match["part"];
$video_pivot->start_time = $time;
$video_pivot->stop_part = $match["part"];
$program->save();
$program->video_pivots()->save($video_pivot);
}
DB::commit();
} catch (QueryException $e) {
DB::rollBack();
return back()->withInput()->withErrors([
"content" => $e->getMessage()
]);
}
ProgramVideoUtil::fix_created_at_by_part_info($bvid);
return redirect(route("program.construct.list"));
}
public function submit(Request $request, Programs $program) {
$request->validate([
"name" => ["required"]
]);
$updatePayload = $request->only(["name", "difficulty", "desc"]);
$program->status = $request->post("status", 0);
$program->update($updatePayload);
return view("program.construct.create", [
"program"=>$program
]);
}
// endregion
}