|
@@ -69,91 +69,300 @@ class InitCourseCommand extends Command
|
|
|
*/
|
|
|
public function handle()
|
|
|
{
|
|
|
+// $data = [
|
|
|
+// //推拿
|
|
|
+// [
|
|
|
+// 'url' => 'tuina',
|
|
|
+// 'lang' => 'zh_CN',
|
|
|
+// 'course_id' => 0,
|
|
|
+// 'is_close_chapter' => 1,
|
|
|
+// 'title' => '推拿',
|
|
|
+// ],
|
|
|
+// [
|
|
|
+// 'url' => 'tuina',
|
|
|
+// 'lang' => 'en',
|
|
|
+// 'course_id' => 0,
|
|
|
+// 'is_close_chapter' => 1,
|
|
|
+// 'title' => 'Tuina',
|
|
|
+// ],
|
|
|
+// //中医诊断
|
|
|
+// [
|
|
|
+// 'url' => 'zhenduanxue',
|
|
|
+// 'lang' => 'zh_CN',
|
|
|
+// 'course_id' => 0,
|
|
|
+// 'is_close_chapter' => 0,
|
|
|
+// 'title' => '中医诊断学',
|
|
|
+// ],
|
|
|
+// [
|
|
|
+// 'url' => 'zhenduanxue',
|
|
|
+// 'lang' => 'en',
|
|
|
+// 'course_id' => 0,
|
|
|
+// 'is_close_chapter' => 0,
|
|
|
+// 'title' => 'TCM Diagnostic ',
|
|
|
+// ],
|
|
|
+// //针灸学
|
|
|
+// [
|
|
|
+// 'url' => 'zhenjiuxue',
|
|
|
+// 'lang' => 'zh_CN',
|
|
|
+// 'course_id' => 0,
|
|
|
+// 'is_close_chapter' => 0,
|
|
|
+// 'title' => '针灸临床学',
|
|
|
+// ],
|
|
|
+// [
|
|
|
+// 'url' => 'zhenjiuxue',
|
|
|
+// 'lang' => 'en',
|
|
|
+// 'course_id' => 0,
|
|
|
+// 'is_close_chapter' => 1,
|
|
|
+// 'title' => 'Clinical Acupuncture',
|
|
|
+// ],
|
|
|
+// //中药鉴定
|
|
|
+// [
|
|
|
+// 'url' => 'zhongyaojianding',
|
|
|
+// 'lang' => 'zh_CN',
|
|
|
+// 'course_id' => 0,
|
|
|
+// 'is_close_chapter' => 0,
|
|
|
+// 'title' => '中药鉴定',
|
|
|
+// ],
|
|
|
+// [
|
|
|
+// 'url' => 'zhongyaojianding',
|
|
|
+// 'lang' => 'en',
|
|
|
+// 'course_id' => 0,
|
|
|
+// 'is_close_chapter' => 0,
|
|
|
+// 'title' => 'Herbal medicine identification',
|
|
|
+// ],
|
|
|
+// //中医基础理论
|
|
|
+// [
|
|
|
+// 'url' => 'zhongji-zh',
|
|
|
+// 'lang' => 'zh_CN',
|
|
|
+// 'course_id' => 1,
|
|
|
+// 'is_close_chapter' => 0,
|
|
|
+// 'title' => '',
|
|
|
+// ],
|
|
|
+// [
|
|
|
+// 'url' => 'zhongji-en',
|
|
|
+// 'lang' => 'en',
|
|
|
+// 'course_id' => 2,
|
|
|
+// 'is_close_chapter' => 0,
|
|
|
+// 'title' => '',
|
|
|
+// ],
|
|
|
+// ];
|
|
|
+
|
|
|
$data = [
|
|
|
//推拿
|
|
|
[
|
|
|
- 'url' => 'tuina',
|
|
|
+ 'url' => 'youjihuaxueshuangyu',
|
|
|
'lang' => 'zh_CN',
|
|
|
'course_id' => 0,
|
|
|
'is_close_chapter' => 1,
|
|
|
- 'title' => '推拿',
|
|
|
+ 'title' => '有机化学双语',
|
|
|
],
|
|
|
[
|
|
|
- 'url' => 'tuina',
|
|
|
+ 'url' => 'youjihuaxueshuangyu',
|
|
|
'lang' => 'en',
|
|
|
'course_id' => 0,
|
|
|
'is_close_chapter' => 1,
|
|
|
- 'title' => 'Tuina',
|
|
|
+ 'title' => '有机化学双语',
|
|
|
],
|
|
|
//中医诊断
|
|
|
[
|
|
|
- 'url' => 'zhenduanxue',
|
|
|
- 'lang' => 'zh_CN',
|
|
|
- 'course_id' => 0,
|
|
|
- 'is_close_chapter' => 0,
|
|
|
- 'title' => '中医诊断学',
|
|
|
- ],
|
|
|
- [
|
|
|
- 'url' => 'zhenduanxue',
|
|
|
- 'lang' => 'en',
|
|
|
- 'course_id' => 0,
|
|
|
- 'is_close_chapter' => 0,
|
|
|
- 'title' => 'TCM Diagnostic ',
|
|
|
- ],
|
|
|
- //针灸学
|
|
|
- [
|
|
|
- 'url' => 'zhenjiuxue',
|
|
|
+ 'url' => 'zhongyiwenhua-jingluoshuxuanxue',
|
|
|
'lang' => 'zh_CN',
|
|
|
'course_id' => 0,
|
|
|
'is_close_chapter' => 0,
|
|
|
- 'title' => '针灸临床学',
|
|
|
+ 'title' => '中医文化《经络腧穴学》',
|
|
|
],
|
|
|
[
|
|
|
- 'url' => 'zhenjiuxue',
|
|
|
+ 'url' => 'zhongyiwenhua-jingluoshuxuanxue',
|
|
|
'lang' => 'en',
|
|
|
'course_id' => 0,
|
|
|
- 'is_close_chapter' => 1,
|
|
|
- 'title' => 'Clinical Acupuncture',
|
|
|
- ],
|
|
|
- //中药鉴定
|
|
|
- [
|
|
|
- 'url' => 'zhongyaojianding',
|
|
|
- 'lang' => 'zh_CN',
|
|
|
- 'course_id' => 0,
|
|
|
- 'is_close_chapter' => 0,
|
|
|
- 'title' => '中药鉴定',
|
|
|
- ],
|
|
|
- [
|
|
|
- 'url' => 'zhongyaojianding',
|
|
|
- 'lang' => 'en',
|
|
|
- 'course_id' => 0,
|
|
|
- 'is_close_chapter' => 0,
|
|
|
- 'title' => 'Herbal medicine identification',
|
|
|
- ],
|
|
|
- //中医基础理论
|
|
|
- [
|
|
|
- 'url' => 'zhongji-zh',
|
|
|
- 'lang' => 'zh_CN',
|
|
|
- 'course_id' => 1,
|
|
|
'is_close_chapter' => 0,
|
|
|
- 'title' => '',
|
|
|
- ],
|
|
|
- [
|
|
|
- 'url' => 'zhongji-en',
|
|
|
- 'lang' => 'en',
|
|
|
- 'course_id' => 2,
|
|
|
- 'is_close_chapter' => 0,
|
|
|
- 'title' => '',
|
|
|
+ 'title' => '中医文化《经络腧穴学》 ',
|
|
|
],
|
|
|
];
|
|
|
|
|
|
foreach ($data as $da) {
|
|
|
- $this->loadFiles($da['url'], $da['lang'], $da['course_id'], $da['is_close_chapter'], $da['title']);
|
|
|
+// $this->loadLocalFiles($da['url'], $da['lang'], $da['course_id'], $da['is_close_chapter'], $da['title']);
|
|
|
+// $this->loadLocalFiles('/Users/mead/Downloads/2024-12-16 中马上传视频', $da['url'], $da['lang'], $da['course_id'], $da['is_close_chapter'], $da['title']);
|
|
|
+ $this->readJson('/Users/mead/Downloads/2024-12-16 中马上传视频', $da['url'], $da['lang'], $da['course_id'], $da['is_close_chapter'], $da['title']);
|
|
|
}
|
|
|
|
|
|
$this->line('ok');
|
|
|
}
|
|
|
|
|
|
+ public function loadLocalFiles($localPath, $url_path, $lang, $course_id, $is_close_chapter, $title)
|
|
|
+ {
|
|
|
+ $base_lang = $lang;
|
|
|
+ $base_url = 'http://zhongma.qiniu.xmnk.cn/' . $url_path;
|
|
|
+ $base_course_id = $course_id;
|
|
|
+
|
|
|
+ $videos = [];
|
|
|
+ $sections = [];
|
|
|
+ $i = 0;
|
|
|
+ $files = [];
|
|
|
+
|
|
|
+ //读取文件
|
|
|
+ foreach (glob("{$localPath}/{$url_path}/*") as $file) {
|
|
|
+ $files[] = pathinfo($file);
|
|
|
+ }
|
|
|
+
|
|
|
+ //处理章节
|
|
|
+ foreach ($files as $file) {
|
|
|
+ $video = [
|
|
|
+ 'section' => 0,
|
|
|
+ 'video' => false,
|
|
|
+ 'video_path' => false,
|
|
|
+ 'srt' => false,
|
|
|
+ ];
|
|
|
+
|
|
|
+ if (array_key_exists('extension', $file)) {
|
|
|
+ $this->line($file['filename']);
|
|
|
+ switch (strtolower($file['extension'])) {
|
|
|
+ case 'txt':
|
|
|
+ $file_data = str2arr0($file['filename'], '-');
|
|
|
+ $name = $file_data[1];
|
|
|
+ if ($base_lang == 'en') $name = $file_data[2];
|
|
|
+ $sections[$file_data[0]] = [
|
|
|
+ 'name' => $name,
|
|
|
+ 'en_name' => $file_data[2],
|
|
|
+ ];
|
|
|
+ break;
|
|
|
+ case 'mp4':
|
|
|
+// $file_data = str2arr0($file['filename'], '-');
|
|
|
+// if (count($file_data) == 2) {
|
|
|
+// list($index, $name
|
|
|
+// ) = str2arr0($file['filename'], '-');
|
|
|
+// $s = str2arr0($index, '.');
|
|
|
+// $en_name = $name;
|
|
|
+// } else {
|
|
|
+// list($index, $name, $en_name) = str2arr0($file['filename'], '-');
|
|
|
+// $s = str2arr0($index, '.');
|
|
|
+// if ($base_lang == 'en') $name = $en_name;
|
|
|
+// }
|
|
|
+ $name = $file['filename'];
|
|
|
+ $s[0] = 'Videos';
|
|
|
+ $videos[$s[0]][] = [
|
|
|
+ 'section' => $s[0],
|
|
|
+ 'name' => $name,
|
|
|
+ 'en_name' => $name,
|
|
|
+ 'path' => "{$base_url}/" . $file['filename'] . '.mp4',
|
|
|
+ 'srt' => false
|
|
|
+ ];
|
|
|
+ break;
|
|
|
+ case 'srt':
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ $file_data = str2arr0($file['filename'], '-');
|
|
|
+ $name = $file_data[1];
|
|
|
+ if (count($file_data) == 2) {
|
|
|
+ $sections[$file_data[0]] = [
|
|
|
+ 'name' => $name,
|
|
|
+ 'en_name' => $file_data[1],
|
|
|
+ ];
|
|
|
+ } else {
|
|
|
+ if ($base_lang == 'en') $name = $file_data[2];
|
|
|
+ $sections[$file_data[0]] = [
|
|
|
+ 'name' => $name,
|
|
|
+ 'en_name' => $file_data[2],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ file_put_contents(base_path('data/' . $url_path . '.json'), json_encode($videos, true));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function readJson($localPath, $url_path, $lang, $course_id, $is_close_chapter, $title)
|
|
|
+ {
|
|
|
+ $base_lang = $lang;
|
|
|
+ $base_course_id = $course_id;
|
|
|
+
|
|
|
+ $videos = [];
|
|
|
+
|
|
|
+
|
|
|
+ $data = file_get_contents(base_path('data/' . $url_path . '.json'));
|
|
|
+ $data = json_decode($data, true);
|
|
|
+ $videos = $data;
|
|
|
+ //保存数据
|
|
|
+ if ($base_course_id) {
|
|
|
+ $course = Course::query()->find($base_course_id);
|
|
|
+ } else {
|
|
|
+ $course = Course::query()->create([
|
|
|
+ 'title' => $title,
|
|
|
+ 'language' => $base_lang,
|
|
|
+ 'admin_id' => 1,
|
|
|
+ 'status' => 1,
|
|
|
+ 'slug' => Str::random(8),
|
|
|
+ 'published_at' => Carbon::now()->toDateTimeString(),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ Chapter::query()->where('course_id', $course->id)->delete();
|
|
|
+ Video::query()->where('course_id', $course->id)->delete();
|
|
|
+ DB::beginTransaction();
|
|
|
+ try {
|
|
|
+ foreach ($videos as $s => $vs) {
|
|
|
+ $section['name'] = $s;
|
|
|
+
|
|
|
+ $chapter = Chapter::query()->updateOrCreate([
|
|
|
+ 'course_id' => $course->id,
|
|
|
+ 'title' => $section['name'],
|
|
|
+ 'language' => $base_lang,
|
|
|
+ ], [
|
|
|
+ 'status' => ModelStatusEnum::OK
|
|
|
+ ]);
|
|
|
+ foreach ($vs as $video) {
|
|
|
+ $resource = Resource::query()->updateOrCreate([
|
|
|
+ 'name' => $video['name'],
|
|
|
+ 'original_name' => $video['name'],
|
|
|
+ 'path' => $video['path'],
|
|
|
+ ], [
|
|
|
+ 'disk' => 'qiniu',
|
|
|
+ 'url' => $video['path'],
|
|
|
+ 'size' => 0,
|
|
|
+ 'language' => $base_lang,
|
|
|
+ 'status' => ModelStatusEnum::OK,
|
|
|
+ ]);
|
|
|
+ $subtitle_resource = null;
|
|
|
+ if ($video['srt']) {
|
|
|
+ $subtitle_resource = Resource::query()->updateOrCreate([
|
|
|
+ 'path' => $video['srt']['path'],
|
|
|
+ ], [
|
|
|
+ 'name' => Str::random(8) . '.srt',
|
|
|
+ 'original_name' => $video['srt']['name'],
|
|
|
+ 'disk' => 'public',
|
|
|
+ 'url' => $video['srt']['path'],
|
|
|
+ 'size' => 0,
|
|
|
+ 'language' => $base_lang,
|
|
|
+ 'status' => ModelStatusEnum::OK,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ Video::query()->updateOrCreate([
|
|
|
+ 'course_id' => $course->id,
|
|
|
+ 'course_chapter_id' => $chapter->id,
|
|
|
+ 'title' => $video['name'],
|
|
|
+ ], [
|
|
|
+ 'slug' => Str::random(),
|
|
|
+ 'language' => $base_lang,
|
|
|
+ 'url' => $resource->id,
|
|
|
+ 'published_at' => Carbon::now()->toDateTimeString(),
|
|
|
+ 'subtitle_zh_path' => $subtitle_resource ? $subtitle_resource->id : '',
|
|
|
+ 'subtitle_en_path' => $subtitle_resource ? $subtitle_resource->id : '',
|
|
|
+ 'status' => ModelStatusEnum::OK
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ DB::commit();
|
|
|
+ } catch (\Exception $exception) {
|
|
|
+ DB::rollBack();
|
|
|
+ dd($exception);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
public function loadFiles($url_path, $lang, $course_id, $is_close_chapter, $title)
|
|
|
{
|
|
|
$base_lang = $lang;
|