// 3. Create a playlist insert request with snippet and status.
     $youTubePlaylist = new Google_Playlist();
     $youTubePlaylist->setSnippet($playlistSnippet);
     $youTubePlaylist->setStatus($playlistStatus);
     // 4. Execute the request and return an object containing information about the new playlist
     $playlistResponse = $youtube->playlists->insert('snippet,status', $youTubePlaylist, array());
     // 5. Add the video to the playlist
     //   a. Create a resource id with video id and kind.
     $resourceId = new Google_ResourceId();
     $resourceId->setVideoId('SZj6rAYkYOg');
     $resourceId->setKind('youtube#video');
     //   b. Create a snippet with resource id.
     $playlistItemSnippet = new Google_PlaylistItemSnippet();
     $playlistItemSnippet->setTitle('First video in the test playlist');
     $playlistItemSnippet->setPlaylistId($playlistResponse['id']);
     $playlistItemSnippet->setResourceId($resourceId);
     //   c. Create a playlist item request request with snippet.
     $playlistItem = new Google_PlaylistItem();
     $playlistItem->setSnippet($playlistItemSnippet);
     //   d. Execute the request and return an object containing information about the
     //      new playlistItem
     $playlistItemResponse = $youtube->playlistItems->insert('snippet,contentDetails', $playlistItem, array());
     $htmlBody .= "<h3>New Playlist</h3><ul>";
     $htmlBody .= sprintf('<li>%s (%s)</li>', $playlistResponse['snippet']['title'], $playlistResponse['id']);
     $htmlBody .= '</ul>';
     $htmlBody .= "<h3>New PlaylistItem</h3><ul>";
     $htmlBody .= sprintf('<li>%s (%s)</li>', $playlistItemResponse['snippet']['title'], $playlistItemResponse['id']);
     $htmlBody .= '</ul>';
 } catch (Google_ServiceException $e) {
     $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', htmlspecialchars($e->getMessage()));
 } catch (Google_Exception $e) {
 public function sync($youtubeUsername, $videoId, $currentVideoPlaylists, $newVideoPlaylists)
 {
     $playlistsLoaded = false;
     for ($i = 1; $i <= $this->_playlistLoadAttemptsLimit; $i++) {
         try {
             KalturaLog::debug('Trying to load all playlists, attempt ' . $i);
             $this->loadPlaylistsForChannel($youtubeUsername);
             $playlistsLoaded = true;
             break;
         } catch (Exception $ex) {
             KalturaLog::err('Failed to load all playlists on attempt ' . $i);
             KalturaLog::debug($ex);
         }
     }
     if (!$playlistsLoaded) {
         KalturaLog::err('An error occurred while loading playlists, sync playlists proccess cannot proceed');
         return $currentVideoPlaylists;
     }
     KalturaLog::info('Current playlists: ' . $currentVideoPlaylists);
     KalturaLog::info('New playlists: ' . $newVideoPlaylists);
     $currentPlaylistsArray = explode(',', $currentVideoPlaylists);
     $newPlaylistsArray = explode(',', $newVideoPlaylists);
     sort($currentPlaylistsArray);
     sort($newPlaylistsArray);
     foreach ($currentPlaylistsArray as &$tempPlaylist) {
         $tempPlaylist = trim($tempPlaylist);
     }
     foreach ($newPlaylistsArray as &$tempPlaylist) {
         $tempPlaylist = trim($tempPlaylist);
     }
     if (count($currentVideoPlaylists) == 0 && count($newVideoPlaylists) == 0) {
         return null;
     }
     if (var_export($currentPlaylistsArray, true) === var_export($newPlaylistsArray, true)) {
         // nothing changed
         return null;
     }
     /**
      * used to store the playlists that were really linked to an entry,
      * if an api error occurs, the playlist will not be added
      */
     $currentPlaylistsReal = array();
     // playlists we need to add the video to
     foreach ($newPlaylistsArray as $playlist) {
         if (!$playlist) {
             continue;
         }
         if (!in_array($playlist, $currentPlaylistsArray)) {
             $playlistId = $this->getPlaylistIdByTitle($playlist);
             if (!$playlistId) {
                 // create the playlist
                 $playlistSnippet = new Google_PlaylistSnippet();
                 $playlistSnippet->setChannelId($this->_channelId);
                 $playlistSnippet->setTitle($playlist);
                 $googlePlaylist = new Google_Playlist();
                 $googlePlaylist->setSnippet($playlistSnippet);
                 try {
                     $playlistResponse = $this->_youtubeService->playlists->insert('snippet', $googlePlaylist);
                 } catch (Exception $ex) {
                     KalturaLog::err('Failed to create new playlist ' . $playlist);
                     KalturaLog::debug($ex);
                     continue;
                 }
                 $playlistId = $playlistResponse['id'];
             }
             $playlistItem = new Google_PlaylistItem();
             $contentDetails = new Google_PlaylistItemContentDetails();
             $contentDetails->setVideoId($videoId);
             $playlistItemSnippet = new Google_PlaylistItemSnippet();
             $playlistItemSnippet->setPlaylistId($playlistId);
             $resourceId = new Google_ResourceId();
             $resourceId->setKind('youtube#video');
             $resourceId->setVideoId($videoId);
             $playlistItemSnippet->setResourceId($resourceId);
             $playlistItem->setSnippet($playlistItemSnippet);
             try {
                 $this->_youtubeService->playlistItems->insert('snippet', $playlistItem);
             } catch (Exception $ex) {
                 KalturaLog::err('Failed to insert playlist item for playlist ' . $playlist);
                 KalturaLog::debug($ex);
                 continue;
             }
             $currentPlaylistsReal[] = $playlist;
         } else {
             $currentPlaylistsReal[] = $playlist;
         }
     }
     // playlists we need to remove the video from
     foreach ($currentPlaylistsArray as $playlist) {
         if (!$playlist) {
             continue;
         }
         if (!in_array($playlist, $newPlaylistsArray)) {
             $playlistId = $this->getPlaylistIdByTitle($playlist);
             if (!$playlistId) {
                 continue;
             }
             $playlistItems = null;
             try {
                 $playlistItems = $this->_youtubeService->playlistItems->listPlaylistItems('snippet', array('playlistId' => $playlistId));
             } catch (Exception $ex) {
                 // failed to list playlists items, we need to keep that playlist in our records
                 $currentPlaylistsReal[] = $playlist;
                 KalturaLog::err('Failed to list playlist items for playlist ' . $playlist);
                 KalturaLog::debug($ex);
                 continue;
             }
             if (!isset($playlistItems['items']) || !count($playlistItems['items'])) {
                 continue;
             }
             foreach ($playlistItems['items'] as $playlistItem) {
                 if (!isset($playlistItem['snippet']['resourceId']['videoId'])) {
                     continue;
                 }
                 $playlistItemVideoId = $playlistItem['snippet']['resourceId']['videoId'];
                 if ($playlistItemVideoId == $videoId) {
                     try {
                         $this->_youtubeService->playlistItems->delete($playlistItem['id']);
                     } catch (Exception $ex) {
                         // playlist item could not be deleted, we need to keep that playlist in our records as well
                         $currentPlaylistsReal[] = $playlist;
                         KalturaLog::err('Failed to delete playlist item for playlist ' . $playlist);
                         KalturaLog::debug($ex);
                     }
                 }
             }
         }
     }
     return $currentPlaylistsReal;
 }