public static function backup($user, $taskId = 0, $syncTaskId = 0, $ignoreUpdate = false) { // Stats $stats = array('playlists' => 0, 'videos' => 0, 'subscriptions' => 0); // Channels $channels = \Rest::get(static::$endpoints['channels'], array('part' => static::$part['channels']['minimal'], 'maxResults' => static::$limit, 'mine' => 'true'), $user); $dbChannels = array(); $playlists = array(); if ($channels) { if ($channels['pageInfo']['totalResults'] < static::$limit) { foreach ($channels['items'] as $channel) { // Save channel $formatedData = array('user_id' => $user['username']['id'], 'task_id' => $taskId, 'sync_task_id' => $syncTaskId, 'etag' => $channel['etag'], 'kind' => static::$kind['playlist'], 'channel_id' => $channel['id'], 'title' => $channel['snippet']['title'], 'description' => $channel['snippet']['description'], 'created_at' => date(DATE_TIME, strtotime($channel['snippet']['publishedAt'])), 'picture' => $channel['snippet']['thumbnails']['default']['url'], 'status' => ChannelsModel::STATUS_ACTIVE); $dbChannels[] = ChannelsModel::create($formatedData)->save(); if ($channel['contentDetails']) { if ($channel['contentDetails']['relatedPlaylists']) { foreach ($channel['contentDetails']['relatedPlaylists'] as $playlistId) { $playlists[] = $playlistId; } } } } } } // Get channel playlists $channelPlaylists = \Rest::get(static::$endpoints['playlists'], array('part' => static::$part['playlists']['all'], 'channelId' => $channel['id'], 'maxResults' => static::$limit), $user); if (isset($channelPlaylists['result']['error'])) { d($channelPlaylists); } // Get channel related playlists $playlists = \Rest::get(static::$endpoints['playlists'], array('part' => static::$part['playlists']['all'], 'id' => implode(',', $playlists), 'maxResults' => static::$limit), $user); if (isset($playlists['result']['error'])) { d($playlists); } $playlists['pageInfo']['totalResults'] += $channelPlaylists['pageInfo']['totalResults']; $playlists['items'] = array_merge($channelPlaylists['items'], $playlists['items']); $videos = array(); $dbPlaylists = array(); if ($playlists) { if ($playlists['pageInfo']['totalResults'] < static::$limit) { foreach ($playlists['items'] as $playlist) { if (!in_array($playlist['snippet']['title'], static::$excludedPlaylists)) { $formatedData = array('user_id' => $user['username']['id'], 'task_id' => $taskId, 'sync_task_id' => $syncTaskId, 'channel_id' => $dbChannels[0]->id, 'youtube_channel_id' => $channel['id'], 'youtube_playlist_id' => $playlist['id'], 'etag' => $playlist['etag'], 'kind' => static::$kind['playlist'], 'title' => $playlist['snippet']['title'], 'description' => $playlist['snippet']['description'], 'videos_count' => $playlist['contentDetails']['itemCount'], 'videos_player' => base64_encode($playlist['player']['embedHtml']), 'created_at' => date(DATE_TIME, strtotime($playlist['snippet']['publishedAt'])), 'picture' => $playlist['snippet']['thumbnails']['default']['url'], 'privacy' => $playlist['status']['privacyStatus'], 'status' => PlaylistsModel::STATUS_ACTIVE); $newplayList = PlaylistsModel::create($formatedData)->save(); $dbPlaylists[] = $newplayList; } } } foreach ($dbPlaylists as $playlist) { $stats['playlists']++; do { $payload = array('part' => static::$part['playlistItems']['minimal'], 'playlistId' => $playlist->youtube_playlist_id, 'maxResults' => static::$limit); if (isset($vids['nextPageToken'])) { $payload['pageToken'] = $vids['nextPageToken']; } $vids = array(); $vids = \Rest::get(static::$endpoints['playlistItems'], $payload, $user); if (isset($vids['result']['error'])) { d($vids); } if ($vids['items']) { foreach ($vids['items'] as $vid) { $formatedData = array('user_id' => $user['username']['id'], 'task_id' => $taskId, 'sync_task_id' => $syncTaskId, 'channel_id' => $playlist->channel_id, 'playlist_id' => $playlist->id, 'youtube_channel_id' => $playlist->youtube_channel_id, 'youtube_playlist_id' => $playlist->youtube_playlist_id, 'youtube_video_id' => $vid['id'], 'etag' => $vid['etag'], 'kind' => static::$kind['video'], 'title' => $vid['snippet']['title'], 'created_at' => date(DATE_TIME, strtotime($vid['snippet']['publishedAt'])), 'picture' => isset($vid['snippet']['thumbnails']) ? $vid['snippet']['thumbnails']['default']['url'] : '', 'position' => $vid['snippet']['position'], 'video_link' => $vid['contentDetails']['videoId'], 'privacy' => $vid['status']['privacyStatus'], 'status' => VideosModel::STATUS_ACTIVE); $newVideos[] = $formatedData; $stats['videos']++; } } } while (isset($vids['nextPageToken']) && $vids['nextPageToken']); } if ($newVideos) { VideosModel::insertBatch($newVideos); } } $newSubscriptions = array(); do { $payload = array('part' => static::$part['subscriptions']['minimal'], 'mine' => 'true', 'maxResults' => static::$limit); if (isset($subscriptions['nextPageToken'])) { $payload['pageToken'] = $subscriptions['nextPageToken']; } $subscriptions = \Rest::get(static::$endpoints['subscriptions'], $payload, $user); if (isset($subscriptions['result']['error'])) { d($subscriptions); } if ($subscriptions['items']) { foreach ($subscriptions['items'] as $sub) { $formatedData = array('user_id' => $user['username']['id'], 'task_id' => $taskId, 'sync_task_id' => $syncTaskId, 'youtube_channel_id' => $sub['id'], 'etag' => $sub['etag'], 'kind' => static::$kind['subscription'], 'title' => $sub['snippet']['title'], 'description' => $sub['snippet']['description'], 'created_at' => date(DATE_TIME, strtotime($sub['snippet']['publishedAt'])), 'picture' => isset($sub['snippet']['thumbnails']) ? $sub['snippet']['thumbnails']['default']['url'] : '', 'channel_link' => $sub['snippet']['resourceId']['channelId'], 'status' => SubscriptionsModel::STATUS_ACTIVE); $newSubscriptions[] = $formatedData; $stats['subscriptions']++; } } } while (isset($subscriptions['nextPageToken']) && $subscriptions['nextPageToken']); if ($newSubscriptions) { SubscriptionsModel::insertBatch($newSubscriptions); } return $stats; }