From 742928f1c2db9dcff7ee4ef3edc7e264cf6a0d8b Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Tue, 8 Aug 2017 15:14:43 -0400 Subject: [PATCH 001/210] Added a test to block to test criteria for smartblock refactoring --- .../models/database/BlockDbTest.php | 70 +++++++++++++++++++ .../models/database/datasets/seed_files.yml | 47 +++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 airtime_mvc/tests/application/models/database/BlockDbTest.php create mode 100644 airtime_mvc/tests/application/models/database/datasets/seed_files.yml diff --git a/airtime_mvc/tests/application/models/database/BlockDbTest.php b/airtime_mvc/tests/application/models/database/BlockDbTest.php new file mode 100644 index 000000000..f2ec203b9 --- /dev/null +++ b/airtime_mvc/tests/application/models/database/BlockDbTest.php @@ -0,0 +1,70 @@ +_connectionMock == null) { + $config = TestHelper::getDbZendConfig(); + + $connection = Zend_Db::factory('pdo_pgsql', $config); + + $this->_connectionMock = $this->createZendDbConnection( + $connection, + 'airtimeunittests' + ); + Zend_Db_Table_Abstract::setDefaultAdapter($connection); + } + return $this->_connectionMock; + } + + + /** + * Load a dataset into the database for the block database tests + * + * Defines how the initial state of the database should look before each test is executed + * Called once during setUp() and gets recreated for each new test + */ + public function getDataSet() + { + $dataset = new PHPUnit_Extensions_Database_DataSet_YamlDataSet(__DIR__ . '/datasets/seed_files.yml' ); + return $dataset; + } + + + /** + * Test if the single newest file is added to the Database + * + */ + + public function testGetListofFilesMeetCriteriaSingleMatch() { + TestHelper::loginUser(); + $CC_CONFIG = Config::getConfig(); + $testqry = CcFilesQuery::create(); + $testout = $testqry->find(); + $vd = $testout->getData(); + $ds = new Zend_Test_PHPUnit_Db_DataSet_QueryDataSet( + $this->getConnection() + ); + $testCriteria = BlockModelData::getCriteriaSingleNewestLabelNada(); + $bltest = new Application_Model_Block(); + $bltest->saveSmartBlockCriteria($testCriteria); + $tracks = $bltest->getListOfFilesUnderLimit(); + //$tracks = $bltest->getLength(); + $this->assertNotEmpty($tracks); + // need to load a example criteria into the database + } + +} \ No newline at end of file diff --git a/airtime_mvc/tests/application/models/database/datasets/seed_files.yml b/airtime_mvc/tests/application/models/database/datasets/seed_files.yml new file mode 100644 index 000000000..ce2cba1f0 --- /dev/null +++ b/airtime_mvc/tests/application/models/database/datasets/seed_files.yml @@ -0,0 +1,47 @@ +cc_files: + - + id: '1' + mime: 'audio/mp3' + ftype: 'audioclip' + directory: '1' + filepath: 'imported/1/oneminute.mp3' + mtime: '2017-08-06 04:27:36' + utime: '2017-08-06 04:26:47' + track_title: 'oneminute.mp3' + bit_rate: '320000' + sample_rate: '44100' + length: '00:01:00' + channels: '2' + genre: 'test' + label: 'nada' + owner_id: '1' + file_exists: 't' + hidden: 'f' + silan_check: 'f' + is_scheduled: 'f' + is_playlist: 'f' + filesize: '2586748' + + - + id: '2' + mime: 'audio/mp3' + ftype: 'audioclip' + directory: '1' + filepath: 'imported/1/fiveminute.mp3' + mtime: '2017-08-06 04:28:36' + utime: '2017-08-06 04:27:47' + track_title: 'fiveminute.mp3' + bit_rate: '320000' + sample_rate: '44100' + length: '00:05:00' + channels: '2' + genre: 'test' + label: 'nada' + owner_id: '1' + file_exists: 't' + hidden: 'f' + silan_check: 'f' + is_scheduled: 'f' + is_playlist: 'f' + filesize: '5126748' + From 505871865ae3afac862026475c522768225282db Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Wed, 9 Aug 2017 13:16:23 -0400 Subject: [PATCH 002/210] adding cc_music_dir to fix dependency on cc_file --- .../models/database/datasets/seed_files.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/airtime_mvc/tests/application/models/database/datasets/seed_files.yml b/airtime_mvc/tests/application/models/database/datasets/seed_files.yml index ce2cba1f0..4a7ab4464 100644 --- a/airtime_mvc/tests/application/models/database/datasets/seed_files.yml +++ b/airtime_mvc/tests/application/models/database/datasets/seed_files.yml @@ -1,3 +1,13 @@ + +cc_music_dirs: + - + id: '1' + directory: '/tmp/libretime-test' + type: 'stor' + exists: 't' + watched: 't' + + cc_files: - id: '1' From 919c77d8f1b081f79a6f66c10ddf8bc6be8672f5 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Wed, 9 Aug 2017 13:24:23 -0400 Subject: [PATCH 003/210] adding block model data --- .../application/testdata/BlockModelData.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 airtime_mvc/tests/application/testdata/BlockModelData.php diff --git a/airtime_mvc/tests/application/testdata/BlockModelData.php b/airtime_mvc/tests/application/testdata/BlockModelData.php new file mode 100644 index 000000000..f7dbf43d8 --- /dev/null +++ b/airtime_mvc/tests/application/testdata/BlockModelData.php @@ -0,0 +1,18 @@ + "sp_type", "value" => 0), + Array("name" => "sp_type", "value" => 0), + Array("name" => "sp_repeat_tracks", "value" => 0), + Array("name" => "sp_sort_options", "value" => "newest"), + Array("name" => "sp_limit_value", "value" => 1), + Array("name" => "sp_limit_options", "value" => "items"), + Array("name" => "sp_criteria_field_0_0", "value" => "label"), + Array("name" => "sp_criteria_modifier_0_0", "value" => "contains"), + Array("name" => "sp_criteria_value_0_0", "value" => "nada"), + ); + } +} \ No newline at end of file From 7b1d224c1a5d042f06c2ddeb1e807314624bd567 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Wed, 16 Aug 2017 00:12:16 -0400 Subject: [PATCH 004/210] added another test to the block test block --- .../models/database/BlockDbTest.php | 25 ++++ .../models/database/datasets/seed_files.yml | 120 ++++++++++++++++++ .../application/testdata/BlockModelData.php | 31 +++++ 3 files changed, 176 insertions(+) diff --git a/airtime_mvc/tests/application/models/database/BlockDbTest.php b/airtime_mvc/tests/application/models/database/BlockDbTest.php index f2ec203b9..1df24c40d 100644 --- a/airtime_mvc/tests/application/models/database/BlockDbTest.php +++ b/airtime_mvc/tests/application/models/database/BlockDbTest.php @@ -67,4 +67,29 @@ class BlockDbTest extends Zend_Test_PHPUnit_DatabaseTestCase //PHPUnit_Framework // need to load a example criteria into the database } + + /** + * Test if the single newest file is added to the Database + * + */ + + public function testMultiTrackandAlbumsGetLoaded() { + TestHelper::loginUser(); + $CC_CONFIG = Config::getConfig(); + $testqry = CcFilesQuery::create(); + $testout = $testqry->find(); + $vd = $testout->getData(); + $ds = new Zend_Test_PHPUnit_Db_DataSet_QueryDataSet( + $this->getConnection() + ); + $testCriteria = BlockModelData::getCriteriaMultiTrackAndAlbum1Hour(); + $bltest = new Application_Model_Block(); + $bltest->saveSmartBlockCriteria($testCriteria); + $tracks = $bltest->getListOfFilesUnderLimit(); + //$tracks = $bltest->getLength(); + $this->assertNotEmpty($tracks); + // add assertion that the length is less than 1 hour... + // need to load a example criteria into the database + } + } \ No newline at end of file diff --git a/airtime_mvc/tests/application/models/database/datasets/seed_files.yml b/airtime_mvc/tests/application/models/database/datasets/seed_files.yml index 4a7ab4464..c29094a97 100644 --- a/airtime_mvc/tests/application/models/database/datasets/seed_files.yml +++ b/airtime_mvc/tests/application/models/database/datasets/seed_files.yml @@ -55,3 +55,123 @@ cc_files: is_playlist: 'f' filesize: '5126748' + - + id: '3' + mime: 'audio/mp3' + ftype: 'audioclip' + directory: '1' + filepath: 'imported/1/track1.mp3' + mtime: '2017-08-06 04:28:36' + utime: '2017-08-06 04:27:47' + track_title: 'track1' + album_title: 'album1' + bit_rate: '320000' + sample_rate: '44100' + length: '00:01:30' + channels: '2' + genre: 'test' + label: 'nada' + owner_id: '1' + file_exists: 't' + hidden: 'f' + silan_check: 'f' + is_scheduled: 'f' + is_playlist: 'f' + filesize: '5126748' + + + id: '4' + mime: 'audio/mp3' + ftype: 'audioclip' + directory: '1' + filepath: 'imported/1/track2.mp3' + mtime: '2017-08-06 04:28:36' + utime: '2017-08-06 04:27:47' + track_title: 'track2' + album_title: 'album1' + bit_rate: '320000' + sample_rate: '44100' + length: '00:01:30' + channels: '2' + genre: 'test' + label: 'nada' + owner_id: '1' + file_exists: 't' + hidden: 'f' + silan_check: 'f' + is_scheduled: 'f' + is_playlist: 'f' + filesize: '5126748' + + id: '5' + mime: 'audio/mp3' + ftype: 'audioclip' + directory: '1' + filepath: 'imported/1/track3.mp3' + mtime: '2017-08-06 04:28:36' + utime: '2017-08-06 04:27:47' + track_title: 'track3' + album_title: 'album1' + bit_rate: '320000' + sample_rate: '44100' + length: '00:01:30' + channels: '2' + genre: 'test' + label: 'nada' + owner_id: '1' + file_exists: 't' + hidden: 'f' + silan_check: 'f' + is_scheduled: 'f' + is_playlist: 'f' + filesize: '5126748' + + + + id: '6' + mime: 'audio/mp3' + ftype: 'audioclip' + directory: '1' + filepath: 'imported/1/track1-2.mp3' + mtime: '2017-08-06 05:28:36' + utime: '2017-08-16 04:27:47' + track_title: 'track1' + album_title: 'album2' + bit_rate: '320000' + sample_rate: '44100' + length: '00:01:30' + channels: '2' + genre: 'test' + label: 'nada' + owner_id: '1' + file_exists: 't' + hidden: 'f' + silan_check: 'f' + is_scheduled: 'f' + is_playlist: 'f' + filesize: '5126748' + + + id: '7' + mime: 'audio/mp3' + ftype: 'audioclip' + directory: '1' + filepath: 'imported/1/track2-2.mp3' + mtime: '2017-08-06 04:28:36' + utime: '2017-08-06 04:27:47' + track_title: 'track2' + album_title: 'album2' + bit_rate: '320000' + sample_rate: '44100' + length: '00:01:30' + channels: '2' + genre: 'test' + label: 'nada' + owner_id: '1' + file_exists: 't' + hidden: 'f' + silan_check: 'f' + is_scheduled: 'f' + is_playlist: 'f' + filesize: '5126748' + diff --git a/airtime_mvc/tests/application/testdata/BlockModelData.php b/airtime_mvc/tests/application/testdata/BlockModelData.php index f7dbf43d8..5799a8912 100644 --- a/airtime_mvc/tests/application/testdata/BlockModelData.php +++ b/airtime_mvc/tests/application/testdata/BlockModelData.php @@ -15,4 +15,35 @@ Class BlockModelData Array("name" => "sp_criteria_value_0_0", "value" => "nada"), ); } + + + public static function getCriteriaMultiTrackAndAlbum1Hour() + { + return array ( + Array("name" => "sp_type" , "value" => 1), + Array("name" => "sp_repeat_tracks", "value" => 0), + Array("name" => "sp_sort_options", "value" => "random"), + Array("name" => "sp_limit_value", "value" => 1), + Array("name" => "sp_limit_options", "value" => "hours"), + Array("name" => "sp_criteria_field_0_0", "value" => "album_title"), + Array("name" => "sp_criteria_modifier_0_0", "value" => "is"), + Array("name" => "sp_criteria_value_0_0", "value" => "album1"), + Array("name" => "sp_criteria_field_0_1", "value" => "album_title"), + Array("name" => "sp_criteria_modifier_0_1", "value" => "is"), + Array("name" => "sp_criteria_value_0_1", "value" => "album2"), + Array("name" => "sp_criteria_field_1_0", "value" => "track_title"), + Array("name" => "sp_criteria_modifier_1_0", "value" => "is"), + Array("name" => "sp_criteria_value_1_0", "value" => "track1"), + Array("name" => "sp_criteria_field_1_1", "value" => "track_title"), + Array("name" => "sp_criteria_modifier_1_1", "value" => "is"), + Array("name" => "sp_criteria_value_1_1", "value" => "track2"), + Array("name" => "sp_criteria_field_1_2", "value" => "track_title"), + Array("name" => "sp_criteria_modifier_1_2", "value" => "is"), + Array("name" => "sp_criteria_value_1_2", "value" => "track3"), + Array("name" => "sp_criteria_field_2_0", "value" => "length"), + Array("name" => "sp_criteria_modifier_2_0", "value" => "is greater than"), + Array("name" => "sp_criteria_value_2_0", "value" => "00:01:00"), + ); + + } } \ No newline at end of file From 4625f8db208858d204915eb08d170781b0a2e1c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?VAN=20DER=20BIEST=20C=C3=A9lian?= Date: Fri, 10 Nov 2017 22:30:12 +0100 Subject: [PATCH 005/210] Adding a backup script Just have to set config, chmod +x and it works ;) --- utils/airtime-backup.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 utils/airtime-backup.sh diff --git a/utils/airtime-backup.sh b/utils/airtime-backup.sh new file mode 100644 index 000000000..afd8f9503 --- /dev/null +++ b/utils/airtime-backup.sh @@ -0,0 +1,30 @@ +sound_folder='/srv/airtime/stor/' +backup_folder='/home/example/backup/' +psql_user='airtime' +psql_password='airtime' + +## Remove old backup +rm -rf $backup_folder +mkdir $backup_folder + +## Backup of database + +echo 'db: Getting database...' +pg_dump --dbname='postgresql://'$psql_user':'$psql_password'@localhost/airtime' > $backup_folder'database' +echo 'db: Complete' + +## Backup of sounds + +mkdir $backup_folder'sounds/' + +echo 'stor : Copying sounds...' +rsync -r -a --info=progress2 $sound_folder $backup_folder'sounds/' +echo 'stor: Complete' + +## Backup of libretime config + +mkdir $backup_folder'airtime_config/' + +echo 'config: Copying config...' +rsync -r -a --info=progress2 /etc/airtime/ $backup_folder'airtime_config/' +echo 'config: Complete' From 1bec7b619cb5e9d9256105cc2a52de6f08411fd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?VAN=20DER=20BIEST=20C=C3=A9lian?= Date: Fri, 10 Nov 2017 22:32:18 +0100 Subject: [PATCH 006/210] Forgot #!/bin/bash --- utils/airtime-backup.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/airtime-backup.sh b/utils/airtime-backup.sh index afd8f9503..92356e15e 100644 --- a/utils/airtime-backup.sh +++ b/utils/airtime-backup.sh @@ -1,3 +1,5 @@ +#!/bin/bash + sound_folder='/srv/airtime/stor/' backup_folder='/home/example/backup/' psql_user='airtime' From f6386a60e748981b8750bfe73ad2b153b1f8d843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?VAN=20DER=20BIEST=20C=C3=A9lian?= Date: Sat, 11 Nov 2017 11:15:10 +0100 Subject: [PATCH 007/210] Rename airtime-backup.sh to libretime-backup.sh --- utils/{airtime-backup.sh => libretime-backup.sh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename utils/{airtime-backup.sh => libretime-backup.sh} (100%) diff --git a/utils/airtime-backup.sh b/utils/libretime-backup.sh similarity index 100% rename from utils/airtime-backup.sh rename to utils/libretime-backup.sh From 44427eca48fc6be44a66bcb5d62beb699dd46f03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?VAN=20DER=20BIEST=20C=C3=A9lian?= Date: Tue, 14 Nov 2017 23:07:26 +0100 Subject: [PATCH 008/210] auto credentials + back_up in arg Credentials are now getting automaticly and the back_up folder can be parse in arg ( optional ). --- utils/libretime-backup.sh | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/utils/libretime-backup.sh b/utils/libretime-backup.sh index 92356e15e..088236f8d 100644 --- a/utils/libretime-backup.sh +++ b/utils/libretime-backup.sh @@ -1,9 +1,21 @@ #!/bin/bash -sound_folder='/srv/airtime/stor/' -backup_folder='/home/example/backup/' -psql_user='airtime' -psql_password='airtime' +if [ -z "$1" ] + then + ## Use config + backup_folder=~/libretime_backup/ + else + ## User arg as config + backup_folder=$1 +fi + + +airtime_conf_path=/etc/airtime/airtime.conf +sound_folder=/srv/airtime/stor/ + +psdl_db=$(grep dbname ${airtime_conf_path} | awk '{print $3;}' ) +psql_user=$(grep dbuser ${airtime_conf_path} | awk '{print $3;}' ) +psql_password=$(grep dbpass ${airtime_conf_path} | awk '{print $3;}' ) ## Remove old backup rm -rf $backup_folder @@ -12,7 +24,7 @@ mkdir $backup_folder ## Backup of database echo 'db: Getting database...' -pg_dump --dbname='postgresql://'$psql_user':'$psql_password'@localhost/airtime' > $backup_folder'database' +pg_dump --dbname='postgresql://'$psql_user':'$psql_password'@localhost/'$psql_db > $backup_folder'database' echo 'db: Complete' ## Backup of sounds From 8a6f992aa57016a1b952d2a3be4c6d01834374c4 Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 21 Oct 2018 17:18:29 -0400 Subject: [PATCH 009/210] Increased podcast download timeout to 1800 seconds --- installer/systemd/airtime-celery.service | 2 +- python_apps/airtime-celery/install/conf/airtime-celery | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/installer/systemd/airtime-celery.service b/installer/systemd/airtime-celery.service index 51254e1d7..06feda985 100644 --- a/installer/systemd/airtime-celery.service +++ b/installer/systemd/airtime-celery.service @@ -7,7 +7,7 @@ User=celery Group=celery Environment=RMQ_CONFIG_FILE=/etc/airtime/airtime.conf WorkingDirectory=/srv/airtime -ExecStart=/usr/local/bin/celery worker -A airtime-celery.tasks:celery --time-limit=300 --concurrency=1 --config=celeryconfig -l INFO +ExecStart=/usr/local/bin/celery worker -A airtime-celery.tasks:celery --time-limit=1800 --concurrency=1 --config=celeryconfig -l INFO Restart=always [Install] diff --git a/python_apps/airtime-celery/install/conf/airtime-celery b/python_apps/airtime-celery/install/conf/airtime-celery index 3b1206738..cee05654b 100644 --- a/python_apps/airtime-celery/install/conf/airtime-celery +++ b/python_apps/airtime-celery/install/conf/airtime-celery @@ -8,7 +8,7 @@ CELERY_BIN="/usr/local/bin/celery" CELERY_APP="airtime-celery.tasks:celery" # Extra command-line arguments to the worker -CELERYD_OPTS="--time-limit=300 --concurrency=1 --config=celeryconfig" +CELERYD_OPTS="--time-limit=1800 --concurrency=1 --config=celeryconfig" # %N will be replaced with the first part of the nodename. CELERYD_LOG_FILE="/var/log/airtime/%N.log" From 95fbd2ccc52895df5ab2290cf95f53264c3c40b0 Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 22 Oct 2018 11:39:18 -0500 Subject: [PATCH 010/210] (docs) note bug with Butt 1.14+. Closes #160 --- docs/manual/stream-settings/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/manual/stream-settings/index.md b/docs/manual/stream-settings/index.md index 0e6d26ca4..452346e92 100644 --- a/docs/manual/stream-settings/index.md +++ b/docs/manual/stream-settings/index.md @@ -19,7 +19,9 @@ Click the **Save** button on the right side of the page to save any changes that Input stream settings --------------------- -On the lower left side of the Stream Settings page you can configure remote live input streams from DJ programs such as **Mixxx** or **IDJC**, or smartphone applications used by broadcast journalists. Airtime supports two types of live input stream; the **Show Source**, which enables a specific person to stream in during their own show, and the **Master Source**, which can override the Show Source if necessary. If neither type of live input is available, Airtime will fall back to **Scheduled Play** (playlists, smart blocks, remote streams and files scheduled in Airtime, in advance of or during a show). +On the lower left side of the Stream Settings page you can configure remote live input streams from DJ programs such as **Mixxx** or **IDJC**, or smartphone applications used by broadcast journalists. Note that a [bug](https://sourceforge.net/p/butt/bugs/12/) has been reported with **Butt** versions 1.14 to 1.16 that causes streams not to connect to LibreTime. Butt version 1.13 does appear to be working. + +Airtime supports two types of live input stream; the **Show Source**, which enables a specific person to stream in during their own show, and the **Master Source**, which can override the Show Source if necessary. If neither type of live input is available, Airtime will fall back to **Scheduled Play** (playlists, smart blocks, remote streams and files scheduled in Airtime, in advance of or during a show). The **Auto Switch Off** and **Auto Switch On** checkboxes enable playout to be switched automatically to the highest priority source whenever an authenticated input source disconnects from or connects to Airtime, respectively. The field **Switch Transition Fade** sets the length of the audio fade as scheduled playout is switched to a remote input source, and back. From 9bed0b79caffb6c74e16c2f722ad95cfaea60c5d Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 22 Oct 2018 18:43:49 -0500 Subject: [PATCH 011/210] Show playlist and smartblock contents on shorter screens. Fixes #574 --- airtime_mvc/public/css/dashboard.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/airtime_mvc/public/css/dashboard.css b/airtime_mvc/public/css/dashboard.css index 1c575ea0a..5ac64b006 100644 --- a/airtime_mvc/public/css/dashboard.css +++ b/airtime_mvc/public/css/dashboard.css @@ -585,11 +585,11 @@ li.ui-state-default { .spl_sortable { height: 100%; overflow: auto; - -webkit-flex: 1 100%; - -moz-flex: 1 100%; - -ms-flex: 1 100%; - -o-flex: 1 100%; - flex: 1 100%; + -webkit-flex: 1 0 100%; + -moz-flex: 1 0 100%; + -ms-flex: 1 0 100%; + -o-flex: 1 0 100%; + flex: 1 0 100%; margin: 4px 0; min-height: 0; From 0ae8969dd39c6a261d3c87549578e55d7da5b1f2 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Wed, 31 Oct 2018 08:06:59 -0400 Subject: [PATCH 012/210] Modified the database to turn on the podcast album override by default --- airtime_mvc/build/sql/defaultdata.sql | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/build/sql/defaultdata.sql b/airtime_mvc/build/sql/defaultdata.sql index 466420208..818276196 100644 --- a/airtime_mvc/build/sql/defaultdata.sql +++ b/airtime_mvc/build/sql/defaultdata.sql @@ -387,4 +387,9 @@ ANALYZE cc_pref; -- this validates the new partial index --end added in 2.5.14 -- For now, just needs to be truthy - to be updated later; we should find a better way to implement this... -INSERT INTO cc_pref("keystr", "valstr") VALUES('whats_new_dialog_viewed', 1); \ No newline at end of file +INSERT INTO cc_pref("keystr", "valstr") VALUES('whats_new_dialog_viewed', 1); + +--added for LibreTime to turn on podcast album override by default 3.0.0.alpha6 +INSERT INTO cc_pref("keystr", "valstr") VALUES('podcast_album_override', 1); +INSERT INTO cc_pref("keystr", "valstr") VALUES('podcast_auto_smartblock', 1); +-- end \ No newline at end of file From 8b6c41a4c62a8162d71f22cda144674c19b63f0c Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sun, 4 Nov 2018 14:30:07 +0100 Subject: [PATCH 013/210] :recycle: (utils) nuke airtime-nuke.sh --- utils/airtime-nuke.sh | 45 ------------------------------------------- 1 file changed, 45 deletions(-) delete mode 100755 utils/airtime-nuke.sh diff --git a/utils/airtime-nuke.sh b/utils/airtime-nuke.sh deleted file mode 100755 index 3ed1a14b1..000000000 --- a/utils/airtime-nuke.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -if [[ $EUID -ne 0 ]]; then - echo "This script must be run as root." 1>&2 - exit 1 -fi - -echo "This script deletes all traces of Airtime from your system," -echo "including files uploaded through the web interface." -echo "It will delete files from all known versions of Airtime." -echo -echo "Are you sure you want to do this? Press Enter to continue..." -read - -service airtime-playout stop >/dev/null 2>&1 -service airtime-liquidsoap stop >/dev/null 2>&1 -service airtime-media-monitor stop >/dev/null 2>&1 -service airtime-show-recorder stop >/dev/null 2>&1 - -airtime-pypo-stop >/dev/null 2>&1 -airtime-show-recorder-stop >/dev/null 2>&1 - -killall liquidsoap - -rm -rf "/etc/airtime" -rm -rf "/var/log/airtime" -rm -rf "/etc/service/pypo" -rm -rf "/etc/service/pypo-liquidsoap" -rm -rf "/etc/service/recorder" -rm -rf "/usr/share/airtime" -rm -rf "/var/tmp/airtime" -rm -rf "/var/www/airtime" -rm -rf "/usr/bin/airtime-*" -rm -rf "/usr/lib/airtime" -rm -rf "/var/lib/airtime" -rm -rf "/var/tmp/airtime" -rm -rf "/opt/pypo" -rm -rf "/opt/recorder" -rm -rf "/srv/airtime" -rm -rf "/etc/monit/conf.d/airtime-monit.cfg" -rm -rf /etc/monit/conf.d/monit-airtime-* - -echo "DROP DATABASE AIRTIME;" | su postgres -c psql -echo "DROP LANGUAGE plpgsql;" | su postgres -c psql -echo "DROP USER AIRTIME;" | su postgres -c psql From beabcba99bffeae76f994b5514493aee961f9d4f Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sun, 4 Nov 2018 14:42:37 +0100 Subject: [PATCH 014/210] :recycle: (utils) Remove unused make_tarball.sh --- utils/make_tarball.sh | 7 ------- 1 file changed, 7 deletions(-) delete mode 100755 utils/make_tarball.sh diff --git a/utils/make_tarball.sh b/utils/make_tarball.sh deleted file mode 100755 index bad81038e..000000000 --- a/utils/make_tarball.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -if [ -z "${1}" ]; then - echo "Usage: make_tarball.sh git_tag" - exit -fi -GIT_TAG=${1} -git archive ${GIT_TAG} --prefix ${GIT_TAG}/ -o "${GIT_TAG}".tar.gz From 46483bff0cd49621d3b7bf5bfd2c65f581c72317 Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 7 Nov 2018 18:34:45 -0600 Subject: [PATCH 015/210] correct sizing for playlist and smartblock contents pane. see #574 --- airtime_mvc/public/css/dashboard.css | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/airtime_mvc/public/css/dashboard.css b/airtime_mvc/public/css/dashboard.css index 5ac64b006..05c5d18c3 100644 --- a/airtime_mvc/public/css/dashboard.css +++ b/airtime_mvc/public/css/dashboard.css @@ -583,16 +583,15 @@ li.ui-state-default { } .spl_sortable { - height: 100%; + -webkit-flex: 1 0 auto; + -moz-flex: 1 0 auto; + -ms-flex: 1 0 auto; + -o-flex: 1 0 auto; + flex: 1 0 auto; overflow: auto; - -webkit-flex: 1 0 100%; - -moz-flex: 1 0 100%; - -ms-flex: 1 0 100%; - -o-flex: 1 0 100%; - flex: 1 0 100%; - margin: 4px 0; - min-height: 0; + min-height: 6em; + max-height: 100%; padding: 5px; border: 1px solid #444; border-radius: 3px; From 6b8bf52bb3ebb4c120181d8460388eb20566ae77 Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 7 Nov 2018 18:46:05 -0600 Subject: [PATCH 016/210] don't hide buttons below playlist and smartblock contents pane --- airtime_mvc/public/css/dashboard.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/public/css/dashboard.css b/airtime_mvc/public/css/dashboard.css index 05c5d18c3..d94b0f941 100644 --- a/airtime_mvc/public/css/dashboard.css +++ b/airtime_mvc/public/css/dashboard.css @@ -591,7 +591,7 @@ li.ui-state-default { overflow: auto; margin: 4px 0; min-height: 6em; - max-height: 100%; + max-height: calc(100% - 40px); padding: 5px; border: 1px solid #444; border-radius: 3px; From 05b62f92586c035a64a797929f912fb7cefa82bb Mon Sep 17 00:00:00 2001 From: jelko Date: Wed, 14 Nov 2018 01:14:53 +0100 Subject: [PATCH 017/210] Fixing failing version test Wrapping version in Array() to comply with SemVer new method signature. This should fix #487. --- .../application/views/helpers/VersionNotify.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/airtime_mvc/application/views/helpers/VersionNotify.php b/airtime_mvc/application/views/helpers/VersionNotify.php index dd6f6424b..e9b1e1421 100644 --- a/airtime_mvc/application/views/helpers/VersionNotify.php +++ b/airtime_mvc/application/views/helpers/VersionNotify.php @@ -45,16 +45,16 @@ class Airtime_View_Helper_VersionNotify extends Zend_View_Helper_Abstract { $isPreRelease = $isGitRelease || array_key_exists(4, $currentParts); // we are always interested in a major when we pre-release, hence the isPreRelease part - $majorCandidates = SemVer::satisfiedBy($latest, sprintf('>=%1$s-stable', $currentParts[0] + ($isPreRelease ? 0 : 1))); - $minorCandidates = SemVer::satisfiedBy($latest, sprintf('~%1$s.%2$s', $currentParts[0], $currentParts[1] + 1)); - $patchCandidates = SemVer::satisfiedBy($latest, sprintf('>=%1$s.%2$s.%3$s <%1$s.%3$s', $currentParts[0], $currentParts[1], $currentParts[2] + 1)); + $majorCandidates = SemVer::satisfiedBy(array($latest), sprintf('>=%1$s-stable', $currentParts[0] + ($isPreRelease ? 0 : 1))); + $minorCandidates = SemVer::satisfiedBy(array($latest), sprintf('~%1$s.%2$s', $currentParts[0], $currentParts[1] + 1)); + $patchCandidates = SemVer::satisfiedBy(array($latest), sprintf('>=%1$s.%2$s.%3$s <%1$s.%3$s', $currentParts[0], $currentParts[1], $currentParts[2] + 1)); $hasMajor = !empty($majorCandidates); $hasMinor = !empty($minorCandidates); $hasPatch = !empty($patchCandidates); $hasMultiMajor = count($majorCandidates) > 1; if ($isPreRelease) { - $stableVersions = SemVer::satisfiedBy($latest, sprintf('>=%1$s.%2$s.%3$s-stable', $currentParts[0], $currentParts[1], $currentParts[2])); + $stableVersions = SemVer::satisfiedBy(array($latest), sprintf('>=%1$s.%2$s.%3$s-stable', $currentParts[0], $currentParts[1], $currentParts[2])); // git releases are never interested in a stable version :P $hasStable = !empty($stableVersions) && !$isGitRelease; // no warning if no major release available, orange warning if you are on unreleased code @@ -71,7 +71,7 @@ class Airtime_View_Helper_VersionNotify extends Zend_View_Helper_Abstract { } else { $class = 'uptodate'; } - $latest = SemVer::rsort($latest); + $latest = SemVer::rsort(array($latest)); $highestVersion = $latest[0]; $data = (object) array( From 4b9e50b64b4304fcd5af01b514201a5d922f6a25 Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 19 Nov 2018 11:39:54 -0600 Subject: [PATCH 018/210] collapse advanced configuration sections in Schedule Dialog --- .../views/scripts/schedule/add-show-form.phtml | 8 ++++---- airtime_mvc/public/js/airtime/schedule/add-show.js | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/views/scripts/schedule/add-show-form.phtml b/airtime_mvc/application/views/scripts/schedule/add-show-form.phtml index 73a6591fc..918c3d2bc 100644 --- a/airtime_mvc/application/views/scripts/schedule/add-show-form.phtml +++ b/airtime_mvc/application/views/scripts/schedule/add-show-form.phtml @@ -11,10 +11,6 @@
what; ?>
-

-
- autoplaylist; ?> -

repeats; ?>
+

+
+ autoplaylist; ?> +

live; ?> diff --git a/airtime_mvc/public/js/airtime/schedule/add-show.js b/airtime_mvc/public/js/airtime/schedule/add-show.js index 921afa218..130c684a8 100644 --- a/airtime_mvc/public/js/airtime/schedule/add-show.js +++ b/airtime_mvc/public/js/airtime/schedule/add-show.js @@ -16,6 +16,14 @@ function openAddShowForm(nowOrFuture) { $("#add-show-form").show(); windowResize(); + + // collapse advanced configuration sections + $('#schedule-show-auto').hide(); + $('#live-stream-override').hide(); + $('#schedule-record-rebroadcast').hide(); + $('#schedule-show-who').hide(); + $('#schedule-show-style').hide(); + } $("#schedule-show-what").show(0, function(){ $add_show_name = $("#add_show_name"); From 11453785c0ae71b4f05d0d7804ca3d5b8b815fe7 Mon Sep 17 00:00:00 2001 From: Robb Date: Tue, 20 Nov 2018 13:31:34 -0500 Subject: [PATCH 019/210] Update install.md --- docs/install.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/install.md b/docs/install.md index 48fe281f6..9bb9efbcf 100644 --- a/docs/install.md +++ b/docs/install.md @@ -2,6 +2,8 @@ LibreTime should generally be installed on a dedicated host running Ubuntu 16.04 LTS (Xenial Xerus). +You can download LibreTime from our [github repo](https://github.com/LibreTime/libretime) In order to run the latest codebase you can click the green Clone or download button. It is recommended to type ``` git clone https://github.com/LibreTime/libretime.git ``` (if you Debian based system lacks git then you can type ``` sudo apt-get install git ```) and this will download the source code to your repository. You can also click Releases and download a tarball of our latest releases. You will then need to extract this archive into a directory on your server. It is not recommended that you install LibreTime on the same computer you are using as a desktop. So you will probably need to use wget for instance ```wget https://github.com/LibreTime/libretime/releases/download/3.0.0-alpha.6/libretime-3.0.0-alpha.6.tar.gz``` and then extract it by typing ```tar -xvzf libretime-3.0.0-alpha.6.tar.gz``` in the directory you downloaded it into. + Once you have downloaded and extracted the LibreTime repository, run the instalation script by navigating into the folder containing the LibreTime codebase, and run it's install script from the command line: :::bash From 4303a9d1e6b8d324817702c359333bd80bd65036 Mon Sep 17 00:00:00 2001 From: ryan Date: Tue, 20 Nov 2018 14:20:01 -0600 Subject: [PATCH 020/210] docs: add recomendations to instalation instructions --- docs/install.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/install.md b/docs/install.md index 9bb9efbcf..8f5760e01 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,13 +1,18 @@ # Installing LibreTime -LibreTime should generally be installed on a dedicated host running Ubuntu 16.04 LTS (Xenial Xerus). +LibreTime releases can be downloaded [here](https://github.com/LibreTime/libretime/releases). -You can download LibreTime from our [github repo](https://github.com/LibreTime/libretime) In order to run the latest codebase you can click the green Clone or download button. It is recommended to type ``` git clone https://github.com/LibreTime/libretime.git ``` (if you Debian based system lacks git then you can type ``` sudo apt-get install git ```) and this will download the source code to your repository. You can also click Releases and download a tarball of our latest releases. You will then need to extract this archive into a directory on your server. It is not recommended that you install LibreTime on the same computer you are using as a desktop. So you will probably need to use wget for instance ```wget https://github.com/LibreTime/libretime/releases/download/3.0.0-alpha.6/libretime-3.0.0-alpha.6.tar.gz``` and then extract it by typing ```tar -xvzf libretime-3.0.0-alpha.6.tar.gz``` in the directory you downloaded it into. +Recommendations: +- LibreTime should generally be installed on a dedicated host running Ubuntu 16.04 LTS (Xenial Xerus). +- LibreTime is undergoing active development, and is currently in ALPHA. +- It is not recommended that you install LibreTime on the same computer you are using as a desktop. +- Please review the release notes of the version you are planning on installing. -Once you have downloaded and extracted the LibreTime repository, run the instalation script by navigating into the folder containing the LibreTime codebase, and run it's install script from the command line: +Once you have downloaded and extracted LibreTime, run the instalation script by navigating into the folder containing the LibreTime codebase, and run it's install script from the command line: - :::bash - sudo ./install +``` +sudo ./install +``` By default, the installer will install and configure all dependencies. From 410523498ddf64c75528fbc09f3883fdbd75a275 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Wed, 21 Nov 2018 00:50:57 +0100 Subject: [PATCH 021/210] Revert "Fixing failing version test" This reverts commit 05b62f92586c035a64a797929f912fb7cefa82bb. --- .../application/views/helpers/VersionNotify.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/airtime_mvc/application/views/helpers/VersionNotify.php b/airtime_mvc/application/views/helpers/VersionNotify.php index e9b1e1421..dd6f6424b 100644 --- a/airtime_mvc/application/views/helpers/VersionNotify.php +++ b/airtime_mvc/application/views/helpers/VersionNotify.php @@ -45,16 +45,16 @@ class Airtime_View_Helper_VersionNotify extends Zend_View_Helper_Abstract { $isPreRelease = $isGitRelease || array_key_exists(4, $currentParts); // we are always interested in a major when we pre-release, hence the isPreRelease part - $majorCandidates = SemVer::satisfiedBy(array($latest), sprintf('>=%1$s-stable', $currentParts[0] + ($isPreRelease ? 0 : 1))); - $minorCandidates = SemVer::satisfiedBy(array($latest), sprintf('~%1$s.%2$s', $currentParts[0], $currentParts[1] + 1)); - $patchCandidates = SemVer::satisfiedBy(array($latest), sprintf('>=%1$s.%2$s.%3$s <%1$s.%3$s', $currentParts[0], $currentParts[1], $currentParts[2] + 1)); + $majorCandidates = SemVer::satisfiedBy($latest, sprintf('>=%1$s-stable', $currentParts[0] + ($isPreRelease ? 0 : 1))); + $minorCandidates = SemVer::satisfiedBy($latest, sprintf('~%1$s.%2$s', $currentParts[0], $currentParts[1] + 1)); + $patchCandidates = SemVer::satisfiedBy($latest, sprintf('>=%1$s.%2$s.%3$s <%1$s.%3$s', $currentParts[0], $currentParts[1], $currentParts[2] + 1)); $hasMajor = !empty($majorCandidates); $hasMinor = !empty($minorCandidates); $hasPatch = !empty($patchCandidates); $hasMultiMajor = count($majorCandidates) > 1; if ($isPreRelease) { - $stableVersions = SemVer::satisfiedBy(array($latest), sprintf('>=%1$s.%2$s.%3$s-stable', $currentParts[0], $currentParts[1], $currentParts[2])); + $stableVersions = SemVer::satisfiedBy($latest, sprintf('>=%1$s.%2$s.%3$s-stable', $currentParts[0], $currentParts[1], $currentParts[2])); // git releases are never interested in a stable version :P $hasStable = !empty($stableVersions) && !$isGitRelease; // no warning if no major release available, orange warning if you are on unreleased code @@ -71,7 +71,7 @@ class Airtime_View_Helper_VersionNotify extends Zend_View_Helper_Abstract { } else { $class = 'uptodate'; } - $latest = SemVer::rsort(array($latest)); + $latest = SemVer::rsort($latest); $highestVersion = $latest[0]; $data = (object) array( From c0124b6245dbd17decb2b5fd3e07f1380921375d Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Wed, 21 Nov 2018 02:21:52 +0100 Subject: [PATCH 022/210] :bug: returnn array of strings The downstream version checking code expects an array of strings and the "github is unreachable" default was returning a string. --- airtime_mvc/application/models/Preference.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 4dee92700..3e64bde6b 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -912,7 +912,7 @@ class Application_Model_Preference self::setValue('latest_version', json_encode($latest)); self::setValue('latest_version_nextcheck', strtotime('+1 week')); if (empty($latest)) { - return $config['airtime_version']; + return array($config['airtime_version']); } else { return $latest; } From b65c04039442bc144015509c7fa280d01d0605b6 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Wed, 21 Nov 2018 02:25:27 +0100 Subject: [PATCH 023/210] :recycle: only store versions on success We should only overwrite latest_version if retreiving from GitHub went ok, else we should keep the old values and store "null". --- airtime_mvc/application/models/Preference.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 3e64bde6b..368d3e52a 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -909,13 +909,13 @@ class Application_Model_Preference $versions[] = $item->get_title(); } $latest = $versions; - self::setValue('latest_version', json_encode($latest)); self::setValue('latest_version_nextcheck', strtotime('+1 week')); if (empty($latest)) { return array($config['airtime_version']); - } else { - return $latest; } + + self::setValue('latest_version', json_encode($latest)); + return $latest; } public static function SetLatestVersion($version) From 6031d953518b1f2f87d589de262e3a4a44e70ffc Mon Sep 17 00:00:00 2001 From: frecuencialibre <36803137+frecuencialibre@users.noreply.github.com> Date: Wed, 21 Nov 2018 09:37:18 -0600 Subject: [PATCH 024/210] docs: fix bullet list formatting in install.md --- docs/install.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/install.md b/docs/install.md index 8f5760e01..cfce019bb 100644 --- a/docs/install.md +++ b/docs/install.md @@ -3,6 +3,7 @@ LibreTime releases can be downloaded [here](https://github.com/LibreTime/libretime/releases). Recommendations: + - LibreTime should generally be installed on a dedicated host running Ubuntu 16.04 LTS (Xenial Xerus). - LibreTime is undergoing active development, and is currently in ALPHA. - It is not recommended that you install LibreTime on the same computer you are using as a desktop. From 954713763a5df2026e7adf292623e4ccccd4492c Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 21 Nov 2018 13:04:56 -0600 Subject: [PATCH 025/210] docs: remove references to deleted obselete instalation methods --- docs/manual/upgrading/index.md | 45 ++++--------------- .../using-the-airtime-import-script/index.md | 3 +- 2 files changed, 10 insertions(+), 38 deletions(-) diff --git a/docs/manual/upgrading/index.md b/docs/manual/upgrading/index.md index 31b9648fe..01122c1aa 100644 --- a/docs/manual/upgrading/index.md +++ b/docs/manual/upgrading/index.md @@ -1,5 +1,6 @@ -LibreTime 3.x versions support upgrading from Airtime 2.5.x versions. LibreTime -follows the [Semantic Versioning (semver)](http://semver.org/spec/v2.0.0.html) standards. +## LibreTime versioning + +LibreTime 3.x versions support upgrading from Airtime 2.5.x versions. LibreTime follows the [Semantic Versioning (semver)](http://semver.org/spec/v2.0.0.html) standards. In a nutshell, given a version number MAJOR.MINOR.PATCH we increment the: @@ -7,45 +8,17 @@ In a nutshell, given a version number MAJOR.MINOR.PATCH we increment the: 2. MINOR version when we add functionality in a backwards-compatible manner, and 3. PATCH version when we make backwards-compatible bug fixes. -Any pre-release versions of LibreTime are denoted by appending a hyphen and a series -of dot separated identifiers immediately following the patch version. This pre-release -indicates that the version is unstable in a sense that it might contain incomplete -features or not satisfy the intended compatibility requirements as per semver. +Any pre-release versions of LibreTime are denoted by appending a hyphen and a series of dot separated identifiers immediately following the patch version. This pre-release indicates that the version is unstable in a sense that it might contain incomplete features or not satisfy the intended compatibility requirements as per semver. -Before upgrading a production LibreTime server, you should back up both the PostgreSQL -database and the storage server used by LibreTime. This is especially important if you -have not already set up a regular back up routine. This extra back up is a safety measure -in case of accidental data loss during the upgrade, for example due to the wrong command -being entered when moving files. See [Backing up the server](../backing-up-the-server/) -in this manual for details of how to perform these back ups. +## Upgrading -If you have deployed LibreTime using the method shown in [Automated installation](../automated-installation/), -you can upgrade in the same way. A new LibreTime package available in -the repository can be installed with: +Before upgrading a production LibreTime server, you should back up both the PostgreSQL database and the storage server used by LibreTime. This is especially important if you have not already set up a regular back up routine. This extra back up is a safety measure in case of accidental data loss during the upgrade, for example due to the wrong command being entered when moving files. See [Backing up the server](../backing-up-the-server/) in this manual for details of how to perform these back ups. - sudo apt-get update - sudo apt-get upgrade +The LibreTime [installation script](../install) will detect an existing LibreTime or Airtime deployment and back up any configuration files that it finds. We recommend taking your own manual backups of the configuration yourself nevertheless. The install script also tries to restart the needed services during an upgrade. In any case you should monitor if this happened and also take a quick look at the logs files to be sure everything is still fine. Now might be the time to reboot the system or virtual machine LibreTime is running on since regular reboots are part of a healthy system anyway. -If you have used the method shown in [Manual installation](../manual-installation/), you should -repeat the installation steps of downloading and unpacking the tarball to an -installation directory, or pulling from the git repository with `git pull`, and -running the `./install` script. The installation script will detect an existing -LibreTime deployment and back up any configuration files that it finds. We recommend -taking your own manual backups of the configuration yourself nevertheless. +After the upgrade has completed, you may need to clear your web browser's cache before logging into the new version of the LibreTime administration interface. If the playout engine starts up and detects that a show should be playing at the current time, it will skip to the correct point in the current item and start playing. -The install script tries to restart the needed services during an upgrade. In any case -you should monitor if this happened and also take a quick look at the logs files to -be sure everything is still fine. Now might be the time to reboot the system or -virtual machine LibreTime is running on since regular reboots are part of a healthy -system anyway. - -After the upgrade has completed, you may need to clear your web browser's cache -before logging into the new version of the LibreTime administration interface. If -the playout engine starts up and detects that a show should be playing at the -current time, it will skip to the correct point in the current item and start playing. - -There will be tested ways to switch from a LibreTime pre-release to a packaged version -of LibreTime. +There will be tested ways to switch from a LibreTime pre-release to a packaged version of LibreTime. Airtime 2.5.x versions support upgrading from version 2.3.0 and above. If you are running a production server with a version of Airtime prior to 2.3.0, you should diff --git a/docs/manual/using-the-airtime-import-script/index.md b/docs/manual/using-the-airtime-import-script/index.md index 5c4a67d21..2271c134e 100644 --- a/docs/manual/using-the-airtime-import-script/index.md +++ b/docs/manual/using-the-airtime-import-script/index.md @@ -41,8 +41,7 @@ Airtime 2.5 for Broadcasters - **Installation** - [Preparing the server](../preparing-the-server/index.html) - [Easy setup](../easy-setup/index.html) -- [Automated installation](../automated-installation/index.html) -- [Manual installation](../manual-installation/index.html) +- [Installation](../install) - [Setting the server time](../setting-the-server-time/index.html) - **Administration** - [Preparing media for ingest](../preparing-media-for-ingest/index.html) From 1d7823468f8d5cd27e0cdf51bf4a05857ac47998 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Wed, 21 Nov 2018 02:04:20 +0100 Subject: [PATCH 026/210] :heavy_minus_sign: drop wheezy support Removes the Vagrant set up for Debian wheezy and makes the installer abort and complain if started on wheezy. --- Vagrantfile | 6 ------ docs/manual/preparing-the-server/index.md | 7 +------ docs/vagrant.md | 1 - install | 7 +++---- 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index f85987c79..a82b48cd0 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -60,12 +60,6 @@ Vagrant.configure("2") do |config| os.vm.box = "bento/debian-9.2" provision_libretime(os, "debian.sh", installer_args) end - config.vm.define "debian-wheezy" do |os| - STDERR.puts 'WARNING: The "debian-wheezy" option is deprecated. Please migrate to "debian-stretch".' - STDERR.puts - os.vm.box = "bento/debian-7.11" - provision_libretime(os, "debian.sh", installer_args) - end config.vm.define "centos" do |os| os.vm.box = 'centos/7' provision_libretime(os, "centos.sh", installer_args + "--selinux") diff --git a/docs/manual/preparing-the-server/index.md b/docs/manual/preparing-the-server/index.md index 1be5dac68..b3ebdf59c 100644 --- a/docs/manual/preparing-the-server/index.md +++ b/docs/manual/preparing-the-server/index.md @@ -234,12 +234,7 @@ and then run the command (as root): This should make sure that **rabbitmq-server** starts after the next reboot. -libav on Debian squeeze and .m4a files --------------------------------------- - -The version of libav shipped with Debian 6.0 'squeeze' is known to cause problems when Airtime analyses .m4a files containing the AAC codec for silence, using Silan (see ). It is recommended that Debian servers are upgraded to the current stable 'wheezy' 7.2 release. As a short-term measure, updated libav packages from the squeeze-backports repository can be used to work around this problem. This work-around is only required if you do not wish to upgrade to 'wheezy' yet, but have AAC codec .m4a files in your Airtime library. - Mail server ----------- -If you wish Airtime to be able to send password reminder emails to your staff users, the server can have an SMTP program installed, such as the **postfix** package in Debian or Ubuntu. For configuration options, refer to the documentation for your mail server of choice. Alternatively, you can specify an external SMTP server in the **Preferences** page on Airtime's **System** menu. \ No newline at end of file +If you wish Airtime to be able to send password reminder emails to your staff users, the server can have an SMTP program installed, such as the **postfix** package in Debian or Ubuntu. For configuration options, refer to the documentation for your mail server of choice. Alternatively, you can specify an external SMTP server in the **Preferences** page on Airtime's **System** menu. diff --git a/docs/vagrant.md b/docs/vagrant.md index 8a3ba6568..5e2fa3f6a 100644 --- a/docs/vagrant.md +++ b/docs/vagrant.md @@ -35,7 +35,6 @@ With the above instructions LibreTime is installed on Ubuntu Xenial Xerus. The V | ------ | ------------------- | ------- | | Debian 9.2 | `vagrant up debian-stretch` | Install on current Debian Stretch. | | Debian 8.7 | `vagrant up debian-jessie` | Install on Debian Jessie. | -| Debian 7.11 | `vagrant up debian-wheezy` | Deprecated install on Debian Wheezy. Please switch to debian-stretch. | | Ubuntu 18.04 | `vagrant up ubuntu-bionic` | Experimental install on current Ubuntu Bionic Beaver. | | Ubuntu 16.04 | `vagrant up ubuntu-xenial` | Install on Ubuntu Xenial Xerus. | | Ubuntu 14.04 | `vagrant up ubuntu-trusty` | Deprecated install on Ubuntu Trusty Tahir. Recommended by legacy upstream. | diff --git a/install b/install index a4ad3f3b4..a180365eb 100755 --- a/install +++ b/install @@ -586,7 +586,6 @@ fi is_debian_dist=false is_debian_stretch=false is_debian_jessie=false -is_debian_wheezy=false is_ubuntu_dist=false is_ubuntu_bionic=false is_ubuntu_xenial=false @@ -636,9 +635,9 @@ case "${dist}-${code}" in is_debian_jessie=true ;; debian-7|debian-wheezy) - code="wheezy" - is_debian_dist=true - is_debian_wheezy=true + echo -e "ERROR: Debian Wheezy is archived and does not receive any security or other updates since 2018-05-31." >&2 + echo -e "The LibreTime installer dropped support for installing LibreTime on Wheezy in 3.0.0-alpha.6." >&2 + exit 1 ;; centos-7) is_centos_dist=true From c759f8b8aa5f1f0aba1d307947fcfede7396c14a Mon Sep 17 00:00:00 2001 From: Robbt Date: Sat, 24 Nov 2018 17:08:39 -0500 Subject: [PATCH 027/210] Initial proof of concept for time remaining smart block limit --- .../application/forms/SmartBlockCriteria.php | 3 ++- airtime_mvc/application/models/Block.php | 21 ++++++++++++++++--- airtime_mvc/application/models/Scheduler.php | 10 ++++++--- .../application/models/ShowInstance.php | 6 ++++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/airtime_mvc/application/forms/SmartBlockCriteria.php b/airtime_mvc/application/forms/SmartBlockCriteria.php index b83a6e208..693f5c342 100644 --- a/airtime_mvc/application/forms/SmartBlockCriteria.php +++ b/airtime_mvc/application/forms/SmartBlockCriteria.php @@ -159,7 +159,8 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm $this->limitOptions = array( "hours" => _("hours"), "minutes" => _("minutes"), - "items" => _("items") + "items" => _("items"), + "remaining" => _("remaining time in show") ); } return $this->limitOptions; diff --git a/airtime_mvc/application/models/Block.php b/airtime_mvc/application/models/Block.php index 37bc92341..c45a4ae01 100644 --- a/airtime_mvc/application/models/Block.php +++ b/airtime_mvc/application/models/Block.php @@ -1310,9 +1310,13 @@ SQL; } } - public function getListOfFilesUnderLimit() + /* + * + */ + + public function getListOfFilesUnderLimit($show = null) { - $info = $this->getListofFilesMeetCriteria(); + $info = $this->getListofFilesMeetCriteria($show); $files = $info['files']; $limit = $info['limit']; $repeat = $info['repeat_tracks']; @@ -1467,7 +1471,7 @@ SQL; } // this function return list of propel object - public function getListofFilesMeetCriteria() + public function getListofFilesMeetCriteria($show = null) { $storedCrit = $this->getCriteria(); @@ -1605,6 +1609,17 @@ SQL; if ($storedCrit['limit']['modifier'] == "items") { $limits['time'] = 1440 * 60; $limits['items'] = $storedCrit['limit']['value']; + } elseif (($storedCrit['limit']['modifier'] == "remaining") ){ + // show will be null unless being called inside a show instance + if (!(is_null($show))) { + $showInstance = new Application_Model_ShowInstance($show); + $limits['time'] = $showInstance->getSecondsRemaining(); + $limits['items'] = null; + } + else { + $limits['time'] = 1440 * 60; + $limits['items'] = null; + } } else { $limits['time'] = $storedCrit['limit']['modifier'] == "hours" ? intval(floatval($storedCrit['limit']['value']) * 60 * 60) : diff --git a/airtime_mvc/application/models/Scheduler.php b/airtime_mvc/application/models/Scheduler.php index cf542dce5..ef031554f 100644 --- a/airtime_mvc/application/models/Scheduler.php +++ b/airtime_mvc/application/models/Scheduler.php @@ -207,10 +207,11 @@ final class Application_Model_Scheduler /* * @param $id * @param $type + * @param $show * * @return $files */ - private function retrieveMediaFiles($id, $type) + private function retrieveMediaFiles($id, $type, $show) { $files = array(); @@ -337,7 +338,7 @@ final class Application_Model_Scheduler } else { $defaultFadeIn = Application_Model_Preference::GetDefaultFadeIn(); $defaultFadeOut = Application_Model_Preference::GetDefaultFadeOut(); - $dynamicFiles = $bl->getListOfFilesUnderLimit(); + $dynamicFiles = $bl->getListOfFilesUnderLimit($show); foreach ($dynamicFiles as $f) { $fileId = $f['id']; $file = CcFilesQuery::create()->findPk($fileId); @@ -788,11 +789,14 @@ final class Application_Model_Scheduler Logging::debug(floatval($pend) - floatval($pstart)); } + // passing $schedule["instance"] so that the instance being scheduled + // can be used to determine the remaining time + // in the case of a fill remaining time smart block if (is_null($filesToInsert)) { $filesToInsert = array(); foreach ($mediaItems as $media) { $filesToInsert = array_merge($filesToInsert, - $this->retrieveMediaFiles($media["id"], $media["type"])); + $this->retrieveMediaFiles($media["id"], $media["type"], $schedule["instance"])); } } diff --git a/airtime_mvc/application/models/ShowInstance.php b/airtime_mvc/application/models/ShowInstance.php index 3dddf80c8..511a83d8a 100644 --- a/airtime_mvc/application/models/ShowInstance.php +++ b/airtime_mvc/application/models/ShowInstance.php @@ -476,6 +476,12 @@ SQL; return intval($ends->format('U')) - intval($starts->format('U')); } + // should return the amount of seconds remaining to be scheduled in a show instance + public function getSecondsRemaining() + { + return ($this->getDurationSecs() - $this->getTimeScheduledSecs()); + } + public function getPercentScheduled() { $durationSeconds = $this->getDurationSecs(); From 74cd668301c9eee0605276ae849fde5a429d1fe7 Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 25 Nov 2018 11:36:18 -0500 Subject: [PATCH 028/210] fixed repeating smartblock to not overflow time limit --- airtime_mvc/application/models/Block.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/models/Block.php b/airtime_mvc/application/models/Block.php index 37bc92341..a061dc131 100644 --- a/airtime_mvc/application/models/Block.php +++ b/airtime_mvc/application/models/Block.php @@ -1355,14 +1355,22 @@ SQL; $sizeOfInsert = count($insertList); // if block is not full and repeat_track is check, fill up more + // additionally still don't overflow the limit while (!$isBlockFull && $repeat == 1 && $sizeOfInsert > 0) { Logging::debug("adding repeated tracks."); Logging::debug("total time = " . $totalTime); $randomEleKey = array_rand(array_slice($insertList, 0, $sizeOfInsert)); - $insertList[] = $insertList[$randomEleKey]; - $totalTime += $insertList[$randomEleKey]['length']; - $totalItems++; + + $projectedTime = $totalTime + $insertList[$randomEleKey]['length']; + if ($projectedTime > $limit['time']) { + $totalItems++; + } + else { + $insertList[] = $insertList[$randomEleKey]; + $totalTime += $insertList[$randomEleKey]['length']; + $totalItems++; + } if ((!is_null($limit['items']) && $limit['items'] == count($insertList)) || $totalItems > 500 || $totalTime > $limit['time']) { break; From 93658cb6e86bb9b55542f35765979a9ac8206ef4 Mon Sep 17 00:00:00 2001 From: "nik.martin" Date: Sun, 25 Nov 2018 13:01:31 -0500 Subject: [PATCH 029/210] typos --- docs/install.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/install.md b/docs/install.md index cfce019bb..9c8126578 100644 --- a/docs/install.md +++ b/docs/install.md @@ -9,7 +9,8 @@ Recommendations: - It is not recommended that you install LibreTime on the same computer you are using as a desktop. - Please review the release notes of the version you are planning on installing. -Once you have downloaded and extracted LibreTime, run the instalation script by navigating into the folder containing the LibreTime codebase, and run it's install script from the command line: +Once you have downloaded and extracted LibreTime, run the installation script by navigating into the +folder containing the LibreTime codebase, and run it's install script from the command line: ``` sudo ./install @@ -18,7 +19,9 @@ sudo ./install By default, the installer will install and configure all dependencies. ## Alternative OS installations -Instalation in Debian 9 and other Linux distributions is possible, but multiple outstanding issues have yet to be resolved. Instalation on Ubuntu 14.04.5 LTS (Trusty Tahr) is also working, but deprecated due to the fact that this version will reach its official end of life in April 2019. +Installation in Debian 9 and other Linux distributions is possible, but multiple outstanding issues have yet +to be resolved. Installation on Ubuntu 14.04.5 LTS (Trusty Tahr) is also working, but deprecated due to the +fact that this version will reach its official end of life in April 2019. Plans are in the works for `.deb` and `.rpm` packages, as well as Docker and AWS images. From 08147a3ae7aed612039fcf7d4e2995de0b0e0871 Mon Sep 17 00:00:00 2001 From: "nik.martin" Date: Sun, 25 Nov 2018 13:15:05 -0500 Subject: [PATCH 030/210] Replace Airtime with LibreTime Line breaks at 120ish columns Fixes checkbox 2 of #376 --- docs/manual/getting-started/index.md | 65 +++++++++++++++------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/docs/manual/getting-started/index.md b/docs/manual/getting-started/index.md index 831fa3cc3..a0e584f97 100644 --- a/docs/manual/getting-started/index.md +++ b/docs/manual/getting-started/index.md @@ -1,20 +1,26 @@ -If the server is only being used for Airtime and has a web browser installed, you can access the administration interface directly on that server by opening the address: +If the server is only being used for LibreTime and has a web browser installed, you can access the administration interface +directly on that server by opening the address: http://localhost/ -If you have set up Airtime so that it can be accessed from other computers, you would use a domain name instead. For example: +If you have set up LibreTime so that it can be accessed from other computers, you would use a domain name instead. For +example: - https://airtime.example.com/ + https://libretime.example.com/ -You can log in for the first time with the user name *admin* and the password set during installation. Your browser should automatically focus on the **Username** field. +You can log in for the first time with the user name *admin* and the password set during installation. Your browser should +automatically focus on the **Username** field. ![](static/Screenshot465-Airtime_login.png) -If you enter the password incorrectly three times, you will be presented with a reCAPTCHA challenge to prove that you are a human, and not a password-guessing robot. This feature helps protect your Airtime installation against brute force attacks. +If you enter the password incorrectly three times, you will be presented with a reCAPTCHA challenge to prove that you are +a human, and not a password-guessing robot. This feature helps protect your LibreTime installation against brute force +attacks. ![](static/Screenshot466-Recaptcha_login.png) -If activated, you will see a link **Reset password** below the password field, which enables users to obtain a password reminder by email. See the chapter *Preferences* for configuration details. +If activated, you will see a link **Reset password** below the password field, which enables users to obtain a password +reminder by email. See the chapter *Preferences* for configuration details. ![](static/Screenshot467-Reset_password_link.png)  @@ -22,50 +28,48 @@ The **E-mail** address you enter must match the address stored in the database f ![](static/Screenshot468-Restore_password.png) -Register Airtime ----------------- - -After you have logged in as *admin* for the first time, a pop-up window will ask if you wish to send technical support data about your server to Sourcefabric. - -![](static/Screenshot389-Yes_help_Airtime.png) - -These details can be viewed by clicking on the **Show me what I am sending** link, which expands a scrolling window. The data helps Sourcefabric engineers resolve any problems with your Airtime installation, as well as count the number of installations worldwide. - - - -Sourcefabric has a privacy policy regarding data collection, which you can read by clicking the link to further down. After checking the **Send support feedback** and **privacy policy** boxes, you can submit the data by clicking the **Yes, help Airtime** button. - -This window also offers the opportunity to **Promote my station on Sourcefabric.org** (on the page ) by checking the box. Fill in the form which will appear with some details about your station. The contact details are only requested for verification purposes, and will not be made available to the public. Click the **Browse** button to select a **Station Logo** image from the file manager on your computer. - -![](static/Screenshot391-Promote_my_station.png) The Master Panel ---------------- -After the pop-up window is closed, you should now see the **Master Panel**, which is present at the top of every page of the Airtime interface. On the left hand side, the Master Panel displays the details of the **Previous** file played out, the current file playing (with an orange progress bar and time elapsed/time remaining), and the details of the **Next** file due to play. It also displays the name and scheduled time of the current show, with a blue progress bar. +After the pop-up window is closed, you should now see the **Master Panel**, which is present at the top of every page of +the LibreTime interface. On the left hand side, the Master Panel displays the details of the **Previous** file played out, +the current file playing (with an orange progress bar and time elapsed/time remaining), and the details of the **Next** +file due to play. It also displays the name and scheduled time of the current show, with a blue progress bar. -Beneath this side of the Master Panel is the main navigation menu, with sub-menus labelled **Now Playing**, **Add Media**, **Library**, **Calendar**, **System**, **History** and **Help**. We'll be looking at the contents of these menus in the following chapters of this book. +Beneath this side of the Master Panel is the main navigation menu, with sub-menus labelled **Now Playing**, **Add Media**, +**Library**, **Calendar**, **System**, **History** and **Help**. We'll be looking at the contents of these menus in the +following chapters of this book. -On the right hand side of the Master Panel are the switches for the **Source Streams**, which enable you to switch from scheduled play to remote live sources, and back. (See the chapter *Stream settings* for details of this feature). The **On Air** indicator turns from dark grey to red whenever audio is being played out. Underneath this indicator is a **Listen** button, which opens a pop-up player that can be used to audition the available playout streams. +On the right hand side of the Master Panel are the switches for the **Source Streams**, which enable you to switch from +scheduled play to remote live sources, and back. (See the chapter *Stream settings* for details of this feature). The +**On Air** indicator turns from dark grey to red whenever audio is being played out. Underneath this indicator is a +**Listen** button, which opens a pop-up player that can be used to audition the available playout streams. -There is also a clock indicating the **Station time** and time zone. Beneath the clock and just to the left, the name of the user currently logged in is displayed, and there is the link for you to **Logout**.  +There is also a clock indicating the **Station time** and time zone. Beneath the clock and just to the left, the name of +the user currently logged in is displayed, and there is the link for you to **Logout**.  ![](static/Screenshot469-On_Air_light.png) -Clicking the username link opens a page in which you can update your Airtime password, contact details, language and time zone preferences. Click the **Save** button once you have made the changes that you require. +Clicking the username link opens a page in which you can update your LibreTime password, contact details, language and time +zone preferences. Click the **Save** button once you have made the changes that you require. ![](static/Screenshot470-User_settings.png) -On the right of the Logout link, clicking the green check mark opens a pop-up window with information about the version of Airtime installed. If your Airtime installation is not the latest version available, the green check mark changes to a green upgrade arrow. Should your Airtime installation get too far out of date, this arrow will change to a red exclamation mark. +On the right of the Logout link, clicking the green check mark opens a pop-up window with information about the version of +LibreTime installed. If your LibreTime installation is not the latest version available, the green check mark changes to a +green upgrade arrow. Should your LibreTime installation get too far out of date, this arrow will change to a red exclamation +mark. Checking an Icecast server -------------------------- -If you have installed an Icecast streaming media server, you can check that Icecast is running by opening its default server port of 8000 in your web browser. For example, on the server itself, you can use: +If you have installed an Icecast streaming media server, you can check that Icecast is running by opening its default server +port of 8000 in your web browser. For example, on the server itself, you can use: http://localhost:8000 @@ -73,6 +77,7 @@ or from another machine, using the domain name of the Icecast server: http://streaming.example.com:8000 -You should see the Icecast status page, with details of any connections that your Airtime server has made to this Icecast server. If you have only just installed Airtime, there may not be any media playing out yet. +You should see the Icecast status page, with details of any connections that your LibreTime server has made to this Icecast +server. If you have only just installed LibreTime, there may not be any media playing out yet. ![](static/Screenshot293-Icecast_status_page.png) From e7c7f215d5bea1e4a36134d50b6734efaddf441f Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 25 Nov 2018 13:16:26 -0500 Subject: [PATCH 031/210] Added the option to allow smartblocks to overflow their time limits to the UI --- .../application/forms/SmartBlockCriteria.php | 8 +++ airtime_mvc/application/models/Block.php | 72 ++++++++++++++----- .../scripts/form/smart-block-criteria.phtml | 15 ++++ airtime_mvc/public/css/styles.css | 2 +- .../js/airtime/playlist/smart_blockbuilder.js | 22 ++++++ docs/manual/library/index.md | 6 +- 6 files changed, 106 insertions(+), 19 deletions(-) diff --git a/airtime_mvc/application/forms/SmartBlockCriteria.php b/airtime_mvc/application/forms/SmartBlockCriteria.php index b83a6e208..757b09356 100644 --- a/airtime_mvc/application/forms/SmartBlockCriteria.php +++ b/airtime_mvc/application/forms/SmartBlockCriteria.php @@ -446,6 +446,14 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm } $this->addElement($repeatTracks); + $overflowTracks = new Zend_Form_Element_Checkbox('sp_overflow_tracks'); + $overflowTracks->setDecorators(array('viewHelper')) + ->setLabel(_('Overflow Time Limit:')); + if (isset($storedCrit["overflow_tracks"])) { + $overflowTracks->setChecked($storedCrit["overflow_tracks"]["value"] == 1?true:false); + } + $this->addElement($overflowTracks); + $sort = new Zend_Form_Element_Select('sp_sort_options'); $sort->setAttrib('class', 'sp_input_select') ->setDecorators(array('viewHelper')) diff --git a/airtime_mvc/application/models/Block.php b/airtime_mvc/application/models/Block.php index a061dc131..9fe070efc 100644 --- a/airtime_mvc/application/models/Block.php +++ b/airtime_mvc/application/models/Block.php @@ -1262,13 +1262,22 @@ SQL; ->save(); - // insert repeate track option + // insert repeat track option $qry = new CcBlockcriteria(); $qry->setDbCriteria("repeat_tracks") ->setDbModifier("N/A") ->setDbValue($p_criteriaData['etc']['sp_repeat_tracks']) ->setDbBlockId($this->id) ->save(); + + // insert overflow track option + $qry = new CcBlockcriteria(); + $qry->setDbCriteria("overflow_tracks") + ->setDbModifier("N/A") + ->setDbValue($p_criteriaData['etc']['sp_overflow_tracks']) + ->setDbBlockId($this->id) + ->save(); + } /** @@ -1316,6 +1325,7 @@ SQL; $files = $info['files']; $limit = $info['limit']; $repeat = $info['repeat_tracks']; + $overflow = $info['overflow_tracks']; $insertList = array(); $totalTime = 0; @@ -1332,17 +1342,27 @@ SQL; $id = $iterator->current()->getDbId(); $fileLength = $iterator->current()->getCueLength(); $length = Application_Common_DateHelper::calculateLengthInSeconds($fileLength); - // need to check to determine if the track will make the playlist exceed the totalTime before adding it - // this can be quite processor consuming so as a workaround I used the totalItems limit to prevent the - // algorithm from parsing too many items. - $projectedTime = $totalTime + $length; - if ($projectedTime > $limit['time']) { - $totalItems++; - } - else { + // if the block is setup to allow the overflow of tracks this will add the next track even if it becomes + // longer than the time limit + if ($overflow == 1) { $insertList[] = array('id' => $id, 'length' => $length); $totalTime += $length; $totalItems++; + } + // otherwise we need to check to determine if the track will make the playlist exceed the totalTime before + // adding it this could loop through a lot of tracks so I used the totalItems limit to prevent + // the algorithm from parsing too many items. + + else { + $projectedTime = $totalTime + $length; + if ($projectedTime > $limit['time']) { + $totalItems++; + } + else { + $insertList[] = array('id' => $id, 'length' => $length); + $totalTime += $length; + $totalItems++; + } } if ((!is_null($limit['items']) && $limit['items'] == count($insertList)) || $totalItems > 500 || $totalTime > $limit['time']) { $isBlockFull = true; @@ -1361,16 +1381,24 @@ SQL; Logging::debug("total time = " . $totalTime); $randomEleKey = array_rand(array_slice($insertList, 0, $sizeOfInsert)); - - $projectedTime = $totalTime + $insertList[$randomEleKey]['length']; - if ($projectedTime > $limit['time']) { - $totalItems++; - } - else { + // this will also allow the overflow of tracks so that time limited smart blocks will schedule until they + // are longer than the time limit rather than never scheduling past the time limit + if ($overflow == 1) { $insertList[] = $insertList[$randomEleKey]; $totalTime += $insertList[$randomEleKey]['length']; $totalItems++; } + else { + $projectedTime = $totalTime + $insertList[$randomEleKey]['length']; + if ($projectedTime > $limit['time']) { + $totalItems++; + } + else { + $insertList[] = $insertList[$randomEleKey]; + $totalTime += $insertList[$randomEleKey]['length']; + $totalItems++; + } + } if ((!is_null($limit['items']) && $limit['items'] == count($insertList)) || $totalItems > 500 || $totalTime > $limit['time']) { break; @@ -1457,6 +1485,8 @@ SQL; "display_modifier"=>_($modifier)); } else if($criteria == "repeat_tracks") { $storedCrit["repeat_tracks"] = array("value"=>$value); + } else if($criteria == "overflow_tracks") { + $storedCrit["overflow_tracks"] = array("value"=>$value); } else if($criteria == "sort") { $storedCrit["sort"] = array("value"=>$value); } else { @@ -1622,17 +1652,25 @@ SQL; } $repeatTracks = 0; + $overflowTracks = 0; + if (isset($storedCrit['repeat_tracks'])) { $repeatTracks = $storedCrit['repeat_tracks']['value']; } - + + if (isset($storedCrit['overflow_tracks'])) { + $overflowTracks = $storedCrit['overflow_tracks']['value']; + } + + try { $out = $qry->setFormatter(ModelCriteria::FORMAT_ON_DEMAND)->find(); - return array("files"=>$out, "limit"=>$limits, "repeat_tracks"=> $repeatTracks, "count"=>$out->count()); + return array("files"=>$out, "limit"=>$limits, "repeat_tracks"=> $repeatTracks, "overflow_tracks"=> $overflowTracks, "count"=>$out->count()); } catch (Exception $e) { Logging::info($e); } + } public static function organizeSmartPlaylistCriteria($p_criteria) { diff --git a/airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml b/airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml index 3f46c828a..7dccbb7d6 100644 --- a/airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml +++ b/airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml @@ -33,6 +33,21 @@ +
+ +
+
+ element->getElement('sp_overflow_tracks')?> + element->getElement("sp_overflow_tracks")->hasErrors()) : ?> + element->getElement("sp_overflow_tracks")->getMessages() as $error): ?> + + + + + + +
+
diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index e9e8ac4ff..c227fdd43 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -203,7 +203,7 @@ img.logo .airtime_auth_help_icon, .custom_auth_help_icon, .stream_username_help_icon, .playlist_type_help_icon, .repeat_tracks_help_icon, .show_linking_help_icon, -.admin_username_help_icon, .stream_type_help_icon, +.admin_username_help_icon, .stream_type_help_icon, .overflow_tracks_help_icon, .show_timezone_help_icon{ cursor: help; position: relative; diff --git a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js index 15ca8b52f..88aaa5e6f 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js @@ -529,6 +529,28 @@ function setupUI() { at: "right center" } }); + + + $(".overflow_tracks_help_icon").qtip({ + content: { + text: sprintf($.i18n._("The smartblock will normally schedule up to but not over the time limit. This will usually result in a smartblock that is less than the time limit set if there are no tracks short enough to fill the remaining time. Enable this option if you want to add tracks until it is longer than the smartblock. Any tracks longer than the smartblock limit maybe cut off during playback if they exceed a shows boundaries."), PRODUCT_NAME) + }, + hide: { + delay: 500, + fixed: true + }, + style: { + border: { + width: 0, + radius: 4 + }, + classes: "ui-tooltip-dark ui-tooltip-rounded" + }, + position: { + my: "left bottom", + at: "right center" + } + }); } /* Utilizing jQuery this function finds the #datetime_select element on the given row diff --git a/docs/manual/library/index.md b/docs/manual/library/index.md index 3c1a79249..579152226 100644 --- a/docs/manual/library/index.md +++ b/docs/manual/library/index.md @@ -102,7 +102,11 @@ To add an AND criteria, such as **Creator** containing *jimi* AND BPM in the ran By default, a smart block will not contain repeated items, which will limit the duration of the block if you do not have sufficient items meeting the specified criteria in your **Library**. To override the default behaviour, check the **Allow Repeat Tracks** box. The **Sort tracks by** menu offers the options of **random**, **newest** or **oldest** items first. -Smart block repeat tracks +![](static/Screenshot582-Smart_block_repeat_tracks.png) + +In addition Smart Blocks by default will never overflow the Time Limit. For instance if you set a time limit of 1 hour. It will add tracks to the schedule until it can't add any more tracks without exceeding the hour. This is to prevent tracks from being cut-off because they exceed the time limit of a show. + +If you want a smartblock to schedule tracks until it is longer than the Time Limit you can check Overflow Time Limit. This will make LibreTime add tracks that meet the criteria until it equals or is longer than the time limit. The was the default behaviour with the Airtime software. If you have a large number of files which meet the criteria that you specify, you may wish to limit the duration of the smart block using the **Limit to** field, so that it fits within the show you have in mind. Select **hours**, **minutes** or **items** from the drop-down menu, and click the **Generate** button again, if it is a static smart block. Then click the **Save** button. From d3ba5d46b06f3cfb9eaa51ef04a0d4228b6d7366 Mon Sep 17 00:00:00 2001 From: Nik Martin Date: Sun, 25 Nov 2018 21:45:20 +0000 Subject: [PATCH 032/210] add LibreTime login screenshot --- docs/manual/getting-started/index.md | 2 +- .../getting-started/static/Screenshot-Login.png | Bin 0 -> 58692 bytes .../static/Screenshot465-Airtime_login.png | Bin 61382 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/manual/getting-started/static/Screenshot-Login.png delete mode 100644 docs/manual/getting-started/static/Screenshot465-Airtime_login.png diff --git a/docs/manual/getting-started/index.md b/docs/manual/getting-started/index.md index a0e584f97..444e8de48 100644 --- a/docs/manual/getting-started/index.md +++ b/docs/manual/getting-started/index.md @@ -11,7 +11,7 @@ example: You can log in for the first time with the user name *admin* and the password set during installation. Your browser should automatically focus on the **Username** field. -![](static/Screenshot465-Airtime_login.png) +![](static/Screenshot-Login.png) If you enter the password incorrectly three times, you will be presented with a reCAPTCHA challenge to prove that you are a human, and not a password-guessing robot. This feature helps protect your LibreTime installation against brute force diff --git a/docs/manual/getting-started/static/Screenshot-Login.png b/docs/manual/getting-started/static/Screenshot-Login.png new file mode 100644 index 0000000000000000000000000000000000000000..1ddd97fdd848d30a881164366bdf14d4ffa27639 GIT binary patch literal 58692 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

3|mB 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 From 62348073d508b35d8677a6afb8c4db8835e66d23 Mon Sep 17 00:00:00 2001 From: Nik Martin Date: Sun, 25 Nov 2018 21:50:48 +0000 Subject: [PATCH 033/210] delete editor tmp files --- .../js/waveformplaylist/observer/observer.js~ | 57 ------------------- .../waveformplaylist/templates/bottombar.tpl~ | 25 -------- 2 files changed, 82 deletions(-) delete mode 100644 airtime_mvc/public/js/waveformplaylist/observer/observer.js~ delete mode 100644 airtime_mvc/public/js/waveformplaylist/templates/bottombar.tpl~ diff --git a/airtime_mvc/public/js/waveformplaylist/observer/observer.js~ b/airtime_mvc/public/js/waveformplaylist/observer/observer.js~ deleted file mode 100644 index 2367a50f9..000000000 --- a/airtime_mvc/public/js/waveformplaylist/observer/observer.js~ +++ /dev/null @@ -1,57 +0,0 @@ -/* -Code taken from http://www.jspatterns.com/book/7/observer-game.html - -Pub/Sub -*/ - -var publisher = { - subscribers: { - any: [] - }, - on: function (type, fn, context) { - type = type || 'any'; - fn = typeof fn === "function" ? fn : context[fn]; - - if (typeof this.subscribers[type] === "undefined") { - this.subscribers[type] = []; - } - this.subscribers[type].push({fn: fn, context: context || this}); - }, - remove: function (type, fn, context) { - this.visitSubscribers('unsubscribe', type, fn, context); - }, - fire: function (type, publication) { - this.visitSubscribers('publish', type, publication); - }, - reset: function (type) { - - }, - visitSubscribers: function (action, type, arg, context) { - var pubtype = type || 'any', - subscribers = this.subscribers[pubtype], - i, - max = subscribers ? subscribers.length : 0; - - for (i = 0; i < max; i += 1) { - if (action === 'publish') { - subscribers[i].fn.call(subscribers[i].context, arg); - } - else { - if (subscribers[i].fn === arg && subscribers[i].context === context) { - subscribers.splice(i, 1); - } - } - } - } -}; - - -function makePublisher(o) { - var i; - for (i in publisher) { - if (publisher.hasOwnProperty(i) && typeof publisher[i] === "function") { - o[i] = publisher[i]; - } - } - o.subscribers = {any: []}; -} diff --git a/airtime_mvc/public/js/waveformplaylist/templates/bottombar.tpl~ b/airtime_mvc/public/js/waveformplaylist/templates/bottombar.tpl~ deleted file mode 100644 index bd2d2051c..000000000 --- a/airtime_mvc/public/js/waveformplaylist/templates/bottombar.tpl~ +++ /dev/null @@ -1,25 +0,0 @@ -

- - - - - - From 0db186321edbf5028a348cf71f10cd9b0efb7162 Mon Sep 17 00:00:00 2001 From: Nik Martin Date: Sun, 25 Nov 2018 22:20:22 +0000 Subject: [PATCH 034/210] remove reference to pop-up on Master Panel replace main menu screenshot add master panel screen shot revert added line breaks --- docs/manual/getting-started/index.md | 25 +++++++----------- .../static/Screenshot-MainMenu.png | Bin 0 -> 35135 bytes .../static/Screenshot-MasterPanel.png | Bin 0 -> 12034 bytes .../static/Screenshot542-Main_menus_250.png | Bin 20292 -> 0 bytes 4 files changed, 10 insertions(+), 15 deletions(-) create mode 100644 docs/manual/getting-started/static/Screenshot-MainMenu.png create mode 100644 docs/manual/getting-started/static/Screenshot-MasterPanel.png delete mode 100644 docs/manual/getting-started/static/Screenshot542-Main_menus_250.png diff --git a/docs/manual/getting-started/index.md b/docs/manual/getting-started/index.md index 444e8de48..39dea47e9 100644 --- a/docs/manual/getting-started/index.md +++ b/docs/manual/getting-started/index.md @@ -1,26 +1,21 @@ -If the server is only being used for LibreTime and has a web browser installed, you can access the administration interface -directly on that server by opening the address: +If the server is only being used for LibreTime and has a web browser installed, you can access the administration interface directly on that server by opening the address: http://localhost/ -If you have set up LibreTime so that it can be accessed from other computers, you would use a domain name instead. For -example: +If you have set up LibreTime so that it can be accessed from other computers, you would use a domain name instead. For example: https://libretime.example.com/ -You can log in for the first time with the user name *admin* and the password set during installation. Your browser should -automatically focus on the **Username** field. +You can log in for the first time with the user name *admin* and the password set during installation. Your browser should automatically focus on the **Username** field. ![](static/Screenshot-Login.png) -If you enter the password incorrectly three times, you will be presented with a reCAPTCHA challenge to prove that you are -a human, and not a password-guessing robot. This feature helps protect your LibreTime installation against brute force +If you enter the password incorrectly three times, you will be presented with a reCAPTCHA challenge to prove that you are a human, and not a password-guessing robot. This feature helps protect your LibreTime installation against brute force attacks. ![](static/Screenshot466-Recaptcha_login.png) -If activated, you will see a link **Reset password** below the password field, which enables users to obtain a password -reminder by email. See the chapter *Preferences* for configuration details. +If activated, you will see a link **Reset password** below the password field, which enables users to obtain a password reminder by email. See the chapter *Preferences* for configuration details. ![](static/Screenshot467-Reset_password_link.png)  @@ -32,16 +27,16 @@ The **E-mail** address you enter must match the address stored in the database f The Master Panel ---------------- -After the pop-up window is closed, you should now see the **Master Panel**, which is present at the top of every page of -the LibreTime interface. On the left hand side, the Master Panel displays the details of the **Previous** file played out, +The **Master Panel** is present at the top of every page of the LibreTime interface. On the left hand side, the Master Panel displays the details of the **Previous** file played out, the current file playing (with an orange progress bar and time elapsed/time remaining), and the details of the **Next** file due to play. It also displays the name and scheduled time of the current show, with a blue progress bar. -Beneath this side of the Master Panel is the main navigation menu, with sub-menus labelled **Now Playing**, **Add Media**, -**Library**, **Calendar**, **System**, **History** and **Help**. We'll be looking at the contents of these menus in the +![](static/Screenshot-MasterPanel.png) + +Beneath this side of the Master Panel is the main navigation menu. We'll be looking at the contents of these menus in the following chapters of this book. - +![](static/Screenshot-MainMenu.png) On the right hand side of the Master Panel are the switches for the **Source Streams**, which enable you to switch from scheduled play to remote live sources, and back. (See the chapter *Stream settings* for details of this feature). The diff --git a/docs/manual/getting-started/static/Screenshot-MainMenu.png b/docs/manual/getting-started/static/Screenshot-MainMenu.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca8234b18eb3647bd2bebef85a42a191621ad72 GIT binary patch literal 35135 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.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 YdWD3x?vH*~|J{+OtLP}#D%rmO4 Date: Sun, 25 Nov 2018 18:28:14 -0500 Subject: [PATCH 035/210] Made overflow tracks set checked simpler --- airtime_mvc/application/forms/SmartBlockCriteria.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/forms/SmartBlockCriteria.php b/airtime_mvc/application/forms/SmartBlockCriteria.php index 757b09356..c05bf6cf2 100644 --- a/airtime_mvc/application/forms/SmartBlockCriteria.php +++ b/airtime_mvc/application/forms/SmartBlockCriteria.php @@ -450,7 +450,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm $overflowTracks->setDecorators(array('viewHelper')) ->setLabel(_('Overflow Time Limit:')); if (isset($storedCrit["overflow_tracks"])) { - $overflowTracks->setChecked($storedCrit["overflow_tracks"]["value"] == 1?true:false); + $overflowTracks->setChecked($storedCrit["overflow_tracks"]["value"] == 1); } $this->addElement($overflowTracks); From aa8a331fcf41006b57c63a97b0bbac0a4b8d8409 Mon Sep 17 00:00:00 2001 From: Nik Martin Date: Mon, 26 Nov 2018 00:38:01 +0000 Subject: [PATCH 036/210] cleanup garbage on import script page and add note about current state of script --- .../using-the-airtime-import-script/index.md | 72 +------------------ 1 file changed, 3 insertions(+), 69 deletions(-) diff --git a/docs/manual/using-the-airtime-import-script/index.md b/docs/manual/using-the-airtime-import-script/index.md index 2271c134e..00199419b 100644 --- a/docs/manual/using-the-airtime-import-script/index.md +++ b/docs/manual/using-the-airtime-import-script/index.md @@ -1,75 +1,9 @@ -[Sourcefabric Manuals](http://sourcefabric.booktype.pro/) - -- [Sign In / Create Account](http://sourcefabric.booktype.pro/accounts/signin/?redirect=/airtime-25-for-broadcasters/using-the-airtime-import-script/) - - English |  Español |  Français |  Italiano |  Português |  Русский |  Shqip - -- [Books](http://sourcefabric.booktype.pro/list-books/) -- [Groups](http://sourcefabric.booktype.pro/list-groups/) -- [People](http://sourcefabric.booktype.pro/list-people/) - -Airtime 2.5 for Broadcasters ----------------------------- - -- **Introduction** -- [What is Airtime?](../index.html) -- [Rights and royalties](../rights-and-royalties/index.html) -- **Using Airtime** -- [On air in 60 seconds!](../on-air-in-60-seconds/index.html) -- [Getting started](../getting-started/index.html) -- [Smartphone journalism](../smartphone-journalism/index.html) -- **The System menu** -- [Preferences](../preferences/index.html) -- [Users](../users/index.html) -- [Media folders](../media-folders/index.html) -- [Stream settings](../stream-settings/index.html) -- [Support feedback](../support-feedback/index.html) -- [Status](../status/index.html) -- [Listener stats](../listener-stats/index.html) -- **The main menus** -- [Now playing](../now-playing/index.html) -- [Add media](../add-media/index.html) -- [Library](../library/index.html) -- [Calendar](../calendar/index.html) -- [History](../playout-history/index.html) -- [Listen](../listen/index.html) -- [Help](../help/index.html) -- **Airtime in the studio** -- [Recording shows](../recording-shows/index.html) -- [Live shows with Mixxx](../live-shows-with-mixxx/index.html) -- [Icecast and SHOUTcast](../icecast-and-shoutcast/index.html) -- **Installation** -- [Preparing the server](../preparing-the-server/index.html) -- [Easy setup](../easy-setup/index.html) -- [Installation](../install) -- [Setting the server time](../setting-the-server-time/index.html) -- **Administration** -- [Preparing media for ingest](../preparing-media-for-ingest/index.html) -- [Using the airtime-import script](index.html) -- [The airtime-log command](../the-airtime-log-command/index.html) -- [Backing up the server](../backing-up-the-server/index.html) -- [Upgrading](../upgrading/index.html) -- [Troubleshooting](../troubleshooting/index.html) -- [Using Monit](../using-monit/index.html) -- **Advanced configuration** -- [Automated file import](../automated-file-import/index.html) -- [Icecast handover](../icecast-handover/index.html) -- [Promoting your station](../promoting-your-station/index.html) -- [Stream player for your website](../stream-player-for-your-website/index.html) -- [Exporting the schedule](../exporting-the-schedule/index.html) -- [Interface customization](../interface-customization/index.html) -- [Interface localization and Git](../interface-localization/index.html) -- [Host configuration](../host-configuration/index.html) -- [Airtime API authentication](../airtime-api-authentication/index.html) -- [Secure login with SSL or TLS](../secure-login-with-ssl/index.html) -- [Icecast statistics with Piwik](../icecast-statistics-with-piwik/index.html) -- **Appendix** -- [HD Audio Models](../hd-audio-models/index.html) -- [About this manual](../about-this-manual/index.html) - Using the import script ======================= +###NOTE: This page has issues, as the import script is not currently functional + + If you have a large number of files in your media library, importing these files one at a time into a broadcast automation system would be time-consuming and tedious. That's why Airtime includes a script that can import an entire directory of files in one go. Copying versus watching From 0cf27e91e26db5ee9584d4a7272126f58773b042 Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 26 Nov 2018 10:56:56 -0600 Subject: [PATCH 037/210] Rename "autoloading playlists", add help texts --- .../application/forms/AddShowAutoPlaylist.php | 4 +-- .../scripts/form/add-show-autoplaylist.phtml | 2 ++ .../scripts/schedule/add-show-form.phtml | 2 +- airtime_mvc/public/css/add-show.css | 3 ++ airtime_mvc/public/css/radio-page/custom.css | 15 +++++++++ airtime_mvc/public/css/styles.css | 4 +-- .../public/js/airtime/schedule/add-show.js | 32 ++++++++++++------- 7 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 airtime_mvc/public/css/radio-page/custom.css diff --git a/airtime_mvc/application/forms/AddShowAutoPlaylist.php b/airtime_mvc/application/forms/AddShowAutoPlaylist.php index bb4cead12..c987480b2 100644 --- a/airtime_mvc/application/forms/AddShowAutoPlaylist.php +++ b/airtime_mvc/application/forms/AddShowAutoPlaylist.php @@ -15,7 +15,7 @@ class Application_Form_AddShowAutoPlaylist extends Zend_Form_SubForm // Add autoplaylist checkbox element $this->addElement('checkbox', 'add_show_has_autoplaylist', array( - 'label' => _('Auto Schedule Playlist ?'), + 'label' => _('Add Autoloading Playlist ?'), 'required' => false, 'class' => 'input_text', 'decorators' => array('ViewHelper') @@ -29,7 +29,7 @@ class Application_Form_AddShowAutoPlaylist extends Zend_Form_SubForm $this->addElement($autoPlaylistSelect); // Add autoplaylist checkbox element $this->addElement('checkbox', 'add_show_autoplaylist_repeat', array( - 'label' => _('Repeat AutoPlaylist Until Show is Full ?'), + 'label' => _('Repeat Playlist Until Show is Full ?'), 'required' => false, 'class' => 'input_text', 'decorators' => array('ViewHelper') diff --git a/airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml b/airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml index 5d5eda5f6..a694866a8 100644 --- a/airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml +++ b/airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml @@ -7,9 +7,11 @@
element->getElement('add_show_has_autoplaylist') ?> +
+

More information"); ?>

-

+

autoplaylist; ?>
diff --git a/airtime_mvc/public/css/add-show.css b/airtime_mvc/public/css/add-show.css index 772c49007..371c471c3 100644 --- a/airtime_mvc/public/css/add-show.css +++ b/airtime_mvc/public/css/add-show.css @@ -85,6 +85,9 @@ label.wrapp-label input[type="checkbox"] { #schedule-add-show fieldset dd input[type="checkbox"] { margin-top: 6px; } +#schedule-show-auto input[type="checkbox"] { + margin-left: 6px; +} #add_show_day_check-element.block-display { margin-bottom: 15px; diff --git a/airtime_mvc/public/css/radio-page/custom.css b/airtime_mvc/public/css/radio-page/custom.css new file mode 100644 index 000000000..5e138b105 --- /dev/null +++ b/airtime_mvc/public/css/radio-page/custom.css @@ -0,0 +1,15 @@ +#schedule_iframe, .tab_content { + color: #fff; + text-align: center; + width: 770px; + max-width: 770px; + margin: -70px auto 0px -380px; + height: calc(100vh - 200px) !important; + padding: 10px; + padding-left: 10px; + margin-bottom: -100px; + padding-top: 50px; + position: absolute; + left: 50%; + overflow: hidden; +} \ No newline at end of file diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index e9e8ac4ff..cfcd3f51c 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -210,8 +210,9 @@ img.logo display:inline-block; zoom:1; width:14px; height:14px; background:url(images/icon_info.png) 0 0 no-repeat; - top:2px; right:7px; left: 3px; + left: 3px; line-height:16px !important; + vertical-align: text-top; } /* Clearfix */ @@ -2888,7 +2889,6 @@ dt.block-display.info-block { text-align:center; letter-spacing:-.3px; text-shadow: rgba(248,248,248,.3) 0 1px 0, rgba(0,0,0,.8) 0 -1px 0; - rgba(51,51,51,.9) } .error-content p { color: #acacac; diff --git a/airtime_mvc/public/js/airtime/schedule/add-show.js b/airtime_mvc/public/js/airtime/schedule/add-show.js index 130c684a8..4d9a8417b 100644 --- a/airtime_mvc/public/js/airtime/schedule/add-show.js +++ b/airtime_mvc/public/js/airtime/schedule/add-show.js @@ -310,17 +310,6 @@ function setAddShowEvents(form) { $(this).blur(); form.find("#add_show_playlist_dropdown").toggle(); form.find("#add_show_autoplaylist_repeat").toggle(); - - var checkBoxSelected = false; - - //must switch rebroadcast displays - if(form.find("#add_show_has_autoplaylist").attr('checked')) { - form.find("#add_show_playlist_dropdown").show(); - form.find("#add_show_autoplaylist_repeat").show(); - } - else { - form.find("#add_show_playlist_downdown").hide(); - } }); form.find("#add_show_repeats").click(function(){ @@ -491,6 +480,27 @@ function setAddShowEvents(form) { at: "right center" } }); + + form.find(".show_autoplaylist_help_icon").qtip({ + content: { + text: $.i18n._("Autoloading playlists' contents are added to shows one hour before the show airs. More information") + }, + hide: { + delay: 500, + fixed: true + }, + style: { + border: { + width: 0, + radius: 4 + }, + classes: "ui-tooltip-dark ui-tooltip-rounded" + }, + position: { + my: "left bottom", + at: "right center" + } + }); form.find(".airtime_auth_help_icon").qtip({ content: { From 1b537919a6b916ac56e89a1b07d7fbffa42fefa6 Mon Sep 17 00:00:00 2001 From: ryan Date: Tue, 20 Nov 2018 12:22:27 -0600 Subject: [PATCH 038/210] rename to "autoloading playlists" in docs --- docs/manual/calendar/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/manual/calendar/index.md b/docs/manual/calendar/index.md index 5dc6def47..cc8e94830 100644 --- a/docs/manual/calendar/index.md +++ b/docs/manual/calendar/index.md @@ -9,7 +9,7 @@ In the top left corner of the page, you can go back or forward through the **Cal Adding a show ------------- -Only *Admins* and *Program Managers* can use this feature. To add a new show to the Calendar, click the **+ New Show** button in the top left corner of the page, or click on any future row or box in the Calendar which is empty. Either of these actions opens the **Add this show** box, which has seven sections, arranged vertically: **What**, **Automatic Playlist**, **When**, **Live Stream Input**, **Record & Rebroadcast**, **Who**, and **Style**. Click the small orange triangle to the left of the section name if you wish to minimize or maximize it. +Only *Admins* and *Program Managers* can use this feature. To add a new show to the Calendar, click the **+ New Show** button in the top left corner of the page, or click on any future row or box in the Calendar which is empty. Either of these actions opens the **Add this show** box, which has seven sections, arranged vertically: **What**, **Autoloading Playlist**, **When**, **Live Stream Input**, **Record & Rebroadcast**, **Who**, and **Style**. Click the small orange triangle to the left of the section name if you wish to minimize or maximize it. What ---- @@ -18,7 +18,7 @@ In the **What** box, enter the **Name**, public website **URL**, **Genre** and * ![](static/Screenshot453-Show_what.png) -Automatic Playlist +Autoloading Playlist ------------------ In this section, you can select a playlist that will be used for this show. The playlist must already be defined in your library. **Auto Schedule Playlist** needs to be checked for **Select Playlist** and **Repeat AutoPlaylist Until Show is Full** to be visible. From d3604592cee115006c005cf2f9bb992d63953187 Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 26 Nov 2018 11:03:00 -0600 Subject: [PATCH 039/210] rename to "autoloading playlists" in translation files 1 --- airtime_mvc/locale/ast/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/az/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/hy/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/ja/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/ka/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/lt/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/si/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/template/airtime.po | 2 +- airtime_mvc/locale/tr/LC_MESSAGES/airtime.po | 2 +- airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po index 3cc41e1dd..8a1ae6d32 100644 --- a/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/az/LC_MESSAGES/airtime.po b/airtime_mvc/locale/az/LC_MESSAGES/airtime.po index 3ed69001b..a41ee8949 100644 --- a/airtime_mvc/locale/az/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/az/LC_MESSAGES/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po index 5a18a1907..20981421f 100644 --- a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po @@ -4940,7 +4940,7 @@ msgid "What" msgstr "Co" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po b/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po index 0824ba6ce..c1654503c 100644 --- a/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po index 06e90b569..73e389d5b 100644 --- a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po @@ -4953,7 +4953,7 @@ msgid "What" msgstr "Was" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po index 7ce30889c..e857f9cc5 100644 --- a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po @@ -4955,7 +4955,7 @@ msgid "What" msgstr "Was" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "Automatische Playlist" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po index 46b771ed4..ae9d90410 100644 --- a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po @@ -4940,7 +4940,7 @@ msgid "What" msgstr "Τι" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po index 5bdc0bcbd..700be5192 100644 --- a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po @@ -4940,7 +4940,7 @@ msgid "What" msgstr "What" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po index d8b37ba78..8fa9b8822 100644 --- a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po @@ -4944,7 +4944,7 @@ msgid "What" msgstr "What" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po index e3e8b1933..1c4154102 100644 --- a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po @@ -4940,7 +4940,7 @@ msgid "What" msgstr "What" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po index eb1740dc8..10983122d 100644 --- a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po @@ -4966,7 +4966,7 @@ msgid "What" msgstr "Qué" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "Lista de reproducción automática" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po index 0d991a8ca..b6d44cb93 100644 --- a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po @@ -4940,7 +4940,7 @@ msgid "What" msgstr "Quoi" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po index 7243ae784..32ec54bf2 100644 --- a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po @@ -4939,7 +4939,7 @@ msgid "What" msgstr "Što" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po index 5d20ca65d..faf815a0d 100644 --- a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po @@ -5267,7 +5267,7 @@ msgid "What" msgstr "Mi" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "Automatikus lejátszási lista" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po index b9dfbf502..46f7b542c 100644 --- a/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po @@ -4931,7 +4931,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po index 3842bcdcb..a883d38bc 100644 --- a/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po b/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po index d865d0252..8e1140284 100644 --- a/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po index 7324b1b19..dcef79e67 100644 --- a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po @@ -4941,7 +4941,7 @@ msgid "What" msgstr "Cosa" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po index 5273a215d..4592b5969 100644 --- a/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po @@ -4939,7 +4939,7 @@ msgid "What" msgstr "番組内容" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po index 4acc92078..5b55ec87a 100644 --- a/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po @@ -4932,7 +4932,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po index bdbeb0f5c..d7b2c2b45 100644 --- a/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po index f410f5ec3..b9279ed84 100644 --- a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po @@ -4937,7 +4937,7 @@ msgid "What" msgstr "무엇" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po b/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po index 72edc401a..0961f7ceb 100644 --- a/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po @@ -4935,7 +4935,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po index 4e019d0b1..056879cdf 100644 --- a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po @@ -4943,7 +4943,7 @@ msgid "What" msgstr "Wat" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po index 372719152..e86f369d2 100644 --- a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po @@ -4940,7 +4940,7 @@ msgid "What" msgstr "Co" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po index fc7548259..69dc20b14 100644 --- a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po @@ -4941,7 +4941,7 @@ msgid "What" msgstr "O que" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po index 9747b18b6..fe50f891b 100644 --- a/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po index 62a35c89c..1ca364b9b 100644 --- a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po @@ -4982,7 +4982,7 @@ msgid "What" msgstr "Что" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "Автоматический Плейлист" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/si/LC_MESSAGES/airtime.po b/airtime_mvc/locale/si/LC_MESSAGES/airtime.po index b67d4a665..ce6065bff 100644 --- a/airtime_mvc/locale/si/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/si/LC_MESSAGES/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po index 541f5a6e8..1fd057475 100644 --- a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po @@ -4939,7 +4939,7 @@ msgid "What" msgstr "Шта" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po index 3f4dcb2e7..a9a718765 100644 --- a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po @@ -4939,7 +4939,7 @@ msgid "What" msgstr "Šta" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/template/airtime.po b/airtime_mvc/locale/template/airtime.po index a476c9d77..956adb2ea 100644 --- a/airtime_mvc/locale/template/airtime.po +++ b/airtime_mvc/locale/template/airtime.po @@ -4934,7 +4934,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po b/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po index 75aeea172..d6c15e7f4 100644 --- a/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po @@ -4935,7 +4935,7 @@ msgid "What" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 diff --git a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po index dd40ebe43..c1843be7e 100644 --- a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po @@ -4939,7 +4939,7 @@ msgid "What" msgstr "名称" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 -msgid "Automatic Playlist" +msgid "Autoloading Playlist" msgstr "" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 From 76f46def18d3f2b03aba49305bb83aeca8503c6f Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 26 Nov 2018 11:16:53 -0600 Subject: [PATCH 040/210] add autoloading playlists help text to translation files --- airtime_mvc/locale/ast/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/az/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/hy/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/ja/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/ka/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/lt/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/si/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/template/airtime.po | 6 +++++- airtime_mvc/locale/tr/LC_MESSAGES/airtime.po | 6 +++++- airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po | 6 +++++- 34 files changed, 170 insertions(+), 34 deletions(-) diff --git a/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po index 8a1ae6d32..0f2c51031 100644 --- a/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/az/LC_MESSAGES/airtime.po b/airtime_mvc/locale/az/LC_MESSAGES/airtime.po index a41ee8949..83c7803e2 100644 --- a/airtime_mvc/locale/az/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/az/LC_MESSAGES/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po index 20981421f..613050914 100644 --- a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po @@ -2538,9 +2538,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Musíte počkat alespoň 1 hodinu před dalším vysíláním" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po b/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po index c1654503c..927dc22ff 100644 --- a/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po index 73e389d5b..5a9cbc584 100644 --- a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po @@ -2551,9 +2551,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po index e857f9cc5..00581aa5d 100644 --- a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po @@ -2553,9 +2553,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Das Wiederholen einer Sendung ist erst nach einer Stunde Wartezeit möglich." #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po index ae9d90410..4de460ee3 100644 --- a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po @@ -2538,9 +2538,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Πρέπει να περιμένετε τουλάχιστον 1 ώρα για την αναμετάδοση" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po index 700be5192..c7d068abf 100644 --- a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po @@ -2538,9 +2538,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Must wait at least 1 hour to rebroadcast" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po index 8fa9b8822..0c45ef6ec 100644 --- a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po @@ -2539,9 +2539,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Must wait at least 1 hour to rebroadcast" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po index 1c4154102..6f5882d2e 100644 --- a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po @@ -2538,9 +2538,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Must wait at least 1 hour to rebroadcast" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po index 10983122d..066efda42 100644 --- a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po @@ -2548,9 +2548,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Debes esperar al menos 1 hora para reprogramar" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "¿Auto Programar Lista?" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "Seleccionar Lista" diff --git a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po index b6d44cb93..f91cfae2a 100644 --- a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po @@ -2538,9 +2538,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Vous devez attendre au moins 1 heure pour retransmettre" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po index 32ec54bf2..21a343f94 100644 --- a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po @@ -2537,9 +2537,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Moraš čekati najmanje 1 sat za re-emitiranje" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po index faf815a0d..2ce34a004 100644 --- a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po @@ -2700,9 +2700,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Az újraközvetítésre legalább 1 órát kell várni" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "Lejátszási lista automatikus ütemezése?" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "Lejátszási lista kiválasztása" diff --git a/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po index 46f7b542c..3764a6924 100644 --- a/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po @@ -2531,9 +2531,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po index a883d38bc..7fe406a6c 100644 --- a/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po b/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po index 8e1140284..29d40c40b 100644 --- a/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po index dcef79e67..091ee2bbc 100644 --- a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po @@ -2539,9 +2539,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Aspettare almeno un'ora prima di ritrasmettere" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po index 4592b5969..fd0fbfb51 100644 --- a/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po @@ -2537,9 +2537,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "再配信するには、1時間以上待たなければなりません" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po index 5b55ec87a..774fd3491 100644 --- a/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po @@ -2532,9 +2532,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po index d7b2c2b45..87f53468d 100644 --- a/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po index b9279ed84..83784846a 100644 --- a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po @@ -2535,9 +2535,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "재방송 설정까지 1시간 기간이 필요합니다" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po b/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po index 0961f7ceb..0822f12cf 100644 --- a/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po @@ -2535,9 +2535,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po index 056879cdf..603b1a257 100644 --- a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po @@ -2541,9 +2541,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Ten minste 1 uur opnieuw uitzenden moet wachten" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po index e86f369d2..d8411c125 100644 --- a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po @@ -2538,9 +2538,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Należy odczekać przynajmniej 1 godzinę przed ponownym odtworzeniem" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po index 69dc20b14..4ac6bfeec 100644 --- a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po @@ -2539,9 +2539,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "É preciso aguardar uma hora para retransmitir" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po index fe50f891b..46c72681e 100644 --- a/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po index 1ca364b9b..0d5322d15 100644 --- a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po @@ -2554,9 +2554,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "1 час нужно подождать до ретрансляции" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "Выбрать плейлист" diff --git a/airtime_mvc/locale/si/LC_MESSAGES/airtime.po b/airtime_mvc/locale/si/LC_MESSAGES/airtime.po index ce6065bff..1ddab4c1e 100644 --- a/airtime_mvc/locale/si/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/si/LC_MESSAGES/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po index 1fd057475..fb76f0f2c 100644 --- a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po @@ -2537,9 +2537,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Мораш да чекаш најмање 1 сат за ре-емитовање" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po index a9a718765..e7661a526 100644 --- a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po @@ -2537,9 +2537,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Moraš da čekaš najmanje 1 sat za re-emitovanje" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/template/airtime.po b/airtime_mvc/locale/template/airtime.po index 956adb2ea..741e5d302 100644 --- a/airtime_mvc/locale/template/airtime.po +++ b/airtime_mvc/locale/template/airtime.po @@ -2534,9 +2534,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po b/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po index d6c15e7f4..6aa5e813e 100644 --- a/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po @@ -2535,9 +2535,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "Tekrar yayın yapmak için en az bir saat bekleyiniz" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" diff --git a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po index c1843be7e..45275521d 100644 --- a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po @@ -2537,9 +2537,13 @@ msgid "Must wait at least 1 hour to rebroadcast" msgstr "至少间隔一个小时" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:18 -msgid "Auto Schedule Playlist ?" +msgid "Add Autoloading Playlist ?" msgstr "" +#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14 +msgid "Autoloading playlists' contents are added to shows one hour before the show airs. More information" +msgstr "" + #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" msgstr "" From cc112531b5e793062ea62a051daa2aae87a54620 Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 26 Nov 2018 11:22:19 -0600 Subject: [PATCH 041/210] add styles for autoloading playlists tootip --- airtime_mvc/public/css/styles.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index cfcd3f51c..7e2d26018 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -204,7 +204,7 @@ img.logo .airtime_auth_help_icon, .custom_auth_help_icon, .stream_username_help_icon, .playlist_type_help_icon, .repeat_tracks_help_icon, .show_linking_help_icon, .admin_username_help_icon, .stream_type_help_icon, -.show_timezone_help_icon{ +.show_timezone_help_icon, .show_autoplaylist_help_icon { cursor: help; position: relative; display:inline-block; zoom:1; @@ -214,6 +214,9 @@ img.logo line-height:16px !important; vertical-align: text-top; } +.qtip a { + color: white; +} /* Clearfix */ .clearfix:after, .side_playlist li:after { content: "."; display: block; height: 0; clear: both; visibility: hidden;} From 5372014fd481351054e2a8204579044d520cdd9c Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 26 Nov 2018 11:27:17 -0600 Subject: [PATCH 042/210] delete file accidentally added to autoloading UI PR --- airtime_mvc/public/css/radio-page/custom.css | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 airtime_mvc/public/css/radio-page/custom.css diff --git a/airtime_mvc/public/css/radio-page/custom.css b/airtime_mvc/public/css/radio-page/custom.css deleted file mode 100644 index 5e138b105..000000000 --- a/airtime_mvc/public/css/radio-page/custom.css +++ /dev/null @@ -1,15 +0,0 @@ -#schedule_iframe, .tab_content { - color: #fff; - text-align: center; - width: 770px; - max-width: 770px; - margin: -70px auto 0px -380px; - height: calc(100vh - 200px) !important; - padding: 10px; - padding-left: 10px; - margin-bottom: -100px; - padding-top: 50px; - position: absolute; - left: 50%; - overflow: hidden; -} \ No newline at end of file From 9b7e03977283476d9b4296367a30d197044d902a Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 26 Nov 2018 13:24:25 -0600 Subject: [PATCH 043/210] make "Repeat Playlist Until Show is Full ?" string translatable --- airtime_mvc/locale/ast/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/az/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/hy/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/ja/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/ka/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/lt/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/si/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/template/airtime.po | 4 ++++ airtime_mvc/locale/tr/LC_MESSAGES/airtime.po | 4 ++++ airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po | 4 ++++ 34 files changed, 136 insertions(+) diff --git a/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po index 0f2c51031..f76b852b9 100644 --- a/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/az/LC_MESSAGES/airtime.po b/airtime_mvc/locale/az/LC_MESSAGES/airtime.po index 83c7803e2..952c3f7ae 100644 --- a/airtime_mvc/locale/az/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/az/LC_MESSAGES/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po index 613050914..ebc588c72 100644 --- a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po @@ -2549,6 +2549,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po b/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po index 927dc22ff..65c1dc92d 100644 --- a/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po index 5a9cbc584..089555c0c 100644 --- a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po @@ -2562,6 +2562,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po index 00581aa5d..2d4ba44c0 100644 --- a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po @@ -2564,6 +2564,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po index 4de460ee3..7bf24c41f 100644 --- a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po @@ -2549,6 +2549,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po index c7d068abf..329447ab9 100644 --- a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po @@ -2549,6 +2549,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po index 0c45ef6ec..4d83b2e2d 100644 --- a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po @@ -2550,6 +2550,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po index 6f5882d2e..8477016d5 100644 --- a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po @@ -2549,6 +2549,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po index 066efda42..7a2f3d943 100644 --- a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po @@ -2559,6 +2559,10 @@ msgstr "" msgid "Select Playlist" msgstr "Seleccionar Lista" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po index f91cfae2a..f29caed5d 100644 --- a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po @@ -2549,6 +2549,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po index 21a343f94..0d89c8418 100644 --- a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po @@ -2548,6 +2548,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po index 2ce34a004..6f1a6fe02 100644 --- a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po @@ -2711,6 +2711,10 @@ msgstr "" msgid "Select Playlist" msgstr "Lejátszási lista kiválasztása" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po index 3764a6924..1c246b1a1 100644 --- a/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po @@ -2542,6 +2542,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po index 7fe406a6c..25bbe9f2d 100644 --- a/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po b/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po index 29d40c40b..1c7de0a44 100644 --- a/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po index 091ee2bbc..3982903d0 100644 --- a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po @@ -2550,6 +2550,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po index fd0fbfb51..ee02e1e92 100644 --- a/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po @@ -2548,6 +2548,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po index 774fd3491..6d7e963d3 100644 --- a/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po @@ -2543,6 +2543,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po index 87f53468d..b8de4d740 100644 --- a/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po index 83784846a..d033f559d 100644 --- a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po @@ -2546,6 +2546,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po b/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po index 0822f12cf..f50e162b4 100644 --- a/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po @@ -2546,6 +2546,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po index 603b1a257..55fb4d204 100644 --- a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po @@ -2552,6 +2552,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po index d8411c125..da8f49d83 100644 --- a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po @@ -2549,6 +2549,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po index 4ac6bfeec..bef98e329 100644 --- a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po @@ -2550,6 +2550,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po index 46c72681e..52492e749 100644 --- a/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po index 0d5322d15..98d34e14a 100644 --- a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po @@ -2565,6 +2565,10 @@ msgstr "" msgid "Select Playlist" msgstr "Выбрать плейлист" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/si/LC_MESSAGES/airtime.po b/airtime_mvc/locale/si/LC_MESSAGES/airtime.po index 1ddab4c1e..d5d98b2b2 100644 --- a/airtime_mvc/locale/si/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/si/LC_MESSAGES/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po index fb76f0f2c..3d217c6f7 100644 --- a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po @@ -2548,6 +2548,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po index e7661a526..cececa3e4 100644 --- a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po @@ -2548,6 +2548,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/template/airtime.po b/airtime_mvc/locale/template/airtime.po index 741e5d302..acf00adde 100644 --- a/airtime_mvc/locale/template/airtime.po +++ b/airtime_mvc/locale/template/airtime.po @@ -2545,6 +2545,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po b/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po index 6aa5e813e..946f16cb4 100644 --- a/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po @@ -2546,6 +2546,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" diff --git a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po index 45275521d..918c1b86f 100644 --- a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po @@ -2548,6 +2548,10 @@ msgstr "" msgid "Select Playlist" msgstr "" +#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 +msgid "Repeat Playlist Until Show is Full ?" +msgstr "" + #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format msgid "Use %s Authentication:" From 36755e428880352aa461f424ed5ec9442540a89c Mon Sep 17 00:00:00 2001 From: ryan Date: Mon, 26 Nov 2018 13:34:51 -0600 Subject: [PATCH 044/210] spanish translation for Autoloading Playlist section --- .../locale/es_ES/LC_MESSAGES/airtime.mo | Bin 80414 -> 80918 bytes .../locale/es_ES/LC_MESSAGES/airtime.po | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.mo b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.mo index b7826b4af6cf45d1ad6c9d2184c1b33be7b65984..05dba596f726093ccd913eec84eefa6411f3c7dc 100644 GIT binary patch delta 21049 zcmbWVNkjx8_AIscj4C365D7_8^D=7GR>W$xwJF-#trpc* zwMJE~wrW(B+HLJo_v?L~<9EC7`@j41_#V%**XNuoSMvRRf6MRsWo+k*(;{#c}H4POO9X@gT-^HR-2Vige9xjTptigOs^eN% z3_IX9OhdIR)5CH6FbcJ@N~i&Ff0*2c3B-ATe+JpVq$`6pC4vwKZK7lFt z3s%F%ubaa+3gbv`LQVK0>JZ++JopUNPwt*(Vu98|n4kP&sGX>Qu~^4VL|c`LyKw^Q z`qb@ZI!Z=evlMF@YU?sl15ZKSp83|#F(>KEs0rRg9oDC)fphdW3l2uTT6ZZT7-rX`z{x!Cwl<$at$;SEQnfpBv!{3s6#aoT{s{8aU1f{ z;q0~PkU?fbVW^$%iEO>|2D%klNTdXA!BjkknowO5I%Kb6MeK-rcN4J~et>HK1y;ge zusr4&Y*rkP@uagb5Qy9Q9!x?XOh=uO zOq+fSwUSw=!8KyS z^H3AofC0F}`W5PP;TUQ{mrx73f!f)>QLo^s%@5Bo_1xu&XohiE4;y1;oP-5%JF3Hj zs2%wc^=f`a-RDcFGw}dj7?NoQu8u0NgL+l%tUXcVr6T>gov}pJ;Z)Q>b5JW>j9gh~ z6{E4(i^W~GB&|> zqxo3JY}5|^fU0+KH2bf^@TbkVgL)PBurPX$;bwR-Aa)|%W~}Gima`JIf@i1&M2$0t zvIZ*M5;b6VjKukEpbpUv)Yk7sy`pby z{$bP(oa*^hFIY8l!L`md1^!ng4*= zvD4_n=coy|CK=144slh~!s??Y-Wb2Z7O4L7zo`kZeT9kWomE10R3CLnnxj_mnoak& z>5-@bCZp=lMZKz}sDU=4Uez|#jvPe|cowyQOQ=_O9jh|FQ)aT+l5VJXIT(xLDAdn_ zg{U3cf-d|9Rqs#Kj{S>1=s(3wATMg*La2$AMs0b#O}Dh=z0j?OgNgX!Q1rv$=#67h z9gRoLd^W0nHu~XG%z+=E3)iChIcW2bpmy*lERW~W5B;Z_>m4+e{nr3tWc0;Ybm0Qj zwb_o^>T}k=P>1m@Y9h~21A0v}6Y)dsOaST?6hZYLhuW!zw!9nWBAq;q{Z}N-7K}jM z`!`WDeFrtbO4Lf%VNTqP8ej*i<6{_xS8RFix6IZDp+1tsQ6FgWsBc=YVrlH_CZZWn zMGdq7b^n)O9Dam4jF+tUP%FNC`e_gRl&9?}<33%-H0 zb32cSs6+3WX2n5RigXjqjmfB$rK38Wf?82FYG;FTaXT(ZGHpljk> z)H+*HJ9QYf13#f#Tlpsuy_;L8EqsjXD92p$^S&S|zX@t5+My;q5>?M_%V(h`x)`-{ zA7EMBjRAN8^Wsg^0-w%h|5Y()p2>(tZCL}^_CdY7Ow5N`{#V$V?Z z%DrtSRtt5OnxS@J0IJ^!s0qz{oBh`em)MLws1+PS?Z^q#OfO(DyoVYnXg*)fu@-7Y zOHucEz4b8a8s5er{0B9l?*elzgHYoHyNT#9ltgW18C1o}SP1K(R@~8=gc>jtbrvSt z{F$hodI#0dCY!$-wL^zc?T(}Rzi7+dw`{?Gs15=bnk_1c8aN8oVNF!SrZ&G5YKQuw zIv#>*@5W%9i~0asgPQ0D)I_$SK4EtwXV2~YL_`DpifZr|>K)xg4e-$F%coBv()m$a z7mg*dBI+=!Pln@shg#{csEJ**-bYq&;?tf8+Drwp?2aY)S>$WHQ+N;zquEib|DzV_)dKyT3LI11N)&?aNc?k z)iBQzv!YPcmRG=rSR1tiV^J%egc@)*s@+o5)~`h^bTjIQ(3j}e7M&-e3H*y{m}{w7 zK_S!*grho&v-u5Br@B3cViIbAF{t*FP+wf;pmt=VbsK8n&r$vUvXuQVOynvVI&97| zGf;k1MIns>5ce6}LlOvo5GZmVi1NNvIu6Mb)2(I$P6G6P=B%ap5xdU+?M? z8CuC*EQW#an5~RL?MzkF4m3y4fLMie0v^Sg*bHBLmoF{23d>>l<;DpZO?n;H#}ilw z3%TDjhoL=IAY+tGuSI<@9m5d3hniTx`{vX~Vms1JQ5`Qv9mcQGg*Pz{^L}7{t#5>? zHvwP4O;{P-e-r6Lq|6HQo6Qu|%r9UW%(>G1Z6_LiNcTW(ac|VbQgAJfN48FmCx;zT4UbDn>dAnn4J?n1QP(sbtKlTf zg`c7Z+K)QCr%|uu4i?3n8%(>>*ot&Ks^3YN8|R?gpU4s->R=VB;TNa@&R{9Lh-%>V zp?MW~P+J{@+OY`K4z)t<*z2hJeNa1+iaNZbP&<~5TF}-H*?(2|mJDs-Nz@KpL4SOV znn;d~=5M)qu{7!a*c_*$20mfamr?INc9Z$@dKKJBx(}+qqMOYQgrm+x<<0EB2B=9! zNo<7bFcEclGEgfSj#}Ax%!`vz?{tApufo?zZ$<4`zK=}(SZqMLD(X58!)RP@J?SQr zhYYWeO@lzxzy&ZKLu`I))Gg?M+No|h6$fGk{0C#O)FAlvg7)yT8R&8)Bv>aY&L`nVi*R?eYz z$Y;A}$K6gDBAQ_%)Zs`*7f!@VxDs_8PoQ?>F|NeQJIoK`J0GN<5R2eE;G{rYY=Ln5Ddj4s1B;2R#XGEwRKTD&<6|RAk^7% zqw38-O<=Bd5qj?baw0!?aVoJR6-It$R(=G_lfI1VApdT2je=1fxljW~U{7p?srVsk z0->LqS6cx!k+xU`Uqc<**`KrjDMWUYA;Z5g?|u&IFn)|WEO)U07TROVBT)IxFbxM_ zH9U>gF>tT>+ffsYB%O}^aWSf%v(NlpFn*t#Z?2@rkf9mg#FF?3>tg7aW=p%E4p}d2 z66%%oN4?vDHh%=xB0buc@38rwVmA3-Am`WVw4dK6(ck?Q+d`x_279q$Y(x6M*Jf*j zzi}KE<V3NP4l=UelN+(AUtARJp@ zJQl(U7>wB%h8wX29z~sr8>n|*_@Eh}4u+CWK())jAe@HkZz<-$kFY3i#}Lk+bBsta zGOnPu-sd|rP-$ebP6PBqzwgb80#S!C7&Y;tsEI|RI&O|Se0@<9c?0#qG#hno_n=8K*EFJ03EpbUM}}{RQgqJw>e~-(mAJpe(ARIMf8IqgGfC1F$jX#r7D7 zy;1!vK)Q0)qUY~_nMX`V>rgA(i0beY)Cb8fEQ|+H6S{z!XsM%Spf1Q(I!QJ?3bg}M zF%XwwD_oDO@jm+FJ3p}h+M2aQs^MvLVc;=yC@W$a(&JF|R$wDMj#^RhkLGqXM{Ruv z)PRFg6CRB^BlE4hP-p2kjKSwW^8T9;i8*dM%*1x2*J30-w1)k}4;<1hP&40$x$qDs z;Rzg#HBOk{pthke_cP|CIU`k0n?w2v>a6re7mhp4{Vzb|Ju>>^7R-r7&zM(G8uO5j zLLJU(sO!`T=i^Y+gme6?qs%WN*ceY?S1k66`5?Xk45rG9sPr`Dz2-U$J?1SH<77}yT4A=nG{!OfoYq18Nw}$@4>PfrX6Vc3$ zq2AqTY=DCqU4i*5dX)Y-X?8Yt|%X_tW7$;qe%&O%Kn8#T_S$hdCj zTOz7>6pP_0Q{eoArAR-*04#FBSPpeI;;;zzz+fDXYj7rdW86h^*y3>->2A0TFQRVQ z*x$9IZoX&`DNIH-=Eu#b3VTr#`Wki5FJNx`1GO`^Y{s->0^C9R7G~kroT<5o_XY%!5%k%mk{T2B?SH;dbbciRg!^7=Z3fn=u}>f~oic&cV7^`KI|sla9I# z8_*jMpl4;Mc1O^&GSq;7+5E?-GvEhk?5PgNW$RK1?4(>@sU;c(OzPr-1Uiy^oJwV)$d z2=8Dh=6J;Zt3k;}W{V>+mUMg6X`O&oaHcKaiyHWm{48k{1*J?WIRA-~!=~~o^51>|d3boQls4dU` z)a*nE#*lWQ&PW?n{qd-ASGtK*B(e+3;}z5l3p_Ioqfr$TPz}>i?{*$)poOT3FGJPa zfQ4}{YC@-N`7QJ%{mkn9pV={YP9okE(nJy;QsU|D>M+MzISFV6z1U@^vbY7wb{T~LQ=j`cm%EBFXC zv8||g`UUEHzzNi=yMn5B4Yf13P%FQ0%X9g7d2UG_EJ}VT>XpW!=kNbDiRhZOM!l=? zcnlYyI!g96D;j~iZd0%m&PVOQRn(!qi<)3y4m07hsQMLA^=hLIXH#s1y>fWDJzKQG zR{Rl5P;d^lRZmeX5A-wX!l-u{iF%iDsE!+2TcZX@z(^d5RdFfm75spu@Gj~s70T&0 zTT+alAZiegm9ZDr!g=@_9>(eznaj(09eblr`5uhMhp6jWHn*4O8a74kTo2ShY3RaX zs8^JY+UezPB4I?fpjLFk`a5dncQ6aFB9`nvxp>`qx)zJ*piWZXm(lx^`z!r~fIcex3lc zfD)(=s5sQCXogJK?F=TO4yU3T%tO7ym8dhY8`JSHY9e(4&5E0#1|E&NHA^rC*Q0jy zH0tm@LhYbmUN6u0i{hw>G{*ql|DHtD@gOXQS?I#KsKfIKPQ*V^6HCcw2AY8S;Q0u3 z4Nsv?|Ies}+(BJS@BHS~`C0Q~N%BK5pYDG(B07~#P%BPGbue5Na2o2=FShwBQT4W4 z51d0&5p78d>MV>yt#l@;d=+XUJ5V1y2T=F@ zXVeGEKd6-k7BCYHLhWdA)U61&>1L?@+M^bfRDk=hj5IRT@p#lJo{u_An^33zN7Oa@ z8Ff~26!hZro*%)ei4;OjBnGtu%}|H16Kdi~s1;|T>c53r;EICWe{JPwWXMCPoj8jw z{2QxdfkNiKx4`bC-$ZqA9$okVn`0<{!_z|gpe8;HE8|$y+4=}|T@T?r^m2!o2J=x9 zSc97JPSidA7PXQ;unqo;`ao$^*yJ}y)$fLSbpud4G#u4_JXXMWZTfrEt+|4#@6Hiw zPHjQd7L~W@2B;3YqP8{*BXJID0=rNh?6vtvP!qk6T6vBlUY_p>fv6p=jPswMh8$G{e~LwGU}S$K)vJJs6+Gw^(y>|n))SChq0VZm&YEYtDsK* z9MnWsVj124pNMD+AD}wQSLoOer&gHmJkW4|NMBVkcaKQTPP)5gP6?pL8uS zj&v$&qVHn_UdG-S7-kM}8V(}82Gg-XY3{#fK9NWau0wrvo=`B3-0FutpDyn%agB7PX|<&40J<;<&CgEL9{L~#E#(A)@fC>Ef;nQTJ6 z+pVb6x(79pv(`(fLv#)GihLr?g#A$U{88mW*bK{~`pra*HxjjzVovbB8A1J4> zG@eD>1?BYC)G!6S;*tYj@p5 zbZr94n?q9!)lnCW$5hmcR-zhgKwYQ(sB3u|^$P#Nau^!z<@tMHebg;lftu*2sEK@s zTEH);Gvt0sMAs~=f;ogysCU`P`a0^TRX@}jnT+aqD{3phN7X-y0eBiUp+8Uq_{W&D z6N~z&Z-r{#6FoowhY`^y)*RGCmY}|JeSjM98R{BES2Q~?7GEd55cTf=#b~^b-(%@m zv(-0IukInLf8RE_0 ziFI%hs{Dj4_pa{c`LkLDtWW*`)GJwsn(zrMg+4Xx2Oa86wW-1V*J&I~h6bL4IyC!G zTX`9O#HgC4!4vc%U9^_{f`K{%;i$tGi8^G}P&?QZbp~2n6HvD;*_u_0`>%{iWN3zO zqwfC}R0k(f*XCE$KsQilSsV2s-x+s50JU2tzU+^cHf~^d>pmXKT!4WpeA-7HK0!&(>@QX{}+#22X7YP z3b}9S8rbKi^)HrPo)AT-uPxxYYJ2#J_x#jt(xP*9r;sLZROZhMQ{ufH38Q~5YLkNZKBy>#u z$WO<0gkHq;yg^(iJ(jv%$@`0RW8yDANu&$d`pR!*__G_yoC+P+d?QodKb%R7Ff@Fo>9ZQY~fpCs=CTjw>(CfW}4 zd9a;&YYC^+fqi_b>*j}&=jqG8bIItAS8)xEi`Wjv;wz?_=ii@cvxz!`cETlBmYBNR*BvUQP#(fl9zZe@yoXSDfL^CH=2+^I7YZg zSwGa%6z3?Pya@!2@A+SmjwACd;XN{o67*~&{SzUZcv%J+L0n&N{#7B*YQhpbkru=| z(C$4I@XRDX58)fzmwtHbSxRt|cN#zO=F3SiiC3vOM5R1k=QnIv*u9+G?Y60YyuWzn z+2JlSl^4%JB8#Xyhcf-VSd03d;sT);A=b7jNu4vc&wub+`j}?Z@8EpW4+w90vn`8l zqt+A*wDEVWY20b(;+N9<=|G>#wJAG|dUn24uJm8}ho>9)8yR>q z@qE;6LOPNVOZ-)J!nbl~I6+T-yOMRp^`%BX&f8Gdk^F3oAQU7%3J(&-5?+4NDVs~i ztAsNIeJ{ymu)3({UCPhnRNIdA^A`~+{7$Gq7)h9>OrGXc+ClmpLC-e^&%Y^jq^B=+ zekH6Vt^fBRe8Kj7o!d-V9^%)q9Qmol8`?H%w}P-$?_bY63Re-nWS~x@LkLM!&LGSo zZ#8AVkvEl4lz1`JbDuE56XTZ~YY1(ArOi8}2UB+y@onUF#sdUBZ}Ojtu$L3$5{Q&!q` zQh|61dHk;9yh2`WeDUNYK7vH`m+}%xpCpvl$KoJ6(0m%cPi6xuHYKl-&Hn&rQg(nc zJ@*K|QKtaGMSe2rI2=T}27X1*^DpZ6k$u>Nve)TnIPnO=O!7l|dwD)plARr1~@{^GeoUOroAk#!7tEvXYv=wjIWdLsF+opx@*dmxpVa$}_$%m5XiT{ezIaAa*Pl?Ipr<{d zCSfaS&-x#cSVhp2pN>LpZ+I(iB&IZax>-`TQQp|Stgu+gwUpzs?>k)F&NoU;lQd#he zN|<2VKgVU%nM5c^{v_Ichacevf}Y0Kx2faS`~Q&4EE-0W@ja%Ir{4o#e#X6&$WOiY z)VW992juU0sjM^kZ7HuxSr_6fiT_7jPY&w^^7MF-c6TMwghT}4YvQMErTWAd689s# zW*aP{!xE&IQFlI}C;5YH{c)7tChm(Pup{O1#G4X7NSHzV6Y9T8{6EU{%+}|B0}5uF zwCCSxRB{n}7hgQ}s1rlNo5nAmf;Rr0^$QC6*mw-}tI~d}?ZX%EQa0E&E=T$^PZ{sO zA(2BAL=#rp4(8d4zmV=o`B9snZu6r_A0od9J|iS}I^!dpfnPl9$bU#8H(nu(p)3gX zL=iuSO?Cff(71P1g;$!|wq8qUWl6s))H>(REdt^d8vJBn4v z+e2AB>W;AG>aT~X<93cyc#}j6+en3aB1!KyQRidgKM?O^J19kZHStX^wTZK33DoOJ zpPjKcc>`>|x{4$oM%YEWr_>41*P0j-r$}7KD^%)^OR3a@cwORpZWDZLM}4st`8{a! zEnzlsm#y~?{!HB{LV1E8VV^B)WbH$q9)Hp`-TZTm#3Di=I(uCuJUtoY8tJcy``LyA zhX5+;vpH8|1>RC%zL)jynR$j}O1{*eiUYmmM#+0T|GK%mKVLLS{kQYbTMOsf` zLNj{0gnO~39Z_Y=ssFki;a$>)Df8a_7eN)o!d=797OnXdG-WY>W7VHvJI z$^FtP&Ki*HDRCvHWMo!!)k$<^C1&(b&Z-;Ht50fT+Mo#6fQ;mRbt493WwjnsD>gPY zrB6n3R?6Vyis>2sV+SXu4NFXoO-f8nPV1YP5nCqle=i~C#f&2Awbn=}X$&|xF)JlK ztxjxWy{$cZ2FB)0&dOr7nOoClwev0UKWpxsmX(s~>d1s$DVeTUhoz>n4Ljx~mdjJQ za!i$YSLL``aaFgL-nBEZ)c(EgGSd5JBo0o@aJ6E;5?$Jqm{(XtV&BC2ThDycB**+} zhq}05&UQK`yHeSj{u#;r6J4q4nRd%k`V#F+Sz@M3n-5x0Op@u1lxv6`Ez>nDEs>qf zNOUE#+n#1ahq0H#lGBpY{@;yEczGxP|2L8u*?mk(`D&}#$hC(yG^o%ac}PlDN`{%X fYe1rQLi5Q=&KR7+J5NsipQ+d1*)G8AXw3ftCzMU! delta 20548 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 W+pII^LsODZPOZ4RRMore information" -msgstr "" +msgstr "Se le agrega los contenidos de las listas auto-cargadas a programas una hora antes de que suenen. Mas información" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25 msgid "Select Playlist" @@ -2561,7 +2561,7 @@ msgstr "Seleccionar Lista" #: airtime_mvc/application/forms/AddShowAutoPlaylist.php:32 msgid "Repeat Playlist Until Show is Full ?" -msgstr "" +msgstr "Repitir lista hasta que termine el programa?" #: airtime_mvc/application/forms/AddShowLiveStream.php:11 #, php-format @@ -4975,7 +4975,7 @@ msgstr "Qué" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:14 msgid "Autoloading Playlist" -msgstr "Lista de reproducción automática" +msgstr "Lista Auto-Cargada" #: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:18 msgid "When" From 008530364b04cf1786919eb2b1d4d14e5fd892a1 Mon Sep 17 00:00:00 2001 From: Robbt Date: Mon, 26 Nov 2018 15:26:19 -0500 Subject: [PATCH 045/210] Added jquery to hide or remove limit value --- .../application/forms/SmartBlockCriteria.php | 2 +- airtime_mvc/public/css/styles.css | 2 +- .../js/airtime/playlist/smart_blockbuilder.js | 27 +++++++++++++++++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/forms/SmartBlockCriteria.php b/airtime_mvc/application/forms/SmartBlockCriteria.php index 693f5c342..39c899226 100644 --- a/airtime_mvc/application/forms/SmartBlockCriteria.php +++ b/airtime_mvc/application/forms/SmartBlockCriteria.php @@ -160,7 +160,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm "hours" => _("hours"), "minutes" => _("minutes"), "items" => _("items"), - "remaining" => _("remaining time in show") + "remaining" => _("time remaining in show") ); } return $this->limitOptions; diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index e9e8ac4ff..e9bcb84a5 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -707,7 +707,7 @@ table.library-get-file-md.table-small{ } .sp_input_select{ - width: 130px; + width: 140px; } .sp_input_text_limit{ diff --git a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js index 15ca8b52f..f496b36d4 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js @@ -291,8 +291,20 @@ function setSmartBlockEvents() { setupUI(); AIRTIME.library.checkAddButton(); }); - - /********** CRITERIA CHANGE **********/ + + /********** LIMIT CHANGE *************/ + form.find('select[id="sp_limit_options"]').live("change", function() { + var limVal = form.find('input[id="sp_limit_value"]'); + if ($(this).val() === 'remaining') { + disableAndHideLimitValue(); + } + else { + enableAndShowLimitValue(); + } + }); + + + /********** CRITERIA CHANGE **********/ form.find('select[id^="sp_criteria"]:not([id^="sp_criteria_modifier"])').live("change", function(){ var index = getRowIndex($(this).parent()); //need to change the criteria value for any modifier rows @@ -461,6 +473,9 @@ function setupUI() { shuffleButton = activeTab.find('button[name="shuffle_button"]'), generateButton = activeTab.find('button[name="generate_button"]'), fadesButton = activeTab.find('#spl_crossfade, #pl-bl-clear-content'); + if (activeTab.find('#sp_limit_options').val() == 'remaining') { + disableAndHideLimitValue(); + } if (!plContents.hasClass('spl_empty')) { if (shuffleButton.hasClass('ui-state-disabled')) { @@ -611,6 +626,14 @@ function disableAndHideExtraField(valEle, index) { var criteria_value = $('#sp_criteria_value_'+index); sizeTextBoxes(criteria_value, 'sp_extra_input_text', 'sp_input_text'); } +function disableAndHideLimitValue() { + console.log('we hide it'); + $('#sp_limit_value').hide(); +} +function enableAndShowLimitValue() { + console.log('we show it'); + $('#sp_limit_value').show(); +} function sizeTextBoxes(ele, classToRemove, classToAdd) { if (ele.hasClass(classToRemove)) { From fe5b722c7f1c00f4801eb044ec50384633812dae Mon Sep 17 00:00:00 2001 From: ryan Date: Tue, 27 Nov 2018 15:07:56 -0600 Subject: [PATCH 046/210] use clock icon to represent autoloading playlist --- airtime_mvc/public/css/fullcalendar.css | 3 +- airtime_mvc/public/css/images/icon-clock.svg | 1 + airtime_mvc/public/css/styles.css | 13 +- .../schedule/full-calendar-functions.js | 352 +++++++++--------- 4 files changed, 184 insertions(+), 185 deletions(-) create mode 100644 airtime_mvc/public/css/images/icon-clock.svg diff --git a/airtime_mvc/public/css/fullcalendar.css b/airtime_mvc/public/css/fullcalendar.css index e0c991eb5..b6cc9f578 100644 --- a/airtime_mvc/public/css/fullcalendar.css +++ b/airtime_mvc/public/css/fullcalendar.css @@ -314,7 +314,8 @@ a.fc-event { .fc-event-time, .fc-event-title { padding: 0 1px; - } + height: 12px; +} .fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/ display: block; diff --git a/airtime_mvc/public/css/images/icon-clock.svg b/airtime_mvc/public/css/images/icon-clock.svg new file mode 100644 index 000000000..dbf371486 --- /dev/null +++ b/airtime_mvc/public/css/images/icon-clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index 7e2d26018..db258fd61 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -204,18 +204,14 @@ img.logo .airtime_auth_help_icon, .custom_auth_help_icon, .stream_username_help_icon, .playlist_type_help_icon, .repeat_tracks_help_icon, .show_linking_help_icon, .admin_username_help_icon, .stream_type_help_icon, -.show_timezone_help_icon, .show_autoplaylist_help_icon { +.show_timezone_help_icon{ cursor: help; position: relative; display:inline-block; zoom:1; width:14px; height:14px; background:url(images/icon_info.png) 0 0 no-repeat; - left: 3px; + top:2px; right:7px; left: 3px; line-height:16px !important; - vertical-align: text-top; -} -.qtip a { - color: white; } /* Clearfix */ @@ -2272,14 +2268,15 @@ span.errors.sp-errors{ height:10px; float:right; margin-left:3px; - margin-top:2px; } .small-icon.linked { background:url(images/icon_link.png) no-repeat 0 0; margin-top: 0px !important; } .small-icon.autoplaylist { - background:url(images/icon_alert_cal_autoplaylist.png) no-repeat 0 0; + background: url(images/icon-clock.svg) black no-repeat center center; + border-radius: 2px; + background-size: contain; } .small-icon.recording { diff --git a/airtime_mvc/public/js/airtime/schedule/full-calendar-functions.js b/airtime_mvc/public/js/airtime/schedule/full-calendar-functions.js index 2cc74acbd..15bd52d9a 100644 --- a/airtime_mvc/public/js/airtime/schedule/full-calendar-functions.js +++ b/airtime_mvc/public/js/airtime/schedule/full-calendar-functions.js @@ -5,10 +5,10 @@ */ function scheduleRefetchEvents(json) { - if(json.show_error == true){ + if (json.show_error == true) { alert($.i18n._("The show instance doesn't exist anymore!")); } - if(json.show_id) { + if (json.show_id) { var dialog_id = parseInt($("#add_show_id").val(), 10); //if you've deleted the show you are currently editing, close the add show dialog. @@ -16,10 +16,10 @@ function scheduleRefetchEvents(json) { $("#add-show-close").click(); } } - $("#schedule_calendar").fullCalendar( 'refetchEvents' ); + $("#schedule_calendar").fullCalendar('refetchEvents'); } -function makeTimeStamp(date){ +function makeTimeStamp(date) { var sy, sm, sd, h, m, s, timestamp; sy = date.getFullYear(); sm = date.getMonth() + 1; @@ -28,19 +28,19 @@ function makeTimeStamp(date){ m = date.getMinutes(); s = date.getSeconds(); - timestamp = sy+"-"+ pad(sm, 2) +"-"+ pad(sd, 2) +" "+ pad(h, 2) +":"+ pad(m, 2) +":"+ pad(s, 2); + timestamp = sy + "-" + pad(sm, 2) + "-" + pad(sd, 2) + " " + pad(h, 2) + ":" + pad(m, 2) + ":" + pad(s, 2); return timestamp; } -function dayClick(date, allDay, jsEvent, view){ +function dayClick(date, allDay, jsEvent, view) { // The show from will be preloaded if the user is admin or program manager. // Hence, if the user if DJ then it won't open anything. - if(userType == "S" || userType == "A" || userType == "P"){ + if (userType == "S" || userType == "A" || userType == "P") { var now, today, selected, chosenDate, chosenTime; now = adjustDateToServerDate(new Date(), serverTimezoneOffset); - if(view.name === "month") { + if (view.name === "month") { today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); selected = new Date(date.getFullYear(), date.getMonth(), date.getDate()); } @@ -49,12 +49,12 @@ function dayClick(date, allDay, jsEvent, view){ selected = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes()); } - if(selected >= today) { + if (selected >= today) { var addShow = $('.add-button'); //remove the +show button if it exists. - if(addShow.length == 1){ - var span = $(addShow).parent(); + if (addShow.length == 1) { + var span = $(addShow).parent(); $(span).next().remove(); $(span).remove(); @@ -65,10 +65,10 @@ function dayClick(date, allDay, jsEvent, view){ var duration_info = duration_string.split(" "); var duration_h = 0; var duration_m = 0; - if(duration_info[0] != null){ + if (duration_info[0] != null) { duration_h = parseInt(duration_info[0], 10); } - if(duration_info[1] != null){ + if (duration_info[1] != null) { duration_m = parseInt(duration_info[1], 10); } // duration in milisec @@ -77,28 +77,28 @@ function dayClick(date, allDay, jsEvent, view){ var startTime_string; var startTime = 0; // get start time value on the form - if(view.name === "month") { + if (view.name === "month") { startTime_string = $("#add_show_start_time").val(); var startTime_info = startTime_string.split(':'); if (startTime_info.length == 2) { - var start_time_temp = (parseInt(startTime_info[0],10) * 60 * 60 * 1000) + var start_time_temp = (parseInt(startTime_info[0], 10) * 60 * 60 * 1000) + (parseInt(startTime_info[1], 10) * 60 * 1000); if (!isNaN(start_time_temp)) { startTime = start_time_temp; } } - }else{ + } else { // if in day or week view, selected has all the time info as well // so we don't ahve to calculate it explicitly - startTime_string = pad(selected.getHours(),2)+":"+pad(selected.getMinutes(),2) + startTime_string = pad(selected.getHours(), 2) + ":" + pad(selected.getMinutes(), 2) startTime = 0 } // calculate endDateTime var endDateTime = new Date(selected.getTime() + startTime + duration); - chosenDate = selected.getFullYear() + '-' + pad(selected.getMonth()+1,2) + '-' + pad(selected.getDate(),2); - var endDateFormat = endDateTime.getFullYear() + '-' + pad(endDateTime.getMonth()+1,2) + '-' + pad(endDateTime.getDate(),2); + chosenDate = selected.getFullYear() + '-' + pad(selected.getMonth() + 1, 2) + '-' + pad(selected.getDate(), 2); + var endDateFormat = endDateTime.getFullYear() + '-' + pad(endDateTime.getMonth() + 1, 2) + '-' + pad(endDateTime.getDate(), 2); //TODO: This should all be refactored into a proper initialize() function for the show form. @@ -108,8 +108,8 @@ function dayClick(date, allDay, jsEvent, view){ $("#add_show_start_date").val(chosenDate); $("#add_show_end_date_no_repeat").val(endDateFormat); $("#add_show_end_date").val(endDateFormat); - if(view.name !== "month") { - var endTimeString = pad(endDateTime.getHours(),2)+":"+pad(endDateTime.getMinutes(),2); + if (view.name !== "month") { + var endTimeString = pad(endDateTime.getHours(), 2) + ":" + pad(endDateTime.getMinutes(), 2); $("#add_show_start_time").val(startTime_string) $("#add_show_end_time").val(endTimeString) } @@ -123,21 +123,21 @@ function dayClick(date, allDay, jsEvent, view){ } } -function viewDisplay( view ) { +function viewDisplay(view) { view_name = view.name; - - if(view.name === 'agendaDay' || view.name === 'agendaWeek') { + + if (view.name === 'agendaDay' || view.name === 'agendaWeek') { var calendarEl = this; var select = $('') - .val(item.value || "").appendTo($label); - break; - - case 'textarea': - $input = $('') - .val(item.value || "").appendTo($label); - - if (item.height) { - $input.height(item.height); - } - break; - - case 'checkbox': - $input = $('') - .val(item.value || "").prop("checked", !!item.selected).prependTo($label); - break; - - case 'radio': - $input = $('') - .val(item.value || "").prop("checked", !!item.selected).prependTo($label); - break; - - case 'select': - $input = $(' - if (item.type && item.type != 'sub' && item.type != 'html') { - $input - .on('focus', handle.focusInput) - .on('blur', handle.blurInput); - - if (item.events) { - $input.on(item.events); - } - } - - // add icons - if (item.icon) { - $t.addClass("icon icon-" + item.icon); - } - } - - // cache contained elements - item.$input = $input; - item.$label = $label; - - // attach item to menu - $t.appendTo(opt.$menu); - - // Disable text selection - if (!opt.hasTypes) { - if($.browser.msie) { - $t.on('selectstart.disableTextSelect', handle.abortevent); - } else if(!$.browser.mozilla) { - $t.on('mousedown.disableTextSelect', handle.abortevent); - } - } - }); - // attach contextMenu to (to bypass any possible overflow:hidden issues on parents of the trigger element) - if (!opt.$node) { - opt.$menu.css('display', 'none').addClass('context-menu-root'); - } - opt.$menu.appendTo(opt.appendTo || document.body); - }, - update: function(opt, root) { - var $this = this; - if (root === undefined) { - root = opt; - // determine widths of submenus, as CSS won't grow them automatically - // position:absolute > position:absolute; min-width:100; max-width:200; results in width: 100; - // kinda sucks hard... - opt.$menu.find('ul').andSelf().css({position: 'static', display: 'block'}).each(function(){ - var $this = $(this); - $this.width($this.css('position', 'absolute').width()) - .css('position', 'static'); - }).css({position: '', display: ''}); - } - // re-check disabled for each item - opt.$menu.children().each(function(){ - var $item = $(this), - key = $item.data('contextMenuKey'), - item = opt.items[key], - disabled = ($.isFunction(item.disabled) && item.disabled.call($this, key, root)) || item.disabled === true; - - // dis- / enable item - $item[disabled ? 'addClass' : 'removeClass']('disabled'); - - if (item.type) { - // dis- / enable input elements - $item.find('input, select, textarea').prop('disabled', disabled); - - // update input states - switch (item.type) { - case 'text': - case 'textarea': - item.$input.val(item.value || ""); - break; - - case 'checkbox': - case 'radio': - item.$input.val(item.value || "").prop('checked', !!item.selected); - break; - - case 'select': - item.$input.val(item.selected || ""); - break; - } - } - - if (item.$menu) { - // update sub-menu - op.update.call($this, item, root); - } - }); - }, - layer: function(opt, zIndex) { - // add transparent layer for click area - // filter and background for Internet Explorer, Issue #23 - return opt.$layer = $('
') - .css({height: $win.height(), width: $win.width(), display: 'block'}) - .data('contextMenuRoot', opt) - .insertBefore(this) - .on('mousedown', handle.layerClick); - } - }; - -// split accesskey according to http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#assigned-access-key -function splitAccesskey(val) { - var t = val.split(/\s+/), - keys = []; - - for (var i=0, k; k = t[i]; i++) { - k = k[0].toUpperCase(); // first character only - // theoretically non-accessible characters should be ignored, but different systems, different keyboard layouts, ... screw it. - // a map to look up already used access keys would be nice - keys.push(k); - } - - return keys; -} - -// handle contextMenu triggers -$.fn.contextMenu = function(operation) { - if (operation === undefined) { - this.first().trigger('contextmenu'); - } else if (operation.x && operation.y) { - this.first().trigger(jQuery.Event("contextmenu", {pageX: operation.x, pageY: operation.y})); - } else if (operation === "hide") { - var $menu = this.data('contextMenu').$menu; - $menu && $menu.trigger('contextmenu:hide'); - } else if (operation) { - this.removeClass('context-menu-disabled'); - } else if (!operation) { - this.addClass('context-menu-disabled'); - } - - return this; -}; - -// manage contextMenu instances -$.contextMenu = function(operation, options) { - if (typeof operation != 'string') { - options = operation; - operation = 'create'; - } - - if (typeof options == 'string') { - options = {selector: options}; - } else if (options === undefined) { - options = {}; - } - - // merge with default options - var o = $.extend(true, {}, defaults, options || {}), - $body = $body = $(document); - - switch (operation) { - case 'create': - // no selector no joy - if (!o.selector) { - throw new Error('No selector specified'); - } - // make sure internal classes are not bound to - if (o.selector.match(/.context-menu-(list|item|input)($|\s)/)) { - throw new Error('Cannot bind to selector "' + o.selector + '" as it contains a reserved className'); - } - if (!o.build && (!o.items || $.isEmptyObject(o.items))) { - throw new Error('No Items sepcified'); - } - counter ++; - o.ns = '.contextMenu' + counter; - namespaces[o.selector] = o.ns; - menus[o.ns] = o; - - if (!initialized) { - // make sure item click is registered first - $body - .on({ - 'contextmenu:hide.contextMenu': handle.hideMenu, - 'prevcommand.contextMenu': handle.prevItem, - 'nextcommand.contextMenu': handle.nextItem, - 'contextmenu.contextMenu': handle.abortevent, - 'mouseenter.contextMenu': handle.menuMouseenter, - 'mouseleave.contextMenu': handle.menuMouseleave - }, '.context-menu-list') - .on('mouseup.contextMenu', '.context-menu-input', handle.inputClick) - .on({ - 'mouseup.contextMenu': handle.itemClick, - 'contextmenu:focus.contextMenu': handle.focusItem, - 'contextmenu:blur.contextMenu': handle.blurItem, - 'contextmenu.contextMenu': handle.abortevent, - 'mouseenter.contextMenu': handle.itemMouseenter, - 'mouseleave.contextMenu': handle.itemMouseleave - }, '.context-menu-item'); - - initialized = true; - } - - // engage native contextmenu event - $body - .on('contextmenu' + o.ns, o.selector, o, handle.contextmenu); - - switch (o.trigger) { - case 'hover': - $body - .on('mouseenter' + o.ns, o.selector, o, handle.mouseenter) - .on('mouseleave' + o.ns, o.selector, o, handle.mouseleave); - break; - - case 'left': - $body.on('click' + o.ns, o.selector, o, handle.click); - break; - /* - default: - // http://www.quirksmode.org/dom/events/contextmenu.html - $body - .on('mousedown' + o.ns, o.selector, o, handle.mousedown) - .on('mouseup' + o.ns, o.selector, o, handle.mouseup); - break; - */ - } - - if (o.trigger != 'hover' && o.ignoreRightClick) { - $body.on('mousedown' + o.ns, o.selector, handle.ignoreRightClick); - } - - // create menu - if (!o.build) { - op.create(o); - } - break; - - case 'destroy': - if (!o.selector) { - $body.off('.contextMenu .contextMenuAutoHide'); - $.each(namespaces, function(key, value) { - $body.off(value); - }); - - namespaces = {}; - menus = {}; - counter = 0; - initialized = false; - - $('.context-menu-list').remove(); - } else if (namespaces[o.selector]) { - try { - if (menus[namespaces[o.selector]].$menu) { - menus[namespaces[o.selector]].$menu.remove(); - } - - delete menus[namespaces[o.selector]]; - } catch(e) { - menus[namespaces[o.selector]] = null; - } - - $body.off(namespaces[o.selector]); - } - break; - - case 'html5': - // if or are not handled by the browser, - // or options was a bool true, - // initialize $.contextMenu for them - if ((!$.support.htmlCommand && !$.support.htmlMenuitem) || (typeof options == "boolean" && options)) { - $('menu[type="context"]').each(function() { - if (this.id) { - $.contextMenu({ - selector: '[contextmenu=' + this.id +']', - items: $.contextMenu.fromMenu(this) - }); - } - }).css('display', 'none'); - } - break; - - default: - throw new Error('Unknown operation "' + operation + '"'); - } - - return this; -}; - -// import values into commands -$.contextMenu.setInputValues = function(opt, data) { - if (data === undefined) { - data = {}; - } - - $.each(opt.inputs, function(key, item) { - switch (item.type) { - case 'text': - case 'textarea': - item.value = data[key] || ""; - break; - - case 'checkbox': - item.selected = data[key] ? true : false; - break; - - case 'radio': - item.selected = (data[item.radio] || "") == item.value ? true : false; - break; - - case 'select': - item.selected = data[key] || ""; - break; - } - }); -}; - -// export values from commands -$.contextMenu.getInputValues = function(opt, data) { - if (data === undefined) { - data = {}; - } - - $.each(opt.inputs, function(key, item) { - switch (item.type) { - case 'text': - case 'textarea': - case 'select': - data[key] = item.$input.val(); - break; - - case 'checkbox': - data[key] = item.$input.prop('checked'); - break; - - case 'radio': - if (item.$input.prop('checked')) { - data[item.radio] = item.value; - } - break; - } - }); - - return data; -}; - -// find
diff --git a/airtime_mvc/public/css/dashboard.css b/airtime_mvc/public/css/dashboard.css index d94b0f941..8df5161b0 100644 --- a/airtime_mvc/public/css/dashboard.css +++ b/airtime_mvc/public/css/dashboard.css @@ -684,20 +684,6 @@ li.ui-state-default { height: 26px; } -.smart-block-form input[type='radio'] { - vertical-align: bottom; - margin: 0 5px -2px; -} - -.smart-block-form input[type='checkbox'] { - vertical-align: bottom; - margin: 0 4px; -} - -.smart-block-form ~ .btn-toolbar { - padding-top: 4px; -} - /* Schedule tab DataTable */ #show_builder_table_wrapper .fg-toolbar.ui-corner-tl.ui-corner-tr { diff --git a/airtime_mvc/public/css/playlist_builder.css b/airtime_mvc/public/css/playlist_builder.css index 73a855634..0e344047a 100644 --- a/airtime_mvc/public/css/playlist_builder.css +++ b/airtime_mvc/public/css/playlist_builder.css @@ -634,4 +634,41 @@ li.spl_empty { #criteria_add { margin-bottom: 5px; +} + +.smart-block-form dt, .smart-block-form dd { + float: none; +} +.smart-block-form dl:not(.search-criteria) { + display: flex; + width: 100%; +} +.smart-block-form dt { + flex: 1 0 20%; + margin: 0; +} +.smart-block-form dd { + flex: 0 0 80%; + margin: 0; +} +.collapsible-header .arrow-icon { + transition: 0.3s; +} +.collapsible-header.visible .arrow-icon { + transform: rotate(90deg); +} +.smart-block-advanced { + display: none; +} +.smart-block-form .smart-block-advanced dt { + flex: 0 0 40%; + margin: 0; +} +.smart-block-form .smart-block-advanced dd { + flex: 0 0 60%; + margin: 0; +} +.smart-block-form input[type='radio'], .smart-block-form input[type='checkbox'] { + vertical-align: middle; + margin: 0 5px; } \ No newline at end of file diff --git a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js index 6794e8855..e4e170978 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js @@ -566,6 +566,11 @@ function setupUI() { at: "right center" } }); + + activeTab.find('.smart-block-form .collapsible-header').click(function(){ + $(this).toggleClass('visible'); + $('.smart-block-advanced').toggle(); + }) } /* Utilizing jQuery this function finds the #datetime_select element on the given row From 626e682aad9fa1ef5c5ecfaf8116536e8090c641 Mon Sep 17 00:00:00 2001 From: Robbt Date: Thu, 13 Dec 2018 12:36:10 -0500 Subject: [PATCH 078/210] changed celery podcast download to use mutagen for all supported files vs. mp3 only --- .../airtime-celery/airtime-celery/tasks.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/python_apps/airtime-celery/airtime-celery/tasks.py b/python_apps/airtime-celery/airtime-celery/tasks.py index c25f24528..bd8e6b953 100644 --- a/python_apps/airtime-celery/airtime-celery/tasks.py +++ b/python_apps/airtime-celery/airtime-celery/tasks.py @@ -9,9 +9,7 @@ import posixpath import shutil import tempfile import traceback -from mutagen.mp3 import MP3 -from mutagen.easyid3 import EasyID3 -import mutagen.id3 +import mutagen from StringIO import StringIO from celery import Celery from celery.utils.log import get_task_logger @@ -155,15 +153,12 @@ def podcast_download(id, url, callback_url, api_key, podcast_name, album_overrid with tempfile.NamedTemporaryFile(mode ='wb+', delete=False) as audiofile: r.raw.decode_content = True shutil.copyfileobj(r.raw, audiofile) - # currently hardcoded for mp3s may want to add support for oggs etc - m = MP3(audiofile.name, ID3=EasyID3) - logger.debug('podcast_download loaded mp3 {0}'.format(audiofile.name)) - + metadata_audiofile = mutagen.File(audiofile.name, easy=True) + logger.debug('podcast_download loaded {0}'.format(audiofile.name)) # replace album title as needed - m = podcast_override_album(m, podcast_name, album_override) - - m.save() - filetypeinfo = m.pprint() + metadata_audiofile = podcast_override_album(metadata_audiofile, podcast_name, album_override) + metadata_audiofile.save() + filetypeinfo = metadata_audiofile.pprint() logger.info('filetypeinfo is {0}'.format(filetypeinfo.encode('ascii', 'ignore'))) re = requests.post(callback_url, files={'file': (filename, open(audiofile.name, 'rb'))}, auth=requests.auth.HTTPBasicAuth(api_key, '')) re.raise_for_status() From eec07d38f74d9213ead1374e4b878e58bcfe967e Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 13 Dec 2018 15:05:41 -0600 Subject: [PATCH 079/210] prevent multiple event bindings on collapsible advanced options header --- airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js index e4e170978..035567389 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js @@ -567,10 +567,10 @@ function setupUI() { } }); - activeTab.find('.smart-block-form .collapsible-header').click(function(){ + activeTab.find('.collapsible-header').off('click').on('click', function(){ $(this).toggleClass('visible'); $('.smart-block-advanced').toggle(); - }) + }); } /* Utilizing jQuery this function finds the #datetime_select element on the given row From b56357309fba97c6fe1a547002917ad5a026623c Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 13 Dec 2018 16:29:41 -0600 Subject: [PATCH 080/210] Make Advanced Options string translatable --- .../application/views/scripts/form/smart-block-criteria.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml b/airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml index 2d61c7d96..34c8375e6 100644 --- a/airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml +++ b/airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml @@ -79,7 +79,7 @@ -
Advanced options
+
From 65550f940f3fec43b3016ac7e4993ab35e0afe08 Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 13 Dec 2018 16:30:14 -0600 Subject: [PATCH 081/210] add missing smartblock strings to translation files --- airtime_mvc/locale/ast/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/az/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/hy/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/ja/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/ka/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/lt/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/si/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po | 12 ++++++++++++ .../locale/sr_RS@latin/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/template/airtime.po | 12 ++++++++++++ airtime_mvc/locale/tr/LC_MESSAGES/airtime.po | 12 ++++++++++++ airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po | 12 ++++++++++++ 34 files changed, 408 insertions(+) diff --git a/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po index f76b852b9..b7e4e67f3 100644 --- a/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ast/LC_MESSAGES/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/az/LC_MESSAGES/airtime.po b/airtime_mvc/locale/az/LC_MESSAGES/airtime.po index 952c3f7ae..7a97e7e58 100644 --- a/airtime_mvc/locale/az/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/az/LC_MESSAGES/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po index ebc588c72..18c9e24e0 100644 --- a/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/cs_CZ/LC_MESSAGES/airtime.po @@ -3383,6 +3383,18 @@ msgstr "Dynamický" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po b/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po index 65c1dc92d..c39759bb5 100644 --- a/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/da_DK/LC_MESSAGES/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po index 089555c0c..56542f78b 100644 --- a/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_AT/LC_MESSAGES/airtime.po @@ -3396,6 +3396,18 @@ msgstr "Dynamisch" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po index 2d4ba44c0..e0b2a98ba 100644 --- a/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/de_DE/LC_MESSAGES/airtime.po @@ -3398,6 +3398,18 @@ msgstr "Dynamisch" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po index 7bf24c41f..811f2cc33 100644 --- a/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/el_GR/LC_MESSAGES/airtime.po @@ -3383,6 +3383,18 @@ msgstr "Δυναμικό" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po index 329447ab9..909fae53a 100644 --- a/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_CA/LC_MESSAGES/airtime.po @@ -3383,6 +3383,18 @@ msgstr "Dynamic" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po index 4d83b2e2d..70717361d 100644 --- a/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_GB/LC_MESSAGES/airtime.po @@ -3384,6 +3384,18 @@ msgstr "Dynamic" msgid "Allow Repeated Tracks:" msgstr "Allow Repeated Tracks:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "Sort Tracks:" diff --git a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po index 8477016d5..8fcd0a71b 100644 --- a/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/en_US/LC_MESSAGES/airtime.po @@ -3383,6 +3383,18 @@ msgstr "Dynamic" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po index 4a0f091a8..78aff978e 100644 --- a/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/es_ES/LC_MESSAGES/airtime.po @@ -3395,6 +3395,18 @@ msgstr "Dinámico" msgid "Allow Repeated Tracks:" msgstr "Permitir Pistas Repetidas:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "Ordenar Pistas:" diff --git a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po index f29caed5d..0c86021f5 100644 --- a/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/fr_FR/LC_MESSAGES/airtime.po @@ -3383,6 +3383,18 @@ msgstr "Dynamique" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po index 0d89c8418..958dcbd10 100644 --- a/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hr_HR/LC_MESSAGES/airtime.po @@ -3382,6 +3382,18 @@ msgstr "Dinamički" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po index 6f1a6fe02..70522bc48 100644 --- a/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hu_HU/LC_MESSAGES/airtime.po @@ -3567,6 +3567,18 @@ msgstr "Dinamikus" msgid "Allow Repeated Tracks:" msgstr "Ismétlődő sávok engedélyezése:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "Sávok rendezése:" diff --git a/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po index 1c246b1a1..52bf3c7af 100644 --- a/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hy/LC_MESSAGES/airtime.po @@ -3376,6 +3376,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po b/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po index 25bbe9f2d..3f4ec08ac 100644 --- a/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/hy_AM/LC_MESSAGES/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po b/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po index 1c7de0a44..d0231319d 100644 --- a/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/id_ID/LC_MESSAGES/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po index 3982903d0..64c0ea64d 100644 --- a/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/it_IT/LC_MESSAGES/airtime.po @@ -3384,6 +3384,18 @@ msgstr "Dinamico" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po index ee02e1e92..c761b6f29 100644 --- a/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ja/LC_MESSAGES/airtime.po @@ -3382,6 +3382,18 @@ msgstr "自動生成スマート・ブロック" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po index 6d7e963d3..0a9896f58 100644 --- a/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ja_JP/LC_MESSAGES/airtime.po @@ -3377,6 +3377,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po index b8de4d740..d27a90f8d 100644 --- a/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ka/LC_MESSAGES/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po index d033f559d..b1e6178f2 100644 --- a/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ko_KR/LC_MESSAGES/airtime.po @@ -3380,6 +3380,18 @@ msgstr "동적(Dynamic)" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po b/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po index f50e162b4..e7f64ba2c 100644 --- a/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/lt/LC_MESSAGES/airtime.po @@ -3380,6 +3380,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po index 55fb4d204..ef103279f 100644 --- a/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/nl_NL/LC_MESSAGES/airtime.po @@ -3386,6 +3386,18 @@ msgstr "Dynamisch" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po index da8f49d83..8decd1ebb 100644 --- a/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pl_PL/LC_MESSAGES/airtime.po @@ -3383,6 +3383,18 @@ msgstr "Dynamiczny" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po index bef98e329..47f8b063e 100644 --- a/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/pt_BR/LC_MESSAGES/airtime.po @@ -3384,6 +3384,18 @@ msgstr "Dinâmico" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po index 52492e749..5552b9f3e 100644 --- a/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ro_RO/LC_MESSAGES/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po index 98d34e14a..f256aba77 100644 --- a/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/ru_RU/LC_MESSAGES/airtime.po @@ -3402,6 +3402,18 @@ msgstr "Динамический" msgid "Allow Repeated Tracks:" msgstr "Разрешить повторение треков:" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "Сортировка треков:" diff --git a/airtime_mvc/locale/si/LC_MESSAGES/airtime.po b/airtime_mvc/locale/si/LC_MESSAGES/airtime.po index d5d98b2b2..d0f0e4f9d 100644 --- a/airtime_mvc/locale/si/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/si/LC_MESSAGES/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po index 3d217c6f7..d5903931f 100644 --- a/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS/LC_MESSAGES/airtime.po @@ -3382,6 +3382,18 @@ msgstr "Динамички" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po index cececa3e4..3a1886849 100644 --- a/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/sr_RS@latin/LC_MESSAGES/airtime.po @@ -3382,6 +3382,18 @@ msgstr "Dinamički" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/template/airtime.po b/airtime_mvc/locale/template/airtime.po index acf00adde..c4bd1a53c 100644 --- a/airtime_mvc/locale/template/airtime.po +++ b/airtime_mvc/locale/template/airtime.po @@ -3379,6 +3379,18 @@ msgstr "" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po b/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po index 946f16cb4..334270f4a 100644 --- a/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/tr/LC_MESSAGES/airtime.po @@ -3380,6 +3380,18 @@ msgstr "Dinamik" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" diff --git a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po index 918c1b86f..a7fda2121 100644 --- a/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po +++ b/airtime_mvc/locale/zh_CN/LC_MESSAGES/airtime.po @@ -3382,6 +3382,18 @@ msgstr "动态" msgid "Allow Repeated Tracks:" msgstr "" +#: airtime_mvc/application/forms/SmartBlockCriteria.php:453 +msgid "Allow last track to exceed time limit:" +msgstr "" + +#: airtime_mvc/application/views/scripts/playlist/update.phtml:25 +msgid "
This is only a preview of possible content generated by the smart block based upon the above criteria." +msgstr "" + +#: airtime_mvc/application/views/scripts/form/smart-block-criteria.phtml:82 +msgid "Advanced options" +msgstr "" + #: airtime_mvc/application/forms/SmartBlockCriteria.php:308 msgid "Sort Tracks:" msgstr "" From 4e172944aca6efc12654cb74f3cb6d6e9d404d69 Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 13 Dec 2018 17:59:23 -0600 Subject: [PATCH 082/210] remove space below smartblock advanced options --- airtime_mvc/public/css/dashboard.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/airtime_mvc/public/css/dashboard.css b/airtime_mvc/public/css/dashboard.css index 8df5161b0..596d9514e 100644 --- a/airtime_mvc/public/css/dashboard.css +++ b/airtime_mvc/public/css/dashboard.css @@ -518,6 +518,7 @@ li.ui-state-default { left: 4px; overflow-x: hidden; /* Show the y-direction scrollbar (magic!) */ color: #efefef; + justify-content: stretch; } .angular_wrapper a { @@ -549,6 +550,13 @@ li.ui-state-default { -moz-box-sizing: border-box; box-sizing: border-box; } +.inner_editor_wrapper.smart-block-form { + -webkit-flex: 0 0 auto; + -moz-flex: 0 0 auto; + -ms-flex: 0 0 auto; + -o-flex: 0 0 auto; + flex: 0 0 auto; +} .angular_wrapper > .inner_editor_wrapper { max-height: none; From ac10de50909370a210feb3864ab18a9e6a6c79f9 Mon Sep 17 00:00:00 2001 From: Robbt Date: Thu, 13 Dec 2018 21:26:08 -0500 Subject: [PATCH 083/210] fixed missing closing bracket and removed debugging log --- airtime_mvc/public/js/airtime/library/podcast.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 1e578fdb3..38d5728db 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -54,9 +54,8 @@ var AIRTIME = (function (AIRTIME) { * Generate a smartblock and playlist for this smartblock. */ $scope.createSmartblock = function () { - console.log($scope.podcast.id); $.post(endpoint + "smartblock", {csrf_token: $("#csrf").val(), id: $scope.podcast.id}, callback); - + }; /** * Close the tab and discard any changes made to the podcast data. */ From 15b73580c11f242dfe0d56ccf1bdc3aea9640518 Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 14 Dec 2018 05:40:47 -0600 Subject: [PATCH 084/210] podcasts: change icon from cog to edit pencil --- airtime_mvc/public/js/airtime/library/library.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 351c71e57..b1e3b5075 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -1379,8 +1379,8 @@ var AIRTIME = (function(AIRTIME) { }); $.extend(true, podcastToolbarButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], { - title: $.i18n._('Settings'), - iconClass : "icon-cog", + title: $.i18n._('Edit'), + iconClass : "icon-pencil", eventHandlers: { click: AIRTIME.podcast.editSelectedPodcasts }, From 15cf291bc990c081018ffa8a55bbad0ed684d9c0 Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 14 Dec 2018 15:24:28 -0600 Subject: [PATCH 085/210] set auto-generated smartblock and playlist title directly from input --- .../rest/controllers/PodcastController.php | 5 +- .../application/services/PodcastService.php | 75 ++++++++++--------- .../public/js/airtime/library/podcast.js | 13 +++- 3 files changed, 53 insertions(+), 40 deletions(-) diff --git a/airtime_mvc/application/modules/rest/controllers/PodcastController.php b/airtime_mvc/application/modules/rest/controllers/PodcastController.php index b3fc38832..eb454cb94 100644 --- a/airtime_mvc/application/modules/rest/controllers/PodcastController.php +++ b/airtime_mvc/application/modules/rest/controllers/PodcastController.php @@ -198,14 +198,15 @@ class Rest_PodcastController extends Zend_Rest_Controller public function smartblockAction() { + $title = $this->_getParam('title', []); $id = $this->_getParam('id', []); if (!$id) { return; } $podcast = Application_Service_PodcastService::getPodcastById($id); - logging::info($podcast); - Application_Service_PodcastService::createPodcastSmartblockAndPlaylist($podcast); + // logging::info($podcast); + Application_Service_PodcastService::createPodcastSmartblockAndPlaylist($podcast, $title); } diff --git a/airtime_mvc/application/services/PodcastService.php b/airtime_mvc/application/services/PodcastService.php index f5abb8590..b67028a8c 100644 --- a/airtime_mvc/application/services/PodcastService.php +++ b/airtime_mvc/application/services/PodcastService.php @@ -162,55 +162,56 @@ class Application_Service_PodcastService /** * @param $podcast + * @param $title passed in directly from web UI input * This will automatically create a smartblock and playlist for this podcast. */ - public static function createPodcastSmartblockAndPlaylist($podcast) + public static function createPodcastSmartblockAndPlaylist($podcast, $title) { if (is_array($podcast)) { $newpodcast = new Podcast(); $newpodcast->fromArray($podcast, BasePeer::TYPE_FIELDNAME); $podcast = $newpodcast; } - // Base class - $newBl = new Application_Model_Block(); - $newBl->setCreator(Application_Model_User::getCurrentUser()->getId()); - $newBl->setName($podcast->getDbTitle()); - $newBl->setDescription('Auto-generated smartblock for podcast'); - $newBl->saveType('dynamic'); - // limit the smartblock to 1 item - $row = new CcBlockcriteria(); - $row->setDbCriteria('limit'); - $row->setDbModifier('items'); - $row->setDbValue(1); - $row->setDbBlockId($newBl->getId()); - $row->save(); + // Base class + $newBl = new Application_Model_Block(); + $newBl->setCreator(Application_Model_User::getCurrentUser()->getId()); + $newBl->setName($title); + $newBl->setDescription('Auto-generated smartblock for podcast'); + $newBl->saveType('dynamic'); + // limit the smartblock to 1 item + $row = new CcBlockcriteria(); + $row->setDbCriteria('limit'); + $row->setDbModifier('items'); + $row->setDbValue(1); + $row->setDbBlockId($newBl->getId()); + $row->save(); - // sort so that it is the newest item - $row = new CcBlockcriteria(); - $row->setDbCriteria('sort'); - $row->setDbModifier('N/A'); - $row->setDbValue('newest'); - $row->setDbBlockId($newBl->getId()); - $row->save(); + // sort so that it is the newest item + $row = new CcBlockcriteria(); + $row->setDbCriteria('sort'); + $row->setDbModifier('N/A'); + $row->setDbValue('newest'); + $row->setDbBlockId($newBl->getId()); + $row->save(); - // match the track by ensuring the album title matches the podcast - $row = new CcBlockcriteria(); - $row->setDbCriteria('album_title'); - $row->setDbModifier('is'); - $row->setDbValue($newBl->getName()); - $row->setDbBlockId($newBl->getId()); - $row->save(); + // match the track by ensuring the album title matches the podcast + $row = new CcBlockcriteria(); + $row->setDbCriteria('album_title'); + $row->setDbModifier('is'); + $row->setDbValue($title); + $row->setDbBlockId($newBl->getId()); + $row->save(); - $newPl = new Application_Model_Playlist(); - $newPl->setName($podcast->getDbTitle()); - $newPl->setCreator(Application_Model_User::getCurrentUser()->getId()); - $row = new CcPlaylistcontents(); - $row->setDbBlockId($newBl->getId()); - $row->setDbPlaylistId($newPl->getId()); - $row->setDbType(2); - $row->save(); - } + $newPl = new Application_Model_Playlist(); + $newPl->setName($title); + $newPl->setCreator(Application_Model_User::getCurrentUser()->getId()); + $row = new CcPlaylistcontents(); + $row->setDbBlockId($newBl->getId()); + $row->setDbPlaylistId($newPl->getId()); + $row->setDbType(2); + $row->save(); + } public static function createStationPodcast() diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 38d5728db..70a125eb1 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -54,7 +54,18 @@ var AIRTIME = (function (AIRTIME) { * Generate a smartblock and playlist for this smartblock. */ $scope.createSmartblock = function () { - $.post(endpoint + "smartblock", {csrf_token: $("#csrf").val(), id: $scope.podcast.id}, callback); + // send smarblock creation instruction to API + $.post( + endpoint + "smartblock", + { + csrf_token: $("#csrf").val(), + id: $scope.podcast.id, + title: $scope.podcast.title + }, + callback + ); + // save podcast + $scope.savePodcast(); }; /** * Close the tab and discard any changes made to the podcast data. From 58299962023342027aeed50d85a629cb7eb92dc7 Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 14 Dec 2018 15:26:37 -0600 Subject: [PATCH 086/210] remove podcast pane close upon save --- airtime_mvc/public/js/airtime/library/podcast.js | 1 - 1 file changed, 1 deletion(-) diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 70a125eb1..b4aad6219 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -36,7 +36,6 @@ var AIRTIME = (function (AIRTIME) { self.onSaveCallback = function () { AIRTIME.library.podcastDataTable.fnDraw(); - tab.close(); }; /** From bde87c7afb50dd5f736b828cd5388811d203a32d Mon Sep 17 00:00:00 2001 From: ryan Date: Sat, 15 Dec 2018 05:09:19 -0600 Subject: [PATCH 087/210] podcast smartblock generation: add success message and conditional hide --- .../views/scripts/podcast/podcast.phtml | 40 ++++---- airtime_mvc/public/css/styles.css | 95 +++++++------------ .../public/js/airtime/library/podcast.js | 11 ++- 3 files changed, 65 insertions(+), 81 deletions(-) diff --git a/airtime_mvc/application/views/scripts/podcast/podcast.phtml b/airtime_mvc/application/views/scripts/podcast/podcast.phtml index 6c715d8b3..b13d88f3f 100644 --- a/airtime_mvc/application/views/scripts/podcast/podcast.phtml +++ b/airtime_mvc/application/views/scripts/podcast/podcast.phtml @@ -7,28 +7,34 @@
 
element->getElement('submit') ?> From 85f75fcadfb580c26660881679cfa4b9b9ecf6d4 Mon Sep 17 00:00:00 2001 From: vagrant Date: Tue, 18 Dec 2018 15:34:58 +0000 Subject: [PATCH 095/210] made Y default value for install script --- install | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/install b/install index a180365eb..71b8d0361 100755 --- a/install +++ b/install @@ -93,7 +93,7 @@ code="" apache_bin="" skip_postgres=0 skip_rabbitmq=0 - +default_value="Y" function verbose() { if [[ ${_v} -eq 1 ]]; then @@ -769,6 +769,7 @@ fi if [ "$apache" = "f" -a ${_i} -eq 1 ]; then echo -e "Install default Airtime apache configuration? (Y/n): \c" read IN + IN=${IN:-$default_value} if [ "$IN" = "y" -o "$IN" = "Y" ]; then apache="t" fi @@ -870,6 +871,7 @@ fi if [ "$icecast" = "f" -a ${_i} -eq 1 ]; then echo -e "Install default Airtime Icecast configuration? (Y/n): \c" read IN + IN=${IN:-$default_value} if [ "$IN" = "y" -o "$IN" = "Y" ]; then icecast="t" fi @@ -1042,6 +1044,7 @@ EOF elif [ ${_i} -eq 1 ]; then echo -e "Create default airtime postgres user? (Y/n): \c" read IN + IN=${IN:-$default_value} if [ "$IN" = "y" -o "$IN" = "Y" ]; then setupAirtimePostgresUser fi From 9e78c110c5fccb306875741a4a3fcf0f9b8cb16a Mon Sep 17 00:00:00 2001 From: Robbt Date: Wed, 19 Dec 2018 15:50:10 -0500 Subject: [PATCH 096/210] made mutagen version 1.41 or above --- python_apps/airtime_analyzer/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 6c4f2f0ed..e59b34593 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -28,7 +28,7 @@ setup(name='airtime_analyzer', packages=['airtime_analyzer'], scripts=['bin/airtime_analyzer'], install_requires=[ - 'mutagen', # got rid of specific version requirement + 'mutagen>=1.41.1', # got rid of specific version requirement 'pika', 'daemon', 'file-magic', From 0b9c3396ea3f9f1d544954125e9777970fb229c9 Mon Sep 17 00:00:00 2001 From: Robbt Date: Wed, 19 Dec 2018 16:27:31 -0500 Subject: [PATCH 097/210] removed debug line that was causing failures for m4a --- python_apps/airtime-celery/airtime-celery/tasks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python_apps/airtime-celery/airtime-celery/tasks.py b/python_apps/airtime-celery/airtime-celery/tasks.py index bd8e6b953..3b06e89e5 100644 --- a/python_apps/airtime-celery/airtime-celery/tasks.py +++ b/python_apps/airtime-celery/airtime-celery/tasks.py @@ -154,7 +154,6 @@ def podcast_download(id, url, callback_url, api_key, podcast_name, album_overrid r.raw.decode_content = True shutil.copyfileobj(r.raw, audiofile) metadata_audiofile = mutagen.File(audiofile.name, easy=True) - logger.debug('podcast_download loaded {0}'.format(audiofile.name)) # replace album title as needed metadata_audiofile = podcast_override_album(metadata_audiofile, podcast_name, album_override) metadata_audiofile.save() From bd409fa1009028f27554c5ad62166c2a924cce82 Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 20 Dec 2018 13:23:13 -0600 Subject: [PATCH 098/210] podcasts: open edit pane upon submission of popup --- airtime_mvc/public/js/airtime/library/podcast.js | 1 + 1 file changed, 1 insertion(+) diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index ac90eb588..31cb4bd84 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -507,6 +507,7 @@ var AIRTIME = (function (AIRTIME) { AIRTIME.library.podcastTableWidget.clearSelection(); AIRTIME.library.setCurrentTable(AIRTIME.library.DataTableTypeEnum.PODCAST_EPISODES); $("#podcast_url_dialog").dialog("close"); + _initAppFromResponse(json); }).fail(function (e) { var errors = $("#podcast_url_dialog").find(".errors"); errors.show(200).text(e.responseText); From 201d3741d85dba0a3f776f516f695c86b1202294 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sat, 22 Dec 2018 22:19:38 +0100 Subject: [PATCH 099/210] :fire: (analyzer) cleanup analyzer.py --- .../airtime_analyzer/airtime_analyzer/analyzer.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py index 4a58aa75d..eae40d1fd 100644 --- a/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py +++ b/python_apps/airtime_analyzer/airtime_analyzer/analyzer.py @@ -1,13 +1,10 @@ +# TODO: use an abstract base class (ie. import from abc ...) once we have python >=3.3 that supports @staticmethod with @abstractmethod + class Analyzer: - """ Abstract base class fpr all "analyzers". + """ Abstract base class for all "analyzers". """ + @staticmethod def analyze(filename, metadata): raise NotImplementedError - -''' -class AnalyzerError(Error): - def __init__(self): - super.__init__(self) -''' From bc17f483bdbc4867f2be8f1f51e59f7d082d9c44 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sun, 23 Dec 2018 08:50:55 +0100 Subject: [PATCH 100/210] :heavy_minus_sign: (mvc) remove zfdebug Remove zfdebug since it is unused and has a dependency on zendframework1. --- airtime_mvc/application/Bootstrap.php | 27 +++----------- composer.json | 3 +- composer.lock | 54 +++------------------------ 3 files changed, 12 insertions(+), 72 deletions(-) diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 37b2ca3af..dcb9ba090 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -43,29 +43,14 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap $view->doctype('XHTML1_STRICT'); } - protected function _initZFDebug() + /** + * initialize front controller + * + * This is call ZFrontController to ensure it is executed last in the bootstrap process. + */ + protected function _initZFrontController() { - Zend_Controller_Front::getInstance()->throwExceptions(false); - - /* - if (APPLICATION_ENV == "development") { - $autoloader = Zend_Loader_Autoloader::getInstance(); - $autoloader->registerNamespace('ZFDebug'); - - $options = array( - 'plugins' => array('Variables', - 'Exception', - 'Memory', - 'Time') - ); - $debug = new ZFDebug_Controller_Plugin_Debug($options); - - $this->bootstrap('frontController'); - $frontController = $this->getResource('frontController'); - $frontController->registerPlugin($debug); - } - */ } protected function _initRouter() diff --git a/composer.json b/composer.json index 2df118aa6..9bcfc9b4a 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,6 @@ }, "require-dev": { "phpunit/phpunit": "^4.3", - "phpunit/dbunit": "^2.0", - "jokkedk/zfdebug": "^1.6" + "phpunit/dbunit": "^2.0" } } diff --git a/composer.lock b/composer.lock index 10c8a7e11..adce81daf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "8742fac4756aa4a4ec5e8035030410da", - "content-hash": "e5741a6b2af783dd4b1467b29e3387ab", + "hash": "0e4eedf77a6c56350bfc8f9c4a193f48", + "content-hash": "e85c1a0029cb2b6f1d1c6bf4ef399e7b", "packages": [ { "name": "aws/aws-sdk-php", @@ -673,7 +673,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplepie/simplepie/zipball/3d628875ef6cda045b9a7df6ac509f73756670c6", + "url": "https://api.github.com/repos/simplepie/simplepie/zipball/0e8fe72132dad765d25db4cabc69a91139af1263", "reference": "eb6dd2d578dd62a1eec68b60cdda8c4a38a8de49", "shasum": "" }, @@ -826,6 +826,7 @@ "ZF1", "framework" ], + "abandoned": "zendframework/zendframework", "time": "2016-09-08 14:50:34" } ], @@ -884,52 +885,6 @@ ], "time": "2015-06-14 21:17:01" }, - { - "name": "jokkedk/zfdebug", - "version": "1.6.3", - "source": { - "type": "git", - "url": "https://github.com/jokkedk/ZFDebug.git", - "reference": "0450584c2ecaaa2b6503416b3434f35cbf45273b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jokkedk/ZFDebug/zipball/0450584c2ecaaa2b6503416b3434f35cbf45273b", - "reference": "0450584c2ecaaa2b6503416b3434f35cbf45273b", - "shasum": "" - }, - "require": { - "zendframework/zendframework1": "1.*" - }, - "type": "library", - "autoload": { - "psr-0": { - "ZFDebug_": "library/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "library/" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Joakim Nygård", - "homepage": "http://jokke.dk", - "role": "Developer" - }, - { - "name": "Andreas Pankratz", - "homepage": "http://www.bangal.de", - "role": "Contributor" - } - ], - "description": "ZFDebug is a plugin for the Zend Framework for PHP5, providing useful debug information displayed in a small bar at the bottom of every page.", - "homepage": "https://github.com/jokkedk/ZFDebug", - "time": "2014-06-25 14:06:28" - }, { "name": "phpdocumentor/reflection-docblock", "version": "2.0.4", @@ -1095,6 +1050,7 @@ "testing", "xunit" ], + "abandoned": true, "time": "2016-12-02 14:39:14" }, { From 36891c18c820ad3a424d3d639f2bdc8aae7a2bb4 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sun, 23 Dec 2018 11:01:25 +0100 Subject: [PATCH 101/210] :recycle: (pypo) cleanup pypo/__main__.py Clean up code and add python 3 support (with python 2 bc). --- python_apps/pypo/pypo/__main__.py | 227 +++++++++++++++++------------- python_apps/pypo/setup.py | 1 + 2 files changed, 130 insertions(+), 98 deletions(-) diff --git a/python_apps/pypo/pypo/__main__.py b/python_apps/pypo/pypo/__main__.py index 33c8a07eb..7b8f8cf24 100644 --- a/python_apps/pypo/pypo/__main__.py +++ b/python_apps/pypo/pypo/__main__.py @@ -1,39 +1,36 @@ """ Python part of radio playout (pypo) """ +from __future__ import absolute_import -from optparse import OptionParser -from datetime import datetime - -import telnetlib - -import time -import sys -import signal -import logging import locale +import logging import os import re +import signal +import sys +import telnetlib +import time -from Queue import Queue +from api_clients import api_client +from configobj import ConfigObj +from datetime import datetime +from optparse import OptionParser +from queue import Queue from threading import Lock -from pypopush import PypoPush -from pypofetch import PypoFetch -from pypofile import PypoFile -from recorder import Recorder -from listenerstat import ListenerStat -from pypomessagehandler import PypoMessageHandler -from pypoliquidsoap import PypoLiquidsoap -from timeout import ls_timeout +from .listenerstat import ListenerStat +from .pypofetch import PypoFetch +from .pypofile import PypoFile +from .pypoliquidsoap import PypoLiquidsoap +from .pypomessagehandler import PypoMessageHandler +from .pypopush import PypoPush +from .recorder import Recorder +from .timeout import ls_timeout +from . import pure -from configobj import ConfigObj -# custom imports -from api_clients import api_client -import pure - -LOG_PATH = '/var/log/airtime/pypo/pypo.log' +LOG_PATH = "/var/log/airtime/pypo/pypo.log" LOG_LEVEL = logging.INFO logging.captureWarnings(True) @@ -45,42 +42,54 @@ usage = "%prog [options]" + " - python playout system" parser = OptionParser(usage=usage) # Options -parser.add_option("-v", "--compat", - help="Check compatibility with server API version", - default=False, - action="store_true", - dest="check_compat") +parser.add_option( + "-v", + "--compat", + help="Check compatibility with server API version", + default=False, + action="store_true", + dest="check_compat", +) -parser.add_option("-t", "--test", - help="Do a test to make sure everything is working properly.", - default=False, - action="store_true", - dest="test") +parser.add_option( + "-t", + "--test", + help="Do a test to make sure everything is working properly.", + default=False, + action="store_true", + dest="test", +) -parser.add_option("-b", - "--cleanup", - help="Cleanup", - default=False, - action="store_true", - dest="cleanup") +parser.add_option( + "-b", + "--cleanup", + help="Cleanup", + default=False, + action="store_true", + dest="cleanup", +) -parser.add_option("-c", - "--check", - help="Check the cached schedule and exit", - default=False, - action="store_true", - dest="check") +parser.add_option( + "-c", + "--check", + help="Check the cached schedule and exit", + default=False, + action="store_true", + dest="check", +) # parse options (options, args) = parser.parse_args() LIQUIDSOAP_MIN_VERSION = "1.1.1" -PYPO_HOME='/var/tmp/airtime/pypo/' +PYPO_HOME = "/var/tmp/airtime/pypo/" + def configure_environment(): os.environ["HOME"] = PYPO_HOME - os.environ["TERM"] = 'xterm' + os.environ["TERM"] = "xterm" + configure_environment() @@ -90,23 +99,27 @@ logging.captureWarnings(True) # configure logging try: # Set up logging - logFormatter = logging.Formatter("%(asctime)s [%(module)s] [%(levelname)-5.5s] %(message)s") + logFormatter = logging.Formatter( + "%(asctime)s [%(module)s] [%(levelname)-5.5s] %(message)s" + ) rootLogger = logging.getLogger() rootLogger.setLevel(LOG_LEVEL) logger = rootLogger - fileHandler = logging.handlers.RotatingFileHandler(filename=LOG_PATH, maxBytes=1024 * 1024 * 30, - backupCount=8) + fileHandler = logging.handlers.RotatingFileHandler( + filename=LOG_PATH, maxBytes=1024 * 1024 * 30, backupCount=8 + ) fileHandler.setFormatter(logFormatter) rootLogger.addHandler(fileHandler) consoleHandler = logging.StreamHandler() consoleHandler.setFormatter(logFormatter) rootLogger.addHandler(consoleHandler) -except Exception, e: - print "Couldn't configure logging", e +except Exception as e: + print("Couldn't configure logging", e) sys.exit(1) + def configure_locale(): """ Silly hacks to force Python 2.x to run in UTF-8 mode. Not portable at all, @@ -123,21 +136,26 @@ def configure_locale(): default_locale = locale.getdefaultlocale() if default_locale[1] is None: - logger.debug("No default locale exists. Let's try loading from \ - /etc/default/locale") + logger.debug( + "No default locale exists. Let's try loading from \ + /etc/default/locale" + ) if os.path.exists("/etc/default/locale"): - locale_config = ConfigObj('/etc/default/locale') - lang = locale_config.get('LANG') + locale_config = ConfigObj("/etc/default/locale") + lang = locale_config.get("LANG") new_locale = lang else: - logger.error("/etc/default/locale could not be found! Please \ - run 'sudo update-locale' from command-line.") + logger.error( + "/etc/default/locale could not be found! Please \ + run 'sudo update-locale' from command-line." + ) sys.exit(1) else: new_locale = default_locale - logger.info("New locale set to: %s", \ - locale.setlocale(locale.LC_ALL, new_locale)) + logger.info( + "New locale set to: %s", locale.setlocale(locale.LC_ALL, new_locale) + ) reload(sys) sys.setdefaultencoding("UTF-8") @@ -145,9 +163,10 @@ def configure_locale(): logger.debug("sys default encoding %s", sys.getdefaultencoding()) logger.debug("After %s", locale.nl_langinfo(locale.CODESET)) - if current_locale_encoding not in ['utf-8', 'utf8']: - logger.error("Need a UTF-8 locale. Currently '%s'. Exiting..." % \ - current_locale_encoding) + if current_locale_encoding not in ["utf-8", "utf8"]: + logger.error( + "Need a UTF-8 locale. Currently '%s'. Exiting..." % current_locale_encoding + ) sys.exit(1) @@ -155,11 +174,12 @@ configure_locale() # loading config file try: - config = ConfigObj('/etc/airtime/airtime.conf') -except Exception, e: - logger.error('Error loading config file: %s', e) + config = ConfigObj("/etc/airtime/airtime.conf") +except Exception as e: + logger.error("Error loading config file: %s", e) sys.exit(1) + class Global: def __init__(self, api_client): self.api_client = api_client @@ -170,11 +190,13 @@ class Global: def test_api(self): self.api_client.test() + def keyboardInterruptHandler(signum, frame): logger = logging.getLogger() - logger.info('\nKeyboard Interrupt\n') + logger.info("\nKeyboard Interrupt\n") sys.exit(0) + @ls_timeout def liquidsoap_get_info(telnet_lock, host, port, logger): logger.debug("Checking to see if Liquidsoap is running") @@ -185,7 +207,7 @@ def liquidsoap_get_info(telnet_lock, host, port, logger): tn.write(msg) tn.write("exit\n") response = tn.read_all() - except Exception, e: + except Exception as e: logger.error(str(e)) return None finally: @@ -193,6 +215,7 @@ def liquidsoap_get_info(telnet_lock, host, port, logger): return get_liquidsoap_version(response) + def get_liquidsoap_version(version_string): m = re.match(r"Liquidsoap (\d+.\d+.\d+)", version_string) @@ -201,42 +224,49 @@ def get_liquidsoap_version(version_string): else: return None - if m: current_version = m.group(1) return pure.version_cmp(current_version, LIQUIDSOAP_MIN_VERSION) >= 0 return False + def liquidsoap_startup_test(): - liquidsoap_version_string = \ - liquidsoap_get_info(telnet_lock, ls_host, ls_port, logger) + liquidsoap_version_string = liquidsoap_get_info( + telnet_lock, ls_host, ls_port, logger + ) while not liquidsoap_version_string: - logger.warning("Liquidsoap doesn't appear to be running!, " + \ - "Sleeping and trying again") + logger.warning( + "Liquidsoap doesn't appear to be running!, " + "Sleeping and trying again" + ) time.sleep(1) - liquidsoap_version_string = \ - liquidsoap_get_info(telnet_lock, ls_host, ls_port, logger) + liquidsoap_version_string = liquidsoap_get_info( + telnet_lock, ls_host, ls_port, logger + ) while pure.version_cmp(liquidsoap_version_string, LIQUIDSOAP_MIN_VERSION) < 0: - logger.warning("Liquidsoap is running but in incorrect version! " + \ - "Make sure you have at least Liquidsoap %s installed" % LIQUIDSOAP_MIN_VERSION) + logger.warning( + "Liquidsoap is running but in incorrect version! " + + "Make sure you have at least Liquidsoap %s installed" + % LIQUIDSOAP_MIN_VERSION + ) time.sleep(1) - liquidsoap_version_string = \ - liquidsoap_get_info(telnet_lock, ls_host, ls_port, logger) + liquidsoap_version_string = liquidsoap_get_info( + telnet_lock, ls_host, ls_port, logger + ) logger.info("Liquidsoap version string found %s" % liquidsoap_version_string) -if __name__ == '__main__': - logger.info('###########################################') - logger.info('# *** pypo *** #') - logger.info('# Liquidsoap Scheduled Playout System #') - logger.info('###########################################') +if __name__ == "__main__": + logger.info("###########################################") + logger.info("# *** pypo *** #") + logger.info("# Liquidsoap Scheduled Playout System #") + logger.info("###########################################") - #Although all of our calculations are in UTC, it is useful to know what timezone - #the local machine is, so that we have a reference for what time the actual - #log entries were made + # Although all of our calculations are in UTC, it is useful to know what timezone + # the local machine is, so that we have a reference for what time the actual + # log entries were made logger.info("Timezone: %s" % str(time.tzname)) logger.info("UTC time: %s" % str(datetime.utcnow())) @@ -251,16 +281,16 @@ if __name__ == '__main__': success = False while not success: try: - api_client.register_component('pypo') + api_client.register_component("pypo") success = True - except Exception, e: + except Exception as e: logger.error(str(e)) time.sleep(10) telnet_lock = Lock() - ls_host = config['pypo']['ls_host'] - ls_port = config['pypo']['ls_port'] + ls_host = config["pypo"]["ls_host"] + ls_port = config["pypo"]["ls_port"] liquidsoap_startup_test() @@ -272,8 +302,7 @@ if __name__ == '__main__': recorder_q = Queue() pypoPush_q = Queue() - pypo_liquidsoap = PypoLiquidsoap(logger, telnet_lock,\ - ls_host, ls_port) + pypo_liquidsoap = PypoLiquidsoap(logger, telnet_lock, ls_host, ls_port) """ This queue is shared between pypo-fetch and pypo-file, where pypo-file @@ -284,19 +313,21 @@ if __name__ == '__main__': media_q = Queue() # Pass only the configuration sections needed; PypoMessageHandler only needs rabbitmq settings - pmh = PypoMessageHandler(pypoFetch_q, recorder_q, config['rabbitmq']) + pmh = PypoMessageHandler(pypoFetch_q, recorder_q, config["rabbitmq"]) pmh.daemon = True pmh.start() - pfile = PypoFile(media_q, config['pypo']) + pfile = PypoFile(media_q, config["pypo"]) pfile.daemon = True pfile.start() - pf = PypoFetch(pypoFetch_q, pypoPush_q, media_q, telnet_lock, pypo_liquidsoap, config['pypo']) + pf = PypoFetch( + pypoFetch_q, pypoPush_q, media_q, telnet_lock, pypo_liquidsoap, config["pypo"] + ) pf.daemon = True pf.start() - pp = PypoPush(pypoPush_q, telnet_lock, pypo_liquidsoap, config['pypo']) + pp = PypoPush(pypoPush_q, telnet_lock, pypo_liquidsoap, config["pypo"]) pp.daemon = True pp.start() diff --git a/python_apps/pypo/setup.py b/python_apps/pypo/setup.py index 596ec22c4..618339435 100644 --- a/python_apps/pypo/setup.py +++ b/python_apps/pypo/setup.py @@ -51,6 +51,7 @@ setup(name='airtime-playout', 'argparse', 'configobj', 'docopt', + 'future', 'kombu', 'mutagen', 'poster', From 79d5d98843cbdc8d0333b246764763c136f03a86 Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 23 Dec 2018 07:08:35 -0500 Subject: [PATCH 102/210] prevented shuffling from failing on playlists containing smartblocks --- airtime_mvc/application/controllers/PlaylistController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/PlaylistController.php b/airtime_mvc/application/controllers/PlaylistController.php index 4c63d73e5..685bfd480 100644 --- a/airtime_mvc/application/controllers/PlaylistController.php +++ b/airtime_mvc/application/controllers/PlaylistController.php @@ -64,7 +64,7 @@ class PlaylistController extends Zend_Controller_Action $this->view->obj = $obj; $this->view->contents = $obj->getContents(); - if ($formIsValid) { + if ($formIsValid && $obj instanceof Application_Model_Block) { $this->view->poolCount = $obj->getListofFilesMeetCriteria()['count']; } $this->view->showPoolCount = true; From dfcd3dd837a75b28b3b84ae3417c63d83b878aa4 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sun, 23 Dec 2018 14:42:29 +0100 Subject: [PATCH 103/210] Create issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 41 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++++++ 2 files changed, 61 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..98a8f4524 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**LibreTime version:** +Version from the upgrade popup if you can reach it. + +**Installation method:** + - OS: [e.g. Ubuntu] + - OS Version [e.g. 16.04.5 LTS (Xenial Xerus)] + - Method: [e.g. `./install` script or packages] + - Details: [how did you call the install script, where did you get packages from] + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Client (please complete the following information if applicable):** + - OS: [e.g. Fedora] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..982a4dc0d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: feature-request +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From e2e8591b4d0203c47c401463ed398e34a0aa404c Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 23 Dec 2018 14:54:47 -0500 Subject: [PATCH 104/210] added track title override for podcasts --- airtime_mvc/application/common/PodcastManager.php | 1 + .../application/services/PodcastEpisodeService.php | 9 +++++---- python_apps/airtime-celery/airtime-celery/tasks.py | 8 +++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/airtime_mvc/application/common/PodcastManager.php b/airtime_mvc/application/common/PodcastManager.php index a090ff910..1e49463c1 100644 --- a/airtime_mvc/application/common/PodcastManager.php +++ b/airtime_mvc/application/common/PodcastManager.php @@ -37,6 +37,7 @@ class PodcastManager { // but will at least continue to ingest new episodes. if (!empty($episodes)) { $podcast->setDbAutoIngestTimestamp(gmdate('r', strtotime($episodes[0]->getDbPublicationDate())))->save(); + Logging::info($episodes); $service->downloadEpisodes($episodes); } } diff --git a/airtime_mvc/application/services/PodcastEpisodeService.php b/airtime_mvc/application/services/PodcastEpisodeService.php index 124290ac2..af61cdf61 100644 --- a/airtime_mvc/application/services/PodcastEpisodeService.php +++ b/airtime_mvc/application/services/PodcastEpisodeService.php @@ -46,7 +46,7 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir public function importEpisode($podcastId, $episode) { $e = $this->addPlaceholder($podcastId, $episode); $p = $e->getPodcast(); - $this->_download($e->getDbId(), $e->getDbDownloadUrl(), $p->getDbTitle(), $this->_getAlbumOverride($p)); + $this->_download($e->getDbId(), $e->getDbDownloadUrl(), $p->getDbTitle(), $this->_getAlbumOverride($p), $episode["title"]); return $e; } @@ -128,7 +128,8 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir /** @var PodcastEpisodes $episode */ foreach($episodes as $episode) { $podcast = $episode->getPodcast(); - $this->_download($episode->getDbId(), $episode->getDbDownloadUrl(), $podcast->getDbTitle(), $this->_getAlbumOverride($podcast)); + Logging::info($episode); + $this->_download($episode->getDbId(), $episode->getDbDownloadUrl(), $podcast->getDbTitle(), $this->_getAlbumOverride($podcast), $episode["title"]); } } @@ -158,7 +159,7 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir * @param string $title title of podcast to be downloaded - added as album to track metadata * @param boolean $album_override should we override the album name when downloading */ - private function _download($id, $url, $title, $album_override) { + private function _download($id, $url, $title, $album_override, $track_title = null) { $CC_CONFIG = Config::getConfig(); $stationUrl = Application_Common_HTTPHelper::getStationUrl(); $stationUrl .= substr($stationUrl, -1) == '/' ? '' : '/'; @@ -169,7 +170,7 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir 'api_key' => $CC_CONFIG["apiKey"][0], 'podcast_name' => $title, 'album_override' => $album_override, - ); + 'track_title' => $track_title); $task = $this->_executeTask(static::$_CELERY_TASKS[self::DOWNLOAD], $data); // Get the created ThirdPartyTaskReference and set the episode ID so // we can remove the placeholder if the import ends up stuck in a pending state diff --git a/python_apps/airtime-celery/airtime-celery/tasks.py b/python_apps/airtime-celery/airtime-celery/tasks.py index 3b06e89e5..32ac92be4 100644 --- a/python_apps/airtime-celery/airtime-celery/tasks.py +++ b/python_apps/airtime-celery/airtime-celery/tasks.py @@ -128,7 +128,7 @@ def soundcloud_delete(token, track_id): @celery.task(name='podcast-download', acks_late=True) -def podcast_download(id, url, callback_url, api_key, podcast_name, album_override): +def podcast_download(id, url, callback_url, api_key, podcast_name, album_override, track_title): """ Download a podcast episode @@ -138,6 +138,7 @@ def podcast_download(id, url, callback_url, api_key, podcast_name, album_overrid :param api_key: API key for callback authentication :param podcast_name: Name of podcast to be added to id3 metadata for smartblock :param album_override: Passing whether to override the album id3 even if it exists + :param track_title: Passing the title of the episode from feed to override the metadata :return: JSON formatted string of a dictionary of download statuses and file identifiers (for successful uploads) @@ -155,7 +156,7 @@ def podcast_download(id, url, callback_url, api_key, podcast_name, album_overrid shutil.copyfileobj(r.raw, audiofile) metadata_audiofile = mutagen.File(audiofile.name, easy=True) # replace album title as needed - metadata_audiofile = podcast_override_album(metadata_audiofile, podcast_name, album_override) + metadata_audiofile = podcast_override_metadata(metadata_audiofile, podcast_name, album_override, track_title) metadata_audiofile.save() filetypeinfo = metadata_audiofile.pprint() logger.info('filetypeinfo is {0}'.format(filetypeinfo.encode('ascii', 'ignore'))) @@ -171,7 +172,7 @@ def podcast_download(id, url, callback_url, api_key, podcast_name, album_overrid obj['status'] = 0 return json.dumps(obj) -def podcast_override_album(m, podcast_name, override): +def podcast_override_metadata(m, podcast_name, override, track_title): """ Override m['album'] if empty or forced with override arg """ @@ -179,6 +180,7 @@ def podcast_override_album(m, podcast_name, override): if override is True: logger.debug('overriding album name to {0} in podcast'.format(podcast_name.encode('ascii', 'ignore'))) m['album'] = podcast_name + m['title'] = track_title else: # replace the album id3 tag with the podcast name if the album tag is empty try: From e36d5a5af5adf1d90329f99ea0c14cbf93b3413c Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Mon, 24 Dec 2018 00:40:25 +0200 Subject: [PATCH 105/210] Convert all line endings in the tarball to unix This is needed because quilt cannot patch line-endings correctly and the Zend framework uses some CRLF line endings instead of LF. --- dev_tools/release/release.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/dev_tools/release/release.sh b/dev_tools/release/release.sh index 4f1aa5f0c..4ccf1c2f6 100755 --- a/dev_tools/release/release.sh +++ b/dev_tools/release/release.sh @@ -61,6 +61,7 @@ popd #echo "Done" pushd /tmp/ +find libretime-${suffix} -type f -exec dos2unix {} \; echo -n "Creating tarball..." tar -czf $target_file \ --owner=root --group=root \ From 761a8c923ef13d2f92dac94f90ec58a81009cb74 Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 26 Dec 2018 16:54:15 -0600 Subject: [PATCH 106/210] remove js hack on media type menu links --- airtime_mvc/public/css/styles.css | 7 ++----- airtime_mvc/public/js/airtime/showbuilder/main_builder.js | 6 ------ 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index 08d86810b..8327080a4 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -3720,11 +3720,8 @@ button.btn-icon-text > i.icon-white { display: block; } -.dashboard_sub_nav { - padding: 0px 0px 0px 10px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; +.media_type_selector.dashboard_sub_nav a { + padding-left: 20px; } .wrapper { diff --git a/airtime_mvc/public/js/airtime/showbuilder/main_builder.js b/airtime_mvc/public/js/airtime/showbuilder/main_builder.js index 37f5fc62e..9960efd95 100644 --- a/airtime_mvc/public/js/airtime/showbuilder/main_builder.js +++ b/airtime_mvc/public/js/airtime/showbuilder/main_builder.js @@ -131,12 +131,6 @@ AIRTIME = (function(AIRTIME) { selected.parent().addClass("selected"); $("#library_filter").text(selected.text()); - // Slightly hacky way of triggering the click event when it's outside of the anchor text - $(".media_type_selector").on("click", function() { - // Need get(0) here so we don't create a stack overflow by recurring the click on the parent - $(this).find("a").get(0).click(); - }); - $(window).on('hashchange', function() { var selected = $("a[href$='"+location.hash+"']"), dashboardLink = $(".media_type_selector:first"), From 14c8df75ab150f09c1db5d31db7b7deca5a3d149 Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 26 Dec 2018 16:59:25 -0600 Subject: [PATCH 107/210] focus library search input upon load --- airtime_mvc/public/js/airtime/library/library.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index b1e3b5075..1939b1fd2 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -745,7 +745,8 @@ var AIRTIME = (function(AIRTIME) { filterMessage.text(""); } $libContent.find('.dataTables_filter input[type="text"]') - .css('padding-right', $('#advanced-options').find('button').outerWidth()); + .css('padding-right', $('#advanced-options').find('button').outerWidth()) + .focus(); }); }, "fnRowCallback": AIRTIME.library.fnRowCallback, From e672e81d8f7b74e4e55d2d1a9fcb4f8b366a84ee Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 26 Dec 2018 18:06:07 -0600 Subject: [PATCH 108/210] restore station podcast onSaveCallback --- .../public/js/airtime/library/podcast.js | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 31cb4bd84..976ffacda 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -145,21 +145,20 @@ var AIRTIME = (function (AIRTIME) { function StationPodcastController($scope, $http, podcast, tab) { // Super call to parent controller PodcastController.call(this, $scope, $http, podcast, tab); - // @frecuencialibre commenting this out since i think it is never called. @todo delete once confirmed - // this.onSaveCallback = function () { - // $http({ - // method: 'POST', - // url: '/preference/station-podcast-settings', - // headers: {'Content-Type': 'application/x-www-form-urlencoded'}, - // data: { stationPodcastPrivacy: $("#podcast-settings").find("input:checked").val() } - // }).success(function (data) { - // jQuery.extend($scope.podcast, data); - // $(".success").text($.i18n._("Podcast settings saved")).slideDown("fast"); - // setTimeout(function () { - // $(".success").slideUp("fast"); - // }, 2000); - // }); - // }; + this.onSaveCallback = function () { + $http({ + method: 'POST', + url: '/preference/station-podcast-settings', + headers: {'Content-Type': 'application/x-www-form-urlencoded'}, + data: { stationPodcastPrivacy: $("#podcast-settings").find("input:checked").val() } + }).success(function (data) { + jQuery.extend($scope.podcast, data); + $(".success").text($.i18n._("Podcast settings saved")).slideDown("fast"); + setTimeout(function () { + $(".success").slideUp("fast"); + }, 2000); + }); + }; return this; } @@ -324,7 +323,7 @@ var AIRTIME = (function (AIRTIME) { uid = AIRTIME.library.MediaTypeStringEnum.PODCAST+"_"+podcast.id, tab = AIRTIME.tabs.openTab(data.html, uid, null); _bootstrapAngularApp(podcast, tab); - + $(".album_names.help_icon").qtip({ content: { text: $.i18n._('Overwrite downloaded podcast episodes\' "Album" metadata tag with the Podcast Name specified above. This album name can then be used as a search criteria by a smartblock.') From a734165169f67e5705a00fca15909a99387cbea7 Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 27 Dec 2018 09:11:49 -0600 Subject: [PATCH 109/210] fix Calendar - Long titles now overlap 'files bar' --- airtime_mvc/public/css/fullcalendar.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/public/css/fullcalendar.css b/airtime_mvc/public/css/fullcalendar.css index b6cc9f578..58c7b631a 100644 --- a/airtime_mvc/public/css/fullcalendar.css +++ b/airtime_mvc/public/css/fullcalendar.css @@ -314,9 +314,12 @@ a.fc-event { .fc-event-time, .fc-event-title { padding: 0 1px; +} +.fc-view-month .fc-event-time, +.fc-view-month .fc-event-title { height: 12px; } - + .fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/ display: block; position: absolute; From 8f8e9ef3f317b6c3ec5b2e7c6b5505a8bcd9bfaa Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 27 Dec 2018 16:48:28 -0600 Subject: [PATCH 110/210] progress commit: display podcast episodes in right-side pane --- .../public/js/airtime/library/library.js | 138 ++++------------ .../public/js/airtime/library/podcast.js | 155 ++++++++++-------- 2 files changed, 125 insertions(+), 168 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index b1e3b5075..ff5561871 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -1398,31 +1398,6 @@ var AIRTIME = (function(AIRTIME) { } }); - var openPodcastEpisodeTable = function (podcast) { - $("#library_filter").append(" - " + podcast.title); - mod.podcastEpisodeTableWidget.reload(podcast.id); - mod.podcastTableWidget.clearSelection(); - mod.setCurrentTable(mod.DataTableTypeEnum.PODCAST_EPISODES); - mod.podcastEpisodeDataTable.closest(".dataTables_wrapper").find(".dataTables_processing") - .addClass("block-overlay").css("visibility", "visible"); - }; - - podcastToolbarButtons["ViewEpisodes"] = { - title : $.i18n._("View Episodes"), - iconClass : "icon-chevron-right", - extraBtnClass : "btn-small", - elementId : "", - eventHandlers : { - click: function () { - var podcast = mod.podcastTableWidget.getSelectedRows()[0]; - openPodcastEpisodeTable(podcast); - } - }, - validateConstraints: function () { - return this.getSelectedRows().length == 1; - } - }; - //Set up the div with id "podcast_table" as a datatable. mod.podcastTableWidget = new AIRTIME.widgets.Table( $('#podcast_table'), //DOM node to create the table inside. @@ -1439,12 +1414,9 @@ var AIRTIME = (function(AIRTIME) { } }); - mod._initPodcastEpisodeDatatable(); - // On double click, open a table showing the selected podcast's episodes - // in the left-hand pane. + // Edit podcast in right-side pane upon double click mod.podcastTableWidget.assignDblClickHandler(function () { - var podcast = mod.podcastDataTable.fnGetData(this); - openPodcastEpisodeTable(podcast); + AIRTIME.podcast.editSelectedPodcasts(); }); mod.podcastDataTable = mod.podcastTableWidget.getDatatable(); @@ -1452,27 +1424,9 @@ var AIRTIME = (function(AIRTIME) { }; /** - * Initialize the podcast episode view for the left-hand pane - * - * @private + * Initialize the podcast episode table with working buttons */ - mod._initPodcastEpisodeDatatable = function () { - var buttons = { - backBtn: { - title : $.i18n._('Back to Podcasts'), - iconClass : 'icon-chevron-left', - extraBtnClass : 'btn-small', - elementId : '', - eventHandlers : { - click: function () { - $("#library_filter").text($.i18n._("Podcasts")); - mod.setCurrentTable(mod.DataTableTypeEnum.PODCAST); - } - }, - validateConstraints: function () { return true; } - } - }, - defaults = AIRTIME.widgets.Table.getStandardToolbarButtons(); + mod.initPodcastEpisodeDatatableWithButtonEvents = function (domNode) { /** * Check the import statuses of each selected episode to see which @@ -1498,7 +1452,8 @@ var AIRTIME = (function(AIRTIME) { }; // Setup the default buttons (new, edit, delete) - $.extend(true, defaults[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.NEW], + podcastEpisodeButtons = AIRTIME.widgets.Table.getStandardToolbarButtons(); + $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.NEW], { title: "Import", eventHandlers: { @@ -1511,7 +1466,7 @@ var AIRTIME = (function(AIRTIME) { return checkSelectedEpisodeImportStatus.call(this, false); } }); - $.extend(true, defaults[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], + $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], { eventHandlers: { click: function () { @@ -1523,7 +1478,7 @@ var AIRTIME = (function(AIRTIME) { return checkSelectedEpisodeImportStatus.call(this, true); } }); - $.extend(true, defaults[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.DELETE], + $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.DELETE], { eventHandlers: { click: function () { @@ -1531,7 +1486,8 @@ var AIRTIME = (function(AIRTIME) { $.each(episodes, function () { data.push({id: this.file.id, type: this.file.ftype}); }); - mod.fnDeleteItems(data); + console.log("podcast deletion:", data); + AIRTIME.podcast.deleteSelectedEpisodes(data, mod.podcastEpisodeTableWidget); } }, validateConstraints: function () { @@ -1541,30 +1497,30 @@ var AIRTIME = (function(AIRTIME) { // Reassign these because integer keys take precedence in iteration order - we want to order based on insertion // FIXME: this is a pretty flimsy way to try to set up iteration order (possibly not xbrowser compatible?) - defaults = { - newBtn : defaults[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.NEW], - editBtn: defaults[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], - delBtn : defaults[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.DELETE] + podcastEpisodeButtons = { + newBtn : podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.NEW], + editBtn: podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], + delBtn : podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.DELETE] }; - $.extend(true, buttons, defaults, { - addToScheduleBtn: { - title : $.i18n._('Add to Schedule'), - iconClass : '', - extraBtnClass : 'btn-small', - elementId : '', - eventHandlers : { - click: function () { - var data = [], selected = mod.podcastEpisodeTableWidget.getSelectedRows(); - $.each(selected, function () { data.push(this.file); }); - mod.addToSchedule(data); - } - }, - validateConstraints: function () { - // TODO: change text + behaviour for playlists, smart blocks, etc. - return checkSelectedEpisodeImportStatus.call(this, true); - } - }, + $.extend(true, podcastEpisodeButtons, { + // addToScheduleBtn: { + // title : $.i18n._('Add to Schedule'), + // iconClass : '', + // extraBtnClass : 'btn-small', + // elementId : '', + // eventHandlers : { + // click: function () { + // var data = [], selected = mod.podcastEpisodeTableWidget.getSelectedRows(); + // $.each(selected, function () { data.push(this.file); }); + // mod.addToSchedule(data); + // } + // }, + // validateConstraints: function () { + // // TODO: change text + behaviour for playlists, smart blocks, etc. + // return checkSelectedEpisodeImportStatus.call(this, true); + // } + // }, viewDescBtn: { title : $.i18n._("View"), iconClass : "icon-globe", @@ -1580,32 +1536,8 @@ var AIRTIME = (function(AIRTIME) { }); mod.podcastEpisodeTableWidget = AIRTIME.podcast.initPodcastEpisodeDatatable( - $("#podcast_episodes_table"), - { - aoColumns : [ - /* GUID */ { "sTitle" : "" , "mDataProp" : "guid" , "sClass" : "podcast_episodes_guid" , "bVisible" : false }, - /* Ingested */ { "sTitle" : $.i18n._("Imported?") , "mDataProp" : "importIcon" , "sClass" : "podcast_episodes_imported" , "sWidth" : "120px" }, - /* Title */ { "sTitle" : $.i18n._("Title") , "mDataProp" : "title" , "sClass" : "podcast_episodes_title" , "sWidth" : "170px" }, - /* Author */ { "sTitle" : $.i18n._("Author") , "mDataProp" : "author" , "sClass" : "podcast_episodes_author" , "sWidth" : "170px" }, - /* Description */ { "sTitle" : $.i18n._("Description") , "mDataProp" : "description" , "sClass" : "podcast_episodes_description" , "sWidth" : "300px" }, - /* Link */ { "sTitle" : $.i18n._("Link") , "mDataProp" : "link" , "sClass" : "podcast_episodes_link" , "sWidth" : "170px" }, - /* Publication Date */ { "sTitle" : $.i18n._("Publication Date") , "mDataProp" : "pub_date" , "sClass" : "podcast_episodes_pub_date" , "sWidth" : "170px" } - ], - bServerSide : false, - sAjaxSource : null, - // Initialize the table with empty data so we can defer loading - // If we load sequentially there's a delay before the table appears - aaData : {}, - oColVis : { - buttonText: $.i18n._("Columns"), - iOverlayFade: 0, - aiExclude: [0, 1, 2] - }, - oColReorder: { - iFixedColumns: 3 // Checkbox + imported - } - }, - buttons, + domNode, + podcastEpisodeButtons, { hideIngestCheckboxes: false, emptyPlaceholder: { @@ -1628,6 +1560,8 @@ var AIRTIME = (function(AIRTIME) { } } }); + + return mod.podcastEpisodeTableWidget; }; mod.libraryInit = libraryInit; diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 976ffacda..6d946b961 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -345,6 +345,12 @@ var AIRTIME = (function (AIRTIME) { } }); + // Add podcast episode table in right-side panel below podcast edit form + var episodeTable = AIRTIME.library.initPodcastEpisodeDatatableWithButtonEvents( + $("#podcast_episodes_" + podcast.id), + ); + episodeTable.reload(podcast.id); + episodeTable.clearSelection() } /** @@ -501,11 +507,13 @@ var AIRTIME = (function (AIRTIME) { */ mod.addPodcast = function () { $.post(endpoint, $("#podcast_url_dialog").find("form").serialize(), function(json) { - // Open the episode view for the newly created podcast in the left-hand pane - AIRTIME.library.podcastEpisodeTableWidget.reload(JSON.parse(json.podcast).id); - AIRTIME.library.podcastTableWidget.clearSelection(); - AIRTIME.library.setCurrentTable(AIRTIME.library.DataTableTypeEnum.PODCAST_EPISODES); + // Refresh left-side library pane to show newly created podcast + AIRTIME.library.podcastDataTable.fnDraw(); + + // close modal $("#podcast_url_dialog").dialog("close"); + + // open newly created podcast in right-side edit pane _initAppFromResponse(json); }).fail(function (e) { var errors = $("#podcast_url_dialog").find(".errors"); @@ -560,6 +568,7 @@ var AIRTIME = (function (AIRTIME) { * @param {PodcastEpisodeTable} dt PodcastEpisode table containing the data */ mod.importSelectedEpisodes = function (episodes, dt) { + console.log("importSelectedEpisodes", episodes, dt); $.each(episodes, function () { // remainingDiskSpace is defined in layout.phtml if (this.enclosure.length > remainingDiskSpace) { @@ -567,12 +576,11 @@ var AIRTIME = (function (AIRTIME) { return false; } if (this.file && Object.keys(this.file).length > 0) return false; - var podcastId = this.podcast_id; - $.post(endpoint + podcastId + '/episodes', JSON.stringify({ + $.post(endpoint + this.podcast_id + '/episodes', JSON.stringify({ csrf_token: $("#csrf").val(), episode: this }), function () { - dt.reload(podcastId); + dt.reload(this.podcast_id); }); remainingDiskSpace -= this.enclosure.length; @@ -581,6 +589,20 @@ var AIRTIME = (function (AIRTIME) { dt.clearSelection(); }; + /** + * Delete one or more podcast episodes. + * + * @param {id:string, type:string}[] data Array of data objects to be deleted + * @param {PodcastEpisodeTable} dt PodcastEpisode table containing the data + */ + mod.deleteSelectedEpisodes = function (data, dt) { + $.each(data, function () { + AIRTIME.library.fnDeleteItems(data); + }); + dt.reload(this.podcast_id); + dt.clearSelection(); + }; + /** * Initialize the internal datatable for the podcast editor view to hold episode data passed back from the server. * @@ -594,73 +616,74 @@ var AIRTIME = (function (AIRTIME) { * * @returns {Table} the created Table object */ - mod.initPodcastEpisodeDatatable = function (domNode, params, buttons, config) { - if ('slideToggle' in buttons) { - buttons = $.extend(true, { - slideToggle: { - title: '', - iconClass: 'spl-no-r-margin icon-chevron-up', - extraBtnClass: 'toggle-editor-form', - elementId: '', - eventHandlers: {}, - validateConstraints: function () { return true; } - } - }, buttons); - } - params = $.extend(true, params, - { - bDeferRender: true, - oColVis: { - buttonText: $.i18n._("Columns"), - iOverlayFade: 0, - aiExclude: [0] - }, - oColReorder: { - iFixedColumns: 1 // Checkbox - }, - fnCreatedRow: function(nRow, aData, iDataIndex) { - var self = this; - if (aData.file && Object.keys(aData.file).length > 0) { - $(nRow).draggable({ - helper: function () { - var $row = $(this), data = self._datatable.fnGetData(nRow); - $row.data("aData", data.file); - self.selectRow(this, data, self.SELECTION_MODE.SINGLE, $row.index()); - var selected = self.getSelectedRows().length, container, - width = self._$wrapperDOMNode.closest(".dataTables_wrapper").outerWidth(), message; + mod.initPodcastEpisodeDatatable = function (domNode, buttons, config) { - message = sprintf($.i18n._(selected > 1 ? "Adding %s Items" : "Adding %s Item"), selected); - container = $('
').attr('id', 'draggingContainer').append('') - .find("tr").append('').find("td") - .attr("colspan", 100).width(width).css("max-width", "none") - .addClass("ui-state-highlight").append(message).end().end(); + params = { + aoColumns : [ + /* GUID */ { "sTitle" : "" , "mDataProp" : "guid" , "sClass" : "podcast_episodes_guid" , "bVisible" : false }, + /* Ingested */ { "sTitle" : $.i18n._("Imported?") , "mDataProp" : "importIcon" , "sClass" : "podcast_episodes_imported" , "sWidth" : "120px" }, + /* Title */ { "sTitle" : $.i18n._("Title") , "mDataProp" : "title" , "sClass" : "podcast_episodes_title" , "sWidth" : "170px" }, + /* Author */ { "sTitle" : $.i18n._("Author") , "mDataProp" : "author" , "sClass" : "podcast_episodes_author" , "sWidth" : "170px" }, + /* Description */ { "sTitle" : $.i18n._("Description") , "mDataProp" : "description" , "sClass" : "podcast_episodes_description" , "sWidth" : "300px" }, + /* Link */ { "sTitle" : $.i18n._("Link") , "mDataProp" : "link" , "sClass" : "podcast_episodes_link" , "sWidth" : "170px" }, + /* Publication Date */ { "sTitle" : $.i18n._("Publication Date") , "mDataProp" : "pub_date" , "sClass" : "podcast_episodes_pub_date" , "sWidth" : "170px" } + ], + bServerSide : false, + sAjaxSource : null, + // Initialize the table with empty data so we can defer loading + // If we load sequentially there's a delay before the table appears + aaData : {}, + oColVis : { + buttonText: $.i18n._("Columns"), + iOverlayFade: 0, + aiExclude: [0, 1, 2] + }, + bDeferRender: true, + oColReorder: { + iFixedColumns: 3 // Checkbox + imported + }, + fnCreatedRow: function(nRow, aData, iDataIndex) { + var self = this; + if (aData.file && Object.keys(aData.file).length > 0) { + $(nRow).draggable({ + helper: function () { + var $row = $(this), data = self._datatable.fnGetData(nRow); + $row.data("aData", data.file); + self.selectRow(this, data, self.SELECTION_MODE.SINGLE, $row.index()); + var selected = self.getSelectedRows().length, container, + width = self._$wrapperDOMNode.closest(".dataTables_wrapper").outerWidth(), message; - return container; - }, - tolerance: 'pointer', - cursor: 'move', - cursorAt: { - top: 20, - left: Math.floor(self._datatable.outerWidth() / 2) - }, - distance: 25, // min-distance for dragging - connectToSortable: $("#show_builder_table, .active-tab .spl_sortable") - }); - } - }, - fnDrawCallback: function () { - AIRTIME.library.drawEmptyPlaceholder(this); - // Hide the processing div - var dt = this.getDatatable(); - !dt || dt.closest(".dataTables_wrapper").find(".dataTables_processing").css("visibility", "hidden"); + message = sprintf($.i18n._(selected > 1 ? "Adding %s Items" : "Adding %s Item"), selected); + container = $('
').attr('id', 'draggingContainer').append('') + .find("tr").append('').find("td") + .attr("colspan", 100).width(width).css("max-width", "none") + .addClass("ui-state-highlight").append(message).end().end(); + + return container; + }, + tolerance: 'pointer', + cursor: 'move', + cursorAt: { + top: 20, + left: Math.floor(self._datatable.outerWidth() / 2) + }, + distance: 25, // min-distance for dragging + connectToSortable: $("#show_builder_table, .active-tab .spl_sortable") + }); } + }, + fnDrawCallback: function () { + AIRTIME.library.drawEmptyPlaceholder(this); + // Hide the processing div + var dt = this.getDatatable(); + !dt || dt.closest(".dataTables_wrapper").find(".dataTables_processing").css("visibility", "hidden"); } - ); + } if (typeof PodcastEpisodeTable === 'undefined') { _initPodcastEpisodeTable(); } - + var podcastEpisodesTableWidget = new PodcastEpisodeTable( domNode, // DOM node to create the table inside. true, // Enable item selection From 26fad97915e35a1565f581ba30cd7e1d6e41b267 Mon Sep 17 00:00:00 2001 From: Robbt Date: Thu, 27 Dec 2018 17:50:33 -0500 Subject: [PATCH 111/210] modified the code to treat a file mutagen fails to load as a mp3 --- python_apps/airtime-celery/airtime-celery/tasks.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/python_apps/airtime-celery/airtime-celery/tasks.py b/python_apps/airtime-celery/airtime-celery/tasks.py index 3b06e89e5..30f594d67 100644 --- a/python_apps/airtime-celery/airtime-celery/tasks.py +++ b/python_apps/airtime-celery/airtime-celery/tasks.py @@ -153,8 +153,14 @@ def podcast_download(id, url, callback_url, api_key, podcast_name, album_overrid with tempfile.NamedTemporaryFile(mode ='wb+', delete=False) as audiofile: r.raw.decode_content = True shutil.copyfileobj(r.raw, audiofile) + # mutagen should be able to guess the write file type metadata_audiofile = mutagen.File(audiofile.name, easy=True) - # replace album title as needed + # if for some reason this should fail lets try it as a mp3 specific code + if metadata_audiofile == None: + logger.info('got a blank from mutagen') + metadata_audiofile = mutagen.mp3.MP3(audiofile.name, ID3=mutagen.easyid3.EasyID3) + logger.info('made a mp3') + #replace album title as needed metadata_audiofile = podcast_override_album(metadata_audiofile, podcast_name, album_override) metadata_audiofile.save() filetypeinfo = metadata_audiofile.pprint() From 28d2b110c224ac2423bdffdd422c9122d7792f36 Mon Sep 17 00:00:00 2001 From: Robbt Date: Thu, 27 Dec 2018 18:38:17 -0500 Subject: [PATCH 112/210] made basic sanity checks to only do back up mp3 mutagen import on files with mp3 extension --- python_apps/airtime-celery/airtime-celery/tasks.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/python_apps/airtime-celery/airtime-celery/tasks.py b/python_apps/airtime-celery/airtime-celery/tasks.py index 30f594d67..4a203cbf0 100644 --- a/python_apps/airtime-celery/airtime-celery/tasks.py +++ b/python_apps/airtime-celery/airtime-celery/tasks.py @@ -157,9 +157,11 @@ def podcast_download(id, url, callback_url, api_key, podcast_name, album_overrid metadata_audiofile = mutagen.File(audiofile.name, easy=True) # if for some reason this should fail lets try it as a mp3 specific code if metadata_audiofile == None: - logger.info('got a blank from mutagen') - metadata_audiofile = mutagen.mp3.MP3(audiofile.name, ID3=mutagen.easyid3.EasyID3) - logger.info('made a mp3') + # if this happens then mutagen couldn't guess what type of file it is + mp3suffix = ("mp3", "MP3", "Mp3", "mP3") + # so we treat it like a mp3 if it has a mp3 file extension and hope for the best + if filename.endswith(mp3suffix): + metadata_audiofile = mutagen.mp3.MP3(audiofile.name, ID3=mutagen.easyid3.EasyID3) #replace album title as needed metadata_audiofile = podcast_override_album(metadata_audiofile, podcast_name, album_override) metadata_audiofile.save() From fb35881df7e3611a9ed39d9ebc2ad8d103511fdf Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 28 Dec 2018 14:19:40 -0600 Subject: [PATCH 113/210] move initPodcastEpisodeDatatable functions within podcast.js --- .../public/js/airtime/library/library.js | 143 +---------------- .../public/js/airtime/library/podcast.js | 151 +++++++++++++++++- 2 files changed, 147 insertions(+), 147 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index ff5561871..37f1e5253 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -504,6 +504,8 @@ var AIRTIME = (function(AIRTIME) { } chosenItems = {}; + + // TODO: correct check whether used to delete episodes if (oTable == $datatables[mod.DataTableTypeEnum.PODCAST_EPISODES]) { mod.podcastEpisodeTableWidget.reload(); } else { @@ -1423,147 +1425,6 @@ var AIRTIME = (function(AIRTIME) { $datatables[mod.DataTableTypeEnum.PODCAST] = mod.podcastDataTable; }; - /** - * Initialize the podcast episode table with working buttons - */ - mod.initPodcastEpisodeDatatableWithButtonEvents = function (domNode) { - - /** - * Check the import statuses of each selected episode to see which - * buttons should be enabled or disabled. - * - * @param shouldBeImported whether or not the selected item(s) - * should be imported to obtain a valid result. - * - * @returns {boolean} true if all selected episodes are valid and - * the button should be enabled, otherwise false. - */ - var checkSelectedEpisodeImportStatus = function (shouldBeImported) { - var selected = this.getSelectedRows(), isValid = true; - if (selected.length == 0) return false; - $.each(selected, function () { - if (this.ingested < 0) isValid = false; - var isImported = !$.isEmptyObject(this.file); - if (shouldBeImported ? !isImported : isImported) { - isValid = false; - } - }); - return isValid; - }; - - // Setup the default buttons (new, edit, delete) - podcastEpisodeButtons = AIRTIME.widgets.Table.getStandardToolbarButtons(); - $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.NEW], - { - title: "Import", - eventHandlers: { - click: function () { - var episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); - AIRTIME.podcast.importSelectedEpisodes(episodes, mod.podcastEpisodeTableWidget); - } - }, - validateConstraints: function () { - return checkSelectedEpisodeImportStatus.call(this, false); - } - }); - $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], - { - eventHandlers: { - click: function () { - var episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); - AIRTIME.podcast.editSelectedEpisodes(episodes); - } - }, - validateConstraints: function () { - return checkSelectedEpisodeImportStatus.call(this, true); - } - }); - $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.DELETE], - { - eventHandlers: { - click: function () { - var data = [], episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); - $.each(episodes, function () { - data.push({id: this.file.id, type: this.file.ftype}); - }); - console.log("podcast deletion:", data); - AIRTIME.podcast.deleteSelectedEpisodes(data, mod.podcastEpisodeTableWidget); - } - }, - validateConstraints: function () { - return checkSelectedEpisodeImportStatus.call(this, true); - } - }); - - // Reassign these because integer keys take precedence in iteration order - we want to order based on insertion - // FIXME: this is a pretty flimsy way to try to set up iteration order (possibly not xbrowser compatible?) - podcastEpisodeButtons = { - newBtn : podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.NEW], - editBtn: podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], - delBtn : podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.DELETE] - }; - - $.extend(true, podcastEpisodeButtons, { - // addToScheduleBtn: { - // title : $.i18n._('Add to Schedule'), - // iconClass : '', - // extraBtnClass : 'btn-small', - // elementId : '', - // eventHandlers : { - // click: function () { - // var data = [], selected = mod.podcastEpisodeTableWidget.getSelectedRows(); - // $.each(selected, function () { data.push(this.file); }); - // mod.addToSchedule(data); - // } - // }, - // validateConstraints: function () { - // // TODO: change text + behaviour for playlists, smart blocks, etc. - // return checkSelectedEpisodeImportStatus.call(this, true); - // } - // }, - viewDescBtn: { - title : $.i18n._("View"), - iconClass : "icon-globe", - extraBtnClass : "btn-small", - elementId : "", - eventHandlers : { - click: mod.openPodcastEpisodeDialog - }, - validateConstraints: function () { - return this.getSelectedRows().length == 1; - } - } - }); - - mod.podcastEpisodeTableWidget = AIRTIME.podcast.initPodcastEpisodeDatatable( - domNode, - podcastEpisodeButtons, - { - hideIngestCheckboxes: false, - emptyPlaceholder: { - iconClass: "icon-white icon-th-list", - html: $.i18n._("This podcast doesn't have any episodes!") - + "
" + $.i18n._("Make sure the RSS feed contains audio items (with enclosure tags).") - + "
" + $.i18n._("Learn about podcasts") + "" - } - } - ); - - mod.podcastEpisodeDataTable = $datatables[mod.DataTableTypeEnum.PODCAST_EPISODES] = mod.podcastEpisodeTableWidget.getDatatable(); - mod.podcastEpisodeTableWidget.assignDblClickHandler(function () { - var data = mod.podcastEpisodeDataTable.fnGetData(this); - if (!$.isEmptyObject(data.file)) { - mod.dblClickAdd(data.file, data.file.ftype); - } else { - if (data.ingested >= 0) { // Only import if the file isn't pending - AIRTIME.podcast.importSelectedEpisodes([data], mod.podcastEpisodeTableWidget); - } - } - }); - - return mod.podcastEpisodeTableWidget; - }; - mod.libraryInit = libraryInit; return AIRTIME; diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 6d946b961..9c4965b24 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -346,7 +346,7 @@ var AIRTIME = (function (AIRTIME) { }); // Add podcast episode table in right-side panel below podcast edit form - var episodeTable = AIRTIME.library.initPodcastEpisodeDatatableWithButtonEvents( + var episodeTable = AIRTIME.podcast.initPodcastEpisodeDatatableWithButtonEvents( $("#podcast_episodes_" + podcast.id), ); episodeTable.reload(podcast.id); @@ -568,7 +568,6 @@ var AIRTIME = (function (AIRTIME) { * @param {PodcastEpisodeTable} dt PodcastEpisode table containing the data */ mod.importSelectedEpisodes = function (episodes, dt) { - console.log("importSelectedEpisodes", episodes, dt); $.each(episodes, function () { // remainingDiskSpace is defined in layout.phtml if (this.enclosure.length > remainingDiskSpace) { @@ -603,13 +602,153 @@ var AIRTIME = (function (AIRTIME) { dt.clearSelection(); }; + /** + * Initialize the podcast episode table with working buttons + */ + mod.initPodcastEpisodeDatatableWithButtonEvents = function (domNode) { + + /** + * Check the import statuses of each selected episode to see which + * buttons should be enabled or disabled. + * + * @param shouldBeImported whether or not the selected item(s) + * should be imported to obtain a valid result. + * + * @returns {boolean} true if all selected episodes are valid and + * the button should be enabled, otherwise false. + */ + var checkSelectedEpisodeImportStatus = function (shouldBeImported) { + var selected = this.getSelectedRows(), isValid = true; + if (selected.length == 0) return false; + $.each(selected, function () { + if (this.ingested < 0) isValid = false; + var isImported = !$.isEmptyObject(this.file); + if (shouldBeImported ? !isImported : isImported) { + isValid = false; + } + }); + return isValid; + }; + + // Setup the default buttons (new, edit, delete) + podcastEpisodeButtons = AIRTIME.widgets.Table.getStandardToolbarButtons(); + $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.NEW], + { + title: "Import", + eventHandlers: { + click: function () { + var episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); + AIRTIME.podcast.importSelectedEpisodes(episodes, mod.podcastEpisodeTableWidget); + } + }, + validateConstraints: function () { + return checkSelectedEpisodeImportStatus.call(this, false); + } + }); + $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], + { + eventHandlers: { + click: function () { + var episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); + AIRTIME.podcast.editSelectedEpisodes(episodes); + } + }, + validateConstraints: function () { + return checkSelectedEpisodeImportStatus.call(this, true); + } + }); + $.extend(true, podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.DELETE], + { + eventHandlers: { + click: function () { + var data = [], episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); + $.each(episodes, function () { + data.push({id: this.file.id, type: this.file.ftype}); + }); + console.log("podcast deletion:", data, mod.podcastEpisodeTableWidget); + AIRTIME.podcast.deleteSelectedEpisodes(data, mod.podcastEpisodeTableWidget); + } + }, + validateConstraints: function () { + return checkSelectedEpisodeImportStatus.call(this, true); + } + }); + + // Reassign these because integer keys take precedence in iteration order - we want to order based on insertion + // FIXME: this is a pretty flimsy way to try to set up iteration order (possibly not xbrowser compatible?) + podcastEpisodeButtons = { + newBtn : podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.NEW], + editBtn: podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.EDIT], + delBtn : podcastEpisodeButtons[AIRTIME.widgets.Table.TOOLBAR_BUTTON_ROLES.DELETE] + }; + + $.extend(true, podcastEpisodeButtons, { + // addToScheduleBtn: { + // title : $.i18n._('Add to Schedule'), + // iconClass : '', + // extraBtnClass : 'btn-small', + // elementId : '', + // eventHandlers : { + // click: function () { + // var data = [], selected = mod.podcastEpisodeTableWidget.getSelectedRows(); + // $.each(selected, function () { data.push(this.file); }); + // mod.addToSchedule(data); + // } + // }, + // validateConstraints: function () { + // // TODO: change text + behaviour for playlists, smart blocks, etc. + // return checkSelectedEpisodeImportStatus.call(this, true); + // } + // }, + viewDescBtn: { + title : $.i18n._("View"), + iconClass : "icon-globe", + extraBtnClass : "btn-small", + elementId : "", + eventHandlers : { + click: mod.openPodcastEpisodeDialog + }, + validateConstraints: function () { + return this.getSelectedRows().length == 1; + } + } + }); + + mod.podcastEpisodeTableWidget = AIRTIME.podcast.initPodcastEpisodeDatatable( + domNode, + podcastEpisodeButtons, + { + hideIngestCheckboxes: false, + emptyPlaceholder: { + iconClass: "icon-white icon-th-list", + html: $.i18n._("This podcast doesn't have any episodes!") + + "
" + $.i18n._("Make sure the RSS feed contains audio items (with enclosure tags).") + + "
" + $.i18n._("Learn about podcasts") + "" + } + } + ); + + mod.podcastEpisodeDataTable = mod.podcastEpisodeTableWidget.getDatatable(); + mod.podcastEpisodeTableWidget.assignDblClickHandler(function () { + var data = mod.podcastEpisodeDataTable.fnGetData(this); + if (!$.isEmptyObject(data.file)) { + mod.dblClickAdd(data.file, data.file.ftype); + } else { + if (data.ingested >= 0) { // Only import if the file isn't pending + AIRTIME.podcast.importSelectedEpisodes([data], mod.podcastEpisodeTableWidget); + } + } + }); + + return mod.podcastEpisodeTableWidget; + }; + /** * Initialize the internal datatable for the podcast editor view to hold episode data passed back from the server. * * Selection for the internal table represents episodes marked for ingest and is disabled for ingested episodes. * * @param {jQuery} domNode the jQuery DOM node to create the table inside. - * @param {Object} params JSON object containing datatables parameters to override * @param {Object} buttons JSON object containing datatables button parameters * @param {Object} config JSON object containing internal PodcastEpisodeTable parameters * @param {boolean} config.hideIngestCheckboxes flag denoting whether or not to hide checkboxes for ingested items @@ -684,7 +823,7 @@ var AIRTIME = (function (AIRTIME) { _initPodcastEpisodeTable(); } - var podcastEpisodesTableWidget = new PodcastEpisodeTable( + var podcastEpisodeTableObj = new PodcastEpisodeTable( domNode, // DOM node to create the table inside. true, // Enable item selection buttons, // Toolbar buttons @@ -692,8 +831,8 @@ var AIRTIME = (function (AIRTIME) { config // Internal config ); - podcastEpisodesTableWidget.getDatatable().addTitles("td"); - return podcastEpisodesTableWidget; + podcastEpisodeTableObj.getDatatable().addTitles("td"); + return podcastEpisodeTableObj; }; return AIRTIME; From 7a00e2a1550d81ec1c830a55b554ae9f021f23df Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sun, 30 Dec 2018 11:48:47 +0100 Subject: [PATCH 114/210] :fire: Remove dead, commented test --- .../application/models/unit/PreferenceUnitTest.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/airtime_mvc/tests/application/models/unit/PreferenceUnitTest.php b/airtime_mvc/tests/application/models/unit/PreferenceUnitTest.php index 8b6a27e55..c27f8453d 100644 --- a/airtime_mvc/tests/application/models/unit/PreferenceUnitTest.php +++ b/airtime_mvc/tests/application/models/unit/PreferenceUnitTest.php @@ -11,16 +11,6 @@ class PreferenceUnitTest extends PHPUnit_Framework_TestCase parent::setUp(); } - /* - public function testSetHeadTitle() - { - $title = "unit test"; - //This function is confusing and doesn't really work so we're just gonna let it formSlide... - Application_Model_Preference::SetHeadTitle($title); - $this->assertEquals(Application_Model_Preference::GetHeadTitle(), $title); - } - */ - public function testSetShowsPopulatedUntil() { $date = new DateTime(); From 08d24627305d7630c22cd37d06e589d614b83faa Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Wed, 2 Jan 2019 20:28:27 +0100 Subject: [PATCH 115/210] :memo: Remove outdated support docs --- .../controllers/PreferenceController.php | 41 ----- .../application/forms/SupportSettings.php | 150 ------------------ .../views/scripts/form/support-setting.phtml | 147 ----------------- .../scripts/preference/support-setting.phtml | 13 -- .../js/airtime/preferences/support-setting.js | 84 ---------- docs/manual/support-feedback/index.md | 9 -- .../static/Screenshot406-Support_feedback.png | Bin 56185 -> 0 bytes .../Screenshot545-Show_what_sending_250.png | Bin 29203 -> 0 bytes mkdocs.yml | 1 - 9 files changed, 445 deletions(-) delete mode 100644 airtime_mvc/application/forms/SupportSettings.php delete mode 100644 airtime_mvc/application/views/scripts/form/support-setting.phtml delete mode 100644 airtime_mvc/application/views/scripts/preference/support-setting.phtml delete mode 100644 airtime_mvc/public/js/airtime/preferences/support-setting.js delete mode 100644 docs/manual/support-feedback/index.md delete mode 100644 docs/manual/support-feedback/static/Screenshot406-Support_feedback.png delete mode 100644 docs/manual/support-feedback/static/Screenshot545-Show_what_sending_250.png diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php index 6c9b0bfd9..0fe76262e 100644 --- a/airtime_mvc/application/controllers/PreferenceController.php +++ b/airtime_mvc/application/controllers/PreferenceController.php @@ -110,47 +110,6 @@ class PreferenceController extends Zend_Controller_Action $this->_helper->json->sendJson(array("url" => $url)); } - public function supportSettingAction() - { - $CC_CONFIG = Config::getConfig(); - - $request = $this->getRequest(); - - $baseUrl = Application_Common_OsPath::getBaseDir(); - - $this->view->headScript()->appendFile($baseUrl.'js/airtime/preferences/support-setting.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); - $this->view->statusMsg = ""; - - SessionHelper::reopenSessionForWriting(); - - $form = new Application_Form_SupportSettings(); - if ($request->isPost()) { - $values = $request->getPost(); - if ($form->isValid($values)) { - Application_Model_Preference::SetHeadTitle($values["stationName"], $this->view); - Application_Model_Preference::SetPhone($values["Phone"]); - Application_Model_Preference::SetEmail($values["Email"]); - Application_Model_Preference::SetStationWebSite($values["StationWebSite"]); - - Application_Model_Preference::SetStationCountry($values["Country"]); - Application_Model_Preference::SetStationCity($values["City"]); - Application_Model_Preference::SetStationDescription($values["Description"]); - if (isset($values["Privacy"])) { - Application_Model_Preference::SetPrivacyPolicyCheck($values["Privacy"]); - } - } - $this->view->statusMsg = "
"._("Support setting updated.")."
"; - } - - $privacyChecked = false; - if (Application_Model_Preference::GetPrivacyPolicyCheck() == 1) { - $privacyChecked = true; - } - $this->view->privacyChecked = $privacyChecked; - $this->view->section_title = _('Support Feedback'); - $this->view->form = $form; - } - public function directoryConfigAction() { } diff --git a/airtime_mvc/application/forms/SupportSettings.php b/airtime_mvc/application/forms/SupportSettings.php deleted file mode 100644 index e582f407b..000000000 --- a/airtime_mvc/application/forms/SupportSettings.php +++ /dev/null @@ -1,150 +0,0 @@ -setDecorators(array( - array('ViewScript', array('viewScript' => 'form/support-setting.phtml')), - array('File', array('viewScript' => 'form/support-setting.phtml', 'placement' => false))) - ); - - //Station name - $this->addElement('text', 'stationName', array( - 'class' => 'input_text', - 'label' => _('Station Name'), - 'required' => true, - 'filters' => array('StringTrim'), - 'validators' => array($notEmptyValidator), - 'value' => Application_Model_Preference::GetStationName(), - 'decorators' => array( - 'ViewHelper' - ) - )); - - // Phone number - $this->addElement('text', 'Phone', array( - 'class' => 'input_text', - 'label' => _('Phone:'), - 'required' => false, - 'filters' => array('StringTrim'), - 'value' => Application_Model_Preference::GetPhone(), - 'decorators' => array( - 'ViewHelper' - ) - )); - - //Email - $this->addElement('text', 'Email', array( - 'class' => 'input_text', - 'label' => _('Email:'), - 'required' => false, - 'filters' => array('StringTrim'), - 'value' => Application_Model_Preference::GetEmail(), - 'decorators' => array( - 'ViewHelper' - ) - )); - - // Station Web Site - $this->addElement('text', 'StationWebSite', array( - 'label' => _('Station Web Site:'), - 'required' => false, - 'class' => 'input_text', - 'value' => Application_Model_Preference::GetStationWebSite(), - 'decorators' => array( - 'ViewHelper' - ) - )); - - // county list dropdown - $this->addElement('select', 'Country', array( - 'label' => _('Country:'), - 'required' => false, - 'value' => Application_Model_Preference::GetStationCountry(), - 'multiOptions' => $country_list, - 'decorators' => array( - 'ViewHelper' - ) - )); - - // Station city - $this->addElement('text', 'City', array( - 'label' => _('City:'), - 'required' => false, - 'class' => 'input_text', - 'value' => Application_Model_Preference::GetStationCity(), - 'decorators' => array( - 'ViewHelper' - ) - )); - - // Station Description - $description = new Zend_Form_Element_Textarea('Description'); - $description->class = 'input_text_area'; - $description->setLabel(_('Station Description:')) - ->setRequired(false) - ->setValue(Application_Model_Preference::GetStationDescription()) - ->setDecorators(array('ViewHelper')) - ->setAttrib('ROWS','2') - ->setAttrib('COLS','58'); - $this->addElement($description); - - //enable support feedback - $this->addElement('checkbox', 'SupportFeedback', array( - 'label' => _('Send support feedback'), - 'required' => false, - 'value' => Application_Model_Preference::GetSupportFeedback(), - 'decorators' => array( - 'ViewHelper' - ) - )); - - // checkbox for publicise - $checkboxPublicise = new Zend_Form_Element_Checkbox("Publicise"); - $checkboxPublicise->setLabel(sprintf(_('Promote my station on %s'), COMPANY_SITE)) - ->setRequired(false) - ->setDecorators(array('ViewHelper')) - ->setValue(Application_Model_Preference::GetPublicise()); - if (Application_Model_Preference::GetSupportFeedback() == '0') { - $checkboxPublicise->setAttrib("disabled", "disabled"); - } - $this->addElement($checkboxPublicise); - - // checkbox for privacy policy - $checkboxPrivacy = new Zend_Form_Element_Checkbox("Privacy"); - $checkboxPrivacy->setLabel( - sprintf(_('By checking this box, I agree to %s\'s %sprivacy policy%s.'), - COMPANY_NAME, - $privacyPolicyAnchorOpen, - "")) - ->setDecorators(array('ViewHelper')); - $this->addElement($checkboxPrivacy); - - // submit button - $submit = new Zend_Form_Element_Submit("submit"); - $submit->class = 'btn right-floated'; - $submit->setIgnore(true) - ->setLabel(_("Save")) - ->setDecorators(array('ViewHelper')); - $this->addElement($submit); - } - - // overriding isValid function - public function isValid ($data) - { - $isValid = parent::isValid($data); - if (isset($data["Privacy"])) { - $checkPrivacy = $this->getElement('Privacy'); - if ($data["SupportFeedback"] == "1" && $data["Privacy"] != "1") { - $checkPrivacy->addError(_("You have to agree to privacy policy.")); - $isValid = false; - } - } - - return $isValid; - } -} diff --git a/airtime_mvc/application/views/scripts/form/support-setting.phtml b/airtime_mvc/application/views/scripts/form/support-setting.phtml deleted file mode 100644 index 4f55061f9..000000000 --- a/airtime_mvc/application/views/scripts/form/support-setting.phtml +++ /dev/null @@ -1,147 +0,0 @@ -
-
-
-
- " - ."Click the box below and we'll make sure the features you use are constantly improving."), - PRODUCT_NAME)?> -
- - element->getElement('SupportFeedback')->hasErrors()) : ?> -
    - element->getElement('SupportFeedback')->getMessages() as $error): ?> -
  • - -
- -
-
-
- " - . COMPANY_SITE - . ""; - echo sprintf(_("Click the box below to promote your station on %s."), $whosUsingAnchor) - ?> -
- - element->getElement('Publicise')->hasErrors()) : ?> -
    - element->getElement('Publicise')->getMessages() as $error): ?> -
  • - -
- -
-
-
-

-
-
;"> -
- -
-
- element->getElement('stationName') ?> - element->getElement('stationName')->hasErrors()) : ?> -
    - element->getElement('stationName')->getMessages() as $error): ?> -
  • - -
- -
-
- - -
-
- element->getElement('Phone') ?> - element->getElement('Phone')->hasErrors()) : ?> -
    - element->getElement('Phone')->getMessages() as $error): ?> -
  • - -
- -
-
- - - - -
-
- element->getElement('Email') ?> - element->getElement('Email')->hasErrors()) : ?> -
    - element->getElement('Email')->getMessages() as $error): ?> -
  • - -
- -
-
- -
-
- element->getElement('StationWebSite') ?> - element->getElement('StationWebSite')->hasErrors()) : ?> -
    - element->getElement('StationWebSite')->getMessages() as $error): ?> -
  • - -
- -
-
- -
-
- element->getElement('Country') ?> - element->getElement('Country')->hasErrors()) : ?> -
    - element->getElement('Country')->getMessages() as $error): ?> -
  • - -
- -
-
- -
-
- element->getElement('City') ?> - element->getElement('City')->hasErrors()) : ?> -
    - element->getElement('City')->getMessages() as $error): ?> -
  • - -
- -
-
- -
-
- element->getElement('Description') ?> - element->getElement('Description')->hasErrors()) : ?> -
    - element->getElement('Description')->getMessages() as $error): ?> -
  • - -
- -
-
-
diff --git a/airtime_mvc/application/views/scripts/preference/support-setting.phtml b/airtime_mvc/application/views/scripts/preference/support-setting.phtml deleted file mode 100644 index cf5e725f7..000000000 --- a/airtime_mvc/application/views/scripts/preference/support-setting.phtml +++ /dev/null @@ -1,13 +0,0 @@ -
-

section_title?>

- -
enctype="multipart/form-data" id="support-feedback-form"> -
- statusMsg ?> - form ?> -
-
- form->getElement('submit')?> -
-
-
diff --git a/airtime_mvc/public/js/airtime/preferences/support-setting.js b/airtime_mvc/public/js/airtime/preferences/support-setting.js deleted file mode 100644 index 0e72daf9f..000000000 --- a/airtime_mvc/public/js/airtime/preferences/support-setting.js +++ /dev/null @@ -1,84 +0,0 @@ -function showErrorSections() { - - if($("soundcloud-settings .errors").length > 0) { - $("#soundcloud-settings").show(); - $(window).scrollTop($("soundcloud-settings .errors").position().top); - } - if($("#support-settings .errors").length > 0) { - $("#support-settings").show(); - $(window).scrollTop($("#support-settings .errors").position().top); - } -} - -$(document).ready(function() { - var form = $("form"); - - $("#SupportFeedback").click( function(){ - var pub = $("#Publicise"); - if( !$(this).is(':checked') ){ - pub.removeAttr("checked"); - pub.attr("disabled", true); - }else{ - pub.removeAttr("disabled"); - } - }); - - var promote = $("#Publicise"); - if(!$("#SupportFeedback").is(':checked')){ - promote.removeAttr("checked"); - promote.attr("disabled", true); - }else{ - promote.removeAttr("disabled"); - } - - promote.live('click', function(){ - if($(this).is(':checked')){ - $("#public-info").show(); - }else{ - $("#public-info").hide(); - } - }); - if( promote.is(":checked")){ - $("#public-info").show(); - } - - showErrorSections(); - - $('.toggle legend').click(function() { - $('.toggle').toggleClass('closed'); - return false; - }); - - $("#Logo").change(function(ev){ - var content, res, logoEl; - - content = $(this).val(); - res = content.match(/(jpg|jpeg|png|gif)$/gi); - logoEl = $("#Logo-element"); - - //not an accepted image extension. - if (!res) { - var ul, li; - - ul = logoEl.find('.errors'); - li = $("
  • ").append($.i18n._("Image must be one of jpg, jpeg, png, or gif")); - - //errors ul has already been created. - if (ul.length > 0) { - ul.empty() - .append(li); - } - else { - logoEl - .append('
      ') - .find(".errors") - .append(li); - } - - $(this).val(""); - } - else { - logoEl.find(".errors").remove(); - } - }); -}); diff --git a/docs/manual/support-feedback/index.md b/docs/manual/support-feedback/index.md deleted file mode 100644 index b5285dbaa..000000000 --- a/docs/manual/support-feedback/index.md +++ /dev/null @@ -1,9 +0,0 @@ -If you did not already register Airtime when you installed it, as shown in the *Getting Started* chapter, you can click **Support Feedback** on the System menu to display Airtime's automated feedback options. Check the **Send support feedback** box in order to post technical details about your Airtime installation to Sourcefabric, over the Internet. These details help Sourcefabric diagnose any problem that you might be having with your Airtime system. - -You may also wish to send details of your station to Sourcefabric, so that your station has the opportunity to be promoted with other Airtime users on the [http://www.sourcefabric.org](http://www.sourcefabric.org/) website. This feature also helps Sourcefabric target its support services to the countries where they are needed most. Check the box **Promote my station on Sourcefabric.org** and fill in the details of your station. You can upload a station logo file (of up to 600 x 600 pixels) from your desktop computer by clicking the **Browse** button. - -![](static/Screenshot406-Support_feedback.png) - -Click on the **Show me what I am sending** link to expand a box which displays the technical data being returned to Sourcefabric. The data is collected according to the Sourcefabric privacy policy () which you are required to agree to before you can submit the information. If you have already checked the box to indicate your acceptance of the privacy policy, a link to the policy will be displayed instead. - -![](static/Screenshot545-Show_what_sending_250.png) diff --git a/docs/manual/support-feedback/static/Screenshot406-Support_feedback.png b/docs/manual/support-feedback/static/Screenshot406-Support_feedback.png deleted file mode 100644 index a7bc61d2dc9dd0f39d8790d34ad138cbd5620ec2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56185 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 MX&Y&wHSM1N55J1ubN~PV diff --git a/docs/manual/support-feedback/static/Screenshot545-Show_what_sending_250.png b/docs/manual/support-feedback/static/Screenshot545-Show_what_sending_250.png deleted file mode 100644 index 9cb49482b7db23f1656e4e9800ab7c91962ba698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29203 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 Date: Mon, 7 Jan 2019 21:13:15 -0600 Subject: [PATCH 116/210] add ability to use multiple episode dataTables --- .../public/js/airtime/library/library.js | 14 +-- .../public/js/airtime/library/podcast.js | 89 ++++++++++--------- 2 files changed, 53 insertions(+), 50 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 37f1e5253..39b7e806c 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -480,7 +480,7 @@ var AIRTIME = (function(AIRTIME) { oTable.fnStandingRedraw(); }; - mod.fnDeleteItems = function(aMedia) { + mod.fnDeleteItems = function(aMedia, podcastId) { //Prevent the user from spamming the delete button while the AJAX request is in progress AIRTIME.button.disableButton("btn-group #sb-delete", false); var openTabObjectIds = $(".obj_id"), @@ -505,11 +505,11 @@ var AIRTIME = (function(AIRTIME) { chosenItems = {}; - // TODO: correct check whether used to delete episodes - if (oTable == $datatables[mod.DataTableTypeEnum.PODCAST_EPISODES]) { - mod.podcastEpisodeTableWidget.reload(); - } else { + if (typeof(podcastId) === "undefined") { oTable.fnStandingRedraw(); + } else { + AIRTIME.podcast.episodeTables[podcastId].reload(this.podcast_id); + AIRTIME.podcast.episodeTables[podcastId].clearSelection(); } //Re-enable the delete button @@ -1331,8 +1331,8 @@ var AIRTIME = (function(AIRTIME) { return oTable; }; - mod.openPodcastEpisodeDialog = function () { - var episode = mod.podcastEpisodeTableWidget.getSelectedRows()[0]; + mod.openPodcastEpisodeDialog = function (podcastId) { + var episode = AIRTIME.podcast.episodeTables[podcastId].getSelectedRows()[0]; $("body").append("
      "); var dialog = $("#podcast_episode_dialog").html(episode.description); dialog.html(dialog.text()); diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 9c4965b24..c7ce2c548 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -6,6 +6,7 @@ var AIRTIME = (function (AIRTIME) { } mod = AIRTIME.podcast; + mod.episodeTables = {}; var endpoint = '/rest/podcast/', PodcastEpisodeTable; @@ -41,6 +42,7 @@ var AIRTIME = (function (AIRTIME) { successMsg.hide("fast"); }, 5000); AIRTIME.library.podcastDataTable.fnDraw(); + self.$scope.tab.setName(self.$scope.podcast.title); }; /** @@ -121,13 +123,14 @@ var AIRTIME = (function (AIRTIME) { self.$scope.tab.setName(self.$scope.podcast.title); // Add an onclose hook to the tab to remove the table object and the // import listener so we don't cause memory leaks. - if (self.episodeTable) { - self.$scope.tab.assignOnCloseHandler(function () { - self.episodeTable.destroy(); - self.episodeTable = null; + var podcastId = self.$scope.podcast.id.toString(); + self.$scope.tab.assignOnCloseHandler(function () { + if ( AIRTIME.podcast.episodeTables.hasOwnProperty(podcastId) ) { + AIRTIME.podcast.episodeTables[podcastId].destroy(); + AIRTIME.podcast.episodeTables[podcastId] = null; self.$scope.$destroy(); - }); - } + } + }); }; /** @@ -348,6 +351,7 @@ var AIRTIME = (function (AIRTIME) { // Add podcast episode table in right-side panel below podcast edit form var episodeTable = AIRTIME.podcast.initPodcastEpisodeDatatableWithButtonEvents( $("#podcast_episodes_" + podcast.id), + podcast.id.toString() ); episodeTable.reload(podcast.id); episodeTable.clearSelection() @@ -436,7 +440,7 @@ var AIRTIME = (function (AIRTIME) { var self = this; self.importListener = setInterval(function () { var podcastId = self.config.podcastId, pendingRows = []; - if (!podcastId) return false; + if (!podcastId) return false; var dt = self.getDatatable(), data = dt.fnGetData(); // Iterate over the table data to check for any rows pending import $.each(data, function () { @@ -579,7 +583,7 @@ var AIRTIME = (function (AIRTIME) { csrf_token: $("#csrf").val(), episode: this }), function () { - dt.reload(this.podcast_id); + dt.reload(dt.config.podcastId); }); remainingDiskSpace -= this.enclosure.length; @@ -592,20 +596,18 @@ var AIRTIME = (function (AIRTIME) { * Delete one or more podcast episodes. * * @param {id:string, type:string}[] data Array of data objects to be deleted - * @param {PodcastEpisodeTable} dt PodcastEpisode table containing the data + * @param podcastId:string */ - mod.deleteSelectedEpisodes = function (data, dt) { + mod.deleteSelectedEpisodes = function (data, podcastId) { $.each(data, function () { - AIRTIME.library.fnDeleteItems(data); + AIRTIME.library.fnDeleteItems(data, podcastId); }); - dt.reload(this.podcast_id); - dt.clearSelection(); }; /** * Initialize the podcast episode table with working buttons */ - mod.initPodcastEpisodeDatatableWithButtonEvents = function (domNode) { + mod.initPodcastEpisodeDatatableWithButtonEvents = function (domNode, podcastId) { /** * Check the import statuses of each selected episode to see which @@ -637,8 +639,8 @@ var AIRTIME = (function (AIRTIME) { title: "Import", eventHandlers: { click: function () { - var episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); - AIRTIME.podcast.importSelectedEpisodes(episodes, mod.podcastEpisodeTableWidget); + var episodes = mod.episodeTables[podcastId].getSelectedRows(); + AIRTIME.podcast.importSelectedEpisodes(episodes, mod.episodeTables[podcastId]); } }, validateConstraints: function () { @@ -649,7 +651,7 @@ var AIRTIME = (function (AIRTIME) { { eventHandlers: { click: function () { - var episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); + var episodes = mod.episodeTables[podcastId].getSelectedRows(); AIRTIME.podcast.editSelectedEpisodes(episodes); } }, @@ -661,12 +663,11 @@ var AIRTIME = (function (AIRTIME) { { eventHandlers: { click: function () { - var data = [], episodes = mod.podcastEpisodeTableWidget.getSelectedRows(); + var data = [], episodes = mod.episodeTables[podcastId].getSelectedRows(); $.each(episodes, function () { data.push({id: this.file.id, type: this.file.ftype}); }); - console.log("podcast deletion:", data, mod.podcastEpisodeTableWidget); - AIRTIME.podcast.deleteSelectedEpisodes(data, mod.podcastEpisodeTableWidget); + AIRTIME.podcast.deleteSelectedEpisodes(data, podcastId); } }, validateConstraints: function () { @@ -683,30 +684,32 @@ var AIRTIME = (function (AIRTIME) { }; $.extend(true, podcastEpisodeButtons, { - // addToScheduleBtn: { - // title : $.i18n._('Add to Schedule'), - // iconClass : '', - // extraBtnClass : 'btn-small', - // elementId : '', - // eventHandlers : { - // click: function () { - // var data = [], selected = mod.podcastEpisodeTableWidget.getSelectedRows(); - // $.each(selected, function () { data.push(this.file); }); - // mod.addToSchedule(data); - // } - // }, - // validateConstraints: function () { - // // TODO: change text + behaviour for playlists, smart blocks, etc. - // return checkSelectedEpisodeImportStatus.call(this, true); - // } - // }, + addToScheduleBtn: { + title : $.i18n._('Add to Schedule'), + iconClass : 'icon-plus', + extraBtnClass : 'btn-small', + elementId : '', + eventHandlers : { + click: function () { + var data = [], selected = AIRTIME.podcast.episodeTables[podcastId].getSelectedRows(); + $.each(selected, function () { data.push(this.file); }); + AIRTIME.library.addToSchedule(data); + } + }, + validateConstraints: function () { + // TODO: change text + behaviour for playlists, smart blocks, etc. + return checkSelectedEpisodeImportStatus.call(this, true); + } + }, viewDescBtn: { title : $.i18n._("View"), iconClass : "icon-globe", extraBtnClass : "btn-small", elementId : "", eventHandlers : { - click: mod.openPodcastEpisodeDialog + click: function () { + AIRTIME.library.openPodcastEpisodeDialog(podcastId); + } }, validateConstraints: function () { return this.getSelectedRows().length == 1; @@ -714,7 +717,7 @@ var AIRTIME = (function (AIRTIME) { } }); - mod.podcastEpisodeTableWidget = AIRTIME.podcast.initPodcastEpisodeDatatable( + mod.episodeTables[podcastId] = AIRTIME.podcast.initPodcastEpisodeDatatable( domNode, podcastEpisodeButtons, { @@ -728,19 +731,19 @@ var AIRTIME = (function (AIRTIME) { } ); - mod.podcastEpisodeDataTable = mod.podcastEpisodeTableWidget.getDatatable(); - mod.podcastEpisodeTableWidget.assignDblClickHandler(function () { + mod.podcastEpisodeDataTable = mod.episodeTables[podcastId].getDatatable(); + mod.episodeTables[podcastId].assignDblClickHandler(function () { var data = mod.podcastEpisodeDataTable.fnGetData(this); if (!$.isEmptyObject(data.file)) { mod.dblClickAdd(data.file, data.file.ftype); } else { if (data.ingested >= 0) { // Only import if the file isn't pending - AIRTIME.podcast.importSelectedEpisodes([data], mod.podcastEpisodeTableWidget); + AIRTIME.podcast.importSelectedEpisodes([data], mod.episodeTables[podcastId]); } } }); - return mod.podcastEpisodeTableWidget; + return mod.episodeTables[podcastId]; }; /** From 3f85c3813725dc0c3f717c02e72a3c2e7bca72f2 Mon Sep 17 00:00:00 2001 From: ryan Date: Tue, 8 Jan 2019 13:01:05 -0600 Subject: [PATCH 117/210] cleanup podcast episodes table orphaned code --- airtime_mvc/application/views/scripts/showbuilder/index.phtml | 1 - airtime_mvc/public/js/airtime/library/library.js | 1 - 2 files changed, 2 deletions(-) diff --git a/airtime_mvc/application/views/scripts/showbuilder/index.phtml b/airtime_mvc/application/views/scripts/showbuilder/index.phtml index 9a8a4316d..b5093d583 100644 --- a/airtime_mvc/application/views/scripts/showbuilder/index.phtml +++ b/airtime_mvc/application/views/scripts/showbuilder/index.phtml @@ -16,7 +16,6 @@
      -
    • diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 39b7e806c..8921da1b2 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -92,7 +92,6 @@ var AIRTIME = (function(AIRTIME) { mod.DataTableTypeEnum = Object.freeze({ LIBRARY : "library", PODCAST : "podcast", - PODCAST_EPISODES: "podcastEpisodes" }); // TODO: once the new manual pages are added, change links! From a3f329834e28f428f1e540b22375883268415113 Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Fri, 11 Jan 2019 09:03:22 +0200 Subject: [PATCH 118/210] Add warning for the deprecation of Debian Jessie Jessie is out of security support and will be dropped in LibreTime 3.0.0-alpha.8 Fixes #684 --- install | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install b/install index 71b8d0361..11d81a8cb 100755 --- a/install +++ b/install @@ -632,6 +632,9 @@ case "${dist}-${code}" in debian-8|debian-jessie) code="jessie" is_debian_dist=true + echo -e "ERROR: Debian Jessie is archived and does not receive any security or other updates since 2018-05-17." >&2 + echo -e "The LibreTime installer dropped support for installing LibreTime on Jessie in 3.0.0-alpha.8." >&2 + sleep 6 is_debian_jessie=true ;; debian-7|debian-wheezy) From ddf34a1f9b6670b8b75bc9bfd7d9a117941e9ba2 Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Fri, 11 Jan 2019 11:49:24 +0200 Subject: [PATCH 119/210] fix grammar in Jessie warning --- install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install b/install index 11d81a8cb..1b82370f6 100755 --- a/install +++ b/install @@ -633,7 +633,7 @@ case "${dist}-${code}" in code="jessie" is_debian_dist=true echo -e "ERROR: Debian Jessie is archived and does not receive any security or other updates since 2018-05-17." >&2 - echo -e "The LibreTime installer dropped support for installing LibreTime on Jessie in 3.0.0-alpha.8." >&2 + echo -e "The LibreTime installer will drop support for installing LibreTime on Jessie in 3.0.0-alpha.8." >&2 sleep 6 is_debian_jessie=true ;; From 3ce27c6c4048d83b30d66aa3f6b869f192c72ec3 Mon Sep 17 00:00:00 2001 From: ryan Date: Sat, 12 Jan 2019 07:28:58 -0600 Subject: [PATCH 120/210] include markup into which to create episode tables --- airtime_mvc/application/views/scripts/podcast/podcast.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/views/scripts/podcast/podcast.phtml b/airtime_mvc/application/views/scripts/podcast/podcast.phtml index 2a2c8122e..9342636f2 100644 --- a/airtime_mvc/application/views/scripts/podcast/podcast.phtml +++ b/airtime_mvc/application/views/scripts/podcast/podcast.phtml @@ -41,7 +41,7 @@
      - +
      From 0a2de69fbbecb92b294c84fe4f95bf9ff2119181 Mon Sep 17 00:00:00 2001 From: Robbt Date: Sat, 12 Jan 2019 23:48:19 -0500 Subject: [PATCH 121/210] modified schema definition to include episode title --- .../models/airtime/map/CcBlockTableMap.php | 2 +- .../airtime/map/PodcastEpisodesTableMap.php | 2 + .../models/airtime/om/BaseCcBlockcontents.php | 6 +- .../airtime/om/BaseCcPlaylistcontents.php | 6 +- .../models/airtime/om/BasePodcastEpisodes.php | 114 +++++++++++++++++- .../airtime/om/BasePodcastEpisodesPeer.php | 38 +++--- .../airtime/om/BasePodcastEpisodesQuery.php | 68 ++++++++++- .../services/PodcastEpisodeService.php | 8 +- airtime_mvc/build/schema.xml | 5 +- airtime_mvc/build/sql/schema.sql | 2 + 10 files changed, 225 insertions(+), 26 deletions(-) diff --git a/airtime_mvc/application/models/airtime/map/CcBlockTableMap.php b/airtime_mvc/application/models/airtime/map/CcBlockTableMap.php index dfc5c95ff..72b72a09a 100644 --- a/airtime_mvc/application/models/airtime/map/CcBlockTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcBlockTableMap.php @@ -46,7 +46,7 @@ class CcBlockTableMap extends TableMap $this->addForeignKey('creator_id', 'DbCreatorId', 'INTEGER', 'cc_subjs', 'id', false, null, null); $this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null); $this->addColumn('length', 'DbLength', 'VARCHAR', false, null, '00:00:00'); - $this->addColumn('type', 'DbType', 'VARCHAR', false, 7, 'static'); + $this->addColumn('type', 'DbType', 'VARCHAR', false, 7, 'dynamic'); // validators } // initialize() diff --git a/airtime_mvc/application/models/airtime/map/PodcastEpisodesTableMap.php b/airtime_mvc/application/models/airtime/map/PodcastEpisodesTableMap.php index ef3895069..978cf12a1 100644 --- a/airtime_mvc/application/models/airtime/map/PodcastEpisodesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/PodcastEpisodesTableMap.php @@ -45,6 +45,8 @@ class PodcastEpisodesTableMap extends TableMap $this->addColumn('publication_date', 'DbPublicationDate', 'TIMESTAMP', true, null, null); $this->addColumn('download_url', 'DbDownloadUrl', 'VARCHAR', true, 4096, null); $this->addColumn('episode_guid', 'DbEpisodeGuid', 'VARCHAR', true, 4096, null); + $this->addColumn('episode_title', 'DbEpisodeTitle', 'VARCHAR', true, 4096, null); + $this->addColumn('episode_description', 'DbEpisodeDescription', 'VARCHAR', true, 4096, null); // validators } // initialize() diff --git a/airtime_mvc/application/models/airtime/om/BaseCcBlockcontents.php b/airtime_mvc/application/models/airtime/om/BaseCcBlockcontents.php index ec32bc9c8..0729979ab 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcBlockcontents.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcBlockcontents.php @@ -55,7 +55,7 @@ abstract class BaseCcBlockcontents extends BaseObject implements Persistent /** * The value for the trackoffset field. - * Note: this column has a database default value of: 0 + * Note: this column has a database default value of: 0.0 * @var double */ protected $trackoffset; @@ -136,7 +136,7 @@ abstract class BaseCcBlockcontents extends BaseObject implements Persistent */ public function applyDefaultValues() { - $this->trackoffset = 0; + $this->trackoffset = 0.0; $this->cliplength = '00:00:00'; $this->cuein = '00:00:00'; $this->cueout = '00:00:00'; @@ -548,7 +548,7 @@ abstract class BaseCcBlockcontents extends BaseObject implements Persistent */ public function hasOnlyDefaultValues() { - if ($this->trackoffset !== 0) { + if ($this->trackoffset !== 0.0) { return false; } diff --git a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontents.php b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontents.php index 1c634b382..b0552a756 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontents.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcPlaylistcontents.php @@ -74,7 +74,7 @@ abstract class BaseCcPlaylistcontents extends BaseObject implements Persistent /** * The value for the trackoffset field. - * Note: this column has a database default value of: 0 + * Note: this column has a database default value of: 0.0 * @var double */ protected $trackoffset; @@ -161,7 +161,7 @@ abstract class BaseCcPlaylistcontents extends BaseObject implements Persistent public function applyDefaultValues() { $this->type = 0; - $this->trackoffset = 0; + $this->trackoffset = 0.0; $this->cliplength = '00:00:00'; $this->cuein = '00:00:00'; $this->cueout = '00:00:00'; @@ -677,7 +677,7 @@ abstract class BaseCcPlaylistcontents extends BaseObject implements Persistent return false; } - if ($this->trackoffset !== 0) { + if ($this->trackoffset !== 0.0) { return false; } diff --git a/airtime_mvc/application/models/airtime/om/BasePodcastEpisodes.php b/airtime_mvc/application/models/airtime/om/BasePodcastEpisodes.php index e39015230..23e331847 100644 --- a/airtime_mvc/application/models/airtime/om/BasePodcastEpisodes.php +++ b/airtime_mvc/application/models/airtime/om/BasePodcastEpisodes.php @@ -65,6 +65,18 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent */ protected $episode_guid; + /** + * The value for the episode_title field. + * @var string + */ + protected $episode_title; + + /** + * The value for the episode_description field. + * @var string + */ + protected $episode_description; + /** * @var CcFiles */ @@ -185,6 +197,28 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent return $this->episode_guid; } + /** + * Get the [episode_title] column value. + * + * @return string + */ + public function getDbEpisodeTitle() + { + + return $this->episode_title; + } + + /** + * Get the [episode_description] column value. + * + * @return string + */ + public function getDbEpisodeDescription() + { + + return $this->episode_description; + } + /** * Set the value of [id] column. * @@ -321,6 +355,48 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent return $this; } // setDbEpisodeGuid() + /** + * Set the value of [episode_title] column. + * + * @param string $v new value + * @return PodcastEpisodes The current object (for fluent API support) + */ + public function setDbEpisodeTitle($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->episode_title !== $v) { + $this->episode_title = $v; + $this->modifiedColumns[] = PodcastEpisodesPeer::EPISODE_TITLE; + } + + + return $this; + } // setDbEpisodeTitle() + + /** + * Set the value of [episode_description] column. + * + * @param string $v new value + * @return PodcastEpisodes The current object (for fluent API support) + */ + public function setDbEpisodeDescription($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->episode_description !== $v) { + $this->episode_description = $v; + $this->modifiedColumns[] = PodcastEpisodesPeer::EPISODE_DESCRIPTION; + } + + + return $this; + } // setDbEpisodeDescription() + /** * Indicates whether the columns in this object are only set to default values. * @@ -359,6 +435,8 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent $this->publication_date = ($row[$startcol + 3] !== null) ? (string) $row[$startcol + 3] : null; $this->download_url = ($row[$startcol + 4] !== null) ? (string) $row[$startcol + 4] : null; $this->episode_guid = ($row[$startcol + 5] !== null) ? (string) $row[$startcol + 5] : null; + $this->episode_title = ($row[$startcol + 6] !== null) ? (string) $row[$startcol + 6] : null; + $this->episode_description = ($row[$startcol + 7] !== null) ? (string) $row[$startcol + 7] : null; $this->resetModified(); $this->setNew(false); @@ -368,7 +446,7 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent } $this->postHydrate($row, $startcol, $rehydrate); - return $startcol + 6; // 6 = PodcastEpisodesPeer::NUM_HYDRATE_COLUMNS. + return $startcol + 8; // 8 = PodcastEpisodesPeer::NUM_HYDRATE_COLUMNS. } catch (Exception $e) { throw new PropelException("Error populating PodcastEpisodes object", $e); @@ -635,6 +713,12 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent if ($this->isColumnModified(PodcastEpisodesPeer::EPISODE_GUID)) { $modifiedColumns[':p' . $index++] = '"episode_guid"'; } + if ($this->isColumnModified(PodcastEpisodesPeer::EPISODE_TITLE)) { + $modifiedColumns[':p' . $index++] = '"episode_title"'; + } + if ($this->isColumnModified(PodcastEpisodesPeer::EPISODE_DESCRIPTION)) { + $modifiedColumns[':p' . $index++] = '"episode_description"'; + } $sql = sprintf( 'INSERT INTO "podcast_episodes" (%s) VALUES (%s)', @@ -664,6 +748,12 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent case '"episode_guid"': $stmt->bindValue($identifier, $this->episode_guid, PDO::PARAM_STR); break; + case '"episode_title"': + $stmt->bindValue($identifier, $this->episode_title, PDO::PARAM_STR); + break; + case '"episode_description"': + $stmt->bindValue($identifier, $this->episode_description, PDO::PARAM_STR); + break; } } $stmt->execute(); @@ -827,6 +917,12 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent case 5: return $this->getDbEpisodeGuid(); break; + case 6: + return $this->getDbEpisodeTitle(); + break; + case 7: + return $this->getDbEpisodeDescription(); + break; default: return null; break; @@ -862,6 +958,8 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent $keys[3] => $this->getDbPublicationDate(), $keys[4] => $this->getDbDownloadUrl(), $keys[5] => $this->getDbEpisodeGuid(), + $keys[6] => $this->getDbEpisodeTitle(), + $keys[7] => $this->getDbEpisodeDescription(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -927,6 +1025,12 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent case 5: $this->setDbEpisodeGuid($value); break; + case 6: + $this->setDbEpisodeTitle($value); + break; + case 7: + $this->setDbEpisodeDescription($value); + break; } // switch() } @@ -957,6 +1061,8 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent if (array_key_exists($keys[3], $arr)) $this->setDbPublicationDate($arr[$keys[3]]); if (array_key_exists($keys[4], $arr)) $this->setDbDownloadUrl($arr[$keys[4]]); if (array_key_exists($keys[5], $arr)) $this->setDbEpisodeGuid($arr[$keys[5]]); + if (array_key_exists($keys[6], $arr)) $this->setDbEpisodeTitle($arr[$keys[6]]); + if (array_key_exists($keys[7], $arr)) $this->setDbEpisodeDescription($arr[$keys[7]]); } /** @@ -974,6 +1080,8 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent if ($this->isColumnModified(PodcastEpisodesPeer::PUBLICATION_DATE)) $criteria->add(PodcastEpisodesPeer::PUBLICATION_DATE, $this->publication_date); if ($this->isColumnModified(PodcastEpisodesPeer::DOWNLOAD_URL)) $criteria->add(PodcastEpisodesPeer::DOWNLOAD_URL, $this->download_url); if ($this->isColumnModified(PodcastEpisodesPeer::EPISODE_GUID)) $criteria->add(PodcastEpisodesPeer::EPISODE_GUID, $this->episode_guid); + if ($this->isColumnModified(PodcastEpisodesPeer::EPISODE_TITLE)) $criteria->add(PodcastEpisodesPeer::EPISODE_TITLE, $this->episode_title); + if ($this->isColumnModified(PodcastEpisodesPeer::EPISODE_DESCRIPTION)) $criteria->add(PodcastEpisodesPeer::EPISODE_DESCRIPTION, $this->episode_description); return $criteria; } @@ -1042,6 +1150,8 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent $copyObj->setDbPublicationDate($this->getDbPublicationDate()); $copyObj->setDbDownloadUrl($this->getDbDownloadUrl()); $copyObj->setDbEpisodeGuid($this->getDbEpisodeGuid()); + $copyObj->setDbEpisodeTitle($this->getDbEpisodeTitle()); + $copyObj->setDbEpisodeDescription($this->getDbEpisodeDescription()); if ($deepCopy && !$this->startCopy) { // important: temporarily setNew(false) because this affects the behavior of @@ -1215,6 +1325,8 @@ abstract class BasePodcastEpisodes extends BaseObject implements Persistent $this->publication_date = null; $this->download_url = null; $this->episode_guid = null; + $this->episode_title = null; + $this->episode_description = null; $this->alreadyInSave = false; $this->alreadyInValidation = false; $this->alreadyInClearAllReferencesDeep = false; diff --git a/airtime_mvc/application/models/airtime/om/BasePodcastEpisodesPeer.php b/airtime_mvc/application/models/airtime/om/BasePodcastEpisodesPeer.php index 3415c9345..91fcbeee2 100644 --- a/airtime_mvc/application/models/airtime/om/BasePodcastEpisodesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BasePodcastEpisodesPeer.php @@ -24,13 +24,13 @@ abstract class BasePodcastEpisodesPeer const TM_CLASS = 'PodcastEpisodesTableMap'; /** The total number of columns. */ - const NUM_COLUMNS = 6; + const NUM_COLUMNS = 8; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */ - const NUM_HYDRATE_COLUMNS = 6; + const NUM_HYDRATE_COLUMNS = 8; /** the column name for the id field */ const ID = 'podcast_episodes.id'; @@ -50,6 +50,12 @@ abstract class BasePodcastEpisodesPeer /** the column name for the episode_guid field */ const EPISODE_GUID = 'podcast_episodes.episode_guid'; + /** the column name for the episode_title field */ + const EPISODE_TITLE = 'podcast_episodes.episode_title'; + + /** the column name for the episode_description field */ + const EPISODE_DESCRIPTION = 'podcast_episodes.episode_description'; + /** The default string format for model objects of the related table **/ const DEFAULT_STRING_FORMAT = 'YAML'; @@ -69,12 +75,12 @@ abstract class BasePodcastEpisodesPeer * e.g. PodcastEpisodesPeer::$fieldNames[PodcastEpisodesPeer::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbFileId', 'DbPodcastId', 'DbPublicationDate', 'DbDownloadUrl', 'DbEpisodeGuid', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbFileId', 'dbPodcastId', 'dbPublicationDate', 'dbDownloadUrl', 'dbEpisodeGuid', ), - BasePeer::TYPE_COLNAME => array (PodcastEpisodesPeer::ID, PodcastEpisodesPeer::FILE_ID, PodcastEpisodesPeer::PODCAST_ID, PodcastEpisodesPeer::PUBLICATION_DATE, PodcastEpisodesPeer::DOWNLOAD_URL, PodcastEpisodesPeer::EPISODE_GUID, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'FILE_ID', 'PODCAST_ID', 'PUBLICATION_DATE', 'DOWNLOAD_URL', 'EPISODE_GUID', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'file_id', 'podcast_id', 'publication_date', 'download_url', 'episode_guid', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbFileId', 'DbPodcastId', 'DbPublicationDate', 'DbDownloadUrl', 'DbEpisodeGuid', 'DbEpisodeTitle', 'DbEpisodeDescription', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbFileId', 'dbPodcastId', 'dbPublicationDate', 'dbDownloadUrl', 'dbEpisodeGuid', 'dbEpisodeTitle', 'dbEpisodeDescription', ), + BasePeer::TYPE_COLNAME => array (PodcastEpisodesPeer::ID, PodcastEpisodesPeer::FILE_ID, PodcastEpisodesPeer::PODCAST_ID, PodcastEpisodesPeer::PUBLICATION_DATE, PodcastEpisodesPeer::DOWNLOAD_URL, PodcastEpisodesPeer::EPISODE_GUID, PodcastEpisodesPeer::EPISODE_TITLE, PodcastEpisodesPeer::EPISODE_DESCRIPTION, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'FILE_ID', 'PODCAST_ID', 'PUBLICATION_DATE', 'DOWNLOAD_URL', 'EPISODE_GUID', 'EPISODE_TITLE', 'EPISODE_DESCRIPTION', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'file_id', 'podcast_id', 'publication_date', 'download_url', 'episode_guid', 'episode_title', 'episode_description', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, ) ); /** @@ -84,12 +90,12 @@ abstract class BasePodcastEpisodesPeer * e.g. PodcastEpisodesPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbFileId' => 1, 'DbPodcastId' => 2, 'DbPublicationDate' => 3, 'DbDownloadUrl' => 4, 'DbEpisodeGuid' => 5, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbFileId' => 1, 'dbPodcastId' => 2, 'dbPublicationDate' => 3, 'dbDownloadUrl' => 4, 'dbEpisodeGuid' => 5, ), - BasePeer::TYPE_COLNAME => array (PodcastEpisodesPeer::ID => 0, PodcastEpisodesPeer::FILE_ID => 1, PodcastEpisodesPeer::PODCAST_ID => 2, PodcastEpisodesPeer::PUBLICATION_DATE => 3, PodcastEpisodesPeer::DOWNLOAD_URL => 4, PodcastEpisodesPeer::EPISODE_GUID => 5, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'FILE_ID' => 1, 'PODCAST_ID' => 2, 'PUBLICATION_DATE' => 3, 'DOWNLOAD_URL' => 4, 'EPISODE_GUID' => 5, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'file_id' => 1, 'podcast_id' => 2, 'publication_date' => 3, 'download_url' => 4, 'episode_guid' => 5, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbFileId' => 1, 'DbPodcastId' => 2, 'DbPublicationDate' => 3, 'DbDownloadUrl' => 4, 'DbEpisodeGuid' => 5, 'DbEpisodeTitle' => 6, 'DbEpisodeDescription' => 7, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbFileId' => 1, 'dbPodcastId' => 2, 'dbPublicationDate' => 3, 'dbDownloadUrl' => 4, 'dbEpisodeGuid' => 5, 'dbEpisodeTitle' => 6, 'dbEpisodeDescription' => 7, ), + BasePeer::TYPE_COLNAME => array (PodcastEpisodesPeer::ID => 0, PodcastEpisodesPeer::FILE_ID => 1, PodcastEpisodesPeer::PODCAST_ID => 2, PodcastEpisodesPeer::PUBLICATION_DATE => 3, PodcastEpisodesPeer::DOWNLOAD_URL => 4, PodcastEpisodesPeer::EPISODE_GUID => 5, PodcastEpisodesPeer::EPISODE_TITLE => 6, PodcastEpisodesPeer::EPISODE_DESCRIPTION => 7, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'FILE_ID' => 1, 'PODCAST_ID' => 2, 'PUBLICATION_DATE' => 3, 'DOWNLOAD_URL' => 4, 'EPISODE_GUID' => 5, 'EPISODE_TITLE' => 6, 'EPISODE_DESCRIPTION' => 7, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'file_id' => 1, 'podcast_id' => 2, 'publication_date' => 3, 'download_url' => 4, 'episode_guid' => 5, 'episode_title' => 6, 'episode_description' => 7, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, ) ); /** @@ -169,6 +175,8 @@ abstract class BasePodcastEpisodesPeer $criteria->addSelectColumn(PodcastEpisodesPeer::PUBLICATION_DATE); $criteria->addSelectColumn(PodcastEpisodesPeer::DOWNLOAD_URL); $criteria->addSelectColumn(PodcastEpisodesPeer::EPISODE_GUID); + $criteria->addSelectColumn(PodcastEpisodesPeer::EPISODE_TITLE); + $criteria->addSelectColumn(PodcastEpisodesPeer::EPISODE_DESCRIPTION); } else { $criteria->addSelectColumn($alias . '.id'); $criteria->addSelectColumn($alias . '.file_id'); @@ -176,6 +184,8 @@ abstract class BasePodcastEpisodesPeer $criteria->addSelectColumn($alias . '.publication_date'); $criteria->addSelectColumn($alias . '.download_url'); $criteria->addSelectColumn($alias . '.episode_guid'); + $criteria->addSelectColumn($alias . '.episode_title'); + $criteria->addSelectColumn($alias . '.episode_description'); } } diff --git a/airtime_mvc/application/models/airtime/om/BasePodcastEpisodesQuery.php b/airtime_mvc/application/models/airtime/om/BasePodcastEpisodesQuery.php index fbf44a00f..f96d61b8d 100644 --- a/airtime_mvc/application/models/airtime/om/BasePodcastEpisodesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BasePodcastEpisodesQuery.php @@ -12,6 +12,8 @@ * @method PodcastEpisodesQuery orderByDbPublicationDate($order = Criteria::ASC) Order by the publication_date column * @method PodcastEpisodesQuery orderByDbDownloadUrl($order = Criteria::ASC) Order by the download_url column * @method PodcastEpisodesQuery orderByDbEpisodeGuid($order = Criteria::ASC) Order by the episode_guid column + * @method PodcastEpisodesQuery orderByDbEpisodeTitle($order = Criteria::ASC) Order by the episode_title column + * @method PodcastEpisodesQuery orderByDbEpisodeDescription($order = Criteria::ASC) Order by the episode_description column * * @method PodcastEpisodesQuery groupByDbId() Group by the id column * @method PodcastEpisodesQuery groupByDbFileId() Group by the file_id column @@ -19,6 +21,8 @@ * @method PodcastEpisodesQuery groupByDbPublicationDate() Group by the publication_date column * @method PodcastEpisodesQuery groupByDbDownloadUrl() Group by the download_url column * @method PodcastEpisodesQuery groupByDbEpisodeGuid() Group by the episode_guid column + * @method PodcastEpisodesQuery groupByDbEpisodeTitle() Group by the episode_title column + * @method PodcastEpisodesQuery groupByDbEpisodeDescription() Group by the episode_description column * * @method PodcastEpisodesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method PodcastEpisodesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -40,6 +44,8 @@ * @method PodcastEpisodes findOneByDbPublicationDate(string $publication_date) Return the first PodcastEpisodes filtered by the publication_date column * @method PodcastEpisodes findOneByDbDownloadUrl(string $download_url) Return the first PodcastEpisodes filtered by the download_url column * @method PodcastEpisodes findOneByDbEpisodeGuid(string $episode_guid) Return the first PodcastEpisodes filtered by the episode_guid column + * @method PodcastEpisodes findOneByDbEpisodeTitle(string $episode_title) Return the first PodcastEpisodes filtered by the episode_title column + * @method PodcastEpisodes findOneByDbEpisodeDescription(string $episode_description) Return the first PodcastEpisodes filtered by the episode_description column * * @method array findByDbId(int $id) Return PodcastEpisodes objects filtered by the id column * @method array findByDbFileId(int $file_id) Return PodcastEpisodes objects filtered by the file_id column @@ -47,6 +53,8 @@ * @method array findByDbPublicationDate(string $publication_date) Return PodcastEpisodes objects filtered by the publication_date column * @method array findByDbDownloadUrl(string $download_url) Return PodcastEpisodes objects filtered by the download_url column * @method array findByDbEpisodeGuid(string $episode_guid) Return PodcastEpisodes objects filtered by the episode_guid column + * @method array findByDbEpisodeTitle(string $episode_title) Return PodcastEpisodes objects filtered by the episode_title column + * @method array findByDbEpisodeDescription(string $episode_description) Return PodcastEpisodes objects filtered by the episode_description column * * @package propel.generator.airtime.om */ @@ -154,7 +162,7 @@ abstract class BasePodcastEpisodesQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT "id", "file_id", "podcast_id", "publication_date", "download_url", "episode_guid" FROM "podcast_episodes" WHERE "id" = :p0'; + $sql = 'SELECT "id", "file_id", "podcast_id", "publication_date", "download_url", "episode_guid", "episode_title", "episode_description" FROM "podcast_episodes" WHERE "id" = :p0'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key, PDO::PARAM_INT); @@ -474,6 +482,64 @@ abstract class BasePodcastEpisodesQuery extends ModelCriteria return $this->addUsingAlias(PodcastEpisodesPeer::EPISODE_GUID, $dbEpisodeGuid, $comparison); } + /** + * Filter the query on the episode_title column + * + * Example usage: + * + * $query->filterByDbEpisodeTitle('fooValue'); // WHERE episode_title = 'fooValue' + * $query->filterByDbEpisodeTitle('%fooValue%'); // WHERE episode_title LIKE '%fooValue%' + * + * + * @param string $dbEpisodeTitle The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return PodcastEpisodesQuery The current query, for fluid interface + */ + public function filterByDbEpisodeTitle($dbEpisodeTitle = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbEpisodeTitle)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbEpisodeTitle)) { + $dbEpisodeTitle = str_replace('*', '%', $dbEpisodeTitle); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(PodcastEpisodesPeer::EPISODE_TITLE, $dbEpisodeTitle, $comparison); + } + + /** + * Filter the query on the episode_description column + * + * Example usage: + * + * $query->filterByDbEpisodeDescription('fooValue'); // WHERE episode_description = 'fooValue' + * $query->filterByDbEpisodeDescription('%fooValue%'); // WHERE episode_description LIKE '%fooValue%' + * + * + * @param string $dbEpisodeDescription The value to use as filter. + * Accepts wildcards (* and % trigger a LIKE) + * @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL + * + * @return PodcastEpisodesQuery The current query, for fluid interface + */ + public function filterByDbEpisodeDescription($dbEpisodeDescription = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbEpisodeDescription)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbEpisodeDescription)) { + $dbEpisodeDescription = str_replace('*', '%', $dbEpisodeDescription); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(PodcastEpisodesPeer::EPISODE_DESCRIPTION, $dbEpisodeDescription, $comparison); + } + /** * Filter the query by a related CcFiles object * diff --git a/airtime_mvc/application/services/PodcastEpisodeService.php b/airtime_mvc/application/services/PodcastEpisodeService.php index af61cdf61..bc71bb961 100644 --- a/airtime_mvc/application/services/PodcastEpisodeService.php +++ b/airtime_mvc/application/services/PodcastEpisodeService.php @@ -93,7 +93,7 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir // feed object, or whether it's passed in as json $enclosure = $episode["enclosure"]; $url = $enclosure instanceof SimplePie_Enclosure ? $enclosure->get_link() : $enclosure["link"]; - return $this->_buildEpisode($podcastId, $url, $episode["guid"], $episode["pub_date"]); + return $this->_buildEpisode($podcastId, $url, $episode["guid"], $episode["pub_date"], $episode["title"], $episode["description"]); } /** @@ -103,18 +103,22 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir * @param string $url the download URL for the episode * @param string $guid the unique id for the episode. Often the same as the download URL * @param string $publicationDate the publication date of the episode + * @param string $title the title of the episode + * @param string $description the description of the epsiode * * @return PodcastEpisodes the newly created PodcastEpisodes object * * @throws Exception * @throws PropelException */ - private function _buildEpisode($podcastId, $url, $guid, $publicationDate) { + private function _buildEpisode($podcastId, $url, $guid, $publicationDate, $title, $description) { $e = new PodcastEpisodes(); $e->setDbPodcastId($podcastId); $e->setDbDownloadUrl($url); $e->setDbEpisodeGuid($guid); $e->setDbPublicationDate($publicationDate); + $e->setDbEpisodeTitle($title); + $e->setDbEpisodeDescription($description); $e->save(); return $e; } diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index 7c46ce495..ecb538a63 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -281,7 +281,7 @@ - + @@ -623,6 +623,9 @@ + + + diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index aae02129e..a158db43a 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -780,6 +780,8 @@ CREATE TABLE "podcast_episodes" "publication_date" TIMESTAMP NOT NULL, "download_url" VARCHAR(4096) NOT NULL, "episode_guid" VARCHAR(4096) NOT NULL, + "episode_title" VARCHAR(4096) NOT NULL, + "episode_description" VARCHAR(4096) NOT NULL, PRIMARY KEY ("id") ); From a9ca4432f901eea082f2b300e4d0b32c9ed09857 Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 13 Jan 2019 00:02:07 -0500 Subject: [PATCH 122/210] added upgrade and downgrade scripts --- .../downgrade_sql/airtime_3.0.0-alpha.8/downgrade.sql | 2 ++ .../controllers/upgrade_sql/airtime_3.0.0-alpha.8/upgrade.sql | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 airtime_mvc/application/controllers/downgrade_sql/airtime_3.0.0-alpha.8/downgrade.sql create mode 100644 airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.8/upgrade.sql diff --git a/airtime_mvc/application/controllers/downgrade_sql/airtime_3.0.0-alpha.8/downgrade.sql b/airtime_mvc/application/controllers/downgrade_sql/airtime_3.0.0-alpha.8/downgrade.sql new file mode 100644 index 000000000..9e5f23e31 --- /dev/null +++ b/airtime_mvc/application/controllers/downgrade_sql/airtime_3.0.0-alpha.8/downgrade.sql @@ -0,0 +1,2 @@ +ALTER TABLE podcast_episodes DROP COLUMN IF EXISTS episode_title; +ALTER TABLE podcast_episodes DROP COLUMN IF EXISTS episode_description; \ No newline at end of file diff --git a/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.8/upgrade.sql b/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.8/upgrade.sql new file mode 100644 index 000000000..d96c575d8 --- /dev/null +++ b/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.8/upgrade.sql @@ -0,0 +1,2 @@ +ALTER TABLE podcast_episodes ADD COLUMN episode_title VARCHAR(4096) NOT NULL; +ALTER TABLE podcast_episodes ADD COLUMN episode_description VARCHAR(4096) NOT NULL; \ No newline at end of file From 8427d0a92ac639a8269215e786741aeee14ae76f Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 13 Jan 2019 00:29:49 -0500 Subject: [PATCH 123/210] changed artist track to podcast title --- python_apps/airtime-celery/airtime-celery/tasks.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python_apps/airtime-celery/airtime-celery/tasks.py b/python_apps/airtime-celery/airtime-celery/tasks.py index a2f100f5d..bedc6efa7 100644 --- a/python_apps/airtime-celery/airtime-celery/tasks.py +++ b/python_apps/airtime-celery/airtime-celery/tasks.py @@ -190,6 +190,7 @@ def podcast_override_metadata(m, podcast_name, override, track_title): logger.debug('overriding album name to {0} in podcast'.format(podcast_name.encode('ascii', 'ignore'))) m['album'] = podcast_name m['title'] = track_title + m['artist'] = podcast_name else: # replace the album id3 tag with the podcast name if the album tag is empty try: From eb349174dd44996d6b8cb487cc8346cbaa9f51c2 Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 13 Jan 2019 00:40:13 -0500 Subject: [PATCH 124/210] change album override label to podcast metadata override in preferences page --- airtime_mvc/application/common/PodcastManager.php | 2 +- airtime_mvc/application/forms/GeneralPreferences.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/common/PodcastManager.php b/airtime_mvc/application/common/PodcastManager.php index 1e49463c1..ce1fc4cc6 100644 --- a/airtime_mvc/application/common/PodcastManager.php +++ b/airtime_mvc/application/common/PodcastManager.php @@ -75,7 +75,7 @@ class PodcastManager { array_push($episodes, $placeholder); } } - return $episodes; + return $episodPoes; } /** diff --git a/airtime_mvc/application/forms/GeneralPreferences.php b/airtime_mvc/application/forms/GeneralPreferences.php index 924264751..ec9390e5c 100644 --- a/airtime_mvc/application/forms/GeneralPreferences.php +++ b/airtime_mvc/application/forms/GeneralPreferences.php @@ -102,13 +102,13 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm $podcast_album_override = new Zend_Form_Element_Radio('podcastAlbumOverride'); - $podcast_album_override->setLabel(_('Podcast Album Override')); + $podcast_album_override->setLabel(_('Podcast Metadata Override')); $podcast_album_override->setMultiOptions(array( _("Disabled"), _("Enabled"), )); $podcast_album_override->setValue(Application_Model_Preference::GetPodcastAlbumOverride()); - $podcast_album_override->setDescription(_('Enabling this means that podcast tracks will always contain the podcast name in their album field.')); + $podcast_album_override->setDescription(_('Enabling this means that podcast tracks will get their metadata set from the podcast feed values')); $podcast_album_override->setSeparator(' '); //No
      between radio buttons $podcast_album_override->addDecorator('HtmlTag', array('tag' => 'dd', 'id'=>"podcastAlbumOverride-element", From 2485e70bbe5925d3c1a3307dc8cd990de5b3d7ca Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 13 Jan 2019 09:50:21 -0500 Subject: [PATCH 125/210] fixed typo in variable --- airtime_mvc/application/common/PodcastManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/common/PodcastManager.php b/airtime_mvc/application/common/PodcastManager.php index ce1fc4cc6..1e49463c1 100644 --- a/airtime_mvc/application/common/PodcastManager.php +++ b/airtime_mvc/application/common/PodcastManager.php @@ -75,7 +75,7 @@ class PodcastManager { array_push($episodes, $placeholder); } } - return $episodPoes; + return $episodes; } /** From 7177fc7bed9be81372b7559403e3c527cd12a70d Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 13 Jan 2019 11:46:55 -0500 Subject: [PATCH 126/210] Removed logging and fix parameter variable --- airtime_mvc/application/common/PodcastManager.php | 3 +-- airtime_mvc/application/services/PodcastEpisodeService.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/common/PodcastManager.php b/airtime_mvc/application/common/PodcastManager.php index 1e49463c1..d29816a54 100644 --- a/airtime_mvc/application/common/PodcastManager.php +++ b/airtime_mvc/application/common/PodcastManager.php @@ -37,7 +37,6 @@ class PodcastManager { // but will at least continue to ingest new episodes. if (!empty($episodes)) { $podcast->setDbAutoIngestTimestamp(gmdate('r', strtotime($episodes[0]->getDbPublicationDate())))->save(); - Logging::info($episodes); $service->downloadEpisodes($episodes); } } @@ -102,4 +101,4 @@ class PodcastManager { return (strtotime($a["pub_date"]) < strtotime($b["pub_date"])) ? 1 : -1; // Descending order } -} \ No newline at end of file +} diff --git a/airtime_mvc/application/services/PodcastEpisodeService.php b/airtime_mvc/application/services/PodcastEpisodeService.php index bc71bb961..a607b8d08 100644 --- a/airtime_mvc/application/services/PodcastEpisodeService.php +++ b/airtime_mvc/application/services/PodcastEpisodeService.php @@ -133,7 +133,7 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir foreach($episodes as $episode) { $podcast = $episode->getPodcast(); Logging::info($episode); - $this->_download($episode->getDbId(), $episode->getDbDownloadUrl(), $podcast->getDbTitle(), $this->_getAlbumOverride($podcast), $episode["title"]); + $this->_download($episode->getDbId(), $episode->getDbDownloadUrl(), $podcast->getDbTitle(), $this->_getAlbumOverride($podcast), $episode->getDbEpisodeTitle()); } } From 6e39cb400f23480843cd30a2a89ded4f3d12d778 Mon Sep 17 00:00:00 2001 From: Robbt Date: Sun, 13 Jan 2019 12:00:42 -0500 Subject: [PATCH 127/210] update individual track metadata --- airtime_mvc/application/views/scripts/podcast/podcast.phtml | 2 +- airtime_mvc/public/js/airtime/library/podcast.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/views/scripts/podcast/podcast.phtml b/airtime_mvc/application/views/scripts/podcast/podcast.phtml index 9342636f2..f2b7b57e0 100644 --- a/airtime_mvc/application/views/scripts/podcast/podcast.phtml +++ b/airtime_mvc/application/views/scripts/podcast/podcast.phtml @@ -26,7 +26,7 @@
      - +
      diff --git a/airtime_mvc/public/css/masterpanel.css b/airtime_mvc/public/css/masterpanel.css index c338bf09f..6396aba31 100644 --- a/airtime_mvc/public/css/masterpanel.css +++ b/airtime_mvc/public/css/masterpanel.css @@ -302,32 +302,46 @@ -.personal-block.solo { - width: 215px; - line-height: 32px; - margin: 0; -} -.personal-block.solo span { - display: inline-block; - width: 100px; - text-overflow: ellipsis; - text-decoration: underline; - overflow: hidden; - float: left; -} -.personal-block.solo ol { - margin-top: 6px; -} .time-info-block.pull-right { margin-right:0; text-align:right !important; background-position:0 0; padding: 0 10px 0 10px; - } - .time-info-block li, .time-info-block li.time { - text-align: right; - } + display: flex; + flex-direction: column; + justify-content: center; + max-width: 150px; +} +.time-info-block .time { + padding: 0; + margin: 0; + width: auto; + list-style-type:none; + font-size:40px; + color:#fff; +} +.personal-block { + display: flex; + justify-content: space-between; + color:#fff; + font-size:12px; +} +.personal-block .name { + display: inline-block; + max-width: 100px; + text-overflow: ellipsis; + text-decoration: underline; + overflow: hidden; + margin-right: 3px; +} +.personal-block a { + color:#fff; + text-decoration:underline; +} +.personal-block a:hover { + color:#ff5d1a; +} /*.line-to-switch { float: right; width: 10px; diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index 8327080a4..adc90fef2 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -106,15 +106,16 @@ img.logo /* Version Notification Starts*/ #version-icon { position:absolute; - top:68px; - right: 10px; - height:35px; - width:35px; + top:3px; + right: 3px; + height:20px; + width:20px; z-index:1000; display:block; cursor:pointer; background-repeat:no-repeat; background-position:center; + background-size: contain; } #version-icon.outdated { background-image:url(images/icon_outdated.png); @@ -267,7 +268,7 @@ img.logo overflow:hidden; } -.now-playing-block, .show-block, .on-air-block, .time-info-block, .personal-block, .listen-control-block, .trial-info-block { +.now-playing-block, .show-block, .on-air-block, .time-info-block, .listen-control-block, .trial-info-block { height:100px; float:left; margin-right:10px; @@ -279,34 +280,6 @@ img.logo min-width:170px; } -.personal-block { - float:right; - margin-right:20px; - text-align:right; - min-width:110px; -} - -.personal-block ul { - margin:0; - padding:8px 0 0; -} -.personal-block li { - font-size:11px; - color:#bdbdbd; - list-style-type:none; - margin:0 0 2px 0; -} -.personal-block li.name { - color:#fff; - font-weight:normal; -} -.personal-block li a { - color:#fff; - text-decoration:underline; -} -.personal-block li a:hover { - color:#ff5d1a; -} .now-playing-block { -webkit-flex: 1 0; -moz-flex: 1 0; @@ -430,26 +403,7 @@ ol.navigation { min-width: 630px; } } -.time-info-block ul { - margin:0; - padding:6px 0 0; -} -.time-info-block li { - list-style-type:none; - font-size:14px; - color:#bdbdbd; - margin:0 0 6px; -} -.time-info-block li.time { - font-size:26px; - color:#fff; - width:auto; - text-align:left; -} -.time-info-block li.time-zone { - font-size:17px; - margin-bottom:0; -} + .listen-control-block a, .listen-control-button { font-size:11px; text-transform:uppercase; diff --git a/airtime_mvc/public/js/airtime/dashboard/dashboard.js b/airtime_mvc/public/js/airtime/dashboard/dashboard.js index 09b1c1916..5ceadf6a2 100644 --- a/airtime_mvc/public/js/airtime/dashboard/dashboard.js +++ b/airtime_mvc/public/js/airtime/dashboard/dashboard.js @@ -242,9 +242,6 @@ function calculateTimeToNextShow() { } function parseItems(obj){ - $('#time-zone').text(obj.timezone); - - previousSong = obj.previous; currentSong = obj.current; nextSong = obj.next; From aa6ac77491d8a1928cce34f78adb7970b1bc1359 Mon Sep 17 00:00:00 2001 From: ryan Date: Tue, 22 Jan 2019 17:45:31 -0600 Subject: [PATCH 161/210] remove red logout button from left sidebar --- airtime_mvc/application/layouts/scripts/layout.phtml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/airtime_mvc/application/layouts/scripts/layout.phtml b/airtime_mvc/application/layouts/scripts/layout.phtml index a67970653..cc89c21e4 100644 --- a/airtime_mvc/application/layouts/scripts/layout.phtml +++ b/airtime_mvc/application/layouts/scripts/layout.phtml @@ -92,14 +92,6 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= - -