sintonia/legacy/application/forms/TuneInPreferences.php

110 lines
5.0 KiB
PHP

<?php
require_once 'customvalidators/ConditionalNotEmpty.php';
class Application_Form_TuneInPreferences extends Zend_Form_SubForm
{
public function init()
{
$this->setDecorators([
['ViewScript', ['viewScript' => 'form/preferences_tunein.phtml']],
]);
$enableTunein = new Zend_Form_Element_Checkbox('enable_tunein');
$enableTunein->setDecorators([
'ViewHelper',
'Errors',
'Label',
]);
$enableTunein->addDecorator('Label', ['class' => 'enable-tunein']);
$enableTunein->setLabel(_('Push metadata to your station on TuneIn?'));
$enableTunein->setValue(Application_Model_Preference::getTuneinEnabled());
$this->addElement($enableTunein);
$tuneinStationId = new Zend_Form_Element_Text('tunein_station_id');
$tuneinStationId->setLabel(_('Station ID:'));
$tuneinStationId->setValue(Application_Model_Preference::getTuneinStationId());
$tuneinStationId->setAttrib('class', 'input_text');
$this->addElement($tuneinStationId);
$tuneinPartnerKey = new Zend_Form_Element_Text('tunein_partner_key');
$tuneinPartnerKey->setLabel(_('Partner Key:'));
$tuneinPartnerKey->setValue(Application_Model_Preference::getTuneinPartnerKey());
$tuneinPartnerKey->setAttrib('class', 'input_text');
$this->addElement($tuneinPartnerKey);
$tuneinPartnerId = new Zend_Form_Element_Text('tunein_partner_id');
$tuneinPartnerId->setLabel(_('Partner Id:'));
$tuneinPartnerId->setValue(Application_Model_Preference::getTuneinPartnerId());
$tuneinPartnerId->setAttrib('class', 'input_text');
$this->addElement($tuneinPartnerId);
}
public function isValid($data)
{
$valid = true;
// Make request to TuneIn API to test the settings are valid.
// TuneIn does not have an API to make test requests to check if
// the credentials are correct. Therefore we will make a request
// with the commercial flag set to true, which removes the metadata
// from the station on TuneIn. After that, and if the test request
// succeeds, we will make another request with the real metadata.
if ($data['enable_tunein']) {
$credentialsQryStr = '?partnerId=' . $data['tunein_partner_id'] . '&partnerKey=' . $data['tunein_partner_key'] . '&id=' . $data['tunein_station_id'];
$commercialFlagQryStr = '&commercial=true';
$metadata = Application_Model_Schedule::getCurrentPlayingTrack();
if (is_null($metadata)) {
$qryStr = $credentialsQryStr . $commercialFlagQryStr;
} else {
$metadata['artist'] = empty($metadata['artist']) ? 'n/a' : $metadata['artist'];
$metadata['title'] = empty($metadata['title']) ? 'n/a' : $metadata['title'];
$metadataQryStr = '&artist=' . $metadata['artist'] . '&title=' . $metadata['title'];
$qryStr = $credentialsQryStr . $metadataQryStr;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, TUNEIN_API_URL . $qryStr);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$xmlData = curl_exec($ch);
if (curl_error($ch)) {
Logging::error('Failed to reach TuneIn: ' . curl_errno($ch) . ' - ' . curl_error($ch) . ' - ' . curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (curl_error($ch) == 'The requested URL returned error: 403 Forbidden') {
$this->getElement('enable_tunein')->setErrors([_('Invalid TuneIn Settings. Please ensure your TuneIn settings are correct and try again.')]);
$valid = false;
}
}
curl_close($ch);
if ($valid) {
$xmlObj = new SimpleXMLElement($xmlData);
if (!$xmlObj || $xmlObj->head->status != '200') {
$this->getElement('enable_tunein')->setErrors([_('Invalid TuneIn Settings. Please ensure your TuneIn settings are correct and try again.')]);
$valid = false;
} elseif ($xmlObj->head->status == '200') {
Application_Model_Preference::setLastTuneinMetadataUpdate(time());
$valid = true;
}
}
} else {
$valid = true;
}
if (!$valid) {
// Set values to what the user entered since the form is invalid so they
// don't have to enter in the values again and can see what they entered.
$this->getElement('enable_tunein')->setValue($data['enable_tunein']);
$this->getElement('tunein_partner_key')->setValue($data['tunein_partner_key']);
$this->getElement('tunein_partner_id')->setValue($data['tunein_partner_id']);
$this->getElement('tunein_station_id')->setValue($data['tunein_station_id']);
}
return $valid;
}
}