Completed
Push — master ( 01eb52...fc03c7 )
by
unknown
19:01
created

AbstractOembedProvider::refreshImage()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 9
ccs 6
cts 6
cp 1
rs 9.6666
c 1
b 0
f 0
cc 1
eloc 5
nc 1
nop 1
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
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 1
    public function update(AbstractMedia $media, $providerReferenceUpdated)
24
    {
25 1
        if ($providerReferenceUpdated) {
26 1
            $media->setProviderReference($this->parseProviderReference($media->getProviderReference()));
27
28 1
            $data = $this->getOembedDataCache($media->getProviderReference());
29
30 1
            $media->setProviderMetaData($data);
31
32 1
            if (empty($media->getTitle()) && isset($data['title'])) {
33 1
                $media->setTitle($data['title']);
34 1
            }
35 1
            if (empty($media->getDescription()) && isset($data['description'])) {
36
                $media->setDescription($data['description']);
37
            }
38 1
            if (empty($media->getAuthorName()) && isset($data['author_name'])) {
39 1
                $media->setAuthorName($data['author_name']);
40 1
            }
41 1
            if (empty($media->getImage())) {
42 1
                $this->refreshImage($media);
43 1
            }
44 1
        }
45
46 1
        parent::update($media, $providerReferenceUpdated);
47 1
    }
48
49
    /**
50
     * @param FormMapper $formMapper
51
     */
52 1
    public function buildProviderCreateForm(FormMapper $formMapper)
53
    {
54 1
        $formMapper->add(
55 1
            'providerReference',
56 1
            TextType::class,
57 1
            ['label' => $this->getReferenceLabel()]
58 1
        );
59 1
    }
60
61
    /**
62
     * @param FormMapper $formMapper
63
     */
64 1
    public function buildProviderEditFormBefore(FormMapper $formMapper)
65
    {
66 1
        $formMapper->add(
67 1
            'providerReference',
68 1
            TextType::class,
69 1
            ['label' => $this->getReferenceLabel()]
70 1
        );
71 1
    }
72
73
    /**
74
     * @param ErrorElement $errorElement
75
     * @param AbstractMedia $media
76
     */
77 1
    public function validate(ErrorElement $errorElement, AbstractMedia $media)
78
    {
79
        try {
80 1
            $this->getOembedDataCache($this->parseProviderReference($media->getProviderReference()));
81
        }
82 1
        catch (\Exception $e) {
83
            $errorElement->with('providerReference')->addViolation($e->getMessage());
84
        }
85 1
    }
86
87
    /**
88
     * @param \MediaMonks\SonataMediaBundle\Model\AbstractMedia $media
89
     */
90 1
    public function refreshImage(AbstractMedia $media)
91
    {
92 1
        $filename = sprintf('%s_%d.%s', sha1($media->getProviderReference()), time(), 'jpg');
93 1
        $thumbnailUrl = $this->getImageUrl($media->getProviderReference());
94
95 1
        $this->getFilesystem()->write($filename, $this->getUrlData($thumbnailUrl));
96
97 1
        $media->setImage($filename);
98 1
    }
99
100
    /**
101
     * @param string $id
102
     * @return string
103
     */
104
    public function getImageUrl($id)
105
    {
106
        return $this->getOembedDataCache($id)['thumbnail_url'];
107
    }
108
109
    /**
110
     * @param $id
111
     * @return mixed
112
     * @throws \Exception
113
     */
114 1
    protected function getOembedDataCache($id)
115
    {
116 1
        if (empty($this->oembedDataCache[$id])) {
117
118 1
            $this->disableErrorHandler();
119 1
            $data = json_decode($this->getUrlData($this->getOembedUrl($id)), true);
120 1
            $this->restoreErrorHandler();
121
122 1
            if (empty($data['title'])) {
123
                throw new \Exception($this->getTranslator()->trans('error.provider_reference', [
124
                    '%provider%' => $this->getName(),
125
                    '%reference%' => $id
126
                ]));
127
            }
128
129 1
            $this->oembedDataCache[$id] = $data;
130 1
        }
131
132 1
        return $this->oembedDataCache[$id];
133
    }
134
135
    /**
136
     * @return string
137
     */
138 1
    public function getReferenceLabel()
139
    {
140 1
        return sprintf('form.%s.reference', $this->getName());
141
    }
142
143
    /**
144
     * @return bool
145
     */
146 1
    public function supportsDownload()
147
    {
148 1
        return false;
149
    }
150
151
    /**
152
     * @return bool
153
     */
154 1
    public function supportsEmbed()
155
    {
156 1
        return true;
157
    }
158
159
    /**
160
     * @return bool
161
     */
162 1
    public function supportsImage()
163
    {
164 1
        return true;
165
    }
166
167
    /**
168
     * @param $url
169
     * @return mixed
170
     */
171 1
    protected function getUrlData($url)
172
    {
173 1
        $ch = curl_init();
174
175 1
        curl_setopt($ch, CURLOPT_HEADER, 0);
176 1
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
177 1
        curl_setopt($ch, CURLOPT_URL, $url);
178
179 1
        $data = curl_exec($ch);
180 1
        curl_close($ch);
181
182 1
        return $data;
183
    }
184
185
    /**
186
     * @param string $url
187
     * @return bool
188
     */
189 1
    protected function urlExists($url)
190
    {
191 1
        $ch = curl_init();
192 1
        curl_setopt($ch, CURLOPT_URL, $url);
193 1
        curl_setopt($ch, CURLOPT_NOBODY, true);
194 1
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
195 1
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
196 1
        curl_setopt($ch, CURLOPT_HEADER, false);
197 1
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD');
198
199 1
        curl_exec($ch);
200 1
        $info = curl_getinfo($ch);
201 1
        curl_close($ch);
202
203 1
        return $info === Response::HTTP_OK;
204
    }
205
}
206