/**
  * Run the database seeds.
  *
  * @return void
  */
 public function run()
 {
     DB::statement('SET FOREIGN_KEY_CHECKS=0;');
     LiveStream::truncate();
     MediaItem::truncate();
     MediaItemComment::truncate();
     MediaItemLike::truncate();
     MediaItemLiveStream::truncate();
     MediaItemVideo::truncate();
     Permission::truncate();
     PermissionGroup::truncate();
     QualityDefinition::truncate();
     LiveStreamUri::truncate();
     Playlist::truncate();
     Show::truncate();
     SiteUser::truncate();
     User::truncate();
     VideoFile::truncate();
     DB::table("media_item_to_playlist")->truncate();
     DB::table("permission_to_group")->truncate();
     DB::table("user_to_group")->truncate();
     DB::statement('SET FOREIGN_KEY_CHECKS=1;');
     $this->command->info('Tables truncated!');
 }
 public function anyEdit($id = null)
 {
     Auth::getUser()->hasPermissionOr401(Config::get("permissions.liveStreams"), 1);
     $liveStream = null;
     $editing = false;
     if (!is_null($id)) {
         $liveStream = LiveStream::find($id);
         if (is_null($liveStream)) {
             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, $liveStream, "enabled") ? "y" : ""), array("shownAsLivestream", ObjectHelpers::getProp(false, $liveStream, "shown_as_livestream") ? "y" : ""), array("name", ObjectHelpers::getProp("", $liveStream, "name")), array("description", ObjectHelpers::getProp("", $liveStream, "description")), array("cover-art-id", ObjectHelpers::getProp("", $liveStream, "coverArtFile", "id")), array("urls", json_encode(array()))), !$formSubmitted);
     // this will contain any additional data which does not get saved anywhere
     $additionalFormData = array("coverArtFile" => FormHelpers::getFileInfo($formData['cover-art-id']), "urlsInput" => null, "urlsInitialData" => null);
     if (!$formSubmitted) {
         $additionalFormData['urlsInput'] = ObjectHelpers::getProp(json_encode(array()), $liveStream, "urls_for_input");
         $additionalFormData['urlsInitialData'] = ObjectHelpers::getProp(json_encode(array()), $liveStream, "urls_for_orderable_list");
     } else {
         $additionalFormData['urlsInput'] = LiveStream::generateInputValueForUrlsOrderableList(JsonHelpers::jsonDecodeOrNull($formData['urls'], true));
         $additionalFormData['urlsInitialData'] = LiveStream::generateInitialDataForUrlsOrderableList(JsonHelpers::jsonDecodeOrNull($formData["urls"], true));
     }
     $errors = null;
     if ($formSubmitted) {
         $modelCreated = DB::transaction(function () use(&$formData, &$liveStream, &$errors) {
             Validator::extend('valid_file_id', FormHelpers::getValidFileValidatorFunction());
             Validator::extend('valid_urls', function ($attribute, $value, $parameters) {
                 return LiveStream::isValidDataFromUrlsOrderableList(JsonHelpers::jsonDecodeOrNull($value, true));
             });
             $validator = Validator::make($formData, array('name' => array('required', 'max:50'), 'description' => array('max:500'), 'cover-art-id' => array('valid_file_id'), 'urls' => array('required', 'valid_urls')), array('name.required' => FormHelpers::getRequiredMsg(), 'name.max' => FormHelpers::getLessThanCharactersMsg(50), 'description.max' => FormHelpers::getLessThanCharactersMsg(500), 'cover-art-id.valid_file_id' => FormHelpers::getInvalidFileMsg(), 'urls.required' => FormHelpers::getGenericInvalidMsg(), 'urls.valid_urls' => FormHelpers::getGenericInvalidMsg()));
             if (!$validator->fails()) {
                 // everything is good. save/create model
                 if (is_null($liveStream)) {
                     $liveStream = new LiveStream();
                 }
                 $liveStream->name = $formData['name'];
                 $liveStream->description = FormHelpers::nullIfEmpty($formData['description']);
                 $liveStream->enabled = FormHelpers::toBoolean($formData['enabled']);
                 $liveStream->shown_as_livestream = FormHelpers::toBoolean($formData['shownAsLivestream']);
                 $coverArtFileId = FormHelpers::nullIfEmpty($formData['cover-art-id']);
                 $file = Upload::register(Config::get("uploadPoints.coverArt"), $coverArtFileId, $liveStream->coverArtFile);
                 EloquentHelpers::associateOrNull($liveStream->coverArtFile(), $file);
                 if ($liveStream->save() === false) {
                     throw new Exception("Error saving LiveStream.");
                 }
                 $liveStream->liveStreamUris()->delete();
                 // detaches all. this causes any corresponding dvrBridgeServiceUrl's to be deleted as well which must happen on any change
                 $urlsData = json_decode($formData['urls'], true);
                 foreach ($urlsData as $a) {
                     $qualityDefinition = QualityDefinition::find(intval($a['qualityState']['id']));
                     $url = $a['url'];
                     $dvrBridgeServiceUri = $a['dvrBridgeServiceUrl'];
                     $nativeDvr = $a['nativeDvr'];
                     $type = $a['type'];
                     $support = $a['support'];
                     $supportedDevices = null;
                     if ($support === "pc") {
                         $supportedDevices = "desktop";
                     } else {
                         if ($support === "mobile") {
                             $supportedDevices = "mobile";
                         }
                     }
                     $liveStreamUri = new LiveStreamUri(array("uri" => $url, "dvr_bridge_service_uri" => $dvrBridgeServiceUri, "has_dvr" => $nativeDvr, "type" => $type, "supported_devices" => $supportedDevices, "enabled" => $support !== "none"));
                     $liveStreamUri->qualityDefinition()->associate($qualityDefinition);
                     $liveStream->liveStreamUris()->save($liveStreamUri);
                 }
                 // the transaction callback result is returned out of the transaction function
                 return true;
             } else {
                 $errors = $validator->messages();
                 return false;
             }
         });
         if ($modelCreated) {
             return Redirect::to(Config::get("custom.admin_base_url") . "/livestreams");
         }
         // if not valid then return form again with errors
     }
     $view = View::make('home.admin.livestreams.edit');
     $view->editing = $editing;
     $view->form = $formData;
     $view->additionalForm = $additionalFormData;
     $view->coverArtUploadPointId = Config::get("uploadPoints.coverArt");
     $view->formErrors = $errors;
     $view->cancelUri = Config::get("custom.admin_base_url") . "/livestreams";
     $this->setContent($view, "livestreams", "livestreams-edit");
 }