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") %} {% 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">

View File

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

View File

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

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

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