2016-11-09 18:57:02 +01:00
|
|
|
<?php
|
|
|
|
|
2017-11-11 14:01:21 +01:00
|
|
|
namespace Shaarli;
|
|
|
|
|
|
|
|
use Shaarli\Config\ConfigManager;
|
|
|
|
use WebThumbnailer\Exception\WebThumbnailerException;
|
2016-11-09 18:57:02 +01:00
|
|
|
use WebThumbnailer\WebThumbnailer;
|
2017-11-11 14:01:21 +01:00
|
|
|
use WebThumbnailer\Application\ConfigManager as WTConfigManager;
|
2016-11-09 18:57:02 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Class Thumbnailer
|
|
|
|
*
|
|
|
|
* Utility class used to retrieve thumbnails using web-thumbnailer dependency.
|
|
|
|
*/
|
|
|
|
class Thumbnailer
|
|
|
|
{
|
2018-07-05 20:29:55 +02:00
|
|
|
const COMMON_MEDIA_DOMAINS = [
|
|
|
|
'imgur.com',
|
|
|
|
'flickr.com',
|
|
|
|
'youtube.com',
|
|
|
|
'wikimedia.org',
|
|
|
|
'redd.it',
|
|
|
|
'gfycat.com',
|
|
|
|
'media.giphy.com',
|
|
|
|
'twitter.com',
|
|
|
|
'twimg.com',
|
|
|
|
'instagram.com',
|
|
|
|
'pinterest.com',
|
|
|
|
'pinterest.fr',
|
|
|
|
'tumblr.com',
|
|
|
|
'deviantart.com',
|
|
|
|
];
|
|
|
|
|
|
|
|
const MODE_ALL = 'all';
|
|
|
|
const MODE_COMMON = 'common';
|
|
|
|
const MODE_NONE = 'none';
|
|
|
|
|
2016-11-09 18:57:02 +01:00
|
|
|
/**
|
|
|
|
* @var WebThumbnailer instance.
|
|
|
|
*/
|
|
|
|
protected $wt;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var ConfigManager instance.
|
|
|
|
*/
|
|
|
|
protected $conf;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Thumbnailer constructor.
|
|
|
|
*
|
|
|
|
* @param ConfigManager $conf instance.
|
|
|
|
*/
|
|
|
|
public function __construct($conf)
|
|
|
|
{
|
|
|
|
$this->conf = $conf;
|
2018-04-06 18:21:47 +02:00
|
|
|
|
|
|
|
if (! $this->checkRequirements()) {
|
|
|
|
$this->conf->set('thumbnails.enabled', false);
|
|
|
|
$this->conf->write(true);
|
|
|
|
// TODO: create a proper error handling system able to catch exceptions...
|
2018-10-13 01:40:04 +02:00
|
|
|
die(t(
|
|
|
|
'php-gd extension must be loaded to use thumbnails. '
|
|
|
|
.'Thumbnails are now disabled. Please reload the page.'
|
|
|
|
));
|
2018-04-06 18:21:47 +02:00
|
|
|
}
|
|
|
|
|
2016-11-09 18:57:02 +01:00
|
|
|
$this->wt = new WebThumbnailer();
|
2017-11-11 14:01:21 +01:00
|
|
|
WTConfigManager::addFile('inc/web-thumbnailer.json');
|
2016-11-09 18:57:02 +01:00
|
|
|
$this->wt->maxWidth($this->conf->get('thumbnails.width'))
|
|
|
|
->maxHeight($this->conf->get('thumbnails.height'))
|
|
|
|
->crop(true)
|
|
|
|
->debug($this->conf->get('dev.debug', false));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve a thumbnail for given URL
|
|
|
|
*
|
|
|
|
* @param string $url where to look for a thumbnail.
|
|
|
|
*
|
|
|
|
* @return bool|string The thumbnail relative cache file path, or false if none has been found.
|
|
|
|
*/
|
|
|
|
public function get($url)
|
|
|
|
{
|
2018-07-05 20:29:55 +02:00
|
|
|
if ($this->conf->get('thumbnails.mode') === self::MODE_COMMON
|
|
|
|
&& ! $this->isCommonMediaOrImage($url)
|
|
|
|
) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-11 14:01:21 +01:00
|
|
|
try {
|
|
|
|
return $this->wt->thumbnail($url);
|
|
|
|
} catch (WebThumbnailerException $e) {
|
|
|
|
// Exceptions are only thrown in debug mode.
|
2018-07-05 20:29:55 +02:00
|
|
|
error_log(get_class($e) . ': ' . $e->getMessage());
|
2017-11-11 14:01:21 +01:00
|
|
|
}
|
2018-07-05 20:29:55 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* We check weather the given URL is from a common media domain,
|
|
|
|
* or if the file extension is an image.
|
|
|
|
*
|
|
|
|
* @param string $url to check
|
|
|
|
*
|
|
|
|
* @return bool true if it's an image or from a common media domain, false otherwise.
|
|
|
|
*/
|
|
|
|
public function isCommonMediaOrImage($url)
|
|
|
|
{
|
|
|
|
foreach (self::COMMON_MEDIA_DOMAINS as $domain) {
|
|
|
|
if (strpos($url, $domain) !== false) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (endsWith($url, '.jpg') || endsWith($url, '.png') || endsWith($url, '.jpeg')) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2016-11-09 18:57:02 +01:00
|
|
|
}
|
2018-04-06 18:21:47 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Make sure that requirements are match to use thumbnails:
|
|
|
|
* - php-gd is loaded
|
|
|
|
*/
|
|
|
|
protected function checkRequirements()
|
|
|
|
{
|
|
|
|
return extension_loaded('gd');
|
|
|
|
}
|
2016-11-09 18:57:02 +01:00
|
|
|
}
|