M3u8Controller.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace Modules\Manage\Controllers;
  3. use App\Repositories\AdRepository;
  4. use App\Repositories\OriginalRepository;
  5. use App\Repositories\ShopsRepository;
  6. use App\Repositories\Utils\M3u8CacheRepository;
  7. use App\Repositories\VideoRepository;
  8. use Hyperf\HttpServer\Request;
  9. class M3u8Controller extends BaseController
  10. {
  11. /**
  12. * 获取raw
  13. * @param Request $request
  14. * @param VideoRepository $videoRepository
  15. * @return \Psr\Http\Message\ResponseInterface
  16. */
  17. public function raw(Request $request, VideoRepository $videoRepository, AdRepository $adRepository, OriginalRepository $goodsRepository, ShopsRepository $shopsRepository)
  18. {
  19. $innerToken = 'vj2x2fgvc'; // 不走中间件,定义个内部简单通信token
  20. $token = $request->input('tk', '');
  21. if ($token != $innerToken) {
  22. return self::responseM3u8Raw('');
  23. }
  24. $module = trim(strtolower($request->input('module', '')));
  25. $pk = substr($request->input('pk', ''), 0, 16);
  26. $rateType = substr($request->input('rate_type', ''), 0, 32); // 指定的比特率.
  27. $item = null;
  28. $m3u8PlayUrl = '';
  29. switch ($module) {
  30. case 'video':
  31. $item = $videoRepository->findBy('id', $pk, ['id', 'mu']);
  32. if (!empty($item->mu)) {
  33. $m3u8PlayUrl = $item->mu;
  34. }
  35. break;
  36. case 'ad':
  37. $item = $adRepository->findBy('id', $pk, ['id', 'play']);
  38. if (!empty($item->play)) {
  39. $m3u8PlayUrl = $item->play;
  40. }
  41. break;
  42. case 'shop':
  43. $item = $shopsRepository->findBy('uid', $pk, ['video_address']);
  44. if (!empty($item->video_address)) {
  45. $m3u8PlayUrl = $item->video_address;
  46. }
  47. break;
  48. case 'goods':
  49. $item = $goodsRepository->findBy('uid', $pk, ['video_address']);
  50. if (!empty($item->video_address)) {
  51. $m3u8PlayUrl = $item->video_address;
  52. }
  53. break;
  54. }
  55. if (empty($m3u8PlayUrl)) {
  56. return self::responseM3u8Raw('');
  57. }
  58. $raw = M3u8CacheRepository::getMu38Raw($m3u8PlayUrl, false);
  59. return self::responseM3u8Raw($raw);
  60. }
  61. /**
  62. * @return string[]
  63. */
  64. private function getHeaders()
  65. {
  66. return [
  67. 'Content-Type' => 'application/x-mpegURL',
  68. ];
  69. }
  70. /**
  71. * 返回raw
  72. * @param $raw
  73. * @return \Psr\Http\Message\ResponseInterface
  74. */
  75. private function responseM3u8Raw($raw)
  76. {
  77. return response($raw, 200, self::getHeaders());
  78. }
  79. }