Showing
4 changed files
with
103 additions
and
41 deletions
... | @@ -114,7 +114,6 @@ class VideoTempController extends AdminController | ... | @@ -114,7 +114,6 @@ class VideoTempController extends AdminController |
114 | 114 | ||
115 | $form->hasMany('components','组件', function (Form\NestedForm $form) { | 115 | $form->hasMany('components','组件', function (Form\NestedForm $form) { |
116 | $form->select('name','组件名称')->options([ | 116 | $form->select('name','组件名称')->options([ |
117 | - 'one_poem_with_annotate' => '一言带注解组件', | ||
118 | 'one_poem' => '一言组件', | 117 | 'one_poem' => '一言组件', |
119 | 'weather' => '天气组件', | 118 | 'weather' => '天气组件', |
120 | 'date' => '日期组件', | 119 | 'date' => '日期组件', | ... | ... |
... | @@ -56,7 +56,7 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -56,7 +56,7 @@ class AdminMakeImmerse implements ShouldQueue |
56 | $this->media_info = $this->mediaInfo($file); | 56 | $this->media_info = $this->mediaInfo($file); |
57 | 57 | ||
58 | // 准备素材 | 58 | // 准备素材 |
59 | - $watermark = $this->getAbsolutePath('images/LOGO_eng.png'); | 59 | + $watermark = $this->getAbsolutePath('images/logo.png'); |
60 | 60 | ||
61 | // 组装文字参数 | 61 | // 组装文字参数 |
62 | $drawtext = $this->getTextContentString(); | 62 | $drawtext = $this->getTextContentString(); |
... | @@ -219,24 +219,8 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -219,24 +219,8 @@ class AdminMakeImmerse implements ShouldQueue |
219 | $contents = []; // | 219 | $contents = []; // |
220 | switch ($component->name){ | 220 | switch ($component->name){ |
221 | case 'one_poem': | 221 | case 'one_poem': |
222 | - foreach ($this->adminMakeVideo->poem2->verses as $item) { | 222 | + $default = $this->adminMakeVideo->poem2->title . "\n" . $this->adminMakeVideo->poem2->author; |
223 | - if ($item->content != '') $contents[] = $this->autoEnter($item->content, $font_size, $this->output_width); | 223 | + $contents[] = $this->autoCenter($default,$font_size, $this->output_width); |
224 | - } | ||
225 | - break; | ||
226 | - case 'one_poem_with_annotate': | ||
227 | - foreach ($this->adminMakeVideo->poem2->verses as $item) { | ||
228 | - if ($item->content != '') $contents[] = $this->autoEnter($item->content, $font_size, $this->output_width); | ||
229 | - if ($item->annotate != '') $contents[] = $this->autoEnter($item->annotate, $font_size, $this->output_width); | ||
230 | - } | ||
231 | - break; | ||
232 | - case 'one_poem_with_annotate_and_source': | ||
233 | - foreach ($this->adminMakeVideo->poem2->verses as $item) { | ||
234 | - if ($item->content != '') $contents[] = $this->autoEnter($item->content, $font_size, $this->output_width); | ||
235 | - if ($item->annotate != '') $contents[] = $this->autoEnter($item->annotate, $font_size, $this->output_width); | ||
236 | - if ($item->source != '') $contents[] = $this->autoEnter($item->source, $font_size, $this->output_width); | ||
237 | - } | ||
238 | - break; | ||
239 | - case 'one_poem_with_all': | ||
240 | foreach ($this->adminMakeVideo->poem2->verses as $item) { | 224 | foreach ($this->adminMakeVideo->poem2->verses as $item) { |
241 | if ($item->content != '') $contents[] = $this->autoEnter($item->content, $font_size, $this->output_width); | 225 | if ($item->content != '') $contents[] = $this->autoEnter($item->content, $font_size, $this->output_width); |
242 | if ($item->annotate != '') $contents[] = $this->autoEnter($item->annotate, $font_size, $this->output_width); | 226 | if ($item->annotate != '') $contents[] = $this->autoEnter($item->annotate, $font_size, $this->output_width); |
... | @@ -275,7 +259,6 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -275,7 +259,6 @@ class AdminMakeImmerse implements ShouldQueue |
275 | '", '; | 259 | '", '; |
276 | } | 260 | } |
277 | 261 | ||
278 | - | ||
279 | $drawtext .= $sub_text; | 262 | $drawtext .= $sub_text; |
280 | } | 263 | } |
281 | 264 | ||
... | @@ -283,13 +266,11 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -283,13 +266,11 @@ class AdminMakeImmerse implements ShouldQueue |
283 | if ($component->draw == 'fix'){ | 266 | if ($component->draw == 'fix'){ |
284 | $contents = []; // | 267 | $contents = []; // |
285 | switch ($component->name){ | 268 | switch ($component->name){ |
286 | - case 'one_poem_with_annotate': | ||
287 | - case 'one_poem_with_annotate_and_source': | ||
288 | - case 'one_poem_with_all': | ||
289 | case 'one_poem': | 269 | case 'one_poem': |
290 | $stanzas = ''; | 270 | $stanzas = ''; |
271 | + $default = $this->adminMakeVideo->poem2->title . "\n" . $this->adminMakeVideo->poem2->author; | ||
272 | + $stanzas .= $this->autoCenter($default,$font_size, $this->output_width) .PHP_EOL.PHP_EOL; | ||
291 | foreach ($this->adminMakeVideo->poem2->verses as $item) { | 273 | foreach ($this->adminMakeVideo->poem2->verses as $item) { |
292 | - | ||
293 | if ($item->content != '') $stanzas .= $this->autoEnter($item->content, $font_size, $this->output_width) . "\n"; | 274 | if ($item->content != '') $stanzas .= $this->autoEnter($item->content, $font_size, $this->output_width) . "\n"; |
294 | } | 275 | } |
295 | $contents[] = $stanzas; | 276 | $contents[] = $stanzas; |
... | @@ -344,6 +325,39 @@ class AdminMakeImmerse implements ShouldQueue | ... | @@ -344,6 +325,39 @@ class AdminMakeImmerse implements ShouldQueue |
344 | } | 325 | } |
345 | } | 326 | } |
346 | 327 | ||
328 | + public function autoCenter($string, $font_width, $video_width) | ||
329 | + { | ||
330 | + $video_width = $video_width - 2 * $font_width; // 两侧留出空隙 | ||
331 | + $row_count = floor($video_width / $font_width); | ||
332 | + $arr = explode("\n", $string); | ||
333 | + $title = $arr[0]; | ||
334 | + $author = $arr[1]; | ||
335 | + | ||
336 | + $title_len = mb_strlen($title); | ||
337 | + if ($title_len > $row_count) { | ||
338 | + $tmp = array_chunk( | ||
339 | + preg_split("//u", $string, -1, PREG_SPLIT_NO_EMPTY), $row_count); | ||
340 | + $tmp[count($tmp - 1)] = $this->autoStrPad(end($tmp), $row_count * 2, ' ', STR_PAD_BOTH); | ||
341 | + $new_title = ''; | ||
342 | + foreach ($tmp as $t) { | ||
343 | + $new_title .= join("", $t) . "\n"; | ||
344 | + } | ||
345 | + } else { | ||
346 | + $new_title = $this->autoStrPad($title, $row_count * 2, ' ', STR_PAD_BOTH); | ||
347 | + } | ||
348 | + | ||
349 | + $new_author = $this->autoStrPad($author, $row_count * 2, ' ', STR_PAD_BOTH); | ||
350 | + | ||
351 | + return $new_title . PHP_EOL . $new_author; | ||
352 | + } | ||
353 | + | ||
354 | + | ||
355 | + public function autoStrPad($string, $length, $pad_string = "", $pad_type = STR_PAD_BOTH) | ||
356 | + { | ||
357 | + $mb_disparity_count = (strlen($string) - mb_strlen($string)) / 2; | ||
358 | + return str_pad($string,$length+$mb_disparity_count,$pad_string,$pad_type); | ||
359 | + } | ||
360 | + | ||
347 | public function calcFontSize($width) | 361 | public function calcFontSize($width) |
348 | { | 362 | { |
349 | return floor($this->output_width / 360 * $width); | 363 | return floor($this->output_width / 360 * $width); | ... | ... |
... | @@ -85,14 +85,13 @@ class SendVerificationMessage implements ShouldQueue | ... | @@ -85,14 +85,13 @@ class SendVerificationMessage implements ShouldQueue |
85 | $email = new \SendGrid\Mail\Mail(); | 85 | $email = new \SendGrid\Mail\Mail(); |
86 | $email->setFrom("hello@parlando.ink", "Parlando"); | 86 | $email->setFrom("hello@parlando.ink", "Parlando"); |
87 | $email->setSubject("Verification Code"); | 87 | $email->setSubject("Verification Code"); |
88 | - $email->addTo($this->email, "Parlando User"); | 88 | + $email->addTo($this->email, $this->email); |
89 | $email->addContent( | 89 | $email->addContent( |
90 | - "text/html", "Please enter in the verification code input box: <strong>$code</strong><br/>(The code will expire in 30 minutes.)" | 90 | + "text/html", "Your verification code is: <strong>$code</strong><br/>(The code will expire in 30 minutes.)" |
91 | ); | 91 | ); |
92 | $sendgrid = new \SendGrid(env('SENDGRID_API_KEY')); | 92 | $sendgrid = new \SendGrid(env('SENDGRID_API_KEY')); |
93 | try { | 93 | try { |
94 | - $res = $sendgrid->send($email); | 94 | + $sendgrid->send($email); |
95 | - Log::channel("daily")->debug($res->body()); | ||
96 | } catch (\Exception $e) { | 95 | } catch (\Exception $e) { |
97 | Log::channel("daily")->error("send email error :".$e->getMessage()); | 96 | Log::channel("daily")->error("send email error :".$e->getMessage()); |
98 | } | 97 | } | ... | ... |
... | @@ -97,7 +97,7 @@ class UserMakeImmerse implements ShouldQueue | ... | @@ -97,7 +97,7 @@ class UserMakeImmerse implements ShouldQueue |
97 | } | 97 | } |
98 | 98 | ||
99 | $drawtext = $this->getTextContentString(); | 99 | $drawtext = $this->getTextContentString(); |
100 | - $watermark = Storage::disk('public')->path('images/LOGO_eng.png'); | 100 | + $watermark = Storage::disk('public')->path('images/logo.png'); |
101 | 101 | ||
102 | //直接将音频替换 | 102 | //直接将音频替换 |
103 | $cmd = $this->ffmpeg . ' -y ' . | 103 | $cmd = $this->ffmpeg . ' -y ' . |
... | @@ -156,7 +156,7 @@ class UserMakeImmerse implements ShouldQueue | ... | @@ -156,7 +156,7 @@ class UserMakeImmerse implements ShouldQueue |
156 | } | 156 | } |
157 | 157 | ||
158 | $drawtext = $this->getTextContentString(); | 158 | $drawtext = $this->getTextContentString(); |
159 | - $watermark = Storage::disk('public')->path('images/LOGO_eng.png'); | 159 | + $watermark = Storage::disk('public')->path('images/logo.png'); |
160 | 160 | ||
161 | //直接将音频替换 | 161 | //直接将音频替换 |
162 | $cmd = $this->ffmpeg . ' -y ' . | 162 | $cmd = $this->ffmpeg . ' -y ' . |
... | @@ -207,7 +207,7 @@ class UserMakeImmerse implements ShouldQueue | ... | @@ -207,7 +207,7 @@ class UserMakeImmerse implements ShouldQueue |
207 | // | 207 | // |
208 | 208 | ||
209 | $drawtext = $this->getTextContentString(); | 209 | $drawtext = $this->getTextContentString(); |
210 | - $watermark = Storage::disk('public')->path('images/LOGO_eng.png'); | 210 | + $watermark = Storage::disk('public')->path('images/logo.png'); |
211 | 211 | ||
212 | // 截取中间帧作为视频封面 | 212 | // 截取中间帧作为视频封面 |
213 | $frame = ceil($this->media_info['streams'][0]['nb_frames'] / 2); | 213 | $frame = ceil($this->media_info['streams'][0]['nb_frames'] / 2); |
... | @@ -498,23 +498,23 @@ class UserMakeImmerse implements ShouldQueue | ... | @@ -498,23 +498,23 @@ class UserMakeImmerse implements ShouldQueue |
498 | $opacity = $component->opacity ? $component->opacity / 100 : 0.5; | 498 | $opacity = $component->opacity ? $component->opacity / 100 : 0.5; |
499 | $font_file = Storage::disk('public')->path($component->font_file); | 499 | $font_file = Storage::disk('public')->path($component->font_file); |
500 | $text_bg_box = $component->text_bg_box ?? 0; | 500 | $text_bg_box = $component->text_bg_box ?? 0; |
501 | - | 501 | + $font_size = $this->calcFontSize($component->font_size); |
502 | 502 | ||
503 | // 文字淡入淡出模式 | 503 | // 文字淡入淡出模式 |
504 | if ($component->draw == 'fade'){ | 504 | if ($component->draw == 'fade'){ |
505 | $contents = []; // | 505 | $contents = []; // |
506 | switch ($component->name){ | 506 | switch ($component->name){ |
507 | case 'one_poem': | 507 | case 'one_poem': |
508 | + $default = $this->immerse->poem2->title . "\n" . $this->immerse->poem2->author; | ||
509 | + $contents[] = $this->autoCenter($default,$font_size, $this->output_width); | ||
508 | foreach ($this->immerse->poem2->verses as $item) { | 510 | foreach ($this->immerse->poem2->verses as $item) { |
509 | - if ($item->content != '') $contents[] = $item->content; | 511 | + if ($item->content != '') $contents[] = $this->autoEnter($item->content, $font_size, $this->output_width); |
510 | - } | 512 | + if ($item->annotate != '') $contents[] = $this->autoEnter($item->annotate, $font_size, $this->output_width); |
511 | - break; | 513 | + if ($item->spelling != '') $contents[] = $this->autoEnter($item->spelling, $font_size, $this->output_width); |
512 | - case 'one_poem_with_annotate': | 514 | + if ($item->en != '') $contents[] = $this->autoEnter($item->en, $font_size, $this->output_width); |
513 | - foreach ($this->immerse->poem2->verses as $item) { | ||
514 | - if ($item->content != '') $contents[] = $item->content; | ||
515 | - if ($item->annotate != '') $contents[] = $item->annotate; | ||
516 | } | 515 | } |
517 | break; | 516 | break; |
517 | + | ||
518 | case 'weather': | 518 | case 'weather': |
519 | $contents[] = $this->immerse->weather; | 519 | $contents[] = $this->immerse->weather; |
520 | break; | 520 | break; |
... | @@ -552,7 +552,6 @@ class UserMakeImmerse implements ShouldQueue | ... | @@ -552,7 +552,6 @@ class UserMakeImmerse implements ShouldQueue |
552 | if ($component->draw == 'fix'){ | 552 | if ($component->draw == 'fix'){ |
553 | $contents = []; // | 553 | $contents = []; // |
554 | switch ($component->name){ | 554 | switch ($component->name){ |
555 | - case 'one_poem_with_annotate': | ||
556 | case 'one_poem': | 555 | case 'one_poem': |
557 | $stanzas = ''; | 556 | $stanzas = ''; |
558 | foreach ($this->immerse->poem2->verses as $item) { | 557 | foreach ($this->immerse->poem2->verses as $item) { |
... | @@ -591,6 +590,57 @@ class UserMakeImmerse implements ShouldQueue | ... | @@ -591,6 +590,57 @@ class UserMakeImmerse implements ShouldQueue |
591 | return rtrim($drawtext,', '); | 590 | return rtrim($drawtext,', '); |
592 | } | 591 | } |
593 | 592 | ||
593 | + public function autoEnter($string, $font_width, $video_width) | ||
594 | + { | ||
595 | + $video_width = $video_width - 2 * $font_width; // 两侧留出空隙 | ||
596 | + $row_count = floor($video_width / $font_width); | ||
597 | + echo $row_count; | ||
598 | + $str_len = mb_strlen($string); | ||
599 | + if ($str_len > $row_count) { | ||
600 | + $tmp = array_chunk( | ||
601 | + preg_split("//u", $string, -1, PREG_SPLIT_NO_EMPTY), $row_count); | ||
602 | + $new_str = ""; | ||
603 | + foreach ($tmp as $t) { | ||
604 | + $new_str .= join("", $t) . "\n"; | ||
605 | + } | ||
606 | + return $new_str; | ||
607 | + }else{ | ||
608 | + return $string; | ||
609 | + } | ||
610 | + } | ||
611 | + | ||
612 | + public function autoCenter($string, $font_width, $video_width) | ||
613 | + { | ||
614 | + $video_width = $video_width - 2 * $font_width; // 两侧留出空隙 | ||
615 | + $row_count = floor($video_width / $font_width); | ||
616 | + $arr = explode("\n", $string); | ||
617 | + $title = $arr[0]; | ||
618 | + $author = $arr[1]; | ||
619 | + | ||
620 | + $title_len = mb_strlen($title); | ||
621 | + if ($title_len > $row_count) { | ||
622 | + $tmp = array_chunk( | ||
623 | + preg_split("//u", $string, -1, PREG_SPLIT_NO_EMPTY), $row_count); | ||
624 | + $tmp[count($tmp - 1)] = $this->autoStrPad(end($tmp), $row_count * 2, ' ', STR_PAD_BOTH); | ||
625 | + $new_title = ''; | ||
626 | + foreach ($tmp as $t) { | ||
627 | + $new_title .= join("", $t) . "\n"; | ||
628 | + } | ||
629 | + } else { | ||
630 | + $new_title = $this->autoStrPad($title, $row_count * 2, ' ', STR_PAD_BOTH); | ||
631 | + } | ||
632 | + | ||
633 | + $new_author = $this->autoStrPad($author, $row_count * 2, ' ', STR_PAD_BOTH); | ||
634 | + | ||
635 | + return $new_title . PHP_EOL . $new_author; | ||
636 | + } | ||
637 | + | ||
638 | + public function autoStrPad($string, $length, $pad_string = "", $pad_type = STR_PAD_BOTH) | ||
639 | + { | ||
640 | + $mb_disparity_count = (strlen($string) - mb_strlen($string)) / 2; | ||
641 | + return str_pad($string,$length+$mb_disparity_count,$pad_string,$pad_type); | ||
642 | + } | ||
643 | + | ||
594 | /** | 644 | /** |
595 | * @param $width | 645 | * @param $width |
596 | * @param $content | 646 | * @param $content | ... | ... |
-
Please register or login to post a comment