示例#1
0
 public static function sync($source, $destination, $syncTaskId = 0)
 {
     // Stats
     $stats = array('links' => 0);
     // Get source data
     $links = BackupsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['link']))->toArray();
     $syncedLinks = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'kind' => static::$kind['link']))->column('identifier');
     if ($links) {
         foreach ($links as $link) {
             if (!in_array($link['entity_id'], $syncedLinks)) {
                 $link['entity'] = json_decode($link['entity'], true);
                 $newLink = array_diff_key($link['entity'], array_flip(static::$skip['link']));
                 $newLink = \Rest::postJSON(static::$endpoints['link'], $newLink, $destination);
                 if (isset($newLink['result']['error'])) {
                     d($newLink);
                 }
                 $stats['links']++;
                 $syncedCalendar = MigratedDataModel::create();
                 $syncedCalendar->source_id = $source['username']['id'];
                 $syncedCalendar->destination_id = $destination['username']['id'];
                 $syncedCalendar->kind = static::$kind['link'];
                 $syncedCalendar->identifier = $link['entity_id'];
                 $syncedCalendar->created = date(DATE_TIME);
                 $syncedCalendar->save();
             }
         }
     }
     return $stats;
 }
示例#2
0
 public static function _transfer($source, $destination, $syncTaskId = 0, $ignoreUpdate = false, $whitelist = array())
 {
     // Stats
     $stats = array('lists' => 0, 'tasks' => 0);
     // Get source data
     $tasks = array();
     $lists = BackupsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['list']))->toArray();
     $tasksDB = BackupsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['task']))->toArray();
     if ($tasksDB) {
         foreach ($tasksDB as $task) {
             $tasks[$task['parent_id']][] = $task;
         }
     }
     $syncedLists = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'kind' => static::$kind['list']))->column('identifier');
     $syncedTasks = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'kind' => static::$kind['task']))->column('identifier');
     $destinationLists = BackupsModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['list']))->column('entity_title');
     if ($lists) {
         foreach ($lists as $list) {
             // Whitelisting used for share feature
             $whiteListed = true;
             if ($whitelist) {
                 if (isset($whitelist['lists']) && $whitelist['lists']) {
                     if (!in_array($list['entity_id'], $whitelist['lists'])) {
                         $whiteListed = false;
                     }
                 }
             }
             if (!in_array($list['entity_id'], $syncedLists) && $whiteListed) {
                 $list['entity'] = json_decode($list['entity'], true);
                 $newList = array_diff_key($list['entity'], array_flip(static::$skip['list']));
                 if (in_array($newList['title'], $destinationLists) && !$ignoreUpdate) {
                     $newList['title'] = $newList['title'] . ' (2)';
                 } else {
                     $newList['title'] = $newList['title'];
                 }
                 $newList = \Rest::postJSON(static::$endpoints['lists'], $newList, $destination);
                 if (isset($newList['result']['error'])) {
                     d($newList);
                 }
                 $stats['lists']++;
                 // Update playlist with new id
                 if (!$ignoreUpdate && $newList) {
                     $oldPlaylist = BackupsModel::first($list['id']);
                     $oldPlaylist->entity_new_id = $newList['id'];
                     $oldPlaylist->save();
                 }
                 $syncedCalendar = MigratedDataModel::create();
                 $syncedCalendar->source_id = $source['username']['id'];
                 $syncedCalendar->destination_id = $destination['username']['id'];
                 $syncedCalendar->task_id = 0;
                 $syncedCalendar->sync_task_id = $syncTaskId;
                 $syncedCalendar->table = BackupsModel::$schema['table'];
                 $syncedCalendar->table_id = $list['id'];
                 $syncedCalendar->kind = static::$kind['list'];
                 $syncedCalendar->identifier = $list['entity_id'];
                 $syncedCalendar->status = MigratedDataModel::STATUS_ACTIVE;
                 $syncedCalendar->created = date(DATE_TIME);
                 $syncedCalendar->save();
                 // Add tasks
                 if (isset($tasks[$list['id']])) {
                     foreach ($tasks[$list['id']] as $task) {
                         if (!in_array($task['entity_id'], $syncedTasks)) {
                             $task['entity'] = json_decode($task['entity'], true);
                             $newTask = array_diff_key($task['entity'], array_flip(static::$skip['task']));
                             $newTask = \Rest::postJSON(sprintf(static::$endpoints['tasks'], $newList['id']), $newTask, $destination);
                             if (isset($newTask['result']['error'])) {
                                 d($newTask);
                             }
                             $stats['tasks']++;
                             $syncedEvent = MigratedDataModel::create();
                             $syncedEvent->source_id = $source['username']['id'];
                             $syncedEvent->destination_id = $destination['username']['id'];
                             $syncedEvent->task_id = 0;
                             $syncedEvent->sync_task_id = $syncTaskId;
                             $syncedEvent->table = BackupsModel::$schema['table'];
                             $syncedEvent->table_id = $task['id'];
                             $syncedEvent->kind = static::$kind['task'];
                             $syncedEvent->identifier = $task['entity_id'];
                             $syncedEvent->status = MigratedDataModel::STATUS_ACTIVE;
                             $syncedEvent->created = date(DATE_TIME);
                             $syncedEvent->save();
                         }
                     }
                 }
             }
         }
     }
     return $stats;
 }
示例#3
0
    public static function _transfer($source, $destination, $syncTaskId = 0, $ignoreUpdate = false, $whitelist = array())
    {
        // Stats
        $stats = array('contacts' => 0);
        // Get source data
        $contacts = BackupsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['contact']))->toArray();
        $destinationContacts = BackupsModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['contact']))->column('entity_title');
        $syncedContacts = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'status' => MigratedDataModel::STATUS_ACTIVE, 'kind' => static::$kind['contact']))->column('identifier');
        if ($contacts) {
            foreach ($contacts as $contact) {
                $contactData = json_decode($contact['entity'], true);
                // Whitelisting used for share feature
                $whiteListed = true;
                if ($whitelist) {
                    if (isset($whitelist['contacts']) && $whitelist['contacts']) {
                        if (!in_array($contactData['id'], $whitelist['contacts'])) {
                            $whiteListed = false;
                        }
                    }
                }
                if (!in_array(md5($contactData['name']), $syncedContacts) && $whiteListed) {
                    $body = <<<EOD
<?xml version='1.0' encoding='UTF-8'?>
<entry
\txmlns='http://www.w3.org/2005/Atom'
\txmlns:gd='http://schemas.google.com/g/2005'>

EOD;
                    if (in_array($contactData['name'], $destinationContacts) && !$ignoreUpdate) {
                        $contactData['name'] = $contactData['name'] . ' (2)';
                    } else {
                        $contactData['name'] = $contactData['name'];
                    }
                    $body .= '<title type="text">' . $contactData['name'] . '</title>';
                    // Emails
                    if (isset($contactData['emails']) && $contactData['emails']) {
                        foreach ($contactData['emails'] as $email) {
                            $body .= '<gd:email rel="' . (isset($email['rel']) ? $email['rel'] : 'http://schemas.google.com/g/2005#other') . '"';
                            if (isset($email['primary'])) {
                                $body .= ' primary="true" ';
                            }
                            $body .= ' address="' . $email['address'] . '" />';
                        }
                    }
                    // IM
                    if (isset($contactData['im']) && $contactData['im']) {
                        foreach ($contactData['im'] as $im) {
                            $body .= '<gd:im address="' . $im['address'] . '" protocol="' . $im['protocol'] . '" rel="' . $im['rel'] . '"/>';
                        }
                    }
                    // Numbers
                    if (isset($contactData['phoneNumbers']) && $contactData['phoneNumbers']) {
                        foreach ($contactData['phoneNumbers'] as $number) {
                            $body .= '<gd:phoneNumber rel="' . $number['rel'] . '">' . $number['number'] . '</gd:phoneNumber>';
                        }
                    }
                    // Postal
                    if (isset($contactData['postalAddress']) && $contactData['postalAddress']) {
                        foreach ($contactData['postalAddress'] as $address) {
                            $body .= '<gd:postalAddress rel="' . $address['rel'] . '">' . $address['address'] . '</gd:postalAddress>';
                        }
                    }
                    $body .= '</entry>';
                    $newContact = \Rest::postXML(static::$endpoints['contacts'], $body, $destination);
                    // Update playlist with new id
                    if (!$ignoreUpdate && $newContact) {
                        $newContactId = @basename($newContact->id);
                        if ($newContactId) {
                            $oldPlaylist = BackupsModel::first($contact['id']);
                            $oldPlaylist->entity_new_id = $newContactId;
                            $oldPlaylist->save();
                        }
                    }
                    $stats['contacts']++;
                    $syncedContact = MigratedDataModel::create();
                    $syncedContact->source_id = $source['username']['id'];
                    $syncedContact->destination_id = $destination['username']['id'];
                    $syncedContact->task_id = 0;
                    $syncedContact->sync_task_id = $syncTaskId;
                    $syncedContact->table = BackupsModel::$schema['table'];
                    $syncedContact->table_id = $contact['id'];
                    $syncedContact->kind = static::$kind['contact'];
                    $syncedContact->identifier = md5($contactData['name']);
                    $syncedContact->status = MigratedDataModel::STATUS_ACTIVE;
                    $syncedContact->created = date(DATE_TIME);
                    $syncedContact->save();
                }
            }
        }
        return $stats;
    }
示例#4
0
 public static function _transfer($source, $destination, $syncTaskId = 0, $ignoreUpdate = false, $whitelist = array())
 {
     // Stats
     $stats = array('calendars' => 0, 'events' => 0);
     // Get source data
     $calendars = CalendarsModel::withEvents($source['username']['id'], $syncTaskId);
     $destinationCalendars = CalendarsModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId))->toArray();
     $destinationNames = static::_getColumn($destinationCalendars, 'name');
     $syncedEvents = EventsModel::identifiers(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId));
     if ($calendars) {
         foreach ($calendars as $calendar) {
             // Create calendar
             $payload = array();
             // Whitelisting used for share feature
             $whiteListed = true;
             if ($whitelist) {
                 if (isset($whitelist['calendars']) && $whitelist['calendars']) {
                     if (!in_array($calendar['calendar_id'], $whitelist['calendars'])) {
                         $whiteListed = false;
                     }
                 }
             }
             // New
             if (!in_array($calendar['name'], array_keys($destinationNames)) && $whiteListed || $whiteListed && $ignoreUpdate) {
                 // Create Calendar
                 $payload['summary'] = $calendar['name'];
                 $newCalendar = \Rest::postJSON(static::$endpoints['calendar'], $payload, $destination);
                 $stats['calendars']++;
                 if (isset($newCalendar['result']['error'])) {
                     d($newCalendar);
                 }
                 // Create Calendar List
                 $payloadList = array();
                 $payloadList['id'] = $newCalendar['id'];
                 $payloadList['timezone'] = $calendar['timezone'];
                 $payloadList['colorId'] = $calendar['color_id'];
                 $payloadList['backgroundColor'] = $calendar['background'];
                 $payloadList['foregroundColor'] = $calendar['foreground'];
                 $payloadList['selected'] = true;
                 \Rest::postJSON(static::$endpoints['calendars'], $payloadList, $destination);
                 $syncedCalendar = MigratedDataModel::create();
                 $syncedCalendar->source_id = $source['username']['id'];
                 $syncedCalendar->destination_id = $destination['username']['id'];
                 $syncedCalendar->task_id = 0;
                 $syncedCalendar->sync_task_id = $syncTaskId;
                 $syncedCalendar->table = CalendarsModel::$schema['table'];
                 $syncedCalendar->table_id = $calendar['id'];
                 $syncedCalendar->kind = static::$kind['calendar'];
                 $syncedCalendar->identifier = $calendar['calendar_id'];
                 $syncedCalendar->name = $calendar['name'];
                 $syncedCalendar->status = MigratedDataModel::STATUS_ACTIVE;
                 $syncedCalendar->created = date(DATE_TIME);
                 $syncedCalendar->save();
                 // Update calendar with new id
                 if (!$ignoreUpdate) {
                     $oldCalendar = CalendarsModel::first($calendar['id']);
                     $oldCalendar->calendar_new_id = $newCalendar['id'];
                     $oldCalendar->save();
                 }
                 // Existing
             } else {
                 $cal = CalendarsModel::first(array('user_id' => $destination['username']['id'], 'name' => $calendar['name']))->toArray();
                 $newCalendar['id'] = $cal['calendar_id'];
             }
             // Add events
             if ($calendar['events']) {
                 foreach ($calendar['events'] as $event) {
                     $combination = static::identifier($event, $calendar);
                     // Whitelisting used for share feature
                     $whiteListed = true;
                     if ($whitelist) {
                         if (isset($whitelist['calendars']) && $whitelist['calendars']) {
                             if (!in_array($event['google_calendar_id'], $whitelist['calendars'])) {
                                 $whiteListed = false;
                             }
                         }
                     }
                     if (!in_array($combination, $syncedEvents) && $whiteListed || $whiteListed && $ignoreUpdate) {
                         // Create Event
                         $payload = array();
                         $payload['summary'] = $event['name'];
                         $payload['description'] = $event['description'];
                         $payload['location'] = $event['location'];
                         $payload['status'] = $event['event_status'];
                         if ($event['color_id']) {
                             $payload['colorId'] = $event['color_id'];
                         }
                         $payload['creator'] = json_decode($event['creator'], true);
                         $payload['start'] = json_decode($event['start'], true);
                         $payload['end'] = json_decode($event['end'], true);
                         if (json_decode($event['recurrence'], true)) {
                             $payload['recurrence'] = json_decode($event['recurrence'], true);
                         }
                         $newEvent = \Rest::postJSON(sprintf(static::$endpoints['events'], $newCalendar['id']), $payload, $destination);
                         if (isset($newEvent['result']['error'])) {
                             d($newEvent);
                         }
                         $stats['events']++;
                         $syncedEvent = MigratedDataModel::create();
                         $syncedEvent->source_id = $source['username']['id'];
                         $syncedEvent->destination_id = $destination['username']['id'];
                         $syncedEvent->task_id = 0;
                         $syncedEvent->sync_task_id = $syncTaskId;
                         $syncedEvent->table = EventsModel::$schema['table'];
                         $syncedEvent->table_id = $event['id'];
                         $syncedEvent->kind = static::$kind['event'];
                         $syncedEvent->identifier = $event['event_id'];
                         $syncedEvent->unique = $combination;
                         $syncedEvent->name = $event['name'];
                         $syncedEvent->created = date(DATE_TIME);
                         $syncedEvent->status = MigratedDataModel::STATUS_ACTIVE;
                         $syncedEvent->save();
                     }
                 }
             }
         }
     }
     return $stats;
 }
示例#5
0
    public static function _transfer($source, $destination, $syncTaskId = 0, $ignoreUpdate = false, $whitelist = array())
    {
        // Stats
        $stats = array('playlists' => 0, 'videos' => 0, 'subscriptions' => 0);
        // Get source data
        $playlists = PlaylistsModel::withVideos($source['username']['id'], $syncTaskId);
        $destinationPlaylists = PlaylistsModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId))->toArray();
        $destinationNames = static::_getColumn($destinationPlaylists, 'title');
        $subscriptions = SubscriptionsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId))->toArray();
        $syncedVideos = VideosModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId))->column('video_link');
        $syncedSubscriptions = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'kind' => static::$kind['subscription'], 'status' => MigratedDataModel::STATUS_ACTIVE))->column('identifier');
        $counter = 0;
        $batches = array();
        $batch = md5(time());
        // Add data to destionation Youtube
        if ($playlists) {
            foreach ($playlists as $playlist) {
                if (intVal($playlist['videos_count']) > 0) {
                    if ($counter == 998) {
                        $batch = md5(time());
                        $counter = 0;
                    }
                    // Create Playlist
                    $payload = array();
                    $payload['status']['privacyStatus'] = 'private';
                    // Whitelisting used for share feature
                    $whiteListed = true;
                    if ($whitelist) {
                        if (isset($whitelist['playlists']) && $whitelist['playlists']) {
                            if (!in_array($playlist['youtube_playlist_id'], $whitelist['playlists'])) {
                                $whiteListed = false;
                            }
                        }
                    }
                    // New
                    if (!in_array($playlist['title'], array_keys($destinationNames)) && $whiteListed || $ignoreUpdate) {
                        // Create Playlist
                        $payload['snippet']['title'] = $playlist['title'];
                        $newPlaylist = \Rest::postJSON(static::$endpoints['playlists'] . '?part=status,snippet', $payload, $destination);
                        $stats['playlists']++;
                        if (isset($newPlaylist['result']['error'])) {
                            d($newPlaylist);
                        }
                        $syncPlaylist = MigratedDataModel::create();
                        $syncPlaylist->source_id = $source['username']['id'];
                        $syncPlaylist->destination_id = $destination['username']['id'];
                        $syncPlaylist->task_id = 0;
                        $syncPlaylist->sync_task_id = $syncTaskId;
                        $syncPlaylist->table = PlaylistsModel::$schema['table'];
                        $syncPlaylist->table_id = $playlist['id'];
                        $syncPlaylist->kind = static::$kind['playlist'];
                        $syncPlaylist->identifier = $playlist['youtube_playlist_id'];
                        $syncPlaylist->name = $playlist['title'];
                        $syncPlaylist->created = date(DATE_TIME);
                        $syncPlaylist->status = MigratedDataModel::STATUS_ACTIVE;
                        $syncPlaylist->save();
                        // Update playlist with new id
                        if (!$ignoreUpdate) {
                            $oldPlaylist = PlaylistsModel::first($playlist['id']);
                            $oldPlaylist->new_youtube_id = $newPlaylist['id'];
                            $oldPlaylist->save();
                        }
                        // Existing
                    } else {
                        $play = PlaylistsModel::first(array('user_id' => $destination['username']['id'], 'title' => $playlist['title']))->toArray();
                        $newPlaylist['id'] = $play['youtube_playlist_id'];
                    }
                    $counter++;
                    // Add videos
                    if ($playlist['videos']) {
                        foreach ($playlist['videos'] as $k => $video) {
                            if (!in_array($video['video_link'], $syncedVideos) || $ignoreUpdate) {
                                if ($counter == 998) {
                                    $batch = md5(time());
                                    $counter = 0;
                                }
                                $counter++;
                                $payload = array();
                                $payload['snippet']['playlistId'] = $newPlaylist['id'];
                                $payload['snippet']['resourceId']['kind'] = static::$kind['video'];
                                $payload['snippet']['resourceId']['videoId'] = $video['video_link'];
                                $payload = json_encode($payload);
                                $batches[$batch][$newPlaylist['id']][] = <<<EOD

POST https://www.googleapis.com/youtube/v3/playlistItems?part=snippet
Content-Type:  application/json
Authorization: Bearer {$destination['credentials']['access_token']}

{$payload}

EOD;
                                $stats['videos']++;
                                $syncPlaylist = MigratedDataModel::create();
                                $syncPlaylist->source_id = $source['username']['id'];
                                $syncPlaylist->destination_id = $destination['username']['id'];
                                $syncPlaylist->task_id = 0;
                                $syncPlaylist->sync_task_id = $syncTaskId;
                                $syncPlaylist->table = VideosModel::$schema['table'];
                                $syncPlaylist->table_id = $video['id'];
                                $syncPlaylist->kind = static::$kind['video'];
                                $syncPlaylist->identifier = $video['video_link'];
                                $syncPlaylist->name = $video['title'];
                                $syncPlaylist->created = date(DATE_TIME);
                                $syncPlaylist->status = MigratedDataModel::STATUS_ACTIVE;
                                $syncPlaylist->save();
                            }
                        }
                    }
                }
            }
        }
        // Add subscriptions
        if ($subscriptions) {
            foreach ($subscriptions as $subscription) {
                // Whitelisting used for share feature
                $whiteListed = true;
                if ($whitelist) {
                    if (isset($whitelist['subscriptions']) && $whitelist['subscriptions']) {
                        if (!in_array($subscription['channel_link'], $whitelist['subscriptions'])) {
                            $whiteListed = false;
                        }
                    }
                }
                if (!in_array($subscription['channel_link'], $syncedSubscriptions) && $whiteListed || $ignoreUpdate) {
                    if ($counter == 998) {
                        $batch = md5(time());
                        $counter = 0;
                    }
                    $counter++;
                    $payload = array();
                    $payload['snippet']['resourceId']['kind'] = static::$kind['channel'];
                    $payload['snippet']['resourceId']['channelId'] = $subscription['channel_link'];
                    $payload = json_encode($payload);
                    $batches[$batch][$subscription['channel_link']][] = <<<EOD

POST https://www.googleapis.com/youtube/v3/subscriptions?part=snippet
Content-Type:  application/json
Authorization: Bearer {$destination['credentials']['access_token']}

{$payload}

EOD;
                    $stats['subscriptions']++;
                    $syncPlaylist = MigratedDataModel::create();
                    $syncPlaylist->source_id = $source['username']['id'];
                    $syncPlaylist->destination_id = $destination['username']['id'];
                    $syncPlaylist->task_id = 0;
                    $syncPlaylist->sync_task_id = $syncTaskId;
                    $syncPlaylist->table = SubscriptionsModel::$schema['table'];
                    $syncPlaylist->table_id = $subscription['id'];
                    $syncPlaylist->kind = static::$kind['subscription'];
                    $syncPlaylist->identifier = $subscription['channel_link'];
                    $syncPlaylist->name = $subscription['title'];
                    $syncPlaylist->created = date(DATE_TIME);
                    $syncPlaylist->status = MigratedDataModel::STATUS_ACTIVE;
                    $syncPlaylist->save();
                }
            }
        }
        if ($batches) {
            foreach ($batches as $key => $batch) {
                for ($i = 0; $i < 500; $i++) {
                    $body = '';
                    $y = md5($i);
                    foreach ($batch as $k => $set) {
                        $keys = $k . '-' . $i;
                        if (isset($set[$i])) {
                            $body .= <<<EOD
--{$y}
Content-Type: application/http
Content-Transfer-Encoding: binary
MIME-Version: 1.0
Content-ID:{$keys}
{$set[$i]}

EOD;
                        }
                    }
                    if ($body) {
                        $body .= "--" . $y . "--";
                        $destination['boundary'] = $y;
                        $insert = \Rest::postRaw('https://www.googleapis.com/batch', $body, $destination);
                    }
                }
            }
        }
        return $stats;
    }