1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-20 22:20:08 -07:00

Add SetImageLoader

This commit is contained in:
David Hübner 2017-05-08 10:51:09 +02:00
parent fa0426ee42
commit 8528817e0b
7 changed files with 110 additions and 60 deletions

View File

@ -18,43 +18,40 @@
{% set placeholder = asset("resources/images/unknown.png") %}
{% 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>
{% endmacro %}
{% macro model(model, quantity = null, color = -1) %}
<div class="column model">
<a href="{{ url('model_detail', {'number': model.number})}}">
<div class="ui bordered fluid image">
{% import _self as blocks %}
{{ blocks.partImage(model.number, 'part_min', color) }}
</div>
<div class="model-meta">
<a class="column part" href="{{ url('model_detail', {'number': model.number})}}">
<div class="ui bordered fluid image">
{% import _self as blocks %}
{{ blocks.partImage(model.number, 'part_min', color) }}
<div class="part-meta">
<span class="quantity"></span> {% if quantity %}{{ quantity }}x{% endif %}<span class="number">{{ model.number }}</span>
{#<span class="name">{{ model.name }}</span>#}
</div>
</a>
</div>
</div>
</a>
{% endmacro %}
{% macro part(part, quantity = null, color = -1) %}
<div class="column">
<div class="ui color-{{ color }} bordered fluid image">
<a href="{{ url('reb_part_detail', {'number': part.number})}}">
{% import _self as blocks %}
{{ blocks.partImage(part.number,'part_min', color) }}
<div class="part-meta">
<span class="quantity"></span> {% if quantity %}{{ quantity }}x{% endif %}<span class="number">{{ part.number }}</span>
</div>
</a>
<a class="column part" href="{{ url('reb_part_detail', {'number': part.number})}}">
<div class="ui bordered fluid image">
{% import _self as blocks %}
{{ blocks.partImage(part.number,'part_min', color) }}
<div class="part-meta">
<span class="quantity"></span> {% if quantity %}{{ quantity }}x{% endif %}<span class="number">{{ part.number }}</span>
</div>
</div>
</div>
</a>
{% endmacro %}
{% macro set(set) %}
<div class="column">
<a href="{{ url('set_detail', {'number': set.number}) }}">
<div class="ui bordered fluid image">
{% import _self as blocks %}
{{ blocks.setImage(set.number,'set_min') }}
</div>
<div class="set-meta">

View File

@ -110,37 +110,20 @@ knp_paginator:
sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig # sort link template
liip_imagine:
loaders:
rebrickable:
stream:
wrapper: 'http://rebrickable.com/media/'
brickset:
stream:
wrapper: 'https://images.brickset.com/'
resolvers:
default:
web_path: ~
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:
quality: 80
data_loader: rebrickable
data_loader: set_image_loader
cache: ~
filters:
thumbnail: { size: [200, 200], mode: inset }
background: { size: [250, 250], position: center, color: '#FFFFFF' }
set_large:
data_loader: rebrickable
data_loader: set_image_loader
cache: ~
quality: 92
filters:
@ -156,7 +139,6 @@ liip_imagine:
part_min:
quality: 80
data_loader: part_image_loader
default_image: "noimage.png"
cache: ~
filters:
thumbnail: { size: [200, 200], mode: inset }

View File

@ -30,4 +30,9 @@ services:
class: AppBundle\Imagine\PartImageLoader
arguments: ['@api.manager.rebrickable', '@oneup_flysystem.media_filesystem']
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 }

View 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;
}
}

View File

@ -4,10 +4,9 @@ namespace AppBundle\Imagine;
use AppBundle\Api\Manager\RebrickableManager;
use League\Flysystem\Filesystem;
use Liip\ImagineBundle\Binary\Loader\LoaderInterface;
use Liip\ImagineBundle\Exception\Binary\Loader\NotLoadableException;
class PartImageLoader implements LoaderInterface
class PartImageLoader extends BaseImageLoader
{
/** @var Filesystem */
private $mediaFilesystem;
@ -18,7 +17,7 @@ class PartImageLoader implements LoaderInterface
private $rebrickableContext = 'http://rebrickable.com/media/parts/ldraw/';
/**
* LocalStreamLoader constructor.
* PartImageLoader constructor.
*
* @param $rebrickableManager
* @param $mediaFilesystem
@ -60,20 +59,4 @@ class PartImageLoader implements LoaderInterface
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;
}
}

View 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');
}
}