Completed
Push — master ( 8b5863...9f73c5 )
by
unknown
06:52
created

AbstractOembedProvider::updateMediaObject()   B

Complexity

Conditions 8
Paths 16

Size

Total Lines 20
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 8

Importance

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