Completed
Push — master ( 7db90d...b62044 )
by
unknown
05:58
created

SoundCloudProvider   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 117
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 3

Test Coverage

Coverage 25%

Importance

Changes 0
Metric Value
wmc 12
lcom 0
cbo 3
dl 0
loc 117
ccs 11
cts 44
cp 0.25
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A parseProviderReference() 0 13 4
A getIcon() 0 4 1
A getName() 0 4 1
A buildProviderEditFormBefore() 0 4 1
A buildProviderEditFormAfter() 0 22 1
A getOembedUrl() 0 4 1
A getOembedDataCache() 0 7 1
A extractEmbedUrl() 0 10 1
A getType() 0 4 1
1
<?php
2
3
namespace MediaMonks\SonataMediaBundle\Provider;
4
5
use MediaMonks\SonataMediaBundle\Exception\InvalidProviderUrlException;
6
use Sonata\AdminBundle\Form\FormMapper;
7
use Sonata\CoreBundle\Form\Type\ImmutableArrayType;
8
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
9
use Symfony\Component\Form\Extension\Core\Type\TextType;
10
11
class SoundCloudProvider extends AbstractOembedProvider
12
{
13
    const URL_OEMBED = 'https://soundcloud.com/oembed?format=json&url=https://soundcloud.com/%s';
14
    const URL = 'https://soundcloud.com/%s';
15
16
    /**
17
     * @param FormMapper $formMapper
18
     */
19
    public function buildProviderEditFormBefore(FormMapper $formMapper)
20
    {
21
        $formMapper->add('providerReference', TextType::class, ['label' => $this->getReferenceLabel()]);
22
    }
23
24
    /**
25
     * @param FormMapper $formMapper
26
     */
27
    public function buildProviderEditFormAfter(FormMapper $formMapper)
28
    {
29
        $formMapper
30
            ->tab('form.embed_options')
31
            ->add(
32
                'providerMetaData',
33
                ImmutableArrayType::class,
34
                [
35
                    'keys' => [
36
                        ['autoPlay', CheckboxType::class, ['label' => 'form.auto_play', 'required' => false]],
37
                        ['hideRelated', CheckboxType::class, ['label' => 'form.hide_related', 'required' => false]],
38
                        ['showComments', CheckboxType::class, ['label' => 'form.show_comments', 'required' => false]],
39
                        ['showUser', CheckboxType::class, ['label' => 'form.show_user', 'required' => false]],
40
                        ['showReposts', CheckboxType::class, ['label' => 'form.show_reposts', 'required' => false]],
41
                        ['showVisual', CheckboxType::class, ['label' => 'form.show_visual', 'required' => false]],
42
                    ],
43
                    'label' => 'form.embed_options',
44
                    'required' => false
45
                ]
46
            )->end()
47
        ;
48
    }
49
50
    /**
51
     * @param string $id
52
     * @return string
53
     */
54
    public function getOembedUrl($id)
55
    {
56
        return sprintf(self::URL_OEMBED, $id);
57
    }
58
59
    /**
60
     * @param $value
61
     * @return string
62
     * @throws \Exception
63
     */
64 2
    public function parseProviderReference($value)
65
    {
66 2
        if (strpos($value, 'soundcloud.com')) {
67 2
            $url = parse_url($value);
68 2
            if (empty($url['path']) || empty(trim($url['path'], '/'))) {
69 1
                throw new InvalidProviderUrlException('SoundCloud');
70
            }
71
72 1
            return trim($url['path'], '/');
73
        }
74
75 1
        return $value;
76
    }
77
78
    /**
79
     * @param $id
80
     * @return array
81
     */
82
    protected function getOembedDataCache($id)
83
    {
84
        $data = parent::getOembedDataCache($id);
85
        $data['embedUrl'] = $this->extractEmbedUrl($data);
86
87
        return $data;
88
    }
89
90
    /**
91
     * @param array $data
92
     */
93
    protected function extractEmbedUrl(array $data)
94
    {
95
        preg_match('/src="(.*)"/', $data['html'], $matches);
96
        $url = $matches[1];
97
98
        $data = parse_url($url);
99
        parse_str($data['query'], $data);
100
101
        return $data['url'];
102
    }
103
104
    /**
105
     * @return string
106
     */
107 1
    public function getIcon()
108
    {
109 1
        return 'fa fa-soundcloud';
110
    }
111
112
    /**
113
     * @return string
114
     */
115 3
    public function getName()
116
    {
117 3
        return 'soundcloud';
118
    }
119
120
    /**
121
     * @return string
122
     */
123
    public function getType()
124
    {
125
        return AbstractProvider::TYPE_AUDIO;
126
    }
127
}
128