2017-01-17 09:46:43 +01:00
|
|
|
<?php
|
2018-08-05 00:05:14 +02:00
|
|
|
namespace App\Entity\Repository;
|
2017-01-17 09:46:43 +01:00
|
|
|
|
2019-08-07 06:33:55 +02:00
|
|
|
use App\Entity;
|
2018-08-05 00:05:14 +02:00
|
|
|
use App\Radio\Adapters;
|
|
|
|
use App\Radio\Configuration;
|
2018-12-27 09:24:07 +01:00
|
|
|
use App\Radio\Frontend\AbstractFrontend;
|
2018-12-05 08:15:51 +01:00
|
|
|
use App\Sync\Task\Media;
|
2018-11-12 17:59:15 +01:00
|
|
|
use Azura\Doctrine\Repository;
|
2019-08-07 06:33:55 +02:00
|
|
|
use DI\Annotation\Inject;
|
2019-08-07 19:50:48 +02:00
|
|
|
use Psr\SimpleCache\CacheInterface;
|
2019-04-09 11:06:44 +02:00
|
|
|
use Symfony\Component\Validator\Validator\ValidatorInterface;
|
2017-01-17 09:46:43 +01:00
|
|
|
|
2018-11-12 17:59:15 +01:00
|
|
|
class StationRepository extends Repository
|
2017-01-17 09:46:43 +01:00
|
|
|
{
|
2019-08-07 06:33:55 +02:00
|
|
|
/**
|
|
|
|
* @Inject
|
|
|
|
* @var Media
|
|
|
|
*/
|
2018-12-05 08:15:51 +01:00
|
|
|
protected $media_sync;
|
|
|
|
|
2019-08-07 06:33:55 +02:00
|
|
|
/**
|
|
|
|
* @Inject
|
|
|
|
* @var Adapters
|
|
|
|
*/
|
2018-12-05 08:15:51 +01:00
|
|
|
protected $adapters;
|
|
|
|
|
2019-08-07 06:33:55 +02:00
|
|
|
/**
|
|
|
|
* @Inject
|
|
|
|
* @var Configuration
|
|
|
|
*/
|
2018-12-05 08:15:51 +01:00
|
|
|
protected $configuration;
|
|
|
|
|
2019-08-07 06:33:55 +02:00
|
|
|
/**
|
|
|
|
* @Inject
|
|
|
|
* @var ValidatorInterface
|
|
|
|
*/
|
2019-04-09 11:06:44 +02:00
|
|
|
protected $validator;
|
|
|
|
|
2019-08-07 06:33:55 +02:00
|
|
|
/**
|
|
|
|
* @Inject
|
2019-08-07 19:50:48 +02:00
|
|
|
* @var CacheInterface
|
2019-08-07 06:33:55 +02:00
|
|
|
*/
|
2019-01-26 21:38:36 +01:00
|
|
|
protected $cache;
|
|
|
|
|
2017-01-17 09:46:43 +01:00
|
|
|
/**
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public function fetchAll()
|
|
|
|
{
|
2019-03-23 22:43:22 +01:00
|
|
|
return $this->_em->createQuery(/** @lang DQL */'SELECT s FROM App\Entity\Station s ORDER BY s.name ASC')
|
2017-01-17 09:46:43 +01:00
|
|
|
->execute();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param bool $add_blank
|
|
|
|
* @param \Closure|NULL $display
|
|
|
|
* @param string $pk
|
|
|
|
* @param string $order_by
|
|
|
|
* @return array
|
|
|
|
*/
|
2017-01-24 01:35:16 +01:00
|
|
|
public function fetchSelect($add_blank = false, \Closure $display = null, $pk = 'id', $order_by = 'name')
|
2017-01-17 09:46:43 +01:00
|
|
|
{
|
2017-01-24 01:35:16 +01:00
|
|
|
$select = [];
|
2017-01-17 09:46:43 +01:00
|
|
|
|
|
|
|
// Specify custom text in the $add_blank parameter to override.
|
2017-01-24 01:35:16 +01:00
|
|
|
if ($add_blank !== false) {
|
|
|
|
$select[''] = ($add_blank === true) ? 'Select...' : $add_blank;
|
|
|
|
}
|
2017-01-17 09:46:43 +01:00
|
|
|
|
|
|
|
// Build query for records.
|
|
|
|
$results = $this->fetchArray();
|
|
|
|
|
|
|
|
// Assemble select values and, if necessary, call $display callback.
|
2019-01-31 18:54:17 +01:00
|
|
|
foreach ($results as $result) {
|
2017-01-17 09:46:43 +01:00
|
|
|
$key = $result[$pk];
|
2017-01-24 01:35:16 +01:00
|
|
|
$value = ($display === null) ? $result['name'] : $display($result);
|
2017-01-17 09:46:43 +01:00
|
|
|
$select[$key] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $select;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-01-31 18:54:17 +01:00
|
|
|
* @param string $short_code
|
2017-01-17 09:46:43 +01:00
|
|
|
* @return null|object
|
|
|
|
*/
|
|
|
|
public function findByShortCode($short_code)
|
|
|
|
{
|
2017-12-08 10:51:08 +01:00
|
|
|
return $this->findOneBy(['short_name' => $short_code]);
|
2017-01-17 09:46:43 +01:00
|
|
|
}
|
|
|
|
|
2019-01-26 21:38:36 +01:00
|
|
|
/**
|
|
|
|
* @param Entity\Station $record
|
|
|
|
*/
|
2019-04-09 11:06:44 +02:00
|
|
|
public function edit(Entity\Station $record): void
|
2019-01-26 21:38:36 +01:00
|
|
|
{
|
2019-04-09 11:06:44 +02:00
|
|
|
/** @var Entity\Station $original_record */
|
|
|
|
$original_record = $this->_em->getUnitOfWork()->getOriginalEntityData($record);
|
2019-01-26 21:38:36 +01:00
|
|
|
|
2019-04-09 11:06:44 +02:00
|
|
|
// Get the original values to check for changes.
|
|
|
|
$old_frontend = $original_record['frontend_type'];
|
|
|
|
$old_backend = $original_record['backend_type'];
|
2019-01-26 21:38:36 +01:00
|
|
|
|
|
|
|
$frontend_changed = ($old_frontend !== $record->getFrontendType());
|
|
|
|
$backend_changed = ($old_backend !== $record->getBackendType());
|
|
|
|
$adapter_changed = $frontend_changed || $backend_changed;
|
|
|
|
|
|
|
|
if ($frontend_changed) {
|
|
|
|
$frontend = $this->adapters->getFrontendAdapter($record);
|
|
|
|
$this->resetMounts($record, $frontend);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->configuration->writeConfiguration($record, $adapter_changed);
|
|
|
|
|
2019-08-07 19:50:48 +02:00
|
|
|
$this->cache->delete('stations');
|
2019-01-26 21:38:36 +01:00
|
|
|
}
|
|
|
|
|
2017-01-17 09:46:43 +01:00
|
|
|
/**
|
2019-04-09 11:06:44 +02:00
|
|
|
* Handle tasks necessary to a station's creation.
|
2017-01-17 09:46:43 +01:00
|
|
|
*
|
2019-04-09 11:06:44 +02:00
|
|
|
* @param Entity\Station $station
|
2017-01-17 09:46:43 +01:00
|
|
|
*/
|
2019-04-09 11:06:44 +02:00
|
|
|
public function create(Entity\Station $station): void
|
2017-01-17 09:46:43 +01:00
|
|
|
{
|
2017-05-10 11:27:22 +02:00
|
|
|
// Create path for station.
|
2018-02-13 17:31:10 +01:00
|
|
|
$station_base_dir = dirname(APP_INCLUDE_ROOT) . '/stations';
|
2017-05-10 11:27:22 +02:00
|
|
|
|
|
|
|
$station_dir = $station_base_dir . '/' . $station->getShortName();
|
|
|
|
$station->setRadioBaseDir($station_dir);
|
|
|
|
|
2017-01-17 09:46:43 +01:00
|
|
|
$this->_em->persist($station);
|
|
|
|
|
|
|
|
// Generate station ID.
|
|
|
|
$this->_em->flush();
|
|
|
|
|
|
|
|
// Scan directory for any existing files.
|
|
|
|
set_time_limit(600);
|
2018-12-05 08:15:51 +01:00
|
|
|
$this->media_sync->importMusic($station);
|
2017-01-17 09:46:43 +01:00
|
|
|
$this->_em->refresh($station);
|
|
|
|
|
2018-12-05 08:15:51 +01:00
|
|
|
$this->media_sync->importPlaylists($station);
|
2017-01-17 09:46:43 +01:00
|
|
|
$this->_em->refresh($station);
|
|
|
|
|
|
|
|
// Load adapters.
|
2018-12-05 08:15:51 +01:00
|
|
|
$frontend_adapter = $this->adapters->getFrontendAdapter($station);
|
|
|
|
$backend_adapter = $this->adapters->getBackendAdapter($station);
|
2017-01-17 09:46:43 +01:00
|
|
|
|
|
|
|
// Create default mountpoints if station supports them.
|
2018-02-01 12:49:40 +01:00
|
|
|
$this->resetMounts($station, $frontend_adapter);
|
2017-01-17 09:46:43 +01:00
|
|
|
|
|
|
|
// Load configuration from adapter to pull source and admin PWs.
|
2018-09-22 13:52:43 +02:00
|
|
|
$frontend_adapter->read($station);
|
2017-01-17 09:46:43 +01:00
|
|
|
|
|
|
|
// Write the adapter configurations and update supervisord.
|
2018-12-05 08:15:51 +01:00
|
|
|
$this->configuration->writeConfiguration($station, true);
|
2017-01-17 09:46:43 +01:00
|
|
|
|
|
|
|
// Save changes and continue to the last setup step.
|
|
|
|
$this->_em->persist($station);
|
|
|
|
$this->_em->flush();
|
|
|
|
|
2019-08-07 20:03:18 +02:00
|
|
|
$this->cache->delete('stations');
|
2017-01-17 09:46:43 +01:00
|
|
|
}
|
|
|
|
|
2017-04-13 00:19:02 +02:00
|
|
|
/**
|
|
|
|
* Reset mount points to their adapter defaults (in the event of an adapter change).
|
|
|
|
*
|
|
|
|
* @param Entity\Station $station
|
2018-12-27 09:24:07 +01:00
|
|
|
* @param AbstractFrontend $frontend_adapter
|
2017-04-13 00:19:02 +02:00
|
|
|
*/
|
2019-01-26 21:38:36 +01:00
|
|
|
public function resetMounts(Entity\Station $station, AbstractFrontend $frontend_adapter): void
|
2017-04-13 00:19:02 +02:00
|
|
|
{
|
2017-08-17 20:28:48 +02:00
|
|
|
foreach($station->getMounts() as $mount) {
|
2017-04-13 00:19:02 +02:00
|
|
|
$this->_em->remove($mount);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create default mountpoints if station supports them.
|
2018-09-22 13:52:43 +02:00
|
|
|
if ($frontend_adapter::supportsMounts()) {
|
2017-04-13 00:19:02 +02:00
|
|
|
// Create default mount points.
|
2018-09-22 13:52:43 +02:00
|
|
|
$mount_points = $frontend_adapter::getDefaultMounts();
|
2017-04-13 00:19:02 +02:00
|
|
|
|
|
|
|
foreach ($mount_points as $mount_point) {
|
2017-08-17 20:28:48 +02:00
|
|
|
$mount_record = new Entity\StationMount($station);
|
|
|
|
$this->fromArray($mount_record, $mount_point);
|
2017-04-13 00:19:02 +02:00
|
|
|
|
|
|
|
$this->_em->persist($mount_record);
|
|
|
|
}
|
2019-01-26 21:38:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
$this->_em->flush();
|
|
|
|
$this->_em->refresh($station);
|
|
|
|
}
|
2017-04-13 00:19:02 +02:00
|
|
|
|
2017-01-17 09:46:43 +01:00
|
|
|
/**
|
|
|
|
* @param Entity\Station $station
|
2017-12-08 10:51:08 +01:00
|
|
|
* @throws \Exception
|
2017-01-17 09:46:43 +01:00
|
|
|
*/
|
2019-01-26 21:38:36 +01:00
|
|
|
public function destroy(Entity\Station $station): void
|
2017-01-17 09:46:43 +01:00
|
|
|
{
|
2018-12-05 08:15:51 +01:00
|
|
|
$this->configuration->removeConfiguration($station);
|
2017-01-17 09:46:43 +01:00
|
|
|
|
|
|
|
// Remove media folders.
|
|
|
|
$radio_dir = $station->getRadioBaseDir();
|
2019-01-31 18:54:17 +01:00
|
|
|
\App\Utilities::rmdirRecursive($radio_dir);
|
2017-01-17 09:46:43 +01:00
|
|
|
|
|
|
|
// Save changes and continue to the last setup step.
|
|
|
|
$this->_em->remove($station);
|
2019-01-26 21:38:36 +01:00
|
|
|
$this->_em->flush($station);
|
|
|
|
|
2019-08-07 20:03:18 +02:00
|
|
|
$this->cache->delete('stations');
|
2019-01-26 21:38:36 +01:00
|
|
|
}
|
2018-08-05 00:05:14 +02:00
|
|
|
}
|