mirror of
https://github.com/ToxicCrack/PrintABrick.git
synced 2025-05-20 22:20:08 -07:00
Add SetImageLoader
This commit is contained in:
parent
fa0426ee42
commit
8528817e0b
@ -18,43 +18,40 @@
|
|||||||
{% set placeholder = asset("resources/images/unknown.png") %}
|
{% set placeholder = asset("resources/images/unknown.png") %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<img src="{{ placeholder }}" data-src="{{ asset('/sets/'~number|lower~'.jpg')|imagine_filter(filter) }}">
|
<img src="{{ placeholder }}" data-src="{{ asset(number|lower~'.jpg')|imagine_filter(filter) }}">
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro model(model, quantity = null, color = -1) %}
|
{% macro model(model, quantity = null, color = -1) %}
|
||||||
<div class="column model">
|
<a class="column part" href="{{ url('model_detail', {'number': model.number})}}">
|
||||||
<a href="{{ url('model_detail', {'number': model.number})}}">
|
<div class="ui bordered fluid image">
|
||||||
<div class="ui bordered fluid image">
|
{% import _self as blocks %}
|
||||||
{% import _self as blocks %}
|
{{ blocks.partImage(model.number, 'part_min', color) }}
|
||||||
{{ blocks.partImage(model.number, 'part_min', color) }}
|
<div class="part-meta">
|
||||||
</div>
|
|
||||||
<div class="model-meta">
|
|
||||||
<span class="quantity"></span> {% if quantity %}{{ quantity }}x{% endif %}<span class="number">{{ model.number }}</span>
|
<span class="quantity"></span> {% if quantity %}{{ quantity }}x{% endif %}<span class="number">{{ model.number }}</span>
|
||||||
{#<span class="name">{{ model.name }}</span>#}
|
{#<span class="name">{{ model.name }}</span>#}
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</div>
|
||||||
</div>
|
</a>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro part(part, quantity = null, color = -1) %}
|
{% macro part(part, quantity = null, color = -1) %}
|
||||||
<div class="column">
|
<a class="column part" href="{{ url('reb_part_detail', {'number': part.number})}}">
|
||||||
<div class="ui color-{{ color }} bordered fluid image">
|
<div class="ui bordered fluid image">
|
||||||
<a href="{{ url('reb_part_detail', {'number': part.number})}}">
|
{% import _self as blocks %}
|
||||||
{% import _self as blocks %}
|
{{ blocks.partImage(part.number,'part_min', color) }}
|
||||||
{{ blocks.partImage(part.number,'part_min', color) }}
|
<div class="part-meta">
|
||||||
<div class="part-meta">
|
<span class="quantity"></span> {% if quantity %}{{ quantity }}x{% endif %}<span class="number">{{ part.number }}</span>
|
||||||
<span class="quantity"></span> {% if quantity %}{{ quantity }}x{% endif %}<span class="number">{{ part.number }}</span>
|
</div>
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</a>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro set(set) %}
|
{% macro set(set) %}
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<a href="{{ url('set_detail', {'number': set.number}) }}">
|
<a href="{{ url('set_detail', {'number': set.number}) }}">
|
||||||
<div class="ui bordered fluid image">
|
<div class="ui bordered fluid image">
|
||||||
|
{% import _self as blocks %}
|
||||||
{{ blocks.setImage(set.number,'set_min') }}
|
{{ blocks.setImage(set.number,'set_min') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="set-meta">
|
<div class="set-meta">
|
||||||
|
@ -110,37 +110,20 @@ knp_paginator:
|
|||||||
sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig # sort link template
|
sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig # sort link template
|
||||||
|
|
||||||
liip_imagine:
|
liip_imagine:
|
||||||
loaders:
|
|
||||||
rebrickable:
|
|
||||||
stream:
|
|
||||||
wrapper: 'http://rebrickable.com/media/'
|
|
||||||
brickset:
|
|
||||||
stream:
|
|
||||||
wrapper: 'https://images.brickset.com/'
|
|
||||||
|
|
||||||
resolvers:
|
resolvers:
|
||||||
default:
|
default:
|
||||||
web_path: ~
|
web_path: ~
|
||||||
|
|
||||||
filter_sets:
|
filter_sets:
|
||||||
brickset_large:
|
|
||||||
data_loader: brickset
|
|
||||||
cache: ~
|
|
||||||
quality: 92
|
|
||||||
filters:
|
|
||||||
thumbnail: { size: [840, 580], mode: inset }
|
|
||||||
background: { size: [900, 600], position: center, color: '#FFFFFF' }
|
|
||||||
|
|
||||||
|
|
||||||
set_min:
|
set_min:
|
||||||
quality: 80
|
quality: 80
|
||||||
data_loader: rebrickable
|
data_loader: set_image_loader
|
||||||
cache: ~
|
cache: ~
|
||||||
filters:
|
filters:
|
||||||
thumbnail: { size: [200, 200], mode: inset }
|
thumbnail: { size: [200, 200], mode: inset }
|
||||||
background: { size: [250, 250], position: center, color: '#FFFFFF' }
|
background: { size: [250, 250], position: center, color: '#FFFFFF' }
|
||||||
set_large:
|
set_large:
|
||||||
data_loader: rebrickable
|
data_loader: set_image_loader
|
||||||
cache: ~
|
cache: ~
|
||||||
quality: 92
|
quality: 92
|
||||||
filters:
|
filters:
|
||||||
@ -156,7 +139,6 @@ liip_imagine:
|
|||||||
part_min:
|
part_min:
|
||||||
quality: 80
|
quality: 80
|
||||||
data_loader: part_image_loader
|
data_loader: part_image_loader
|
||||||
default_image: "noimage.png"
|
|
||||||
cache: ~
|
cache: ~
|
||||||
filters:
|
filters:
|
||||||
thumbnail: { size: [200, 200], mode: inset }
|
thumbnail: { size: [200, 200], mode: inset }
|
||||||
|
@ -30,4 +30,9 @@ services:
|
|||||||
class: AppBundle\Imagine\PartImageLoader
|
class: AppBundle\Imagine\PartImageLoader
|
||||||
arguments: ['@api.manager.rebrickable', '@oneup_flysystem.media_filesystem']
|
arguments: ['@api.manager.rebrickable', '@oneup_flysystem.media_filesystem']
|
||||||
tags:
|
tags:
|
||||||
- { name: liip_imagine.binary.loader, loader: part_image_loader }
|
- { name: liip_imagine.binary.loader, loader: part_image_loader }
|
||||||
|
app.set_image_loader:
|
||||||
|
class: AppBundle\Imagine\SetImageLoader
|
||||||
|
arguments: ['@api.manager.brickset', '@oneup_flysystem.media_filesystem']
|
||||||
|
tags:
|
||||||
|
- { name: liip_imagine.binary.loader, loader: set_image_loader }
|
27
src/AppBundle/Imagine/BaseImageLoader.php
Normal file
27
src/AppBundle/Imagine/BaseImageLoader.php
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace AppBundle\Imagine;
|
||||||
|
|
||||||
|
|
||||||
|
use Liip\ImagineBundle\Binary\Loader\LoaderInterface;
|
||||||
|
|
||||||
|
abstract class BaseImageLoader implements LoaderInterface
|
||||||
|
{
|
||||||
|
abstract public function find($path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $url
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
protected function remoteFileExists($url)
|
||||||
|
{
|
||||||
|
$resource = curl_init($url);
|
||||||
|
curl_setopt($resource, CURLOPT_NOBODY, true);
|
||||||
|
curl_exec($resource);
|
||||||
|
$status = curl_getinfo($resource, CURLINFO_HTTP_CODE);
|
||||||
|
curl_close($resource);
|
||||||
|
|
||||||
|
return $status === 200 ? true : false;
|
||||||
|
}
|
||||||
|
}
|
@ -4,10 +4,9 @@ namespace AppBundle\Imagine;
|
|||||||
|
|
||||||
use AppBundle\Api\Manager\RebrickableManager;
|
use AppBundle\Api\Manager\RebrickableManager;
|
||||||
use League\Flysystem\Filesystem;
|
use League\Flysystem\Filesystem;
|
||||||
use Liip\ImagineBundle\Binary\Loader\LoaderInterface;
|
|
||||||
use Liip\ImagineBundle\Exception\Binary\Loader\NotLoadableException;
|
use Liip\ImagineBundle\Exception\Binary\Loader\NotLoadableException;
|
||||||
|
|
||||||
class PartImageLoader implements LoaderInterface
|
class PartImageLoader extends BaseImageLoader
|
||||||
{
|
{
|
||||||
/** @var Filesystem */
|
/** @var Filesystem */
|
||||||
private $mediaFilesystem;
|
private $mediaFilesystem;
|
||||||
@ -18,7 +17,7 @@ class PartImageLoader implements LoaderInterface
|
|||||||
private $rebrickableContext = 'http://rebrickable.com/media/parts/ldraw/';
|
private $rebrickableContext = 'http://rebrickable.com/media/parts/ldraw/';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LocalStreamLoader constructor.
|
* PartImageLoader constructor.
|
||||||
*
|
*
|
||||||
* @param $rebrickableManager
|
* @param $rebrickableManager
|
||||||
* @param $mediaFilesystem
|
* @param $mediaFilesystem
|
||||||
@ -60,20 +59,4 @@ class PartImageLoader implements LoaderInterface
|
|||||||
|
|
||||||
return $this->mediaFilesystem->read('noimage.png');
|
return $this->mediaFilesystem->read('noimage.png');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $url
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function remoteFileExists($url)
|
|
||||||
{
|
|
||||||
$resource = curl_init($url);
|
|
||||||
curl_setopt($resource, CURLOPT_NOBODY, true);
|
|
||||||
curl_exec($resource);
|
|
||||||
$status = curl_getinfo($resource, CURLINFO_HTTP_CODE);
|
|
||||||
curl_close($resource);
|
|
||||||
|
|
||||||
return $status === 200 ? true : false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
56
src/AppBundle/Imagine/SetImageLoader.php
Normal file
56
src/AppBundle/Imagine/SetImageLoader.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace AppBundle\Imagine;
|
||||||
|
|
||||||
|
use AppBundle\Api\Manager\BricksetManager;
|
||||||
|
use League\Flysystem\Filesystem;
|
||||||
|
use Liip\ImagineBundle\Exception\Binary\Loader\NotLoadableException;
|
||||||
|
|
||||||
|
class SetImageLoader extends BaseImageLoader
|
||||||
|
{
|
||||||
|
/** @var BricksetManager */
|
||||||
|
private $bricksetManager;
|
||||||
|
|
||||||
|
private $rebrickableContext = 'http://rebrickable.com/media/sets/';
|
||||||
|
|
||||||
|
/** @var Filesystem */
|
||||||
|
private $mediaFilesystem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SetImageLoader constructor.
|
||||||
|
*
|
||||||
|
* @param $bricksetManager
|
||||||
|
*/
|
||||||
|
public function __construct($bricksetManager, $mediaFilesystem)
|
||||||
|
{
|
||||||
|
$this->bricksetManager = $bricksetManager;
|
||||||
|
$this->mediaFilesystem = $mediaFilesystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function find($path)
|
||||||
|
{
|
||||||
|
// try to load image from rebrickable website
|
||||||
|
try {
|
||||||
|
if ($this->remoteFileExists($this->rebrickableContext.$path)) {
|
||||||
|
return file_get_contents($this->rebrickableContext.$path);
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw new NotLoadableException(sprintf('Source image %s could not be loaded.', $path), $e->getCode(), $e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load part entity form rebrickable api and get image path from response
|
||||||
|
try {
|
||||||
|
if (preg_match('/^(.*)[.png|.jpg]$/', $path, $match)) {
|
||||||
|
$set = $this->bricksetManager->getSetByNumber($match[1]);
|
||||||
|
|
||||||
|
if ($set && $set->getImage()) {
|
||||||
|
return file_get_contents($set->getImageURL());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw new NotLoadableException(sprintf('Source image %s could not be loaded.', $path), $e->getCode(), $e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->mediaFilesystem->read('noimage.png');
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user