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 %}