public function handleRequest($playlistId, $mediaItemId) { $playlist = Playlist::with("show", "mediaItems")->accessible()->accessibleToPublic()->find(intval($playlistId)); $mediaItem = null; if (!is_null($playlist)) { $mediaItem = $playlist->mediaItems()->accessible()->find($mediaItemId); } if (is_null($mediaItem)) { $this->do404Response($this->getDisableRedirect()); return; } $this->prepareResponse($playlist, $mediaItem); }
protected static function boot() { parent::boot(); self::saving(function ($model) { if ($model->enabled && is_null($model->scheduled_publish_time)) { throw new Exception("A Playlist which is enabled must have a scheduled publish time."); } else { if ($model->show_id === NULL) { if ($model->name === NULL) { throw new Exception("A name must be specified."); } else { if ($model->series_no !== NULL) { throw new Exception("A standard playlist cannot have a series number."); } } } else { if ($model->series_no === NULL) { throw new Exception("Series number required."); } } } // transaction ended in "saved" event // needed to make sure if search index version number is incremented it // takes effect at the same time that the rest of the media item is updated DB::beginTransaction(); // assume that something has changed and force ths item to be reindexed $a = Playlist::with("mediaItems")->find(intval($model->id)); // $a may be null if this item is currently being created // when the item is being created pending_search_index_version defaults to 1 // meaning the item will be indexed if (!is_null($a)) { // make sure get latest version number. The version in $model might have changed before the transaction started $currentPendingIndexVersion = intval($a->pending_search_index_version); $model->pending_search_index_version = $currentPendingIndexVersion + 1; // also force reindex of all items that are currently in the playlist foreach ($a->mediaItems as $mediaItem) { $mediaItem->touch(); } } return true; }); self::saved(function ($model) { DB::commit(); }); }
public function anyEdit($id = null) { Auth::getUser()->hasPermissionOr401(Config::get("permissions.playlists"), 1); $playlist = null; $editing = false; if (!is_null($id)) { $playlist = Playlist::with("coverFile", "sideBannerFile", "coverArtFile", "mediaItems", "customUri")->find($id); if (is_null($playlist)) { App::abort(404); return; } $editing = true; } $formSubmitted = isset($_POST['form-submitted']) && $_POST['form-submitted'] === "1"; // has id 1 // populate $formData with default values or received values $formData = FormHelpers::getFormData(array(array("enabled", ObjectHelpers::getProp(false, $playlist, "enabled") ? "y" : ""), array("show-id", ObjectHelpers::getProp("", $playlist, "show", "id")), array("series-no", ObjectHelpers::getProp("", $playlist, "series_no")), array("name", ObjectHelpers::getProp("", $playlist, "name")), array("description", ObjectHelpers::getProp("", $playlist, "description")), array("custom-uri", ObjectHelpers::getProp("", $playlist, "custom_uri_name")), array("cover-image-id", ObjectHelpers::getProp("", $playlist, "coverFile", "id")), array("side-banners-image-id", ObjectHelpers::getProp("", $playlist, "sideBannerFile", "id")), array("side-banners-fill-image-id", ObjectHelpers::getProp("", $playlist, "sideBannerFillFile", "id")), array("cover-art-id", ObjectHelpers::getProp("", $playlist, "coverArtFile", "id")), array("publish-time", ObjectHelpers::getProp("", $playlist, "scheduled_publish_time_for_input")), array("playlist-content", json_encode(array())), array("related-items", json_encode(array()))), !$formSubmitted); // this will contain any additional data which does not get saved anywhere $show = Show::find(intval($formData['show-id'])); $additionalFormData = array("coverImageFile" => FormHelpers::getFileInfo($formData['cover-image-id']), "sideBannersImageFile" => FormHelpers::getFileInfo($formData['side-banners-image-id']), "sideBannersFillImageFile" => FormHelpers::getFileInfo($formData['side-banners-fill-image-id']), "coverArtFile" => FormHelpers::getFileInfo($formData['cover-art-id']), "showItemText" => !is_null($show) ? $show->name : "", "playlistContentInput" => null, "playlistContentInitialData" => null, "relatedItemsInput" => null, "relatedItemsInitialData" => null); if (!$formSubmitted) { $additionalFormData['playlistContentInput'] = ObjectHelpers::getProp(json_encode(array()), $playlist, "playlist_content_for_input"); $additionalFormData['playlistContentInitialData'] = ObjectHelpers::getProp(json_encode(array()), $playlist, "playlist_content_for_reorderable_list"); $additionalFormData['relatedItemsInput'] = ObjectHelpers::getProp(json_encode(array()), $playlist, "related_items_for_input"); $additionalFormData['relatedItemsInitialData'] = ObjectHelpers::getProp(json_encode(array()), $playlist, "related_items_for_reorderable_list"); } else { $additionalFormData['playlistContentInput'] = MediaItem::generateInputValueForAjaxSelectReorderableList(JsonHelpers::jsonDecodeOrNull($formData["playlist-content"], true)); $additionalFormData['playlistContentInitialData'] = MediaItem::generateInitialDataForAjaxSelectReorderableList(JsonHelpers::jsonDecodeOrNull($formData["playlist-content"], true)); $additionalFormData['relatedItemsInput'] = MediaItem::generateInputValueForAjaxSelectReorderableList(JsonHelpers::jsonDecodeOrNull($formData["related-items"], true)); $additionalFormData['relatedItemsInitialData'] = MediaItem::generateInitialDataForAjaxSelectReorderableList(JsonHelpers::jsonDecodeOrNull($formData["related-items"], true)); } $errors = null; if ($formSubmitted) { // validate input Validator::extend('valid_file_id', FormHelpers::getValidFileValidatorFunction()); Validator::extend('my_date', FormHelpers::getValidDateValidatorFunction()); Validator::extend('valid_show_id', function ($attribute, $value, $parameters) { return !is_null(Show::find(intval($value))); }); Validator::extend('valid_playlist_content', function ($attribute, $value, $parameters) { return MediaItem::isValidIdsFromAjaxSelectReorderableList(JsonHelpers::jsonDecodeOrNull($value, true)); }); Validator::extend('valid_related_items', function ($attribute, $value, $parameters) { return MediaItem::isValidIdsFromAjaxSelectReorderableList(JsonHelpers::jsonDecodeOrNull($value, true)); }); Validator::extend('unique_custom_uri', function ($attribute, $value, $parameters) use(&$playlist) { $q = CustomUri::where("name", $value); if (!is_null($playlist)) { $currentCustomUri = $playlist->custom_uri_name; if (!is_null($currentCustomUri)) { $q = $q->where("name", "!=", $currentCustomUri); } } return $q->count() === 0; }); $modelCreated = DB::transaction(function () use(&$formData, &$playlist, &$errors) { $validator = Validator::make($formData, array('show-id' => array('valid_show_id'), 'series-no' => array('required_with:show-id', 'integer'), 'name' => array('required_without:show-id', 'max:50'), 'description' => array('max:500'), 'custom-uri' => array('alpha_dash', 'max:50', 'unique_custom_uri'), 'cover-image-id' => array('valid_file_id'), 'side-banners-image-id' => array('valid_file_id'), 'side-banners-fill-image-id' => array('valid_file_id'), 'description' => array('max:500'), 'cover-art-id' => array('valid_file_id'), 'publish-time' => array('my_date'), 'playlist-content' => array('required', 'valid_playlist_content'), 'related-items' => array('required', 'valid_related_items')), array('show-id.valid_show_id' => FormHelpers::getGenericInvalidMsg(), 'series-no.required_with' => FormHelpers::getRequiredMsg(), 'series-no.integer' => FormHelpers::getMustBeIntegerMsg(), 'name.required_without' => FormHelpers::getRequiredMsg(), 'name.max' => FormHelpers::getLessThanCharactersMsg(50), 'description.max' => FormHelpers::getLessThanCharactersMsg(500), 'custom-uri.alpha_dash' => FormHelpers::getInvalidAlphaDashMsg(), 'custom-uri.max' => FormHelpers::getLessThanCharactersMsg(50), 'custom-uri.unique_custom_uri' => "This is already in use.", 'cover-image-id.valid_file_id' => FormHelpers::getInvalidFileMsg(), 'side-banners-image-id.valid_file_id' => FormHelpers::getInvalidFileMsg(), 'side-banners-fill-image-id.valid_file_id' => FormHelpers::getInvalidFileMsg(), 'cover-art-id.valid_file_id' => FormHelpers::getInvalidFileMsg(), 'publish-time.my_date' => FormHelpers::getInvalidTimeMsg(), 'playlist-content.required' => FormHelpers::getGenericInvalidMsg(), 'playlist-content.valid_playlist_content' => FormHelpers::getGenericInvalidMsg(), 'related-items.required' => FormHelpers::getGenericInvalidMsg(), 'related-items.valid_related_items' => FormHelpers::getGenericInvalidMsg())); if (!$validator->fails()) { $show = $formData['show-id'] !== "" ? Show::find(intval($formData['show-id'])) : null; Validator::extend('unique_series_no', function ($attribute, $value, $parameters) use(&$playlist, &$show) { if (is_null($show)) { return true; } $count = $show->playlists()->where("series_no", $value); if (!is_null($playlist)) { $count = $count->where("id", "!=", $playlist->id); } $count = $count->count(); return $count === 0; }); $validator = Validator::make($formData, array('series-no' => array('unique_series_no')), array('series-no.unique_series_no' => "A series already exists with that number.")); if (!$validator->fails()) { // everything is good. save/create model if (is_null($playlist)) { $playlist = new Playlist(); } $playlist->name = FormHelpers::nullIfEmpty($formData['name']); $playlist->description = FormHelpers::nullIfEmpty($formData['description']); $playlist->enabled = FormHelpers::toBoolean($formData['enabled']); // if the scheduled publish time is empty and this playlist is enabled, set it to the current time. // an enabled playlist should always have a published time. $scheduledPublishTime = FormHelpers::nullIfEmpty(strtotime($formData['publish-time'])); $playlist->scheduled_publish_time = !is_null($scheduledPublishTime) ? $scheduledPublishTime : Carbon::now(); EloquentHelpers::associateOrNull($playlist->show(), $show); $playlist->series_no = !is_null($show) ? intval($formData['series-no']) : null; $coverImageId = FormHelpers::nullIfEmpty($formData['cover-image-id']); $file = Upload::register(Config::get("uploadPoints.coverImage"), $coverImageId, $playlist->coverFile); EloquentHelpers::associateOrNull($playlist->coverFile(), $file); $sideBannerFileId = FormHelpers::nullIfEmpty($formData['side-banners-image-id']); $file = Upload::register(Config::get("uploadPoints.sideBannersImage"), $sideBannerFileId, $playlist->sideBannerFile); EloquentHelpers::associateOrNull($playlist->sideBannerFile(), $file); $sideBannerFillFileId = FormHelpers::nullIfEmpty($formData['side-banners-fill-image-id']); $file = Upload::register(Config::get("uploadPoints.sideBannersFillImage"), $sideBannerFillFileId, $playlist->sideBannerFillFile); EloquentHelpers::associateOrNull($playlist->sideBannerFillFile(), $file); $coverArtFileId = FormHelpers::nullIfEmpty($formData['cover-art-id']); $file = Upload::register(Config::get("uploadPoints.coverArt"), $coverArtFileId, $playlist->coverArtFile); EloquentHelpers::associateOrNull($playlist->coverArtFile(), $file); if ($playlist->save() === false) { throw new Exception("Error saving Playlist."); } $customUri = FormHelpers::nullIfEmpty($formData['custom-uri']); $currentCustomUriModel = $playlist->customUri; if (!is_null($customUri)) { if ($playlist->custom_uri_name !== $customUri) { // change needed if (!is_null($currentCustomUriModel)) { // remove the current one first $currentCustomUriModel->delete(); } $customUriModel = new CustomUri(array("name" => $customUri)); $playlist->customUri()->save($customUriModel); } } else { if (!is_null($currentCustomUriModel)) { // remove the current one $currentCustomUriModel->delete(); } } // touch so that their search index numbers will be incremented // each media item in the search index has the playlists it's in stored with it // so will therefore need reindexing foreach ($playlist->mediaItems as $a) { $a->touch(); } $playlist->mediaItems()->detach(); // detaches all $ids = json_decode($formData['playlist-content'], true); if (count($ids) > 0) { $mediaItems = MediaItem::whereIn("id", $ids)->get(); foreach ($mediaItems as $a) { $a->touch(); // for same reason as touch above $playlist->mediaItems()->attach($a, array("position" => array_search(intval($a->id), $ids, true))); } } $playlist->relatedItems()->detach(); // detaches all $ids = json_decode($formData['related-items'], true); if (count($ids) > 0) { $mediaItems = MediaItem::whereIn("id", $ids)->get(); foreach ($mediaItems as $a) { $playlist->relatedItems()->attach($a, array("position" => array_search(intval($a->id), $ids, true))); } } // the transaction callback result is returned out of the transaction function return true; } else { $errors = $validator->messages(); return false; } } else { $errors = $validator->messages(); return false; } }); if ($modelCreated) { return Redirect::to(Config::get("custom.admin_base_url") . "/playlists"); } // if not valid then return form again with errors } $view = View::make('home.admin.playlists.edit'); $view->editing = $editing; $view->form = $formData; $view->additionalForm = $additionalFormData; $view->formErrors = $errors; // used to uniquely identify these file upload points on the site. Must not be duplicated for different upload points. $view->coverImageUploadPointId = Config::get("uploadPoints.coverImage"); $view->sideBannersImageUploadPointId = Config::get("uploadPoints.sideBannersImage"); $view->sideBannersFillImageUploadPointId = Config::get("uploadPoints.sideBannersFillImage"); $view->coverArtUploadPointId = Config::get("uploadPoints.coverArt"); $view->cancelUri = Config::get("custom.admin_base_url") . "/playlists"; $view->seriesAjaxSelectDataUri = Config::get("custom.admin_base_url") . "/shows/ajaxselect"; $this->setContent($view, "playlists", "playlists-edit"); }
private function updatePlaylistsIndex() { $entries = ["toAdd" => [], "toRemove" => []]; $changedPlaylists = DB::transaction(function () { return Playlist::with("show")->needsReindexing()->get(); }); foreach ($changedPlaylists as $playlist) { if ($playlist->getIsAccessibleToPublic()) { $entries["toAdd"][] = ["model" => $playlist, "data" => $this->getPlaylistData($playlist, $this->coverArtWidth, $this->coverArtHeight)]; } else { // this item is no longer accessible so remove it from the index $entries["toRemove"][] = ["model" => $playlist]; } } $this->syncIndexType("playlist", new Playlist(), $entries); }
public function getIndex($id = null) { if (is_null($id)) { App::abort(404); } $playlist = Playlist::with("show", "mediaItems", "relatedItems", "relatedItems.playlists")->accessibleToPublic()->find(intval($id)); if (is_null($playlist)) { App::abort(404); } $coverArtResolutions = Config::get("imageResolutions.coverArt"); // retrieving inaccessible items as well and then skipping them in the loop. This is so that we get the correct episode number. $playlistMediaItems = $playlist->mediaItems()->orderBy("media_item_to_playlist.position")->get(); $playlistTableData = array(); $activeItemIndex = null; foreach ($playlistMediaItems as $i => $item) { if (!$item->getIsAccessible()) { // this shouldn't be accessible continue; } $thumbnailUri = Config::get("custom.default_cover_uri"); if (!Config::get("degradedService.enabled")) { $thumbnailUri = $playlist->getMediaItemCoverArtUri($item, $coverArtResolutions['thumbnail']['w'], $coverArtResolutions['thumbnail']['h']); } $playlistName = null; if (is_null($playlist->show)) { // this is a playlist not a series. // show the series/playlist that each video in the playlist is from $defaultPlaylist = $item->getDefaultPlaylist(); if (!is_null($defaultPlaylist->show)) { // the current item in the playlist is part of a show. $playlistName = $defaultPlaylist->generateName(); } } $playlistTableData[] = array("uri" => $playlist->getMediaItemUri($item), "title" => $playlist->generateEpisodeTitle($item), "escapedDescription" => !is_null($item->description) ? e($item->description) : null, "playlistName" => $playlistName, "episodeNo" => is_null($playlist->show) ? $i + 1 : null, "thumbnailUri" => $thumbnailUri, "thumbnailFooter" => PlaylistTableHelpers::getFooterObj($item), "duration" => PlaylistTableHelpers::getDuration($item), "active" => false); } $relatedItems = $playlist->relatedItems()->accessible()->orderBy("related_item_to_playlist.position")->get(); $relatedItemsTableData = array(); foreach ($relatedItems as $i => $item) { // a mediaitem can be part of several playlists. Always use the first one that has a show if there is one, or just the first one otherwise $relatedItemPlaylist = $item->getDefaultPlaylist(); $thumbnailUri = Config::get("custom.default_cover_uri"); if (!Config::get("degradedService.enabled")) { $thumbnailUri = $relatedItemPlaylist->getMediaItemCoverArtUri($item, $coverArtResolutions['thumbnail']['w'], $coverArtResolutions['thumbnail']['h']); } $relatedItemsTableData[] = array("uri" => $relatedItemPlaylist->getMediaItemUri($item), "active" => false, "title" => $item->name, "escapedDescription" => null, "playlistName" => $relatedItemPlaylist->generateName(), "episodeNo" => $i + 1, "thumbnailUri" => $thumbnailUri, "thumbnailFooter" => PlaylistTableHelpers::getFooterObj($item), "duration" => null); } $coverUri = null; $sideBannerUri = null; $sideBannerFillUri = null; if (!Config::get("degradedService.enabled")) { $coverImageResolutions = Config::get("imageResolutions.coverImage"); $coverUri = $playlist->getCoverUri($coverImageResolutions['full']['w'], $coverImageResolutions['full']['h']); $sideBannerImageResolutions = Config::get("imageResolutions.sideBannerImage"); $sideBannerUri = $playlist->getSideBannerUri($sideBannerImageResolutions['full']['w'], $sideBannerImageResolutions['full']['h']); $sideBannerFillImageResolutions = Config::get("imageResolutions.sideBannerFillImage"); $sideBannerFillUri = $playlist->getSideBannerFillUri($sideBannerFillImageResolutions['full']['w'], $sideBannerFillImageResolutions['full']['h']); } $playlistName = $playlist->generateName(); $openGraphCoverArtUri = $playlist->getCoverArtUri($coverArtResolutions['fbOpenGraph']['w'], $coverArtResolutions['fbOpenGraph']['h']); $twitterCardCoverArtUri = $playlist->getCoverArtUri($coverArtResolutions['twitterCard']['w'], $coverArtResolutions['twitterCard']['h']); $twitterProperties = array(); $twitterProperties[] = array("name" => "card", "content" => "summary_large_image"); $openGraphProperties = array(); if (!is_null($playlist->show)) { $openGraphProperties[] = array("name" => "og:type", "content" => "video.tv_show"); } if (!is_null($playlist->description)) { $twitterProperties[] = array("name" => "description", "content" => str_limit($playlist->description, 197, "...")); $openGraphProperties[] = array("name" => "og:description", "content" => $playlist->description); } $openGraphProperties[] = array("name" => "video:release_date", "content" => $playlist->scheduled_publish_time->toISO8601String()); $twitterProperties[] = array("name" => "title", "content" => $playlistName); $openGraphProperties[] = array("name" => "og:title", "content" => $playlistName); $openGraphProperties[] = array("name" => "og:image", "content" => $openGraphCoverArtUri); $twitterProperties[] = array("name" => "image", "content" => $twitterCardCoverArtUri); foreach ($playlistTableData as $a) { $openGraphProperties[] = array("name" => "og:see_also", "content" => $a['uri']); } foreach ($relatedItemsTableData as $a) { $openGraphProperties[] = array("name" => "og:see_also", "content" => $a['uri']); } $view = View::make("home.playlist.index"); $view->playlistTitle = $playlistName; $view->escapedPlaylistDescription = !is_null($playlist->description) ? nl2br(URLHelpers::escapeAndReplaceUrls($playlist->description)) : null; $view->coverImageUri = $coverUri; $view->playlistTableFragment = count($playlistTableData) > 0 ? View::make("fragments.home.playlist", array("stripedTable" => true, "headerRowData" => null, "tableData" => $playlistTableData)) : null; $view->relatedItemsTableFragment = count($relatedItemsTableData) > 0 ? View::make("fragments.home.playlist", array("stripedTable" => true, "headerRowData" => array("title" => "Related Items", "seriesUri" => null, "navButtons" => null), "tableData" => $relatedItemsTableData)) : null; $view->seriesUri = !is_null($playlist->show) ? $playlist->show->getUri() : null; $this->setContent($view, "playlist", "playlist", $openGraphProperties, $playlistName, 200, $twitterProperties, $sideBannerUri, $sideBannerFillUri); }
public function getIndex($playlistId = null, $mediaItemId = null) { if (is_null($playlistId) || is_null($mediaItemId)) { App::abort(404); } // true if a user is logged into the cms and has permission to view media items. $userHasMediaItemsPermission = false; // true if a user is logged into the cms and has permission to edit media items. $userHasMediaItemsEditPermission = false; // true if a user is logged into the cms and has permission to view playlists. $userHasPlaylistsPermission = false; // true if a user is logged into the cms and has permission to manage comments and post as station. $userHasCommentsPermission = false; if (Auth::isLoggedIn()) { $userHasMediaItemsPermission = Auth::getUser()->hasPermission(Config::get("permissions.mediaItems"), 0); $userHasMediaItemsEditPermission = Auth::getUser()->hasPermission(Config::get("permissions.mediaItems"), 1); $userHasPlaylistsPermission = Auth::getUser()->hasPermission(Config::get("permissions.playlists"), 0); $userHasCommentsPermission = Auth::getUser()->hasPermission(Config::get("permissions.siteComments"), 0); } $playlist = Playlist::with("show", "mediaItems", "relatedItems", "relatedItems.playlists")->accessible(); if (!$userHasPlaylistsPermission) { // current cms user (if logged in) does not have permission to view playlists, so only search playlists accessible to the public. $playlist = $playlist->accessibleToPublic(); } $playlist = $playlist->find(intval($playlistId)); if (is_null($playlist)) { App::abort(404); } $currentMediaItem = $playlist->mediaItems()->accessible()->find($mediaItemId); if (is_null($currentMediaItem)) { App::abort(404); } $coverArtResolutions = Config::get("imageResolutions.coverArt"); // retrieving inaccessible items as well and then skipping them in the loop. This is so that we get the correct episode number. $playlistMediaItems = $playlist->mediaItems()->orderBy("media_item_to_playlist.position")->get(); $playlistTableData = array(); $activeItemIndex = null; $newIndex = 0; foreach ($playlistMediaItems as $i => $item) { if (!$item->getIsAccessible()) { // this shouldn't be accessible continue; } $thumbnailUri = Config::get("custom.default_cover_uri"); if (!Config::get("degradedService.enabled")) { $thumbnailUri = $playlist->getMediaItemCoverArtUri($item, $coverArtResolutions['thumbnail']['w'], $coverArtResolutions['thumbnail']['h']); } $active = intval($item->id) === intval($currentMediaItem->id); if ($active) { $activeItemIndex = $newIndex; } $playlistName = null; if (is_null($playlist->show)) { // this is a playlist not a series. // show the series/playlist that each video in the playlist is from $defaultPlaylist = $item->getDefaultPlaylist(); if (!is_null($defaultPlaylist->show)) { // the current item in the playlist is part of a show. $playlistName = $defaultPlaylist->generateName(); } } $playlistTableData[] = array("uri" => $playlist->getMediaItemUri($item), "active" => $active, "title" => $item->name, "escapedDescription" => null, "playlistName" => $playlistName, "episodeNo" => $i + 1, "thumbnailUri" => $thumbnailUri, "thumbnailFooter" => PlaylistTableHelpers::getFooterObj($item), "duration" => PlaylistTableHelpers::getDuration($item)); $newIndex++; } $playlistPreviousItemUri = null; $playlistNextItemUri = null; if ($activeItemIndex > 0) { $playlistPreviousItemUri = $playlistTableData[$activeItemIndex - 1]['uri']; } if ($activeItemIndex < count($playlistTableData) - 1) { $playlistNextItemUri = $playlistTableData[$activeItemIndex + 1]['uri']; } $relatedItems = $playlist->generateRelatedItems($currentMediaItem); $relatedItemsTableData = array(); foreach ($relatedItems as $i => $item) { // a mediaitem can be part of several playlists. Always use the first one that has a show if there is one, or just the first one otherwise $relatedItemPlaylist = $item->getDefaultPlaylist(); $thumbnailUri = Config::get("custom.default_cover_uri"); if (!Config::get("degradedService.enabled")) { $thumbnailUri = $relatedItemPlaylist->getMediaItemCoverArtUri($item, $coverArtResolutions['thumbnail']['w'], $coverArtResolutions['thumbnail']['h']); } $relatedItemsTableData[] = array("uri" => $relatedItemPlaylist->getMediaItemUri($item), "active" => false, "title" => $item->name, "escapedDescription" => null, "playlistName" => $relatedItemPlaylist->generateName(), "episodeNo" => $i + 1, "thumbnailUri" => $thumbnailUri, "thumbnailFooter" => PlaylistTableHelpers::getFooterObj($item), "duration" => PlaylistTableHelpers::getDuration($item)); } $streamControlData = null; $currentMediaItem->load("liveStreamItem", "liveStreamItem.stateDefinition"); $liveStreamItem = $currentMediaItem->liveStreamItem; if ($userHasMediaItemsEditPermission && !is_null($liveStreamItem)) { $infoMsg = $liveStreamItem->information_msg; $liveStreamStateDefinitions = LiveStreamStateDefinition::orderBy("id", "asc")->get(); $streamStateButtonsData = array(); foreach ($liveStreamStateDefinitions as $a) { $streamStateButtonsData[] = array("id" => intval($a->id), "text" => $a->name); } $liveStream = $liveStreamItem->liveStream; $streamControlData = array("showInaccessibleWarning" => !$liveStreamItem->getIsAccessible(), "showNoLiveStreamWarning" => is_null($liveStream), "showLiveStreamNotAccessibleWarning" => !is_null($liveStream) && !$liveStream->getIsAccessible(), "showStreamReadyForLiveMsg" => !is_null($liveStream) && $liveStream->getIsAccessible(), "showExternalStreamLocationMsg" => !is_null($liveStreamItem->external_stream_url), "streamStateButtonsData" => $streamStateButtonsData, "streamStateChosenId" => $liveStreamItem->stateDefinition->id, "streamInfoMsg" => !is_null($infoMsg) ? $infoMsg : ""); } $seriesAd = null; if (is_null($playlist->show)) { // user is currently browsing playlist not series $defaultPlaylist = $currentMediaItem->getDefaultPlaylist(); if (!is_null($defaultPlaylist->show)) { // show the button to link the user to the series containing the video they are watching. $seriesAd = array("name" => $defaultPlaylist->generateName(), "uri" => $defaultPlaylist->getMediaItemUri($currentMediaItem)); } } $episodeTitle = $playlist->generateEpisodeTitle($currentMediaItem); $openGraphCoverArtUri = $playlist->getMediaItemCoverArtUri($currentMediaItem, $coverArtResolutions['fbOpenGraph']['w'], $coverArtResolutions['fbOpenGraph']['h']); $twitterCardCoverArtUri = $playlist->getMediaItemCoverArtUri($currentMediaItem, $coverArtResolutions['twitterCard']['w'], $coverArtResolutions['twitterCard']['h']); $twitterProperties = array(); $twitterProperties[] = array("name" => "card", "content" => "player"); $openGraphProperties = array(); if (is_null($playlist->show)) { $openGraphProperties[] = array("name" => "og:type", "content" => "video.other"); } else { $openGraphProperties[] = array("name" => "og:type", "content" => "video.episode"); $openGraphProperties[] = array("name" => "video:series", "content" => $playlist->getUri()); } $twitterProperties[] = array("name" => "player", "content" => $playlist->getMediaItemEmbedUri($currentMediaItem) . "?autoPlayVod=0&autoPlayStream=0&flush=1&disableFullScreen=1&disableRedirect=1"); $twitterProperties[] = array("name" => "player:width", "content" => "1280"); $twitterProperties[] = array("name" => "player:height", "content" => "720"); if (!is_null($currentMediaItem->description)) { $openGraphProperties[] = array("name" => "og:description", "content" => $currentMediaItem->description); $twitterProperties[] = array("name" => "description", "content" => str_limit($currentMediaItem->description, 197, "...")); } $openGraphProperties[] = array("name" => "video:release_date", "content" => $currentMediaItem->scheduled_publish_time->toISO8601String()); $openGraphProperties[] = array("name" => "og:title", "content" => $episodeTitle); $twitterProperties[] = array("name" => "title", "content" => $episodeTitle); $openGraphProperties[] = array("name" => "og:image", "content" => $openGraphCoverArtUri); $twitterProperties[] = array("name" => "image", "content" => $twitterCardCoverArtUri); if (!is_null($playlist->show)) { if (!is_null($playlistNextItemUri)) { $openGraphProperties[] = array("name" => "og:see_also", "content" => $playlistNextItemUri); } if (!is_null($playlistPreviousItemUri)) { $openGraphProperties[] = array("name" => "og:see_also", "content" => $playlistPreviousItemUri); } } foreach ($relatedItemsTableData as $a) { if (!in_array($a['uri'], array($playlistNextItemUri, $playlistPreviousItemUri))) { $openGraphProperties[] = array("name" => "og:see_also", "content" => $a['uri']); } } $view = View::make("home.player.index"); $view->episodeTitle = $episodeTitle; $view->episodeDescriptionEscaped = !is_null($currentMediaItem->description) ? nl2br(URLHelpers::escapeAndReplaceUrls($currentMediaItem->description)) : null; $view->playlistTableFragment = View::make("fragments.home.playlist", array("stripedTable" => true, "headerRowData" => array("title" => $playlist->generateName(), "seriesUri" => !is_null($playlist->show) ? $playlist->show->getUri() : null, "navButtons" => array("previousItemUri" => $playlistPreviousItemUri, "nextItemUri" => $playlistNextItemUri, "showAutoPlayButton" => true)), "tableData" => $playlistTableData)); $view->relatedItemsTableFragment = count($relatedItemsTableData) > 0 ? View::make("fragments.home.playlist", array("stripedTable" => true, "headerRowData" => array("title" => "Related Items", "seriesUri" => null, "navButtons" => null), "tableData" => $relatedItemsTableData)) : null; $currentMediaItem->load("videoItem", "videoItem.chapters"); $videoItem = $currentMediaItem->videoItem; $hasAccessibleVod = false; if (!Config::get("degradedService.enabled")) { $hasAccessibleVod = !is_null($videoItem) && $videoItem->getIsLive(); } $commentsEnabled = $currentMediaItem->comments_enabled; $vodPlayStartTime = $this->getVodStartTimeFromUrl(); $vodChapters = array(); if ($hasAccessibleVod) { foreach ($videoItem->chapters()->orderBy("time", "asc")->orderBy("title", "asc")->get() as $b => $a) { $vodChapters[] = array("num" => $b + 1, "title" => $a->title, "timeStr" => $a->time_str, "time" => intval($a->time)); } } $vodControlData = null; if ($userHasMediaItemsEditPermission) { $vodFileId = null; if (!is_null($videoItem)) { $vodFile = $videoItem->sourceFile; $vodFileId = !is_null($vodFile) ? intval($vodFile->id) : null; } $vodControlData = array("uploadPointId" => Config::get("uploadPoints.vodVideo"), "fileId" => $vodFileId, "info" => FormHelpers::getFileInfo($vodFileId)); } $coverImageUri = null; $sideBannerUri = null; $sideBannerFillUri = null; if (!Config::get("degradedService.enabled")) { $coverImageResolutions = Config::get("imageResolutions.coverImage"); $coverImageUri = $playlist->getMediaItemCoverUri($currentMediaItem, $coverImageResolutions['full']['w'], $coverImageResolutions['full']['h']); $sideBannerImageResolutions = Config::get("imageResolutions.sideBannerImage"); $sideBannerUri = $playlist->getMediaItemSideBannerUri($currentMediaItem, $sideBannerImageResolutions['full']['w'], $sideBannerImageResolutions['full']['h']); $sideBannerFillImageResolutions = Config::get("imageResolutions.sideBannerImage"); $sideBannerFillUri = $playlist->getMediaItemSideBannerFillUri($currentMediaItem, $sideBannerFillImageResolutions['full']['w'], $sideBannerFillImageResolutions['full']['h']); } // only autoplay if the user has come from an external site, or specified a start time $autoPlay = !is_null($vodPlayStartTime) || !URLHelpers::hasInternalReferrer(); $view->playerInfoUri = PlayerHelpers::getInfoUri($playlist->id, $currentMediaItem->id); $view->playlistInfoUri = $this->getPlaylistInfoUri($playlist->id); $view->autoContinueMode = $this->getAutoContinueMode(); $view->registerWatchingUri = PlayerHelpers::getRegisterWatchingUri($playlist->id, $currentMediaItem->id); $view->registerLikeUri = PlayerHelpers::getRegisterLikeUri($playlist->id, $currentMediaItem->id); $view->adminOverrideEnabled = $userHasMediaItemsPermission; $view->loginRequiredMsg = "Please log in to use this feature."; $view->beingRecordedForVod = !is_null($liveStreamItem) ? (bool) $liveStreamItem->being_recorded : null; $view->autoPlay = $autoPlay; $view->vodPlayStartTime = is_null($vodPlayStartTime) ? "" : $vodPlayStartTime; $view->vodChapters = $vodChapters; $view->commentsEnabled = $commentsEnabled; if ($commentsEnabled) { $view->getCommentsUri = $this->getGetCommentsUri($currentMediaItem->id); $view->postCommentUri = $this->getPostCommentUri($currentMediaItem->id); $view->deleteCommentUri = $this->getDeleteCommentUri($currentMediaItem->id); $view->canCommentAsFacebookUser = Facebook::isLoggedIn() && Facebook::getUserState() === 0; $view->canCommentAsStation = $userHasCommentsPermission; } $view->vodControlData = $vodControlData; $view->streamControlData = $streamControlData; $view->mediaItemId = $currentMediaItem->id; $view->seriesAd = $seriesAd; $view->coverImageUri = $coverImageUri; $this->setContent($view, "player", "player", $openGraphProperties, $currentMediaItem->name, 200, $twitterProperties, $sideBannerUri, $sideBannerFillUri); }