/** * DOCUMENT ME * @param mixed $arguments * @param mixed $options */ protected function execute($arguments = array(), $options = array()) { // We need a basic context so we can call helpers to format text $context = sfContext::createInstance($this->configuration); // initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection(); // PDO connection not so useful, get the doctrine one $conn = Doctrine_Manager::connection(); $accounts = Doctrine::getTable('aEmbedMediaAccount')->findAll(); foreach ($accounts as $a) { $perPage = 50; $service = aMediaTools::getEmbedService($a->service); if (!$service) { // An account for a service that has been deconfigured continue; } $total = null; $page = 1; $serviceUrls = array(); while (true) { $results = $service->browseUser($a->username, $page, $perPage); if ($results === false) { // We hit the rate limit, the account is bad, etc. Just // be tolerant and retry later. Would be nice to distinguish // these cases but it's not that hard to figure out an // account is gone break; } foreach ($results['results'] as $result) { $serviceUrls[] = $result['url']; } // We hit the end of the results for this user if (!count($results['results'])) { break; } $page++; } if (count($serviceUrls)) { $existingServiceUrls = Doctrine::getTable('aMediaItem')->createQuery('m')->select('m.service_url')->andWhereIn('m.service_url', $serviceUrls)->execute(array(), Doctrine::HYDRATE_SINGLE_SCALAR); } else { $existingServiceUrls = array(); } $existingServiceUrls = array_flip($existingServiceUrls); foreach ($serviceUrls as $serviceUrl) { if (!isset($existingServiceUrls[$serviceUrl])) { // If Doctrine becomes a performance problem I could use PDO // and set lucene_dirty to let that clean itself up later $id = $service->getIdFromUrl($serviceUrl); $info = $service->getInfo($id); if (!$info) { // We are not actually allowed meaningful access to this video. Password protected for example continue; } $item = new aMediaItem(); $item->setTitle($info['title']); // We want tags to be lower case, and slashes break routes in most server configs. $info['tags'] = str_replace('/', '-', aString::strtolower($info['tags'])); $item->setTags($info['tags']); $item->setDescription(aHtml::textToHtml($info['description'])); $item->setCredit($info['credit']); $item->setServiceUrl($info['url']); $item->setType($service->getType()); // The dance is this: get the thumbnail if there is one; // call preSaveFile to learn the width, height and format // before saving; save; and then saveFile to copy it to a // filename based on the slug, which is unknown until after save $thumbnail = $service->getThumbnail($id); if ($thumbnail) { // Grab a local copy of the thumbnail, and get the pain // over with all at once in a predictable way if // the service provider fails to give it to us. $thumbnailCopy = aFiles::getTemporaryFilename(); if (copy($thumbnail, $thumbnailCopy)) { $item->preSaveFile($thumbnailCopy); } } $item->save(); if ($thumbnail) { $item->saveFile($thumbnailCopy); } $item->free(); } } } }
/** * Finds or adds a video without the overhead of a proper Doctrine save. * @param array $info * @return mixed */ protected function findOrAddVideo($info) { $mediaId = null; $slug = null; if (!isset($info['title'])) { $info['title'] = 'Imported video'; } $slug = aTools::slugify(!empty($info['title']) ? $info['title'] : (!empty($info['service_url']) ? $info['service_url'] : md5($info['embed']))); $result = $this->sql->query('SELECT id FROM a_media_item WHERE slug = :slug', array('slug' => $slug)); if (isset($result[0]['id'])) { $mediaId = $result[0]['id']; } else { $mediaItem = new aMediaItem(); foreach ($info as $key => $value) { if ($key !== 'tags') { $mediaItem[$key] = $value; } } if (empty($mediaItem['title'])) { $mediaItem->setTitle($slug); } else { $mediaItem->setTitle($info['title']); } $mediaItem->setSlug($slug); $mediaItem->setType('video'); if ($mediaItem->service_url) { $service = aMediaTools::getEmbedService($mediaItem->service_url); $id = $service->getIdFromUrl($mediaItem->service_url); if ($service->supports('thumbnail')) { $filename = $service->getThumbnail($id); if ($filename) { // saveFile can't handle a nonlocal file directly, so // copy to a temporary file first $bad = isset($this->failedMedia[$filename]); if (!$bad) { $tmpFile = aFiles::getTemporaryFilename(); try { if (!copy($filename, $tmpFile)) { throw new sfException(sprintf('Could not copy file: %s', $src)); } if (!$mediaItem->saveFile($tmpFile)) { throw new sfException(sprintf('Could not save file: %s', $src)); } } catch (Exception $e) { $this->failedMedia[$filename] = true; } unlink($tmpFile); } } } } $this->sql->fastSaveMediaItem($mediaItem); if (count($info['tags'])) { $this->sql->fastSaveTags('aMediaItem', $mediaItem->id, $info['tags']); } $mediaId = $mediaItem->id; $mediaItem->free(true); } return $mediaId; }