From 523b82b5ae18f0eb21ed02f75726fc528e66491b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Burnichon?= Date: Tue, 12 Jan 2016 17:53:09 +0100 Subject: [PATCH] Change on embed bundle handling --- composer.json | 4 +- composer.lock | 24 ++++---- lib/Alchemy/Phrasea/Application.php | 23 ++++++-- .../Controller/MediaAccessorController.php | 48 ++++++++++++---- .../Controller/PermalinkController.php | 7 +++ .../Controller/Prod/ShareController.php | 34 ++---------- .../Phrasea/Media/DatafilesResolver.php | 51 +++++++++++++++++ .../Phrasea/Media/MediaAccessorResolver.php | 55 +++++++++++++++++++ .../Phrasea/Media/PermalinkMediaResolver.php | 52 ++++++++++++++++++ templates/mobile/common/thumbnail.html.twig | 12 ++-- templates/web/common/thumbnail.html.twig | 6 +- templates/web/overview.html.twig | 4 +- 12 files changed, 249 insertions(+), 71 deletions(-) create mode 100644 lib/Alchemy/Phrasea/Media/DatafilesResolver.php create mode 100644 lib/Alchemy/Phrasea/Media/MediaAccessorResolver.php create mode 100644 lib/Alchemy/Phrasea/Media/PermalinkMediaResolver.php diff --git a/composer.json b/composer.json index ec712af4dc..d5adf19ed8 100644 --- a/composer.json +++ b/composer.json @@ -28,13 +28,13 @@ }, { "type": "vcs", - "url": "https://github.com/alchemy-fr/embed-bundle.git" + "url": "https://github.com/bburnichon/embed-bundle.git" } ], "require": { "php": ">=5.5", "alchemy-fr/tcpdf-clone": "~6.0", - "alchemy/embed-bundle": "~0.1.0", + "alchemy/embed-bundle": "dev-OpenEmbed@dev", "alchemy/geonames-api-consumer": "~0.1.0", "alchemy/google-plus-api-client": "~0.6.2", "alchemy/mediavorus": "^0.4.4", diff --git a/composer.lock b/composer.lock index ec3e96f445..5967c8d21f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "32865d9f1fb5a0d8ead56364bc5db5c7", - "content-hash": "1212545fbe0ee56e58d31f099da0e819", + "hash": "cddd55809cd44a4f9d87bfd47079e793", + "content-hash": "e92d5f3befc203c4ce18b110e83123f0", "packages": [ { "name": "alchemy-fr/tcpdf-clone", @@ -122,16 +122,16 @@ }, { "name": "alchemy/embed-bundle", - "version": "v0.1.1", + "version": "dev-OpenEmbed", "source": { "type": "git", - "url": "https://github.com/alchemy-fr/embed-bundle.git", - "reference": "422f4835a812d916e6ae81bfb842dad10a0f3a2a" + "url": "https://github.com/bburnichon/embed-bundle.git", + "reference": "859f19891a794fee4ed81bc4b55e9fb2d19e6a48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/alchemy-fr/embed-bundle/zipball/422f4835a812d916e6ae81bfb842dad10a0f3a2a", - "reference": "422f4835a812d916e6ae81bfb842dad10a0f3a2a", + "url": "https://api.github.com/repos/bburnichon/embed-bundle/zipball/859f19891a794fee4ed81bc4b55e9fb2d19e6a48", + "reference": "859f19891a794fee4ed81bc4b55e9fb2d19e6a48", "shasum": "" }, "require-dev": { @@ -169,10 +169,9 @@ ], "description": "Embed resources bundle", "support": { - "source": "https://github.com/alchemy-fr/embed-bundle/tree/v0.1.1", - "issues": "https://github.com/alchemy-fr/embed-bundle/issues" + "source": "https://github.com/bburnichon/embed-bundle/tree/OpenEmbed" }, - "time": "2016-01-06 17:34:21" + "time": "2016-01-12 16:51:22" }, { "name": "alchemy/geonames-api-consumer", @@ -2583,7 +2582,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Stream/zipball/011ab91d942f1d7096deade4c8a10fe57d51c5b3", + "url": "https://api.github.com/repos/hoaproject/Stream/zipball/3bc446bc00849bf51166adc415d77aa375d48d8c", "reference": "011ab91d942f1d7096deade4c8a10fe57d51c5b3", "shasum": "" }, @@ -4440,7 +4439,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/8ea5840ad835444627de70a706aabd8c9aa41df8", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9835fc4f8463c944bdc2617cbbdb6b688ca17944", "reference": "a6a3d39d1f68e3e04555a2d6b43a9df0977d96d9", "shasum": "" }, @@ -6474,6 +6473,7 @@ ], "minimum-stability": "stable", "stability-flags": { + "alchemy/embed-bundle": 20, "alchemy/rest-bundle": 20, "alchemy/task-manager": 20, "goodby/csv": 20, diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index ca9d5a993b..e5ba94f2d6 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -18,7 +18,6 @@ use Alchemy\Phrasea\Application\Helper\AclAware; use Alchemy\Phrasea\Application\Helper\ApplicationBoxAware; use Alchemy\Phrasea\Application\Helper\AuthenticatorAware; use Alchemy\Phrasea\Authorization\AuthorizationServiceProvider; -use Alchemy\Phrasea\Cache\Factory; use Alchemy\Phrasea\Cache\Manager; use Alchemy\Phrasea\Core\Event\Subscriber\BasketSubscriber; use Alchemy\Phrasea\Core\Event\Subscriber\BridgeSubscriber; @@ -75,6 +74,8 @@ use Alchemy\Phrasea\Core\Provider\UnicodeServiceProvider; use Alchemy\Phrasea\Core\Provider\ZippyServiceProvider; use Alchemy\Phrasea\Exception\InvalidArgumentException; use Alchemy\Phrasea\Form\Extension\HelpTypeExtension; +use Alchemy\Phrasea\Media\MediaAccessorResolver; +use Alchemy\Phrasea\Media\PermalinkMediaResolver; use Alchemy\Phrasea\Model\Entities\User; use Alchemy\Phrasea\Twig\BytesConverter; use Alchemy\Phrasea\Twig\Camelize; @@ -93,11 +94,8 @@ use MediaAlchemyst\MediaAlchemystServiceProvider; use MediaVorus\Media\MediaInterface; use MediaVorus\MediaVorus; use MediaVorus\MediaVorusServiceProvider; -use Monolog\Handler\NullHandler; use Monolog\Handler\RotatingFileHandler; -use Monolog\Handler\SyslogHandler; use Monolog\Logger; -use Monolog\Processor\IntrospectionProcessor; use MP4Box\MP4BoxServiceProvider; use Neutron\ReCaptcha\ReCaptchaServiceProvider; use Neutron\Silex\Provider\FilesystemServiceProvider; @@ -372,11 +370,25 @@ class Application extends SilexApplication 'Alchemy\Phrasea\ControllerProvider\User\Notifications' => [], 'Alchemy\Phrasea\ControllerProvider\User\Preferences' => [], 'Alchemy\EmbedProvider\EmbedServiceProvider' => [], - 'Alchemy\EmbedProvider\OembedServiceProvider' => [], ]; foreach ($providers as $class => $values) { $this->register(new $class, $values); } + + $resolvers = $this['alchemy_embed.resource_resolvers']; + $resolvers['datafiles'] = $resolvers->share(function () { + return new DatafilesResolver($this->getApplicationBox(), $this['url_generator']); + }); + $resolvers['permalinks_permalink'] = $resolvers->share(function () { + return new PermalinkMediaResolver($this->getApplicationBox(), $this['url_generator']); + }); + $resolvers['media_accessor'] = $resolvers->share(function () { + return new MediaAccessorResolver( + $this->getApplicationBox(), + $this['url_generator'], + $this['controller.media_accessor'] + ); + }); } /** @@ -695,7 +707,6 @@ class Application extends SilexApplication '/developers/' => 'Alchemy\Phrasea\ControllerProvider\Root\Developers', '/download/' => 'Alchemy\Phrasea\ControllerProvider\Prod\DoDownload', '/embed/' => 'Alchemy\EmbedProvider\EmbedServiceProvider', - '/oembed/' => 'Alchemy\EmbedProvider\OembedServiceProvider', '/feeds/' => 'Alchemy\Phrasea\ControllerProvider\Root\RSSFeeds', '/include/minify' => 'Alchemy\Phrasea\ControllerProvider\Minifier', '/login/' => 'Alchemy\Phrasea\ControllerProvider\Root\Login', diff --git a/lib/Alchemy/Phrasea/Controller/MediaAccessorController.php b/lib/Alchemy/Phrasea/Controller/MediaAccessorController.php index 43f105685c..6ca16d9491 100644 --- a/lib/Alchemy/Phrasea/Controller/MediaAccessorController.php +++ b/lib/Alchemy/Phrasea/Controller/MediaAccessorController.php @@ -52,18 +52,7 @@ class MediaAccessorController extends Controller public function showAction(Request $request, $token) { - try { - $token = JWT::decode($token, $this->keyStorage, $this->allowedAlgorithms); - } catch (\UnexpectedValueException $exception) { - throw new NotFoundHttpException('Resource not found', $exception); - } catch (\Exception $exception) { - throw new BadRequestHttpException('Invalid token', $exception); - } - - if (! isset($token->sdef) || !is_array($token->sdef) || count($token->sdef) !== 3) { - throw new BadRequestHttpException('sdef should be a sub-definition identifier.'); - } - list ($sbas_id, $record_id, $subdef) = $token->sdef; + list($sbas_id, $record_id, $subdef) = $this->validateToken($token); try { $databox = $this->findDataboxById($sbas_id); @@ -93,4 +82,39 @@ class MediaAccessorController extends Controller return $response; } + + /** + * @param string $token + * @return object + */ + public function decodeToken($token) + { + try { + return JWT::decode($token, $this->keyStorage, $this->allowedAlgorithms); + } catch (\UnexpectedValueException $exception) { + throw new NotFoundHttpException('Resource not found', $exception); + } catch (\Exception $exception) { + throw new BadRequestHttpException('Invalid token', $exception); + } + } + + /** + * Validate token and returns triplet containing sbas_id, record_id and subdef. + * + * @param string|object $token + * @return array + */ + public function validateToken($token) + { + if (is_string($token)) { + $token = $this->decodeToken($token); + } + + if (!isset($token->sdef) || !is_array($token->sdef) || count($token->sdef) !== 3) { + throw new BadRequestHttpException('sdef should be a sub-definition identifier.'); + } + list ($sbas_id, $record_id, $subdef) = $token->sdef; + + return array($sbas_id, $record_id, $subdef); + } } diff --git a/lib/Alchemy/Phrasea/Controller/PermalinkController.php b/lib/Alchemy/Phrasea/Controller/PermalinkController.php index 985422f94e..e636f853b3 100644 --- a/lib/Alchemy/Phrasea/Controller/PermalinkController.php +++ b/lib/Alchemy/Phrasea/Controller/PermalinkController.php @@ -86,6 +86,13 @@ class PermalinkController extends AbstractDelivery 'view' => 'overview', 'token' => $token, 'record' => $record, + 'recordUrl' => $this->app->url('permalinks_permalink', [ + 'sbas_id' => $sbas_id, + 'record_id' => $record_id, + 'subdef' => $subdefName, + 'label' => $record->get_title(), + 'token' => $token, + ]) ]); } diff --git a/lib/Alchemy/Phrasea/Controller/Prod/ShareController.php b/lib/Alchemy/Phrasea/Controller/Prod/ShareController.php index 207d64f4d5..85df3351cf 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/ShareController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/ShareController.php @@ -41,35 +41,13 @@ class ShareController extends Controller $preview = $record->get_preview(); - if ($preview->get_permalink() !== null) { + if (null !== $previewLink = $preview->get_permalink()) { + $permalinkUrl = $previewLink->get_url(); + $permaviewUrl = $previewLink->get_page(); + $previewWidth = $preview->get_width(); + $previewHeight = $preview->get_height(); - - $subdefName = $preview->get_name(); - $subdef = $record->get_subdef($subdefName); - - switch ($record->getType()) { - - case 'flexpaper': - case 'document': - case 'audio': - case 'video': - default: - $token = $preview->get_permalink()->get_token(); - $permalinkUrl = $preview->get_permalink()->get_url(); - $permaviewUrl = $preview->get_permalink()->get_page(); - $previewWidth = $preview->get_width(); - $previewHeight = $preview->get_height(); - break; - } - - - $sbas_id = $record->getDataboxId(); - $embedUrl = $this->app->url('alchemy_embed_view', [ - 'sbas_id' => $sbas_id, - 'record_id' => $record_id, - 'subdefName' => $subdefName, - 'token' => $token, - ]); + $embedUrl = $this->app->url('alchemy_embed_view', ['url' => (string)$permalinkUrl]); $outputVars = [ 'isAvailable' => true, diff --git a/lib/Alchemy/Phrasea/Media/DatafilesResolver.php b/lib/Alchemy/Phrasea/Media/DatafilesResolver.php new file mode 100644 index 0000000000..f117b5e176 --- /dev/null +++ b/lib/Alchemy/Phrasea/Media/DatafilesResolver.php @@ -0,0 +1,51 @@ +appbox = $appbox; + $this->urlGenerator = $urlGenerator; + } + + public function resolve(Request $request, $routeName, array $routeParameters) + { + $parameters = array_replace( + $request->query->all(), + array_intersect_key($routeParameters, [ + 'sbas_id' => null, + 'record_id' => null, + 'subdef' => null, + ]) + ); + + $databox = $this->appbox->get_databox((int) $parameters['sbas_id']); + $record = $databox->get_record((int)$parameters['record_id']); + $subdef = $record->get_subdef($parameters['subdef']); + + $urlGenerator = $this->urlGenerator; + $url = $urlGenerator->generate($routeName, $parameters, $urlGenerator::ABSOLUTE_URL); + $embedUrl = $urlGenerator->generate('alchemy_embed_view', ['url' => $url], $urlGenerator::ABSOLUTE_URL); + + return new MediaInformation($subdef, $url, $embedUrl); + } +} diff --git a/lib/Alchemy/Phrasea/Media/MediaAccessorResolver.php b/lib/Alchemy/Phrasea/Media/MediaAccessorResolver.php new file mode 100644 index 0000000000..2be28d0cc1 --- /dev/null +++ b/lib/Alchemy/Phrasea/Media/MediaAccessorResolver.php @@ -0,0 +1,55 @@ +appbox = $appbox; + $this->urlGenerator = $urlGenerator; + $this->controller = $controller; + } + + public function resolve(Request $request, $routeName, array $routeParameters) + { + $parameters = array_replace( + $request->query->all(), + array_intersect_key($routeParameters, [ + 'token' => null, + ]) + ); + + list ($sbas_id, $record_id, $subdefName) = $this->controller->validateToken($parameters['token']); + + $databox = $this->appbox->get_databox($sbas_id); + $record = $databox->get_record($record_id); + $subdef = $record->get_subdef($subdefName); + + $urlGenerator = $this->urlGenerator; + $url = $urlGenerator->generate($routeName, $parameters, $urlGenerator::ABSOLUTE_URL); + $embedUrl = $urlGenerator->generate('alchemy_embed_view', ['url' => $url], $urlGenerator::ABSOLUTE_URL); + + return new MediaInformation($subdef, $url, $embedUrl); + } +} diff --git a/lib/Alchemy/Phrasea/Media/PermalinkMediaResolver.php b/lib/Alchemy/Phrasea/Media/PermalinkMediaResolver.php new file mode 100644 index 0000000000..9bf16522c3 --- /dev/null +++ b/lib/Alchemy/Phrasea/Media/PermalinkMediaResolver.php @@ -0,0 +1,52 @@ +appbox = $appbox; + $this->urlGenerator = $urlGenerator; + } + + public function resolve(Request $request, $routeName, array $routeParameters) + { + $parameters = array_replace( + $request->query->all(), + array_intersect_key($routeParameters, [ + 'sbas_id' => null, + 'record_id' => null, + 'subdef' => null, + 'label' => null, + ]) + ); + + $databox = $this->appbox->get_databox((int) $parameters['sbas_id']); + $record = $databox->get_record((int)$parameters['record_id']); + $subdef = $record->get_subdef($parameters['subdef']); + + $urlGenerator = $this->urlGenerator; + $url = $urlGenerator->generate($routeName, $parameters, $urlGenerator::ABSOLUTE_URL); + $embedUrl = $urlGenerator->generate('alchemy_embed_view', ['url' => $url], $urlGenerator::ABSOLUTE_URL); + + return new MediaInformation($subdef, $url, $embedUrl); + } +} diff --git a/templates/mobile/common/thumbnail.html.twig b/templates/mobile/common/thumbnail.html.twig index bc71a69510..c8211566c1 100644 --- a/templates/mobile/common/thumbnail.html.twig +++ b/templates/mobile/common/thumbnail.html.twig @@ -33,15 +33,15 @@ {% if record_type == 'VIDEO_MP4' or record_type == 'VIDEO_FLV' %} {% elseif record_type == 'FLEXPAPER' %} {% elseif record_type == 'AUDIO_MP3' %} {% else %} {% elseif record_type == 'FLEXPAPER' %} {% elseif record_type == 'AUDIO_MP3' %} {% else %} {% elseif record_type == 'FLEXPAPER' %} {% elseif record_type == 'AUDIO_MP3' %} {% else %} {% set fit_size = fitIn( diff --git a/templates/web/overview.html.twig b/templates/web/overview.html.twig index 2fbb4fdec2..f87bf0af61 100644 --- a/templates/web/overview.html.twig +++ b/templates/web/overview.html.twig @@ -19,11 +19,11 @@ {% block content %}
-

{{ record.get_title() }}

+

{{ local_title }}