From 702ee97c7bea986b709eccce37078eb750a2389e Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 30 Oct 2015 14:38:34 -0400 Subject: [PATCH 1/6] Refactored Facebook Widget stuff --- airtime_mvc/application/configs/conf.php | 6 ++ .../application/configs/navigation.php | 6 ++ .../EmbeddablewidgetsController.php | 81 ++++++++++++++++- .../application/layouts/scripts/layout.phtml | 3 + .../scripts/embeddablewidgets/facebook.phtml | 25 ++++++ .../public/js/airtime/common/facebook.js | 89 +++++++++++++++++++ 6 files changed, 207 insertions(+), 3 deletions(-) create mode 100644 airtime_mvc/application/views/scripts/embeddablewidgets/facebook.phtml create mode 100644 airtime_mvc/public/js/airtime/common/facebook.js diff --git a/airtime_mvc/application/configs/conf.php b/airtime_mvc/application/configs/conf.php index 00af3e337..503880256 100644 --- a/airtime_mvc/application/configs/conf.php +++ b/airtime_mvc/application/configs/conf.php @@ -96,6 +96,12 @@ class Config { $CC_CONFIG['soundcloud-client-id'] = $globalAirtimeConfigValues['soundcloud']['soundcloud_client_id']; $CC_CONFIG['soundcloud-client-secret'] = $globalAirtimeConfigValues['soundcloud']['soundcloud_client_secret']; $CC_CONFIG['soundcloud-redirect-uri'] = $globalAirtimeConfigValues['soundcloud']['soundcloud_redirect_uri']; + if (isset($globalAirtimeConfigValues['facebook']['facebook_app_id'])) { + $CC_CONFIG['facebook-app-id'] = $globalAirtimeConfigValues['facebook']['facebook_app_id']; + $CC_CONFIG['facebook-app-url'] = $globalAirtimeConfigValues['facebook']['facebook_app_url']; + $CC_CONFIG['facebook-app-api-key'] = $globalAirtimeConfigValues['facebook']['facebook_app_api_key']; + } + if(isset($values['demo']['demo'])){ $CC_CONFIG['demo'] = $values['demo']['demo']; diff --git a/airtime_mvc/application/configs/navigation.php b/airtime_mvc/application/configs/navigation.php index e61ad2986..aba3630e3 100644 --- a/airtime_mvc/application/configs/navigation.php +++ b/airtime_mvc/application/configs/navigation.php @@ -41,6 +41,12 @@ $pages = array( 'module' => 'default', 'controller' => 'embeddablewidgets', 'action' => 'schedule', + ), + array( + 'label' => _('Facebook'), + 'module' => 'default', + 'controller' => 'embeddablewidgets', + 'action' => 'facebook', ) ) ), diff --git a/airtime_mvc/application/controllers/EmbeddablewidgetsController.php b/airtime_mvc/application/controllers/EmbeddablewidgetsController.php index 210edb969..98158fa7f 100644 --- a/airtime_mvc/application/controllers/EmbeddablewidgetsController.php +++ b/airtime_mvc/application/controllers/EmbeddablewidgetsController.php @@ -26,8 +26,8 @@ class EmbeddableWidgetsController extends Zend_Controller_Action $this->view->player_form = $form; } else { $this->view->player_error_msg = _("To configure and use the embeddable player you must:

- 1. Enable at least one MP3, AAC, or OGG stream under System -> Streams
- 2. Enable the Public Airtime API under System -> Preferences"); + 1. Enable at least one MP3, AAC, or OGG stream under Settings -> Streams
+ 2. Enable the Public Airtime API under Settings -> Preferences"); } } @@ -39,8 +39,83 @@ class EmbeddableWidgetsController extends Zend_Controller_Action if (!$apiEnabled) { $this->view->weekly_schedule_error_msg = _("To use the embeddable weekly schedule widget you must:

- Enable the Public Airtime API under System -> Preferences"); + Enable the Public Airtime API under Settings -> Preferences"); } } + + public function facebookAction() + { + Zend_Layout::getMvcInstance()->assign('parent_page', 'Widgets'); + + $apiEnabled = Application_Model_Preference::GetAllow3rdPartyApi(); + + if (!$apiEnabled) { + $this->view->facebook_error_msg = _("To add the Radio Tab to your Facebook Page, you must first:

+ Enable the Public Airtime API under Settings -> Preferences"); + } + + $CC_CONFIG = Config::getConfig(); + $baseUrl = Application_Common_OsPath::getBaseDir(); + + $facebookAppId = $CC_CONFIG['facebook-app-id']; + $this->view->headScript()->appendScript("var FACEBOOK_APP_ID = " . json_encode($facebookAppId) . ";"); + $this->view->headScript()->appendFile($baseUrl . 'js/airtime/common/facebook.js?' . $CC_CONFIG['airtime_version'], 'text/javascript'); + } + + /** Airtime makes an AJAX POST here after it successfully adds a tab to your Facebook page. */ + public function facebookTabSuccessAction() + { + // disable the view and the layout + $this->view->layout()->disableLayout(); + $this->_helper->viewRenderer->setNoRender(true); + + //TODO: Get list of page IDs (deserialize) + + $request = $this->getRequest(); + if (!$request->isPost()) { + return; + } + + $values = $request->getPost(); + $facebookPageIds = json_decode($values["pages"]); + + $CC_CONFIG = Config::getConfig(); + $facebookMicroserviceUrl = $CC_CONFIG['facebook-app-url']; + $facebookMicroserviceApiKey = $CC_CONFIG['facebook-app-api-key']; + + //Post the page tab ID and station subdomain to the social microservice so that mapping can be saved + //in a database. + foreach ($facebookPageIds as $facebookPageId) + { + $postfields = array(); + $postfields["facebookPageId"] = $facebookPageId; + $postfields["stationId"] = $CC_CONFIG['stationId']; + + $query_string = ""; + foreach ($postfields as $k => $v) $query_string .= "$k=".urlencode($v)."&"; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $facebookMicroserviceUrl); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_TIMEOUT, 30); + curl_setopt($ch, CURLOPT_FAILONERROR, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $query_string); + curl_setopt($ch, CURLOPT_USERPWD, ":$facebookMicroserviceApiKey"); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + + $jsondata = curl_exec($ch); + if (curl_error($ch)) { + throw new Exception("Failed to reach server in " . __FUNCTION__ . ": " + . curl_errno($ch) . ' - ' . curl_error($ch) . ' - ' . curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)); + } + curl_close($ch); + + } + + //$arr = json_decode($jsondata, true); # Decode JSON String + + } } diff --git a/airtime_mvc/application/layouts/scripts/layout.phtml b/airtime_mvc/application/layouts/scripts/layout.phtml index ec2c64088..32df4aad7 100644 --- a/airtime_mvc/application/layouts/scripts/layout.phtml +++ b/airtime_mvc/application/layouts/scripts/layout.phtml @@ -219,6 +219,9 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= } ?> +
+ + diff --git a/airtime_mvc/application/views/scripts/embeddablewidgets/facebook.phtml b/airtime_mvc/application/views/scripts/embeddablewidgets/facebook.phtml new file mode 100644 index 000000000..a397e9243 --- /dev/null +++ b/airtime_mvc/application/views/scripts/embeddablewidgets/facebook.phtml @@ -0,0 +1,25 @@ +
+ + + +

+
+ +
+ facebook_error_msg; ?> +
+

Add your station to your Facebook Page.

+ +
+ + +
+

Preview:

+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/airtime_mvc/public/js/airtime/common/facebook.js b/airtime_mvc/public/js/airtime/common/facebook.js new file mode 100644 index 000000000..ecd803ca8 --- /dev/null +++ b/airtime_mvc/public/js/airtime/common/facebook.js @@ -0,0 +1,89 @@ + +$(document).ready(function() { + $("#facebook-login").click(function() { + AIRTIME.facebook.promptForFacebookPage(); + }); +}); + + +window.fbAsyncInit = function() { + FB.init({ + appId : FACEBOOK_APP_ID, + xfbml : true, + version : 'v2.4' + }); +}; + +var AIRTIME = (function(AIRTIME) { + + //Module initialization + if (AIRTIME.facebook === undefined) { + AIRTIME.facebook = {}; + } + + var mod = AIRTIME.facebook; + + (function (d, s, id) { + var js, fjs = d.getElementsByTagName(s)[0]; + if (d.getElementById(id)) { + return; + } + js = d.createElement(s); + js.id = id; + js.src = "//connect.facebook.net/en_US/sdk.js"; + fjs.parentNode.insertBefore(js, fjs); + }(document, 'script', 'facebook-jssdk')); + + mod.promptForFacebookPage = function() { + FB.login(function (response) { + if (response.authResponse) { + mod.getPagesOwnedByUser(response.authResponse.userID, response.authResponse.accessToken); + mod.addPageTab(); + + } else { + console.log('Authorization failed.'); + } + }, {scope: 'manage_pages'}); + } + + mod.getPagesOwnedByUser = function(userId, accessToken) { + FB.api('/' + userId + '/accounts', function (response) { + console.log(response); + }, {access_token: accessToken}); + } + + mod.addPageTab = function() { + FB.ui( + { method: 'pagetab' }, + function (resp) { + console.log("response:"); + console.log(resp); + var pageIdList = []; + var tabs = resp["tabs_added"]; + + if ((tabs != undefined) && (Object.keys(tabs).length > 0)) { + for (var pageId in tabs) { + pageIdList.push(pageId); + } + + //POST these back to Airtime, which will then proxy it over to our social app. (multiple requests from Airtime) + $.post('facebook-tab-success', { "pages" : JSON.stringify(pageIdList) }, function() { + alert("Successfully added to your Facebook page!"); + }).done(function() { + + }).fail(function() { + alert("Sorry, an error occurred and we were unable to add the widget to your Facebook page."); + }); + } + }, + { + app_id: FACEBOOK_APP_ID, + //redirect_uri: 'https://localhost' + } + ); + } + + return AIRTIME; + +}(AIRTIME || {})); + From 7545c91ca47a5fff6333c8f8439a91c8b3c26ea6 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Thu, 19 Nov 2015 15:55:12 -0500 Subject: [PATCH 2/6] SAAS-1181: Finalize the Facebook widget --- .../scripts/embeddablewidgets/facebook.phtml | 20 ++++++++++++++---- .../public/images/doc/facebook_widget1.png | Bin 0 -> 35576 bytes .../public/images/doc/facebook_widget2.png | Bin 0 -> 16601 bytes 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 airtime_mvc/public/images/doc/facebook_widget1.png create mode 100644 airtime_mvc/public/images/doc/facebook_widget2.png diff --git a/airtime_mvc/application/views/scripts/embeddablewidgets/facebook.phtml b/airtime_mvc/application/views/scripts/embeddablewidgets/facebook.phtml index a397e9243..172c7b73a 100644 --- a/airtime_mvc/application/views/scripts/embeddablewidgets/facebook.phtml +++ b/airtime_mvc/application/views/scripts/embeddablewidgets/facebook.phtml @@ -5,21 +5,33 @@

+

+
facebook_error_msg; ?>
-

Add your station to your Facebook Page.

- -
-

Preview:

+

Preview:

+
+ +
+

Tips:

+

+ To make the tab more visible on your Facebook page, click "More", and "Manage Tabs":
+ ">

+ + Then, drag the Radio Player item higher in the list, and click Save. It will now appear as one of the default tabs instead of being buried under "More":
+ "> + +

+
\ No newline at end of file diff --git a/airtime_mvc/public/images/doc/facebook_widget1.png b/airtime_mvc/public/images/doc/facebook_widget1.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4a8cbb882b7106fbdc20ffd04999139576219b GIT binary patch literal 35576 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%0A=># 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 Date: Fri, 20 Nov 2015 13:41:23 -0500 Subject: [PATCH 3/6] Add basic 403 handling to table.js --- .../public/js/airtime/library/library.js | 25 ++++++++++--------- .../public/js/airtime/widgets/table.js | 12 +++------ 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 3bf80d800..1b9f82a2c 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -542,6 +542,18 @@ var AIRTIME = (function(AIRTIME) { } }; + mod.handleAjaxError = function (r) { + // If the request was denied due to permissioning + if (r.status === 403) { + // Hide the processing div + var wrapper = $("#library_display_wrapper"); + wrapper.find(".dt-process-rel").hide(); + wrapper.find('.empty_placeholder_text').text($.i18n._("You don't have permission to view the library.")); + wrapper.find('.empty_placeholder').show(); + } + }; + + libraryInit = function() { $libContent = $("#library_content"); @@ -706,7 +718,7 @@ var AIRTIME = (function(AIRTIME) { "url": sSource, "data": aoData, "success": fnCallback, - "error": handleAjaxError + "error": mod.handleAjaxError }).done(function (data) { var filterMessage = $libContent.find('.filter-message'); if (data.iTotalRecords > data.iTotalDisplayRecords) { @@ -904,17 +916,6 @@ var AIRTIME = (function(AIRTIME) { } - function handleAjaxError(r) { - // If the request was denied due to permissioning - if (r.status === 403) { - // Hide the processing div - $("#library_display_wrapper").find(".dt-process-rel").hide(); - $('.empty_placeholder_text').text($.i18n._("You don't have permission to view the library.")); - - $('.empty_placeholder').show(); - } - } - var selected = $("a[href$='"+location.hash+"']"), table; if (selected.parent().data("selection-id") == AIRTIME.library.MediaTypeIntegerEnum.PODCAST) { table = mod.DataTableTypeEnum.PODCAST; diff --git a/airtime_mvc/public/js/airtime/widgets/table.js b/airtime_mvc/public/js/airtime/widgets/table.js index aaf3b75b9..dc23f8df8 100644 --- a/airtime_mvc/public/js/airtime/widgets/table.js +++ b/airtime_mvc/public/js/airtime/widgets/table.js @@ -399,15 +399,9 @@ var AIRTIME = (function(AIRTIME) { Table.prototype._handleAjaxError = function(r) { // If the request was denied due to permissioning if (r.status === 403) { - // Hide the processing div - /* - $("#library_display_wrapper").find(".dt-process-rel").hide(); - $.getJSON( "ajax/library_placeholders.json", function( data ) { - $('.empty_placeholder_text').text($.i18n._(data.unauthorized)); - }) ; - - $('.empty_placeholder').show(); - */ + $(".dt-process-rel").hide(); + $('.empty_placeholder_text').text($.i18n._("You don't have permission to view this resource.")); + $('.empty_placeholder').show(); } }; From e91eece092baf0765431ba902075b21db0baf8b2 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 20 Nov 2015 16:27:23 -0500 Subject: [PATCH 4/6] Added podcast episode downloads to plans grid --- .../application/views/scripts/billing/upgrade.phtml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/views/scripts/billing/upgrade.phtml b/airtime_mvc/application/views/scripts/billing/upgrade.phtml index 83077cb9e..5e3c61605 100644 --- a/airtime_mvc/application/views/scripts/billing/upgrade.phtml +++ b/airtime_mvc/application/views/scripts/billing/upgrade.phtml @@ -222,7 +222,18 @@ $(document).ready(function() { 150GB Storage - + + + No Built-in Podcast + + 2,000 Podcast Episode Downloads + + 5,000 Podcast Episode Downloads + + + 10,000 Podcast Episode Downloads + + Ticket, Email, Forum Support From aabd1f31862adfc160dcd8bb65d7214523e8fd37 Mon Sep 17 00:00:00 2001 From: Albert Santoni Date: Fri, 20 Nov 2015 17:07:58 -0500 Subject: [PATCH 5/6] Updated stream qualities in pricing grid --- .../application/views/scripts/billing/upgrade.phtml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/views/scripts/billing/upgrade.phtml b/airtime_mvc/application/views/scripts/billing/upgrade.phtml index 5e3c61605..b3b6b09f0 100644 --- a/airtime_mvc/application/views/scripts/billing/upgrade.phtml +++ b/airtime_mvc/application/views/scripts/billing/upgrade.phtml @@ -193,13 +193,13 @@ $(document).ready(function() { - 64kbps Stream Quality + Up to 64kbps Stream Quality - 64kbps and 128kbps Stream Quality + Up to 128kbps Stream Quality - 64kbps and 196kbps Stream Quality + Up to 196kbps Stream Quality - 64kbps, 128kbps, and 196kbps Stream Quality + Up to 196kbps Stream Quality From 553299e9f543fa7e01a7960b872ecc7e882e801e Mon Sep 17 00:00:00 2001 From: Duncan Sommerville Date: Mon, 23 Nov 2015 14:55:37 -0500 Subject: [PATCH 6/6] Try to fix some schedule bugs --- airtime_mvc/application/models/Preference.php | 3 +++ airtime_mvc/application/models/Scheduler.php | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 82731f524..5757171b0 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -1572,6 +1572,9 @@ class Application_Model_Preference self::setValue("station_podcast_download_counter", empty($c) ? 0 : --$c); } + /** + * @return int either 0 (public) or 1 (private) + */ public static function getStationPodcastPrivacy() { if (!Billing::isStationPodcastAllowed()) { // return private setting diff --git a/airtime_mvc/application/models/Scheduler.php b/airtime_mvc/application/models/Scheduler.php index de3b73ca1..f3f0c508c 100644 --- a/airtime_mvc/application/models/Scheduler.php +++ b/airtime_mvc/application/models/Scheduler.php @@ -482,10 +482,15 @@ class Application_Model_Scheduler ->orderByDbStarts() ->find($this->con); + $now = new DateTime("now", new DateTimeZone("UTC")); $itemStartDT = $instance->getDbStarts(null); foreach ($schedule as $item) { $itemEndDT = $this->findEndTime($itemStartDT, $item->getDbClipLength()); - Logging::info($itemEndDT); + // If the track has already ended, don't change it. + if ($itemEndDT < $now) { + $itemStartDT = $itemEndDT; + continue; + } $item->setDbStarts($itemStartDT) ->setDbEnds($itemEndDT) ->save($this->con); @@ -515,10 +520,15 @@ class Application_Model_Scheduler ->orderByDbStarts() ->find($this->con); + $now = new DateTime("now", new DateTimeZone("UTC")); $itemStartDT = $instance->getDbStarts(null); foreach ($schedule as $item) { - $itemEndDT = $this->findEndTime($itemStartDT, $item->getDbClipLength()); + // If the track has already ended, don't change it. + if ($itemEndDT < $now) { + $itemStartDT = $itemEndDT; + continue; + } $item->setDbStarts($itemStartDT) ->setDbEnds($itemEndDT); @@ -1191,7 +1201,7 @@ class Application_Model_Scheduler foreach ($removedItems as $removedItem) { $instance = $removedItem->getCcShowInstances($this->con); - $effectedInstanceIds[] = $instance->getDbId(); + $effectedInstanceIds[$instance->getDbId()] = $instance->getDbId(); //check if instance is linked and if so get the schedule items //for all linked instances so we can delete them too