Modules_Manage_Controllers_M3u8Controller.proxy.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. use \Hyperf\Di\Aop\ProxyTrait;
  12. use \Hyperf\Di\Aop\PropertyHandlerTrait;
  13. function __construct()
  14. {
  15. if (method_exists(parent::class, '__construct')) {
  16. parent::__construct(...func_get_args());
  17. }
  18. $this->__handlePropertyHandler(__CLASS__);
  19. }
  20. /**
  21. * 获取raw
  22. * @param Request $request
  23. * @param VideoRepository $videoRepository
  24. * @return \Psr\Http\Message\ResponseInterface
  25. */
  26. public function raw(Request $request, VideoRepository $videoRepository, AdRepository $adRepository, OriginalRepository $goodsRepository, ShopsRepository $shopsRepository)
  27. {
  28. $innerToken = 'vj2x2fgvc';
  29. // 不走中间件,定义个内部简单通信token
  30. $token = $request->input('tk', '');
  31. if ($token != $innerToken) {
  32. return self::responseM3u8Raw('');
  33. }
  34. $module = trim(strtolower($request->input('module', '')));
  35. $pk = substr($request->input('pk', ''), 0, 16);
  36. $rateType = substr($request->input('rate_type', ''), 0, 32);
  37. // 指定的比特率.
  38. $item = null;
  39. $m3u8PlayUrl = '';
  40. switch ($module) {
  41. case 'video':
  42. $item = $videoRepository->findBy('id', $pk, ['id', 'mu']);
  43. if (!empty($item->mu)) {
  44. $m3u8PlayUrl = $item->mu;
  45. }
  46. break;
  47. case 'ad':
  48. $item = $adRepository->findBy('id', $pk, ['id', 'play']);
  49. if (!empty($item->play)) {
  50. $m3u8PlayUrl = $item->play;
  51. }
  52. break;
  53. case 'shop':
  54. $item = $shopsRepository->findBy('uid', $pk, ['video_address']);
  55. if (!empty($item->video_address)) {
  56. $m3u8PlayUrl = $item->video_address;
  57. }
  58. break;
  59. case 'goods':
  60. $item = $goodsRepository->findBy('uid', $pk, ['video_address']);
  61. if (!empty($item->video_address)) {
  62. $m3u8PlayUrl = $item->video_address;
  63. }
  64. break;
  65. }
  66. if (empty($m3u8PlayUrl)) {
  67. return self::responseM3u8Raw('');
  68. }
  69. $raw = M3u8CacheRepository::getMu38Raw($m3u8PlayUrl, false);
  70. return self::responseM3u8Raw($raw);
  71. }
  72. /**
  73. * @return string[]
  74. */
  75. private function getHeaders()
  76. {
  77. return ['Content-Type' => 'application/x-mpegURL'];
  78. }
  79. /**
  80. * 返回raw
  81. * @param $raw
  82. * @return \Psr\Http\Message\ResponseInterface
  83. */
  84. private function responseM3u8Raw($raw)
  85. {
  86. return response($raw, 200, self::getHeaders());
  87. }
  88. }