123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- <?php
- if (!defined('GNUSOCIAL')) { exit(1); }
- class OembedAction extends Action
- {
- protected function handle()
- {
- parent::handle();
- $url = $this->trimmed('url');
- if (substr(strtolower($url),0,strlen(common_root_url())) !== strtolower(common_root_url())) {
-
- $this->clientError(sprintf(_('oEmbed data will only be provided for %s URLs.'), common_root_url()), 400);
- }
- $path = substr($url,strlen(common_root_url()));
- $r = Router::get();
- $proxy_args = $r->map($path);
- if (!$proxy_args) {
-
-
- $this->clientError(sprintf(_('"%s" not found.'),$path), 404);
- }
- $oembed=array();
- $oembed['version']='1.0';
- $oembed['provider_name']=common_config('site', 'name');
- $oembed['provider_url']=common_root_url();
- switch ($proxy_args['action']) {
- case 'shownotice':
- $oembed['type']='link';
- $id = $proxy_args['notice'];
- $notice = Notice::getKV($id);
- if(empty($notice)){
-
-
- $this->clientError(sprintf(_("Notice %s not found."),$id), 404);
- }
- $profile = $notice->getProfile();
- if (empty($profile)) {
-
- $this->serverError(_('Notice has no profile.'), 500);
- }
- $authorname = $profile->getFancyName();
-
- $oembed['title'] = sprintf(_('%1$s\'s status on %2$s'),
- $authorname,
- common_exact_date($notice->created));
- $oembed['author_name']=$authorname;
- $oembed['author_url']=$profile->profileurl;
- $oembed['url']=$notice->getUrl();
- $oembed['html']=$notice->getRendered();
-
- $attachments = $notice->attachments();
- if (!empty($attachments)) {
- foreach ($attachments as $attachment) {
- if(is_object($attachment)) {
- try {
- $thumb = $attachment->getThumbnail();
- } catch (ServerException $e) {
-
- }
- try {
- $thumb_url = File_thumbnail::url($thumb->filename);
- $oembed['thumbnail_url'] = $thumb_url;
- break;
- } catch (ClientException $e) {
-
- }
- }
- }
- }
-
- break;
- case 'attachment':
- $id = $proxy_args['attachment'];
- $attachment = File::getKV($id);
- if(empty($attachment)){
-
-
- $this->clientError(sprintf(_('Attachment %s not found.'),$id), 404);
- }
- if (empty($attachment->filename) && $file_oembed = File_oembed::getKV('file_id', $attachment->id)) {
-
- $oembed['type']=$file_oembed->type;
- $oembed['provider']=$file_oembed->provider;
- $oembed['provider_url']=$file_oembed->provider_url;
- $oembed['width']=$file_oembed->width;
- $oembed['height']=$file_oembed->height;
- $oembed['html']=$file_oembed->html;
- $oembed['title']=$file_oembed->title;
- $oembed['author_name']=$file_oembed->author_name;
- $oembed['author_url']=$file_oembed->author_url;
- $oembed['url']=$file_oembed->getUrl();
- } elseif (substr($attachment->mimetype,0,strlen('image/'))==='image/') {
- $oembed['type']='photo';
- if ($attachment->filename) {
- $filepath = File::path($attachment->filename);
- $gis = @getimagesize($filepath);
- if ($gis) {
- $oembed['width'] = $gis[0];
- $oembed['height'] = $gis[1];
- } else {
-
- }
- }
- $oembed['url']=$attachment->getUrl();
- try {
- $thumb = $attachment->getThumbnail();
- $oembed['thumbnail_url'] = $thumb->getUrl();
- $oembed['thumbnail_width'] = $thumb->width;
- $oembed['thumbnail_height'] = $thumb->height;
- unset($thumb);
- } catch (UnsupportedMediaException $e) {
-
- }
- } else {
- $oembed['type']='link';
- $oembed['url']=common_local_url('attachment',
- array('attachment' => $attachment->id));
- }
- if ($attachment->title) {
- $oembed['title']=$attachment->title;
- }
- break;
- default:
-
-
- $this->serverError(sprintf(_('"%s" not supported for oembed requests.'),$path), 501);
- }
- switch ($this->trimmed('format')) {
- case 'xml':
- $this->init_document('xml');
- $this->elementStart('oembed');
- foreach(array(
- 'version', 'type', 'provider_name',
- 'provider_url', 'title', 'author_name',
- 'author_url', 'url', 'html', 'width',
- 'height', 'cache_age', 'thumbnail_url',
- 'thumbnail_width', 'thumbnail_height',
- ) as $key) {
- if (isset($oembed[$key]) && $oembed[$key]!='') {
- $this->element($key, null, $oembed[$key]);
- }
- }
- $this->elementEnd('oembed');
- $this->end_document('xml');
- break;
- case 'json':
- case null:
- $this->init_document('json');
- $this->raw(json_encode($oembed));
- $this->end_document('json');
- break;
- default:
-
- $this->serverError(sprintf(_('Content type %s not supported.'), $apidata['content-type']), 501);
- }
- }
- public function init_document($type)
- {
- switch ($type) {
- case 'xml':
- header('Content-Type: application/xml; charset=utf-8');
- $this->startXML();
- break;
- case 'json':
- header('Content-Type: application/json; charset=utf-8');
-
- $callback = $this->arg('callback');
- if ($callback) {
- print $callback . '(';
- }
- break;
- default:
-
- $this->serverError(_('Not a supported data format.'), 501);
- break;
- }
- }
- public function end_document($type)
- {
- switch ($type) {
- case 'xml':
- $this->endXML();
- break;
- case 'json':
-
- $callback = $this->arg('callback');
- if ($callback) {
- print ')';
- }
- break;
- default:
-
- $this->serverError(_('Not a supported data format.'), 501);
- break;
- }
- return;
- }
-
- function isReadOnly($args)
- {
- return true;
- }
- }
|