src/Controller/JSON/MediaController.php line 83

Open in your IDE?
  1. <?php
  2. /** @noinspection SqlResolve */
  3. /** @noinspection SqlNoDataSourceInspection */
  4. namespace App\Controller\JSON;
  5. use App\Common\API\APICommon;
  6. use App\Common\Resize;
  7. use App\Common\SyncCommon;
  8. use PDO;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  13. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  16. /**
  17.  * Class MediaController
  18.  *
  19.  * @package App\Controller\JSON
  20.  */
  21. #[Route(path'/api/media')]
  22. class MediaController extends CommonController
  23. {
  24.     /**
  25.      * Common static function to generate URL items for media related API elements.
  26.      *
  27.      * @param $mediaData
  28.      */
  29.     public static function buildMediaPaths($mediaDataAbstractController $controller): array
  30.     {
  31.         if (!array_key_exists("MediaID"$mediaData) || !array_key_exists("FileExt"$mediaData)) {
  32.             // Missing required keys
  33.             return ["Invalid media data"];
  34.         }
  35.         $paths = [
  36.             'normal' => $controller->generateUrl(
  37.                 'JSON_API.media',
  38.                 [
  39.                     'media' => $mediaData['MediaID'],
  40.                 ],
  41.                 UrlGeneratorInterface::ABSOLUTE_URL
  42.             ),
  43.         ];
  44.         if ($mediaData['ext'] == 'jpg' || $mediaData['ext'] == 'jpeg' || $mediaData['ext'] == 'gif' || $mediaData['ext'] == 'png') {
  45.             // Media is an image, include additional paths
  46.             $paths['full-size'] = $controller->generateUrl(
  47.                 'JSON_API.media.fullsize',
  48.                 [
  49.                     'media' => $mediaData['MediaID'],
  50.                 ],
  51.                 UrlGeneratorInterface::ABSOLUTE_URL
  52.             );
  53.             $paths['thumbnail'] = $controller->generateUrl(
  54.                 'JSON_API.media.thumbnail',
  55.                 [
  56.                     'media' => $mediaData['MediaID'],
  57.                 ],
  58.                 UrlGeneratorInterface::ABSOLUTE_URL
  59.             );
  60.         }
  61.         return $paths;
  62.     }
  63.     /**
  64.      * Return media object. If it is an image, max resolution of 512px x 512px
  65.      *
  66.      *
  67.      * @param $media
  68.      * @return string
  69.      */
  70.     #[Route(path'/{media}'name'JSON_API.media')]
  71.     public function media($media)
  72.     {
  73.         $mediaData $this->getMediaAsset($media);
  74.         if (!array_key_exists('path'$mediaData)) {
  75.             // Asset not found. Kill process.
  76.             throw new NotFoundHttpException('Object not found.');
  77.         }
  78.         $remoteAsset APICommon::getAssetPath($mediaData['path'], $mediaData['name'], $mediaData['ext']);
  79.         if (!file_exists($remoteAsset) || filesize($remoteAsset) <= 0) {
  80.             // Asset not found. Kill process.
  81.             throw new NotFoundHttpException('Asset not found.');
  82.         }
  83.         // Get last modified time.
  84.         $lastModified filemtime($remoteAsset);
  85.         // Getting headers sent by the client.
  86.         $headers getallheaders();
  87.         // Checking if the client is validating its cache and if it is current.
  88.         if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $lastModified)) {
  89.             // Client's cache IS current, so we just respond '304 Not Modified'.
  90.             header("Last-Modified: " gmdate('D, d M Y H:i:s'$lastModified) . " GMT"true304);
  91.             exit;
  92.         }
  93.         if ($mediaData['ext'] == 'jpg' || $mediaData['ext'] == 'jpeg' || $mediaData['ext'] == 'gif' || $mediaData['ext'] == 'png') {
  94.             $resizeObj = new Resize();
  95.             $resizeObj->build($remoteAsset);
  96.             $resizeObj->resizeImage(512512);
  97.             $response = new Response();
  98.             $response->headers->set('Content-Type'$resizeObj->getContentType());
  99.             $response->sendHeaders();
  100.             $resizeObj->getImage();
  101.             return $response;
  102.         } else {
  103.             $response = new BinaryFileResponse($remoteAsset);
  104.             $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE);
  105.             $response->headers->add(["Last-Modified" => gmdate('D, d M Y H:i:s'$lastModified) . " GMT"]);
  106.             return $response;
  107.         }
  108.     }
  109.     /**
  110.      * Get array containing media data
  111.      *
  112.      * @param $mediaID
  113.      */
  114.     protected function getMediaAsset($mediaID): array
  115.     {
  116.         // Connect to MSSQL
  117.         $this->makeConnection();
  118.         $fullQuery "
  119.             SELECT Multimedia.MulId AS MediaID,
  120.                 Multimedia.MulDateiS AS LinkID,
  121.                 Multimedia.MulPfadS AS FilePath,
  122.                 Multimedia.MulDateiS AS FileName,
  123.                 Multimedia.MulExtentS AS FileExt,
  124.                 Multimedia.MulTypS AS FileType
  125.             FROM Multimedia
  126.             WHERE Multimedia.MulId = %d";
  127.         // Fire query
  128.         $query sqlsrv_query(
  129.             $this->getConnection(),
  130.             sprintf($fullQuery$mediaID) . SyncCommon::GENERAL_MEDIA_FILTERS ";"
  131.         );
  132.         $data = [];
  133.         // Loop through result set
  134.         while ($row sqlsrv_fetch_array($querySQLSRV_FETCH_ASSOC)) {
  135.             $data = [
  136.                 'path' => $row['FilePath'],
  137.                 'name' => $row['FileName'],
  138.                 'ext' => $row['FileExt'],
  139.             ];
  140.         }
  141.         $this->closeConnection();
  142.         return $data;
  143.     }
  144.     /**
  145.      * Get image at its full size
  146.      *
  147.      *
  148.      * @param $media
  149.      * @return string
  150.      */
  151.     #[Route(path'/{media}/full'name'JSON_API.media.fullsize')]
  152.     public function full($media)
  153.     {
  154.         $mediaData $this->getMediaAsset($media);
  155.         if (!array_key_exists('path'$mediaData) ||
  156.             !($mediaData['ext'] == 'jpg' || $mediaData['ext'] == 'jpeg' || $mediaData['ext'] == 'gif' || $mediaData['ext'] == 'png')) {
  157.             // Asset not found. Kill process.
  158.             throw new NotFoundHttpException('Object not found.');
  159.         }
  160.         $remoteAsset APICommon::getAssetPath($mediaData['path'], $mediaData['name'], $mediaData['ext']);
  161.         if (!file_exists($remoteAsset) || filesize($remoteAsset) <= 0) {
  162.             // Asset not found. Kill process.
  163.             throw new NotFoundHttpException('Asset not found.');
  164.         }
  165.         // Get last modified time.
  166.         $lastModified filemtime($remoteAsset);
  167.         // Getting headers sent by the client.
  168.         $headers getallheaders();
  169.         // Checking if the client is validating its cache and if it is current.
  170.         if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $lastModified)) {
  171.             // Client's cache IS current, so we just respond '304 Not Modified'.
  172.             header("Last-Modified: " gmdate('D, d M Y H:i:s'$lastModified) . " GMT"true304);
  173.             exit;
  174.         }
  175.         $response = new BinaryFileResponse($remoteAsset);
  176.         $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE);
  177.         $response->headers->add(["Last-Modified" => gmdate('D, d M Y H:i:s'$lastModified) . " GMT"]);
  178.         return $response;
  179.     }
  180.     /**
  181.      * Get image at 38x56
  182.      *
  183.      *
  184.      * @param $media
  185.      * @return string
  186.      */
  187.     #[Route(path'/{media}/thumbnail'name'JSON_API.media.thumbnail')]
  188.     public function thumbnail($media)
  189.     {
  190.         $mediaData $this->getMediaAsset($media);
  191.         if (!array_key_exists('path'$mediaData) ||
  192.             !($mediaData['ext'] == 'jpg' || $mediaData['ext'] == 'jpeg' || $mediaData['ext'] == 'gif' || $mediaData['ext'] == 'png')) {
  193.             // Asset not found. Kill process.
  194.             throw new NotFoundHttpException('Object not found.');
  195.         }
  196.         $remoteAsset APICommon::getAssetPath($mediaData['path'], $mediaData['name'], $mediaData['ext']);
  197.         if (!file_exists($remoteAsset) || filesize($remoteAsset) <= 0) {
  198.             // Asset not found. Kill process.
  199.             throw new NotFoundHttpException('Asset not found.');
  200.         }
  201.         // Get last modified time.
  202.         $lastModified filemtime($remoteAsset);
  203.         // Getting headers sent by the client.
  204.         $headers getallheaders();
  205.         // Checking if the client is validating its cache and if it is current.
  206.         if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == $lastModified)) {
  207.             // Client's cache IS current, so we just respond '304 Not Modified'.
  208.             header("Last-Modified: " gmdate('D, d M Y H:i:s'$lastModified) . " GMT"true304);
  209.             exit;
  210.         }
  211.         $resizeObj = new Resize();
  212.         $resizeObj->build($remoteAsset);
  213.         $resizeObj->resizeImage(3856);
  214.         $response = new Response();
  215.         $response->headers->set('Content-Type'$resizeObj->getContentType());
  216.         $response->sendHeaders();
  217.         $resizeObj->getImage();
  218.         return $response;
  219.     }
  220. }