]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
[Embed] Updated fixup_files.php script to be able to fix broken oEmbedinfo using...
authorMiguel Dantas <biodantasgs@gmail.com>
Sat, 13 Jul 2019 23:05:01 +0000 (00:05 +0100)
committerDiogo Cordeiro <diogo@fc.up.pt>
Sat, 3 Aug 2019 16:49:10 +0000 (17:49 +0100)
plugins/Embed/scripts/fixup_files.php

index cee01ccb5c40d8146ee4fdea008eb9e988ec7055..0697714b94ec5d80d9b6d491b27bd84c76758fe8 100755 (executable)
@@ -16,7 +16,7 @@
 // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * OembedPlugin implementation for GNU social
+ * EmbedPlugin implementation for GNU social
  *
  * @package   GNUsocial
  * @author    Mikael Nordfeldth
  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later
  */
 
-defined('GNUSOCIAL') || die();
+defined('GNUSOCIAL');
 
 define('INSTALLDIR', realpath(__DIR__ . '/../../..'));
 
-$longoptions = array('dry-run');
+$longoptions = ['dry-run', 'h-bug', 'broken-oembed', 'limit='];
 
 $helptext = <<<END_OF_USERROLE_HELP
 fixup_files.php [options]
-Patches up file entries with corrupted types and titles (the "h bug").
-
-     --dry-run  look but don't touch
+Patches attachments with broken oembed.
 
+     --dry-run       look but don't touch
+     --h-bug         Patches up file entries with corrupted types and titles (the "h bug")
+     --broken-oembed Attempts refecting info for broken attachments
+     --limit [date]  Only affect files from after this date. This is a timestamp, format is: yyyy-mm-dd (optional time hh:mm:ss may be provided)
 END_OF_USERROLE_HELP;
 
 require_once INSTALLDIR.'/scripts/commandline.inc';
 
 $dry = have_option('dry-run');
+$h_bug = have_option('h-bug');
+$broken = have_option('broken-oembed');
+$limit = get_option_value('limit');
+
+if (!($broken ^ $h_bug)) {
+    echo "Exactly one of --h-bug and --broken-oembed are required\n";
+    die();
+}
+
+$query = "
+    SELECT DISTINCT
+        file_to_post.file_id
+    FROM
+        file_to_post
+            INNER JOIN
+        file ON file.id = file_to_post.file_id
+            INNER JOIN
+        notice ON notice.id = file_to_post.post_id
+    WHERE";
 
 $f = new File();
-$f->title = 'h';
-$f->mimetype = 'h';
-$f->size = 0;
-$f->protected = 0;
-$f->find();
-echo "Found $f->N bad items:\n";
-
-while ($f->fetch()) {
-    echo "$f->id $f->url";
-
-    $data = File_redirection::lookupWhere($f->url);
-    if ($dry) {
-        if (is_array($data)) {
-            echo " (unchanged)\n";
-        } else {
-            echo " (unchanged, but embedding lookup failed)\n";
+if ($h_bug) {
+    $query .= " file.title = 'h'
+                AND file.mimetype = 'h'
+                AND file.size = 0
+                AND file.protected = 0";
+} elseif ($broken) {
+    $query .= " file.filename is NULL";
+}
+
+$query .= empty($limit) ? "" : " AND notice.modified >= '{$limit}' ORDER BY notice.modified ASC";
+
+// echo $query;
+
+$fn = new DB_DataObject();
+$fn->query($query);
+
+if ($h_bug) {
+    echo "Found {$fn->N} bad items:\n";
+} else {
+    echo "Found {$fn->N} files.\n";
+}
+
+while ($fn->fetch()) {
+    $f = File::getByID($fn->file_id);
+
+    try {
+        $data = File_embed::getByFile($f);
+    } catch (Exception $e) {
+        // Carry on
+    }
+
+    if ($broken && $data instanceof File_embed) {
+        try {
+            $thumb = File_thumbnail::byFile($f, true /* not null url */);
+            $thumb->getPath(); // Check we have the file
+        } catch (Exception $e) {
+            $no_thumb = true;
+            // Doesn't exist, no problem
         }
-    } else {
-        // NULL out the mime/title/size/protected fields
-        $sql = sprintf(
-            "UPDATE file " .
-                       "SET mimetype=null,title=null,size=null,protected=null " .
-                       "WHERE id=%d",
-            $f->id
-        );
-        $f->query($sql);
-        $f->decache();
-
-        if (is_array($data)) {
-            Event::handle('EndFileSaveNew', array($f, $data, $f->url));
-            echo " (ok)\n";
+    }
+
+
+    if ($h_bug) {
+        echo "ID: {$f->id}, URL {$f->url}";
+
+        if ($dry) {
+            if ($data instanceof File_embed) {
+                echo " (unchanged)\n";
+            } else {
+                echo " (unchanged, but embedding lookup failed)\n";
+            }
+        } elseif (!$dry) {
+            $sql = "UPDATE file " .
+                 "SET mimetype=null, title=null,size=null,protected=null " .
+                 "WHERE id={$f->id}";
+            $f->query($sql);
+            $f->decache();
+            if ($data instanceof File_embed) {
+                $fetch = true;
+                echo " (ok)\n";
+            } else {
+                echo " (ok, but embedding lookup failed)\n";
+            }
+        }
+
+    } elseif ($broken &&
+              (!$data instanceof File_embed ||
+               empty($data->title) ||
+               empty($f->title)
+               ||
+               ($thumb instanceof File_thumbnail && empty($thumb->filename))
+              )) {
+
+        // print_r($thumb);
+
+        if (!$dry) {
+            echo "Will refetch for file with ";
         } else {
-            echo " (ok, but embedding lookup failed)\n";
+            echo "Found broken file with ";
         }
+
+        echo "ID: {$f->id}, URL {$f->url}\n";
+        if (!$dry) {
+            $fetch = true;
+            $sql = "UPDATE file SET title=null, size=null, protected=null " .
+                 "WHERE id={$f->id}";
+            $f->query($sql);
+            $f->decache();
+
+            if ($data instanceof File_embed) {
+                $data->delete();
+                $data->decache();
+            }
+
+            if ($thumb instanceof File_thumbnail) {
+                // Delete all thumbnails, not just this one
+                $f->query("DELETE from file_thumbnail WHERE file_id = {$f->id}");
+                $thumb->decache();
+            }
+        }
+
+    }
+
+    if ($fetch === true && !$dry) {
+        $fetch = false;
+        echo "Attempting to fetch Embed data\n";
+        Event::handle('EndFileSaveNew', array($f));
     }
 }
 
-echo "done.\n";
+echo "Done.\n";