summaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
Diffstat (limited to 'classes')
-rw-r--r--classes/File.php44
-rw-r--r--classes/File_oembed.php28
-rw-r--r--classes/File_redirection.php21
-rw-r--r--classes/File_thumbnail.php41
-rw-r--r--classes/Notice.php29
-rw-r--r--classes/Profile.php23
-rw-r--r--classes/User.php7
7 files changed, 159 insertions, 34 deletions
diff --git a/classes/File.php b/classes/File.php
index 16e00024a..ef9dbf14a 100644
--- a/classes/File.php
+++ b/classes/File.php
@@ -116,10 +116,24 @@ class File extends Memcached_DataObject
}
/**
+ * Go look at a URL and possibly save data about it if it's new:
+ * - follow redirect chains and store them in file_redirection
+ * - look up oEmbed data and save it in file_oembed
+ * - if a thumbnail is available, save it in file_thumbnail
+ * - save file record with basic info
+ * - optionally save a file_to_post record
+ * - return the File object with the full reference
+ *
* @fixme refactor this mess, it's gotten pretty scary.
- * @param bool $followRedirects
+ * @param string $given_url the URL we're looking at
+ * @param int $notice_id (optional)
+ * @param bool $followRedirects defaults to true
+ *
+ * @return mixed File on success, -1 on some errors
+ *
+ * @throws ServerException on some errors
*/
- function processNew($given_url, $notice_id=null, $followRedirects=true) {
+ public function processNew($given_url, $notice_id=null, $followRedirects=true) {
if (empty($given_url)) return -1; // error, no url to process
$given_url = File_redirection::_canonUrl($given_url);
if (empty($given_url)) return -1; // error, no url to process
@@ -352,22 +366,28 @@ class File extends Memcached_DataObject
$mimetype = substr($mimetype,0,$semicolon);
}
if(in_array($mimetype,$notEnclosureMimeTypes)){
+ // Never treat generic HTML links as an enclosure type!
+ // But if we have oEmbed info, we'll consider it golden.
$oembed = File_oembed::staticGet('file_id',$this->id);
- if($oembed){
+ if($oembed && in_array($oembed->type, array('photo', 'video'))){
$mimetype = strtolower($oembed->mimetype);
$semicolon = strpos($mimetype,';');
if($semicolon){
$mimetype = substr($mimetype,0,$semicolon);
}
- if(in_array($mimetype,$notEnclosureMimeTypes)){
- return false;
- }else{
+ // @fixme uncertain if this is right.
+ // we want to expose things like YouTube videos as
+ // viewable attachments, but don't expose them as
+ // downloadable enclosures.....?
+ //if (in_array($mimetype, $notEnclosureMimeTypes)) {
+ // return false;
+ //} else {
if($oembed->mimetype) $enclosure->mimetype=$oembed->mimetype;
if($oembed->url) $enclosure->url=$oembed->url;
if($oembed->title) $enclosure->title=$oembed->title;
if($oembed->modified) $enclosure->modified=$oembed->modified;
unset($oembed->size);
- }
+ //}
} else {
return false;
}
@@ -382,4 +402,14 @@ class File extends Memcached_DataObject
$enclosure = $this->getEnclosure();
return !empty($enclosure);
}
+
+ /**
+ * Get the attachment's thumbnail record, if any.
+ *
+ * @return File_thumbnail
+ */
+ function getThumbnail()
+ {
+ return File_thumbnail::staticGet('file_id', $this->id);
+ }
}
diff --git a/classes/File_oembed.php b/classes/File_oembed.php
index 4813d5dda..b7bf3a5da 100644
--- a/classes/File_oembed.php
+++ b/classes/File_oembed.php
@@ -58,26 +58,16 @@ class File_oembed extends Memcached_DataObject
return array(false, false, false);
}
- function _getOembed($url, $maxwidth = 500, $maxheight = 400) {
- require_once INSTALLDIR.'/extlib/Services/oEmbed.php';
+ function _getOembed($url) {
$parameters = array(
- 'maxwidth'=>$maxwidth,
- 'maxheight'=>$maxheight,
+ 'maxwidth' => common_config('attachments', 'thumb_width'),
+ 'maxheight' => common_config('attachments', 'thumb_height'),
);
- try{
- $oEmbed = new Services_oEmbed($url);
- $object = $oEmbed->getObject($parameters);
- return $object;
- }catch(Exception $e){
- try{
- $oEmbed = new Services_oEmbed($url, array(
- Services_oEmbed::OPTION_API => common_config('oohembed', 'endpoint')
- ));
- $object = $oEmbed->getObject($parameters);
- return $object;
- }catch(Exception $ex){
- return false;
- }
+ try {
+ return oEmbedHelper::getObject($url, $parameters);
+ } catch (Exception $e) {
+ common_log(LOG_ERR, "Error during oembed lookup for $url - " . $e->getMessage());
+ return false;
}
}
@@ -120,7 +110,7 @@ class File_oembed extends Memcached_DataObject
}
}
$file_oembed->insert();
- if (!empty($data->thumbnail_url)) {
+ if (!empty($data->thumbnail_url) || ($data->type == 'photo')) {
$ft = File_thumbnail::staticGet('file_id', $file_id);
if (!empty($ft)) {
common_log(LOG_WARNING, "Strangely, a File_thumbnail object exists for new file $file_id",
diff --git a/classes/File_redirection.php b/classes/File_redirection.php
index 68fed77e8..1976e3439 100644
--- a/classes/File_redirection.php
+++ b/classes/File_redirection.php
@@ -91,9 +91,16 @@ class File_redirection extends Memcached_DataObject
$request->setMethod(HTTP_Request2::METHOD_HEAD);
$response = $request->send();
- if (405 == $response->getStatus()) {
+ if (405 == $response->getStatus() || 204 == $response->getStatus()) {
+ // HTTP 405 Unsupported Method
// Server doesn't support HEAD method? Can this really happen?
// We'll try again as a GET and ignore the response data.
+ //
+ // HTTP 204 No Content
+ // YFrog sends 204 responses back for our HEAD checks, which
+ // seems like it may be a logic error in their servers. If
+ // we get a 204 back, re-run it as a GET... if there's really
+ // no content it'll be cheap. :)
$request = self::_commonHttp($short_url, $redirs);
$response = $request->send();
}
@@ -235,6 +242,18 @@ class File_redirection extends Memcached_DataObject
return null;
}
+ /**
+ * Basic attempt to canonicalize a URL, cleaning up some standard variants
+ * such as funny syntax or a missing path. Used internally when cleaning
+ * up URLs for storage and following redirect chains.
+ *
+ * Note that despite being on File_redirect, this function DOES NOT perform
+ * any dereferencing of redirects.
+ *
+ * @param string $in_url input URL
+ * @param string $default_scheme if given a bare link; defaults to 'http://'
+ * @return string
+ */
function _canonUrl($in_url, $default_scheme = 'http://') {
if (empty($in_url)) return false;
$out_url = $in_url;
diff --git a/classes/File_thumbnail.php b/classes/File_thumbnail.php
index edae8ac21..17bac7f08 100644
--- a/classes/File_thumbnail.php
+++ b/classes/File_thumbnail.php
@@ -48,12 +48,45 @@ class File_thumbnail extends Memcached_DataObject
return array(false, false, false);
}
- function saveNew($data, $file_id) {
+ /**
+ * Save oEmbed-provided thumbnail data
+ *
+ * @param object $data
+ * @param int $file_id
+ */
+ public static function saveNew($data, $file_id) {
+ if (!empty($data->thumbnail_url)) {
+ // Non-photo types such as video will usually
+ // show us a thumbnail, though it's not required.
+ self::saveThumbnail($file_id,
+ $data->thumbnail_url,
+ $data->thumbnail_width,
+ $data->thumbnail_height);
+ } else if ($data->type == 'photo') {
+ // The inline photo URL given should also fit within
+ // our requested thumbnail size, per oEmbed spec.
+ self::saveThumbnail($file_id,
+ $data->url,
+ $data->width,
+ $data->height);
+ }
+ }
+
+ /**
+ * Save a thumbnail record for the referenced file record.
+ *
+ * @param int $file_id
+ * @param string $url
+ * @param int $width
+ * @param int $height
+ */
+ static function saveThumbnail($file_id, $url, $width, $height)
+ {
$tn = new File_thumbnail;
$tn->file_id = $file_id;
- $tn->url = $data->thumbnail_url;
- $tn->width = intval($data->thumbnail_width);
- $tn->height = intval($data->thumbnail_height);
+ $tn->url = $url;
+ $tn->width = intval($width);
+ $tn->height = intval($height);
$tn->insert();
}
}
diff --git a/classes/Notice.php b/classes/Notice.php
index eff0d3251..85c7dabea 100644
--- a/classes/Notice.php
+++ b/classes/Notice.php
@@ -1611,6 +1611,35 @@ class Notice extends Memcached_DataObject
Event::handle('EndActivityGeo', array(&$this, &$xs, $lat, $lon));
}
+ // @fixme check this logic
+
+ if ($this->isLocal()) {
+
+ $selfUrl = common_local_url('ApiStatusesShow', array('id' => $this->id,
+ 'format' => 'atom'));
+
+ if (Event::handle('StartActivityRelSelf', array(&$this, &$xs, &$selfUrl))) {
+ $xs->element('link', array('rel' => 'self',
+ 'type' => 'application/atom+xml',
+ 'href' => $selfUrl));
+ Event::handle('EndActivityRelSelf', array(&$this, &$xs, $selfUrl));
+ }
+
+ if (!empty($cur) && $cur->id == $this->profile_id) {
+
+ // note: $selfUrl may have been changed by a plugin
+ $relEditUrl = common_local_url('ApiStatusesShow', array('id' => $this->id,
+ 'format' => 'atom'));
+
+ if (Event::handle('StartActivityRelEdit', array(&$this, &$xs, &$relEditUrl))) {
+ $xs->element('link', array('rel' => 'edit',
+ 'type' => 'application/atom+xml',
+ 'href' => $relEditUrl));
+ Event::handle('EndActivityRelEdit', array(&$this, &$xs, $relEditUrl));
+ }
+ }
+ }
+
if (Event::handle('StartActivityEnd', array(&$this, &$xs))) {
$xs->elementEnd('entry');
Event::handle('EndActivityEnd', array(&$this, &$xs));
diff --git a/classes/Profile.php b/classes/Profile.php
index d580e1235..3ea95ab01 100644
--- a/classes/Profile.php
+++ b/classes/Profile.php
@@ -494,6 +494,29 @@ class Profile extends Memcached_DataObject
return $cnt;
}
+ /**
+ * Is this profile subscribed to another profile?
+ *
+ * @param Profile $other
+ * @return boolean
+ */
+ function isSubscribed($other)
+ {
+ return Subscription::exists($this, $other);
+ }
+
+ /**
+ * Are these two profiles subscribed to each other?
+ *
+ * @param Profile $other
+ * @return boolean
+ */
+ function mutuallySubscribed($other)
+ {
+ return $this->isSubscribed($other) &&
+ $other->isSubscribed($this);
+ }
+
function hasFave($notice)
{
$cache = common_memcache();
diff --git a/classes/User.php b/classes/User.php
index 7345dc7f9..964bc3e7f 100644
--- a/classes/User.php
+++ b/classes/User.php
@@ -84,7 +84,8 @@ class User extends Memcached_DataObject
function isSubscribed($other)
{
- return Subscription::exists($this->getProfile(), $other);
+ $profile = $this->getProfile();
+ return $profile->isSubscribed($other);
}
// 'update' won't write key columns, so we have to do it ourselves.
@@ -418,8 +419,8 @@ class User extends Memcached_DataObject
function mutuallySubscribed($other)
{
- return $this->isSubscribed($other) &&
- $other->isSubscribed($this);
+ $profile = $this->getProfile();
+ return $profile->mutuallySubscribed($other);
}
function mutuallySubscribedUsers()