src/Controller/DownloadController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Twig\LayoutExtension;
  4. use App\Twig\PressExtension;
  5. use Pimcore\Model\Asset;
  6. use Pimcore\Model\DataObject\MediaAlbum;
  7. use Pimcore\Model\DataObject\MediaAsset;
  8. use Pimcore\Model\DataObject\PressArticle;
  9. use Pimcore\Model\DataObject\PressDossier;
  10. use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\StreamedResponse;
  13. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  14. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. class DownloadController extends AbstractController
  17. {
  18.     private LayoutExtension $layoutExtension;
  19.     private $assetBasePath "/home/steiermark/www/public/var/assets";
  20.     public function __construct(LayoutExtension $layoutExtension, protected PressExtension $pressExtension) {
  21.         $this->layoutExtension $layoutExtension;
  22.     }
  23.     /**
  24.      * @Route("/download/asset", name="app_asset_download")
  25.      * @param Request $request
  26.      * @return StreamedResponse
  27.      */
  28.     public function downloadAction(Request $request)
  29.     {
  30.         $asset Asset::getById($request->get('id'));
  31.         if (!$asset instanceof Asset) {
  32.             throw new NotFoundHttpException('asset not found');
  33.         }
  34.         $stream $asset->getStream();
  35.         return new StreamedResponse(function () use ($stream) {
  36.             fpassthru($stream);
  37.         }, 200, [
  38.             'Content-Type' => $asset->getMimetype(),
  39.             'Content-Disposition' => sprintf('attachment; filename="%s"'$asset->getFilename()),
  40.             'Content-Length' => $asset->getFileSize(),
  41.             'X-Robots-Tag' => 'noindex'
  42.         ]);
  43.     }
  44.     /**
  45.      * @Route("/{_locale}/download/press/watchlist/all", name="download-watchlist-press-all")
  46.      * @param Request $request
  47.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse|AccessDeniedHttpException
  48.      */
  49.     public function downloadPressAllWatchlist(Request $request) {
  50.         if(!empty($request->getSession()->get('pressImageWishlistIds', [])) && !$this->layoutExtension->getMediaUser($request) && !\Pimcore::inDebugMode()) {
  51.             //if there are press images and the user is not logged in => download is not allowed
  52.             return new AccessDeniedHttpException('Log in to download press images');
  53.         }
  54.         $assets = [];
  55.         $language $request->getLocale();
  56.         $this->addDossiersToAssetsArray($assets$request$language);
  57.         $this->addArticlesToAssetsArray($assets$request$language);
  58.         $this->addMediaAlbumToAssetsArray($assets$request$language);
  59.         $this->addMediaAlbumItemsToAssetsArray($assets$request$language);
  60.         $this->addImagesToAssetsArray($assets$request$languagetrue);
  61.         $this->addMediaAssetsToAssetsArray($assets$request$language);
  62.         $md5 md5(serialize($assets));
  63.         $zipfile PIMCORE_PRIVATE_VAR '/press-all-watchlist-'.$md5.'.zip';
  64.         $this->createZipFile($zipfile$assets);
  65.         $filename 'watchlist.zip';
  66.         $fsPath $zipfile;
  67.         $response $this->file($fsPath$filename);
  68.         $response->headers->add([
  69.             'Expires' => '0',
  70.             'Cache-Control' => 'must-revalidate',
  71.             'Pragma' => 'public',
  72.             'X-Robots-Tag' => 'noindex'
  73.         ]);
  74.         $response->deleteFileAfterSend(true);
  75.         return $response;
  76.     }
  77.     /**
  78.      * @param Request $request
  79.      * @Route("/{_locale}/download/press/image/{assetId}", name="download-press-image")
  80.      */
  81.     public function downloadMediaImage(Request $request) {
  82.         if(!$this->layoutExtension->getMediaUser($request) && !\Pimcore::inDebugMode()) {
  83.             //if there are press images and the user is not logged in => download is not allowed
  84.             throw new AccessDeniedHttpException('Log in to download press images');
  85.         }
  86.         $asset Asset::getById($request->get('assetId'));
  87.         if(!$asset || !$asset->getMetadata('General.mediaArchive') || $asset->getMetadata('General.mediaArchive') != 1) {
  88.             throw new NotFoundHttpException('Media Image not found');
  89.         }
  90.         if($request->get('gdpr') and $request->get('gdpr') == 'checked') {
  91.             $stream $asset->getStream();
  92.             return new StreamedResponse(function () use ($stream) {
  93.                 fpassthru($stream);
  94.             }, 200, [
  95.                 'Content-Type' => $asset->getMimetype(),
  96.                 'Content-Disposition' => sprintf('attachment; filename="%s"'$asset->getFilename()),
  97.                 'Content-Length' => $asset->getFileSize(),
  98.                 'X-Robots-Tag' => 'noindex'
  99.             ]);
  100.         }
  101.         throw new AccessDeniedException('gdpr not accepted');
  102.     }
  103.     /**
  104.      * @param Request $request
  105.      * @Route("/{_locale}/download/press/video/{assetId}", name="download-press-video")
  106.      */
  107.     public function downloadMediaVideo(Request $request) {
  108.         $asset Asset::getById($request->get('assetId'));
  109.         if(!$asset || !$asset->getMetadata('General.mediaArchive') || $asset->getMetadata('General.mediaArchive') != 1) {
  110.             throw new NotFoundHttpException('Media video not found');
  111.         }
  112.         if($request->get('gdpr') and $request->get('gdpr') == 'checked') {
  113.             $stream $asset->getStream();
  114.             return new StreamedResponse(function () use ($stream) {
  115.                 fpassthru($stream);
  116.             }, 200, [
  117.                 'Content-Type' => $asset->getMimetype(),
  118.                 'Content-Disposition' => sprintf('attachment; filename="%s"'$asset->getFilename()),
  119.                 'Content-Length' => $asset->getFileSize(),
  120.                 'X-Robots-Tag' => 'noindex'
  121.             ]);
  122.         }
  123.         throw new AccessDeniedException('gdpr not accepted');
  124.     }
  125.     /**
  126.      * @Route("/{_locale}/download/press/watchlist/media-album", name="download-watchlist-media-album")
  127.      * @param Request $request
  128.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
  129.      */
  130.     public function downloadPressMediaAlbumWatchlist (Request $request) {
  131.         $assets = [];
  132.         $language $request->getLocale();
  133.         $this->addMediaAlbumToAssetsArray($assets$request$language);
  134.         $md5 md5(serialize($assets));
  135.         $zipfile PIMCORE_PRIVATE_VAR '/media-album-watchlist-'.$md5.'.zip';
  136.         $this->createZipFile($zipfile$assets);
  137.         $filename 'mediaAlbum.zip';
  138.         $fsPath $zipfile;
  139.         $response $this->file($fsPath$filename);
  140.         $response->headers->add([
  141.             'Expires' => '0',
  142.             'Cache-Control' => 'must-revalidate',
  143.             'Pragma' => 'public',
  144.             'X-Robots-Tag' => 'noindex'
  145.         ]);
  146.         $response->deleteFileAfterSend(true);
  147.         return $response;
  148.     }
  149.     /**
  150.      * @Route("/{_locale}/download/press/watchlist/media-album/items", name="download-watchlist-media-album-items")
  151.      * @param Request $request
  152.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
  153.      */
  154.     public function downloadPressMediaAlbumItemsWatchlist (Request $request) {
  155.         $assets = [];
  156.         $language $request->getLocale();
  157.         $this->addMediaAlbumItemsToAssetsArray($assets$request$language);
  158.         $md5 md5(serialize($assets));
  159.         $zipfile PIMCORE_PRIVATE_VAR '/media-album-watchlist-'.$md5.'.zip';
  160.         $this->createZipFile($zipfile$assets);
  161.         $filename 'mediaAlbum.zip';
  162.         $fsPath $zipfile;
  163.         $response $this->file($fsPath$filename);
  164.         $response->headers->add([
  165.             'Expires' => '0',
  166.             'Cache-Control' => 'must-revalidate',
  167.             'Pragma' => 'public',
  168.             'X-Robots-Tag' => 'noindex'
  169.         ]);
  170.         $response->deleteFileAfterSend(true);
  171.         return $response;
  172.     }
  173.     /**
  174.      * @Route("/{_locale}/download/press/watchlist/dossiers", name="download-watchlist-pressdossiers")
  175.      * @param Request $request
  176.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
  177.      */
  178.     public function downloadPressDossiersWatchlist(Request $request) {
  179.         $assets = [];
  180.         $language $request->getLocale();
  181.         $this->addDossiersToAssetsArray($assets$request$language);
  182.         $md5 md5(serialize($assets));
  183.         $zipfile PIMCORE_PRIVATE_VAR '/press-dossiers-watchlist-'.$md5.'.zip';
  184.         $this->createZipFile($zipfile$assets);
  185.         $filename 'dossiers.zip';
  186.         $fsPath $zipfile;
  187.         $response $this->file($fsPath$filename);
  188.         $response->headers->add([
  189.             'Expires' => '0',
  190.             'Cache-Control' => 'must-revalidate',
  191.             'Pragma' => 'public',
  192.             'X-Robots-Tag' => 'noindex'
  193.         ]);
  194.         $response->deleteFileAfterSend(true);
  195.         return $response;
  196.     }
  197.     /**
  198.      * @Route("/{_locale}/download/press/dossiers", name="download-pressdossiers")
  199.      * @param Request $request
  200.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
  201.      */
  202.     public function downloadPressDossiersById(Request $request) {
  203.         $assets = [];
  204.         $language $request->getLocale();
  205.         $dossier PressDossier::getById($request->get('id'));
  206.         if ($dossier) {
  207.             foreach ($dossier->getArticles() as $article) {
  208.                 $this->addArticle($assets$article$language);
  209.             }
  210.         }
  211.         $md5 md5(serialize($assets));
  212.         $zipfile PIMCORE_PRIVATE_VAR '/press-dossier-'.$md5.'.zip';
  213.         $this->createZipFile($zipfile$assets);
  214.         $filename 'dossier.zip';
  215.         $fsPath $zipfile;
  216.         $response $this->file($fsPath$filename);
  217.         $response->headers->add([
  218.             'Expires' => '0',
  219.             'Cache-Control' => 'must-revalidate',
  220.             'Pragma' => 'public',
  221.             'X-Robots-Tag' => 'noindex'
  222.         ]);
  223.         $response->deleteFileAfterSend(true);
  224.         return $response;
  225.     }
  226.     /**
  227.      * @Route("/{_locale}/download/press/watchlist/articles", name="download-watchlist-pressarticles")
  228.      * @param Request $request
  229.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
  230.      */
  231.     public function downloadPressArticlesWatchlist(Request $request)
  232.     {
  233.         $assets = [];
  234.         $language $request->getLocale();
  235.         $this->addArticlesToAssetsArray($assets$request$language);
  236.         $md5 md5(serialize($assets));
  237.         $zipfile PIMCORE_PRIVATE_VAR '/press-articles-watchlist-'.$md5.'.zip';
  238.         $this->createZipFile($zipfile$assets);
  239.         $filename 'articles.zip';
  240.         $fsPath $zipfile;
  241.         $response $this->file($fsPath$filename);
  242.         $response->headers->add([
  243.             'Expires' => '0',
  244.             'Cache-Control' => 'must-revalidate',
  245.             'Pragma' => 'public',
  246.             'X-Robots-Tag' => 'noindex'
  247.         ]);
  248.         $response->deleteFileAfterSend(true);
  249.         return $response;
  250.     }
  251.     /**
  252.      * @Route("/{_locale}/download/press/watchlist/images", name="download-watchlist-pressimages")
  253.      * @param Request $request
  254.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
  255.      */
  256.     public function downloadPressImagesWatchlist(Request $request)
  257.     {
  258.         if(!empty($request->getSession()->get('pressImageWishlistIds', [])) && !$this->layoutExtension->getMediaUser($request) && !\Pimcore::inDebugMode()) {
  259.             //if there are press images and the user is not logged in => download is not allowed
  260.             return new AccessDeniedHttpException('Log in to download press images');
  261.         }
  262.         $assets = [];
  263.         $language $request->getLocale();
  264.         $this->addImagesToAssetsArray($assets$request$language);
  265.         $md5 md5(serialize($assets));
  266.         $zipfile PIMCORE_PRIVATE_VAR '/press-images-watchlist-'.$md5.'.zip';
  267.         $this->createZipFile($zipfile$assets);
  268.         $filename 'images.zip';
  269.         $fsPath $zipfile;
  270.         $response $this->file($fsPath$filename);
  271.         $response->headers->add([
  272.             'Expires' => '0',
  273.             'Cache-Control' => 'must-revalidate',
  274.             'Pragma' => 'public',
  275.             'X-Robots-Tag' => 'noindex'
  276.         ]);
  277.         $response->deleteFileAfterSend(true);
  278.         return $response;
  279.     }
  280.     /**
  281.      * @Route("/{_locale}/download/press/media-album", name="download-media-album")
  282.      * @param Request $request
  283.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
  284.      */
  285.     public function downloadMediaAlbum(Request $request)
  286.     {
  287.         $mediaAlbum MediaAlbum::getById($request->get('id'));
  288.         if(!$mediaAlbum) {
  289.             throw new NotFoundHttpException('Media Album not found');
  290.         }
  291.         $assets = [];
  292.         $language $request->getLocale();
  293.         $this->addMediaAlbumToArray($mediaAlbum->getAlbumItems(), $assets$mediaAlbum->getTitle($language));
  294.         $md5 md5(serialize($assets));
  295.         $zipfile PIMCORE_PRIVATE_VAR '/press-media-album-'.$md5.'.zip';
  296.         $this->createZipFile($zipfile$assets);
  297.         $filename = ($mediaAlbum->getTitle($language) ?? 'media-album' $mediaAlbum->getId()) . '.zip';
  298.         $fsPath $zipfile;
  299.         $response $this->file($fsPath$filename);
  300.         $response->headers->add([
  301.             'Expires' => '0',
  302.             'Cache-Control' => 'must-revalidate',
  303.             'Pragma' => 'public',
  304.             'X-Robots-Tag' => 'noindex'
  305.         ]);
  306.         $response->deleteFileAfterSend(true);
  307.         return $response;
  308.     }
  309.     /**
  310.      * @Route("/{_locale}/download/press/watchlist/media-assets", name="download-watchlist-media-assets")
  311.      * @param Request $request
  312.      * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
  313.      */
  314.     public function downloadPressMediaAssetsWatchlist(Request $request)
  315.     {
  316.         if(!empty($request->getSession()->get('pressMediaAssetsWishlistIds', [])) && !$this->layoutExtension->getMediaUser($request) && !\Pimcore::inDebugMode()) {
  317.             //if there are press images and the user is not logged in => download is not allowed
  318.             return new AccessDeniedHttpException('Log in to download press images');
  319.         }
  320.         $assets = [];
  321.         $language $request->getLocale();
  322.         $this->addMediaAssetsToAssetsArray($assets$request$language);
  323.         $md5 md5(serialize($assets));
  324.         $zipfile PIMCORE_PRIVATE_VAR '/press-media-assets-watchlist-'.$md5.'.zip';
  325.         $this->createZipFile($zipfile$assets);
  326.         $filename 'media-assets.zip';
  327.         $fsPath $zipfile;
  328.         $response $this->file($fsPath$filename);
  329.         $response->headers->add([
  330.             'Expires' => '0',
  331.             'Cache-Control' => 'must-revalidate',
  332.             'Pragma' => 'public',
  333.             'X-Robots-Tag' => 'noindex'
  334.         ]);
  335.         $response->deleteFileAfterSend(true);
  336.         return $response;
  337.     }
  338.     private function createZipFile($zipfile$assets) {
  339.         #zip it
  340.         $zip = new \ZipArchive();
  341.         if(file_exists($zipfile)) { unlink($zipfile); }
  342.         $zip->open($zipfile\ZipArchive::CREATE);
  343.         $createdStructure = [];
  344.         #only two subdirs supported atm
  345.         foreach ($assets as $dir1 => $file1) {
  346.             if (is_array($file1)) {
  347.                 if (!in_array($dir1$createdStructure)) {
  348.                     $zip->addEmptyDir($dir1);
  349.                     $createdStructure[] = $dir1;
  350.                 }
  351.                 foreach ($file1 as $dir2 => $file2) {
  352.                     if (is_array($file2)) {
  353.                         if (!in_array($dir1 '/' $dir2$createdStructure)) {
  354.                             $zip->addEmptyDir($dir1 '/' $dir2);
  355.                             $createdStructure[] = $dir1 '/' $dir2;
  356.                         }
  357.                         foreach ($file2 as $dir3 => $file3) {
  358.                             if (!is_array($file3) && file_exists($file3)) {
  359.                                 $zip->addFile(urldecode($file3), $dir1 '/' $dir2 '/' basename($dir3));
  360.                             }
  361.                         }
  362.                     } else {
  363.                         if(file_exists($file2)) {
  364.                             $zip->addFile(urldecode($file2), $dir1 '/' basename($dir2));
  365.                         }
  366.                     }
  367.                 }
  368.             } else {
  369.                 if(file_exists($file1)) {
  370.                     $zip->addFile(urldecode($file1), basename($dir1));
  371.                 }
  372.             }
  373.         }
  374.         $zip->close();
  375.         return $zip;
  376.     }
  377.     private function getPressArticlesFromCache(Request $request) : array {
  378.         $pressArticles = [];
  379.         $pressArticleIds $request->getSession()->get('pressArticleWishlistIds', []);
  380.         if(!empty($pressArticleIds)) {
  381.             foreach ($pressArticleIds as $id) {
  382.                 if($pressArticle PressArticle::getById($id)) {
  383.                     $pressArticles[] = $pressArticle;
  384.                 }
  385.             }
  386.         }
  387.         return $pressArticles;
  388.     }
  389.     private function getPressDossiersFromCache(Request $request) {
  390.         $pressDossiers = [];
  391.         $pressDossiersIds $request->getSession()->get('pressDossierWishlistIds', []);
  392.         if(!empty($pressDossiersIds)) {
  393.             foreach ($pressDossiersIds as $id) {
  394.                 if($pressDossier PressDossier::getById($id)) {
  395.                     $pressDossiers[] = $pressDossier;
  396.                 }
  397.             }
  398.         }
  399.         return $pressDossiers;
  400.     }
  401.     private function getPressMediaAlbumsFromCache(Request $request) {
  402.         $pressMediaAlbums = [];
  403.         $mediaAlbumIds $request->getSession()->get('pressAlbumWishlistIds', []);
  404.         if(!empty($mediaAlbumIds)) {
  405.             foreach ($mediaAlbumIds as $id) {
  406.                 if($mediaAlbum MediaAlbum::getById($id)) {
  407.                     $pressMediaAlbums[] = $mediaAlbum;
  408.                 }
  409.             }
  410.         }
  411.         return $pressMediaAlbums;
  412.     }
  413.     private function getPressMediaAlbumItemsFromCache(Request $request) {
  414.         $pressMediaAlbumItems = [];
  415.         $mediaAlbumItemsIds $request->getSession()->get('pressAlbumItemsWishlistIds', []);
  416.         if(!empty($mediaAlbumItemsIds)) {
  417.             foreach ($mediaAlbumItemsIds as $id) {
  418.                 if($mediaAlbum Asset::getById($id)) {
  419.                     $pressMediaAlbumItems[] = $mediaAlbum;
  420.                 }
  421.             }
  422.         }
  423.         return $pressMediaAlbumItems;
  424.     }
  425.     private function getPressMediaAssetsFromCache(Request $request) {
  426.         $pressMediaAssets = [];
  427.         $mediaAssetsIds $request->getSession()->get('pressMediaAssetsWishlistIds', []);
  428.         if(!empty($mediaAssetsIds)) {
  429.             foreach ($mediaAssetsIds as $id) {
  430.                 if(($mediaAsset MediaAsset::getById($id)) && $mediaAsset->getAsset()) {
  431.                     $pressMediaAssets[] = $mediaAsset->getAsset();
  432.                 }
  433.             }
  434.         }
  435.         return $pressMediaAssets;
  436.     }
  437.     private function addArticle( array &$assetsPressArticle $pressArticlestring $language) {
  438.         //prepares data (images, articles,...) from the PressArticle for the ZIP-download including the correct folder structure
  439.         $articleAssets = [];
  440.         if($pressArticle->getArticleDocument($language)) {
  441.             $articleAssets[$pressArticle->getId() . '-'basename($pressArticle->getArticleDocument($language)->getFullPath())] = $pressArticle->getArticleDocument($language)->getLocalFile();
  442.         }
  443.         foreach($pressArticle->getDocuments() as $document) {
  444.             if($document instanceof \Pimcore\Model\Asset\Video) {
  445.                 $articleAssets['videos'][$document->getId() . '-'  basename($document->getFullPath())] = $document->getLocalFile();
  446.             } elseif($document instanceof \Pimcore\Model\Asset) {
  447.                 $articleAssets['documents'][$document->getId() . '-'  .basename($document->getFullPath())] = $document->getLocalFile();
  448.             }
  449.         }
  450.         $assets[$pressArticle->getId() . '-' $pressArticle->getKey()] = $articleAssets;
  451.     }
  452.     private function addDossiersToAssetsArray(array &$assetsRequest $requeststring $language) {
  453.         $pressDossiers $this->getPressDossiersFromCache($request);
  454.         if(!empty($pressDossiers)) {
  455.             foreach ($pressDossiers as $dossier) {
  456.                 if ($dossier instanceof PressDossier) {
  457.                     if($this->pressExtension->isDownloadableDossier($dossier$this->layoutExtension->getMediaUser($request))) {
  458.                         foreach ($dossier->getArticles() as $article) {
  459.                                 $this->addArticle($assets$article$language);
  460.                             }
  461.                     }
  462.                 }
  463.             }
  464.         }
  465.     }
  466.     private function addMediaAlbumToAssetsArray(array &$assetsRequest $requeststring $language) {
  467.         $mediaAlbums $this->getPressMediaAlbumsFromCache($request);
  468.         if(!empty($mediaAlbums)) {
  469.             foreach ($mediaAlbums as $mediaAlbum) {
  470.                 if ($mediaAlbum instanceof MediaAlbum) {
  471.                     $this->addMediaAlbumToArray($mediaAlbum->getAlbumItems(), $assets$mediaAlbum->getTitle($language));
  472.                 }
  473.             }
  474.         }
  475.     }
  476.     private function addMediaAlbumItemsToAssetsArray(array &$assetsRequest $requeststring $language) {
  477.         $mediaAlbumItems $this->getPressMediaAlbumItemsFromCache($request);
  478.         if(!empty($mediaAlbumItems)) {
  479.             $this->addMediaAlbumToArray($mediaAlbumItems$assets'single media album assets');
  480.         }
  481.     }
  482.     private function addMediaAssetsToAssetsArray(array &$assetsRequest $requeststring $language) {
  483.         $mediaAssets $this->getPressMediaAssetsFromCache($request);
  484.         if(!empty($mediaAssets)) {
  485.             $this->addMediaAlbumToArray($mediaAssets$assets'media assets');
  486.         }
  487.     }
  488.     private function addArticlesToAssetsArray(array &$assetsRequest $requeststring $language) {
  489.         $pressArticles $this->getPressArticlesFromCache($request);
  490.         if(!empty($pressArticles)) {
  491.             foreach ($pressArticles as $pressArticle) {
  492.                 if($pressArticle instanceof PressArticle && $this->pressExtension->isDownloadableArticle($pressArticle$this->layoutExtension->getMediaUser($request))) {
  493.                     $this->addArticle($assets$pressArticle$language);
  494.                 }
  495.             }
  496.         }
  497.     }
  498.     private function addImagesToAssetsArray(array &$assetsRequest $requeststring $languagebool $imagesInFolder false) {
  499.         $images $request->getSession()->get('pressImageWishlistIds', []);
  500.         if(!empty($images)) {
  501.             foreach ($images as $imageId) {
  502.                 if(($asset Asset::getById($imageId)) && $asset->getMetadata('General.mediaArchive') && $asset->getMetadata('General.mediaArchive') == &&
  503.                     $this->pressExtension->isDownloadableAsset($asset$this->layoutExtension->getMediaUser($request))) {
  504.                     if($imagesInFolder) {
  505.                         $assets['images'][$asset->getId() . '-' $asset->getKey()] = $asset->getLocalFile();
  506.                     } else {
  507.                         $assets[$asset->getId() . '-' $asset->getKey()] =  $asset->getLocalFile();
  508.                     }
  509.                 }
  510.             }
  511.         }
  512.     }
  513.     private function addMediaAlbumToArray(array $albumItems, array &$downloadAssetsstring $albumName) {
  514.         foreach ($albumItems as $item) {
  515.             if($item instanceof Asset\Image) {
  516.                 $downloadAssets[$albumName][$item->getId() . '-' $item->getKey()] =  $item->getLocalFile();
  517.             } elseif($item instanceof Asset\Video) {
  518.                 $downloadAssets[$albumName][$item->getId() . '-' $item->getKey()] =  $item->getLocalFile();
  519.             } elseif($item instanceof Asset\Folder) {
  520.                 $this->addMediaAlbumToArray($item->getChildren(), $downloadAssets$albumName);
  521.             } elseif($item instanceof Asset) {
  522.                 $downloadAssets[$albumName][$item->getId() . '-' $item->getKey()] =  $item->getLocalFile();
  523.             }
  524.         }
  525.     }
  526. }