]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Twitter Import improvements. Still buggy?
authorMikael Nordfeldth <mmn@hethane.se>
Fri, 4 Oct 2013 11:36:45 +0000 (13:36 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Fri, 4 Oct 2013 11:36:45 +0000 (13:36 +0200)
Apparently mrvdb has problems with duplicate inserts and missing files when
unlinking. It could be due to coding, or it could be due to parallelizing.

classes/Avatar.php
lib/filenotfoundexception.php [new file with mode: 0644]
plugins/TwitterBridge/TwitterBridgePlugin.php
plugins/TwitterBridge/daemons/synctwitterfriends.php
plugins/TwitterBridge/daemons/twitterstatusfetcher.php
plugins/TwitterBridge/lib/twitterimport.php

index 29920a5f621ac9e9906353f40a7472286c211ba7..01d42f7406d65314f5dc981faa091e588735f4a2 100644 (file)
@@ -89,16 +89,13 @@ class Avatar extends Managed_DataObject
         if (!$avatar->find(true)) {
             throw new NoResultException($avatar);
         }
-        return $avatar;
-    }
-
-    public static function hasUploaded(Profile $profile) {
-        try {
-            $avatar = Avatar::getUploaded($profile);
-        } catch (NoResultException $e) {
-            return false;
+        if (!file_exists(Avatar::path($avatar->filename))) {
+            // The delete call may be odd for, say, unmounted filesystems
+            // that cause a file to currently not exist, but actually it does...
+            $avatar->delete();
+            throw new FileNotFoundException(Avatar::path($avatar->filename));
         }
-        return file_exists(Avatar::path($avatar->filename));
+        return $avatar;
     }
 
     public static function getProfileAvatars(Profile $target) {
diff --git a/lib/filenotfoundexception.php b/lib/filenotfoundexception.php
new file mode 100644 (file)
index 0000000..e7ea7bc
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Class for an exception when a database lookup returns no results
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Exception
+ * @package   GNUSocial
+ * @author    Mikael Nordfeldth <mmn@hethane.se>
+ * @copyright 2013 Free Software Foundation, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link      http://www.gnu.org/software/social/
+ */
+
+if (!defined('GNUSOCIAL')) { exit(1); }
+
+class FileNotFoundException extends ServerException
+{
+    public $path = null;
+
+    public function __construct($path)
+    {
+        $this->path = $path;
+        parent::__construct(_('File not found in filesystem.'), 404);
+    }
+}
index f11234b5e17f772a5cb72b19ed206d25ca6c0496..c513772baa3b67c8b5fb2e32520b64e2cdd5572f 100644 (file)
@@ -364,7 +364,7 @@ class TwitterBridgePlugin extends Plugin
 
         // For saving the last-synched status of various timelines
         // home_timeline, messages (in), messages (out), ...
-        $schema->ensureTable('twitter_synch_status', Twitter_sync_status::schemaDef());
+        $schema->ensureTable('twitter_synch_status', Twitter_synch_status::schemaDef());
 
         // For storing user-submitted flags on profiles
         $schema->ensureTable('notice_to_status', Notice_to_status::schemaDef());
index 3f1a8af6fb2ae915761f42596efb4494934f0421..651c4d34da145b59b2b74ebcd30c91cea559a6db 100755 (executable)
@@ -31,9 +31,7 @@ Batch script for synching local friends with Twitter friends.
 END_OF_TRIM_HELP;
 
 require_once INSTALLDIR . '/scripts/commandline.inc';
-require_once INSTALLDIR . '/lib/parallelizingdaemon.php';
 require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php';
 
 /**
  * Daemon to sync local friends with Twitter friends
index 6599058fd48239ab2da5f49d4edc4a322be82ff5..771544fcce1c0fb3147e99749c12ca5962592dba 100755 (executable)
@@ -40,7 +40,6 @@ require_once INSTALLDIR . '/scripts/commandline.inc';
 require_once INSTALLDIR . '/lib/common.php';
 require_once INSTALLDIR . '/lib/daemon.php';
 require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
-require_once INSTALLDIR . '/plugins/TwitterBridge/lib/twitteroauthclient.php';
 
 /**
  * Fetch statuses from Twitter
index eb58bc7373920302bfb457f1b78d4b957ed62ee9..d8b9f7a6bb6cb2ef0ee5347bd4986f0934aba221 100644 (file)
@@ -230,44 +230,19 @@ class TwitterImport
         $profile->profileurl = $profileurl;
         $profile->limit(1);
 
-        if (!$profile->find()) {
+        if (!$profile->find(true)) {
             throw new NoResultException($profile);
         }
-
-        $profile->fetch();
         return $profile;
     }
 
-    /**
-     * Check to see if this Twitter status has already been imported
-     *
-     * @param Profile $profile   Twitter user's local profile
-     * @param string  $statusUri URI of the status on Twitter
-     *
-     * @return mixed value a matching Notice or null
-     */
-    function checkDupe($profile, $statusUri)
-    {
-        $notice = new Notice();
-        $notice->uri = $statusUri;
-        $notice->profile_id = $profile->id;
-        $notice->limit(1);
-
-        if ($notice->find()) {
-            $notice->fetch();
-            return $notice;
-        }
-
-        return null;
-    }
-
     protected function ensureProfile($twuser)
     {
         // check to see if there's already a profile for this user
         $profileurl = 'http://twitter.com/' . $twuser->screen_name;
         try {
             $profile = $this->getProfileByUrl($twuser->screen_name, $profileurl);
-            $this->checkAvatar($twuser, $profile);
+            $this->updateAvatar($twuser, $profile);
             return $profile;
         } catch (NoResultException $e) {
             common_debug(__METHOD__ . ' - Adding profile and remote profile ' .
@@ -323,47 +298,45 @@ class TwitterImport
         return $profile;
     }
 
-    protected function checkAvatar($twuser, Profile $profile)
+    /*
+     * Checks whether we have to update the profile's avatar
+     *
+     * @return true when updated, false on failure, null when no action taken
+     */
+    protected function updateAvatar($twuser, Profile $profile)
     {
         $path_parts = pathinfo($twuser->profile_image_url);
         $ext        = isset($path_parts['extension'])
                         ? '.'.$path_parts['extension']
                         : '';  // some lack extension
         $img_root   = basename($path_parts['basename'], '_normal'.$ext);       // cut off extension
-        $newname = "Twitter_{$twuser->id}_{$img_root}_{$this->avatarsizename}{$ext}";
+        $filename   = "Twitter_{$twuser->id}_{$img_root}_{$this->avatarsizename}{$ext}";
 
         try {
             $avatar = Avatar::getUploaded($profile);
-            $oldname = $avatar->filename;
-            $avatar->free();
+            if ($avatar->filename === $filename) {
+                return null;
+            }
+            // else we continue with creating a new avatar
         } catch (Exception $e) {
-            $oldname = null;
+            // Avatar was not found. We can catch NoResultException or FileNotFoundException
+            // but generally we just want to continue creating a new avatar.
         }
         
-        if ($newname != $oldname || !Avatar::hasUploaded($profile)) {
-            common_debug(__METHOD__ . " - Avatar for {$profile->nickname} has changed.");
-            $this->updateAvatar($twuser, $profile);
-        }
-    }
-
-    protected function updateAvatar($twuser, Profile $profile)
-    {
-        $path_parts = pathinfo($twuser->profile_image_url);
-        $ext        = isset($path_parts['extension'])
-                        ? '.'.$path_parts['extension']
-                        : '';  // some lack extension
-        $img_root   = basename($path_parts['basename'], '_normal'.$ext);       // cut off extension
         $url        = "{$path_parts['dirname']}/{$img_root}_{$this->avatarsizename}{$ext}";
-        $filename   = "Twitter_{$twuser->id}_{$img_root}_{$this->avatarsizename}{$ext}";
-        $mediatype  = $this->getMediatype(substr($ext, 1));
+        $mediatype  = $this->getMediatype(mb_substr($ext, 1));
 
         try {
+            common_debug(__METHOD__ . " - Updating profile avatar (profile_id={$profile->id} to {$filename}");
             $this->newAvatar($profile, $url, $filename, $mediatype);
         } catch (Exception $e) {
             if (file_exists(Avatar::path($filename))) {
                 unlink(Avatar::path($filename));
             }
+            return false;
         }
+
+        return true;
     }
 
     protected function getMediatype($ext)