Browse Source

Merge pull request #4726 from paulexyz/insta-import-utf8

fix: Instagram import broken UTF8 characters
daniel 1 year ago
parent
commit
e6301bfa51
1 changed files with 14 additions and 4 deletions
  1. 14 4
      resources/assets/components/AccountImport.vue

+ 14 - 4
resources/assets/components/AccountImport.vue

@@ -348,8 +348,16 @@
                 }, 500);
             },
 
+			// Facebook and Instagram are encoding UTF8 characters in a weird way in their json
+			// here is a good explanation what's going wrong https://sorashi.github.io/fix-facebook-json-archive-encoding
+			fixFacebookEncoding(string) {
+				const replaced = string.replace(/\\u00([a-f0-9]{2})/g, (x) => String.fromCharCode(parseInt(x.slice(2), 16)));
+				const buffer = Array.from(replaced, (c) => c.charCodeAt(0));
+				return new TextDecoder().decode(new Uint8Array(buffer));
+			},
+
             filterPostMeta(media) {
-                let json = JSON.parse(media);
+                let json = JSON.parse(this.fixFacebookEncoding(media));
                 let res = json.filter(j => {
                     let ids = j.media.map(m => m.uri).filter(m => {
                         if(this.config.allow_video_posts == true) {
@@ -396,12 +404,14 @@
                     this.filterPostMeta(media);
 
                     let imgs = await Promise.all(entries.filter(entry => {
-                        return entry.filename.startsWith('media/posts/') && (entry.filename.endsWith('.png') || entry.filename.endsWith('.jpg') || entry.filename.endsWith('.mp4'));
+                        return (entry.filename.startsWith('media/posts/') || entry.filename.startsWith('media/other/')) && (entry.filename.endsWith('.png') || entry.filename.endsWith('.jpg') || entry.filename.endsWith('.mp4'));
                     })
                     .map(async entry => {
                         if(
-                            entry.filename.startsWith('media/posts/') &&
-                            (
+							(
+								entry.filename.startsWith('media/posts/') ||
+								entry.filename.startsWith('media/other/')
+							) && (
                                 entry.filename.endsWith('.png') ||
                                 entry.filename.endsWith('.jpg') ||
                                 entry.filename.endsWith('.mp4')