Completed
Push — master ( 285b1b...2fc430 )
by
unknown
26:57
created

AbstractOembedProvider::getReferenceLabel()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
namespace MediaMonks\SonataMediaBundle\Provider;
4
5
use MediaMonks\SonataMediaBundle\Model\AbstractMedia;
6
use Sonata\AdminBundle\Form\FormMapper;
7
use Sonata\CoreBundle\Validator\ErrorElement;
8
use Symfony\Component\Form\Extension\Core\Type\TextType;
9
10
abstract class AbstractOembedProvider extends AbstractProvider implements OembedProviderInterface, EmbeddableProviderInterface
11
{
12
    /**
13
     * @var array
14
     */
15
    protected $oembedDataCache;
16
17
    /**
18
     * @param AbstractMedia $media
19
     * @param bool $providerReferenceUpdated
20
     * @throws \Exception
21
     */
22 3
    public function update(AbstractMedia $media, $providerReferenceUpdated)
23
    {
24 3
        if ($providerReferenceUpdated) {
25 3
            $media->setProviderReference($this->parseProviderReference($media->getProviderReference()));
26 3
            $this->updateMediaObject($media);
27
        }
28
29 3
        parent::update($media, $providerReferenceUpdated);
30 3
    }
31
32
    /**
33
     * @param AbstractMedia $media
34
     */
35 3
    protected function updateMediaObject(AbstractMedia $media)
36
    {
37 3
        $data = $this->getOembedDataCache($media->getProviderReference());
38
39 3
        $media->setProviderMetaData($data);
40
41 3
        if (empty($media->getTitle()) && isset($data['title'])) {
42 3
            $media->setTitle($data['title']);
43
        }
44 3
        if (empty($media->getDescription()) && isset($data['description'])) {
45 2
            $media->setDescription($data['description']);
46
        }
47 3
        if (empty($media->getAuthorName()) && isset($data['author_name'])) {
48 3
            $media->setAuthorName($data['author_name']);
49
        }
50
51 3
        if (empty($media->getImage())) {
52 3
            $this->refreshImage($media);
53
        }
54 3
    }
55
56
    /**
57
     * @param FormMapper $formMapper
58
     */
59 4
    public function buildProviderCreateForm(FormMapper $formMapper)
60
    {
61 4
        $formMapper->add(
62 4
            'providerReference',
63 4
            TextType::class,
64 4
            ['label' => $this->getReferenceLabel()]
65
        );
66 4
    }
67
68
    /**
69
     * @param FormMapper $formMapper
70
     */
71 2
    public function buildProviderEditFormBefore(FormMapper $formMapper)
72
    {
73 2
        $formMapper->add(
74 2
            'providerReference',
75 2
            TextType::class,
76 2
            ['label' => $this->getReferenceLabel()]
77
        );
78 2
    }
79
80
    /**
81
     * @param ErrorElement $errorElement
82
     * @param AbstractMedia $media
83
     */
84 4
    public function validate(ErrorElement $errorElement, AbstractMedia $media)
85
    {
86
        try {
87 4
            $this->getOembedDataCache($this->parseProviderReference($media->getProviderReference()));
88
        }
89 1
        catch (\Exception $e) {
90 1
            $errorElement->with('providerReference')->addViolation($e->getMessage());
91
        }
92 4
    }
93
94
    /**
95
     * @param \MediaMonks\SonataMediaBundle\Model\AbstractMedia $media
96
     */
97 3
    public function refreshImage(AbstractMedia $media)
98
    {
99 3
        $filename = sprintf('%s_%d.%s', sha1($media->getProviderReference()), time(), 'jpg');
100 3
        $thumbnailUrl = $this->getImageUrl($media->getProviderReference());
101
102 3
        $this->getFilesystem()->write($filename, $this->getHttpClient()->getData($thumbnailUrl));
103
104 3
        $media->setImage($filename);
105 3
    }
106
107
    /**
108
     * @param string $id
109
     * @return string
110
     */
111 2
    public function getImageUrl($id)
112
    {
113 2
        return $this->getOembedDataCache($id)['thumbnail_url'];
114
    }
115
116
    /**
117
     * @param $id
118
     * @return mixed
119
     * @throws \Exception
120
     */
121 4
    protected function getOembedDataCache($id)
122
    {
123 4
        if (empty($this->oembedDataCache[$id])) {
124
125 4
            $this->disableErrorHandler();
126 4
            $data = json_decode($this->getHttpClient()->getData($this->getOembedUrl($id)), true);
127 4
            $this->restoreErrorHandler();
128
129 4
            if (empty($data['title'])) {
130 1
                throw new \Exception($this->getTranslator()->trans('error.provider_reference', [
131 1
                    '%provider%' => $this->getName(),
132 1
                    '%reference%' => $id
133
                ]));
134
            }
135
136 3
            $this->oembedDataCache[$id] = $data;
137
        }
138
139 3
        return $this->oembedDataCache[$id];
140
    }
141
142
    /**
143
     * @return string
144
     */
145 4
    public function getReferenceLabel()
146
    {
147 4
        return sprintf('form.%s.reference', $this->getName());
148
    }
149
}
150