DMAXBridge komplett neu gemacht, mit neuer API und Support für DMAX, TLC und HGTV
This commit is contained in:
		
							
								
								
									
										203
									
								
								DMAXBridge.php
									
									
									
									
									
								
							
							
						
						
									
										203
									
								
								DMAXBridge.php
									
									
									
									
									
								
							@@ -2,114 +2,133 @@
 | 
			
		||||
 | 
			
		||||
class DMAXBridge extends BridgeAbstract
 | 
			
		||||
{
 | 
			
		||||
    const NAME = 'DMAX, HGTV, TLC Bridge';
 | 
			
		||||
    const URI = '';
 | 
			
		||||
    const API_URI = 'https://de-api.loma-cms.com/feloma/videos/';
 | 
			
		||||
    const DESCRIPTION = 'Gibt die neuesten Episoden einer DMAX, HGTV oder TLC Sendung zurück.';
 | 
			
		||||
    const MAINTAINER = 'Brawl, Akamaru';
 | 
			
		||||
 | 
			
		||||
    const MAINTAINER = 'Brawl';
 | 
			
		||||
    const NAME = 'DMAX';
 | 
			
		||||
    const URI = 'https://www.dmax.de/';
 | 
			
		||||
    const CACHE_TIMEOUT = 7200; // 7200 = 2h
 | 
			
		||||
    const DESCRIPTION = 'Returns the newest episode of a DMAX show.';
 | 
			
		||||
    const PARAMETERS = array(
 | 
			
		||||
        array(
 | 
			
		||||
            'show' => array(
 | 
			
		||||
                'name' => 'Show ID (e.g. "6023" for Steel Buddies, check website source code)',
 | 
			
		||||
                'type' => 'number',
 | 
			
		||||
    const PARAMETERS = [
 | 
			
		||||
        'Sendung' => [
 | 
			
		||||
            'show' => [
 | 
			
		||||
                'name' => 'Sendungs-Slug (z.B. "112-feuerwehr-im-einsatz")',
 | 
			
		||||
                'type' => 'text',
 | 
			
		||||
                'required' => true
 | 
			
		||||
            ),
 | 
			
		||||
        )
 | 
			
		||||
    );
 | 
			
		||||
    const TOKEN_URI = 'https://eu1-prod.disco-api.com/token?realm=dmaxde';
 | 
			
		||||
    const DISCO_URI = 'https://eu1-prod.disco-api.com/content/videos//?include=primaryChannel,primaryChannel.images,show,show.images,genres,tags,images,contentPackages&sort=-seasonNumber,-episodeNumber&filter[show.id]=%d&filter[videoType]=EPISODE&page[number]=1&page[size]=100';
 | 
			
		||||
            ],
 | 
			
		||||
            'realm' => [
 | 
			
		||||
                'name' => 'Plattform',
 | 
			
		||||
                'type' => 'list',
 | 
			
		||||
                'values' => [
 | 
			
		||||
                    'DMAX' => 'dmax',
 | 
			
		||||
                    'HGTV' => 'hgtv',
 | 
			
		||||
                    'TLC' => 'tlc'
 | 
			
		||||
                ],
 | 
			
		||||
                'defaultValue' => 'dmax'
 | 
			
		||||
            ]
 | 
			
		||||
        ]
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    const PLATFORM_URLS = [
 | 
			
		||||
        'dmax' => 'https://www.dmax.de/',
 | 
			
		||||
        'hgtv' => 'https://de.hgtv.com/',
 | 
			
		||||
        'tlc' => 'https://tlc.de/'
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    const PLATFORM_NAMES = [
 | 
			
		||||
        'dmax' => 'DMAX',
 | 
			
		||||
        'hgtv' => 'HGTV',
 | 
			
		||||
        'tlc' => 'TLC'
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    private $showName = '';
 | 
			
		||||
    private $pageUrl = self::URI . 'sendungen/';
 | 
			
		||||
 | 
			
		||||
    public function getName()
 | 
			
		||||
    {
 | 
			
		||||
    public function getName() {
 | 
			
		||||
        if (!empty($this->showName)) {
 | 
			
		||||
            return $this->showName;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return parent::getName();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getIcon()
 | 
			
		||||
    {
 | 
			
		||||
        return self::URI . 'apple-touch-icon.png';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getURI()
 | 
			
		||||
    {
 | 
			
		||||
        return $this->pageUrl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function collectData()
 | 
			
		||||
    {
 | 
			
		||||
        // Retrieve and check user input
 | 
			
		||||
    public function collectData() {
 | 
			
		||||
        $show = $this->getInput('show');
 | 
			
		||||
        if (empty($show))
 | 
			
		||||
            returnClientError('Invalid show: ' . $show);
 | 
			
		||||
        $realm = $this->getInput('realm');
 | 
			
		||||
 | 
			
		||||
        // Get Token
 | 
			
		||||
        $tokenUrl = getSimpleHTMLDOM(self::TOKEN_URI)
 | 
			
		||||
        or returnServerError('Could not request DMAX token.');
 | 
			
		||||
 | 
			
		||||
        $token_json = json_decode($tokenUrl, true);
 | 
			
		||||
        $token = $token_json['data']['attributes']['token'];
 | 
			
		||||
        if (empty($token))
 | 
			
		||||
            returnServerError('Could not get DMAX token.');
 | 
			
		||||
 | 
			
		||||
        // Retrieve discovery URI
 | 
			
		||||
        $pageUrl = sprintf(self::DISCO_URI, $show);
 | 
			
		||||
        $html = getSimpleHTMLDOM($pageUrl, array('Authorization: Bearer ' . $token))
 | 
			
		||||
        or returnServerError('Could not request DMAX discovery URI: ' . $pageUrl);
 | 
			
		||||
        $json = json_decode($html, true);
 | 
			
		||||
 | 
			
		||||
        // Get show name
 | 
			
		||||
        foreach ($json["included"] as $incl_element) {
 | 
			
		||||
            if ($incl_element["type"] == "show") {
 | 
			
		||||
                $this->showName = $incl_element['attributes']['name'];
 | 
			
		||||
                $this->pageUrl = self::URI . 'sendungen/' . $incl_element['attributes']['alternateId'];
 | 
			
		||||
            }
 | 
			
		||||
        if (empty($show)) {
 | 
			
		||||
            returnClientError('Ungültiger Sendungs-Slug.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (empty($this->showName))
 | 
			
		||||
            returnClientError('Show not found.');
 | 
			
		||||
        $apiUrl = self::API_URI . '?environment=' . $realm . '&v=2&filter[show.slug]=' . urlencode($show);
 | 
			
		||||
        $json = json_decode(getContents($apiUrl), true);
 | 
			
		||||
 | 
			
		||||
        // Process articles
 | 
			
		||||
        foreach ($json['data'] as $element) {
 | 
			
		||||
 | 
			
		||||
            if (count($this->items) >= 10) {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $episodeTitle = trim($element['attributes']['name']);
 | 
			
		||||
            if (array_key_exists('episodeNumber', $element['attributes']) // Both season + episode no. given
 | 
			
		||||
                && array_key_exists('seasonNumber', $element['attributes'])) {
 | 
			
		||||
                $article_title = sprintf($this->showName . ' S%02dE%02d: ' . $episodeTitle,
 | 
			
		||||
                    $element['attributes']['seasonNumber'],
 | 
			
		||||
                    $element['attributes']['episodeNumber']);
 | 
			
		||||
            } elseif (array_key_exists('episodeNumber', $element['attributes']) // Only season no. given
 | 
			
		||||
                && !array_key_exists('seasonNumber', $element['attributes'])) {
 | 
			
		||||
                $article_title = sprintf($this->showName . ' E%02d: ' . $episodeTitle,
 | 
			
		||||
                    $element['attributes']['episodeNumber']);
 | 
			
		||||
            } else {  // Nothing given
 | 
			
		||||
                $article_title = $this->showName . ' - ' . $episodeTitle;
 | 
			
		||||
            }
 | 
			
		||||
            $article_content = trim($element['attributes']['description']);
 | 
			
		||||
 | 
			
		||||
            $article_time = $element['attributes']['airDate'];
 | 
			
		||||
 | 
			
		||||
            // Store article in items array
 | 
			
		||||
            if (!empty($article_title)) {
 | 
			
		||||
                $item = array();
 | 
			
		||||
                $item['uri'] = $this->pageUrl . '/videos';
 | 
			
		||||
                $item['title'] = $article_title;
 | 
			
		||||
                $item['enclosures'] = array();
 | 
			
		||||
                $item['content'] = $article_content;
 | 
			
		||||
                $item['timestamp'] = $article_time;
 | 
			
		||||
                $item['uid'] = $article_title;
 | 
			
		||||
                $this->items[] = $item;
 | 
			
		||||
            }
 | 
			
		||||
        if (!$json) {
 | 
			
		||||
            returnServerError('Keine Daten von der API erhalten.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Extrahiere den Sendungsnamen aus dem JSON
 | 
			
		||||
        $this->showName = $json['title'] ?? '';
 | 
			
		||||
 | 
			
		||||
        // Die Episoden befinden sich in blocks[1]['items']
 | 
			
		||||
        if (!isset($json['blocks'][1]['items']) || !is_array($json['blocks'][1]['items'])) {
 | 
			
		||||
            returnServerError('Keine Episoden gefunden.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        foreach ($json['blocks'][1]['items'] as $element) {
 | 
			
		||||
            $item = [];
 | 
			
		||||
 | 
			
		||||
            // Erstelle den Episodentitel
 | 
			
		||||
            $episodeTitle = $element['title'] ?? '';
 | 
			
		||||
            if (isset($element['seasonNumber']) && isset($element['episodeNumber'])) {
 | 
			
		||||
                $item['title'] = sprintf(
 | 
			
		||||
                    '%s S%02dE%02d %s',
 | 
			
		||||
                    $this->showName,
 | 
			
		||||
                    $element['seasonNumber'],
 | 
			
		||||
                    $element['episodeNumber'],
 | 
			
		||||
                    $episodeTitle
 | 
			
		||||
                );
 | 
			
		||||
            } else {
 | 
			
		||||
                $item['title'] = sprintf('%s %s', $this->showName, $episodeTitle);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Setze die Beschreibung
 | 
			
		||||
            $item['content'] = $element['description'] ?? '';
 | 
			
		||||
 | 
			
		||||
            // Erstelle die Episode-URL
 | 
			
		||||
            $episodeSlug = $element['alternateId'] ?? '';
 | 
			
		||||
            $item['uri'] = self::PLATFORM_URLS[$realm] . 'sendungen/' . $show . '/' . $episodeSlug;
 | 
			
		||||
 | 
			
		||||
            // Setze das Veröffentlichungsdatum
 | 
			
		||||
            if (isset($element['publishStart'])) {
 | 
			
		||||
                $item['timestamp'] = strtotime($element['publishStart']);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Setze die eindeutige ID
 | 
			
		||||
            $item['uid'] = $element['id'] ?? '';
 | 
			
		||||
 | 
			
		||||
            // Füge das Vorschaubild hinzu, falls vorhanden
 | 
			
		||||
            if (isset($element['poster']['src'])) {
 | 
			
		||||
                $item['enclosures'] = [$element['poster']['src']];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Setze den Sender als Autor
 | 
			
		||||
            $item['author'] = self::PLATFORM_NAMES[$realm];
 | 
			
		||||
 | 
			
		||||
            $this->items[] = $item;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getIcon() {
 | 
			
		||||
        $realm = $this->getInput('realm');
 | 
			
		||||
        return self::PLATFORM_URLS[$realm] . 'favicon.ico';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getURI() {
 | 
			
		||||
        $realm = $this->getInput('realm');
 | 
			
		||||
        $show = $this->getInput('show');
 | 
			
		||||
 | 
			
		||||
        if (empty($show)) {
 | 
			
		||||
            return self::PLATFORM_URLS[$realm];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return self::PLATFORM_URLS[$realm] . 'sendungen/' . $show;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user