소스 검색

tweak gifski, fix regex, edit clash, error catch

Mike L 3 년 전
부모
커밋
37e084ab5c
6개의 변경된 파일94개의 추가작업 그리고 80개의 파일을 삭제
  1. 7 3
      dist/gifski.js
  2. 5 6
      dist/twitter.js
  3. 36 32
      dist/wiki.js
  4. 7 3
      src/gifski.ts
  5. 5 6
      src/twitter.ts
  6. 34 30
      src/wiki.ts

+ 7 - 3
dist/gifski.js

@@ -13,20 +13,24 @@ const child_process_1 = require("child_process");
 const fs_1 = require("fs");
 const loggers_1 = require("./loggers");
 const logger = (0, loggers_1.getLogger)('gifski');
-const sizeLimit = +Infinity;
+const sizeLimit = 8000000;
 const roundToEven = (n) => Math.ceil(n / 2) * 2;
 exports.default = (inputFilePath, targetWidth) => __awaiter(void 0, void 0, void 0, function* () {
     const outputFilePath = inputFilePath.replace(/(?:\.[^.]*)?$/, '.gif');
+    if ((0, fs_1.existsSync)(outputFilePath) && (0, fs_1.statSync)(outputFilePath).size > 0) {
+        logger.info(`converted gif exists, skipping conversion...`);
+        return outputFilePath;
+    }
     try {
         const args = [
             inputFilePath,
             '-o',
             outputFilePath,
             '--fps',
-            '14.985',
+            '11.988',
             '--quiet',
             '--quality',
-            '96',
+            '95',
         ];
         if (typeof (targetWidth) === 'number') {
             args.push('--width', roundToEven(targetWidth).toString());

+ 5 - 6
dist/twitter.js

@@ -23,7 +23,7 @@ exports.keywordMap = {
     '(?<!今後の)アップデート情報': '改修',
 };
 exports.recurringKeywords = [
-    '(育成応援|お仕事).*開催', 'イベント開催決定', 'ガチャ',
+    '(育成応援|お仕事).*開催', 'イベント開催決定', 'ガチャ$',
     'アップデート情報', 'キャラクター紹介',
     '(生放送|配信)予告', 'メンテナンス予告'
 ];
@@ -120,10 +120,9 @@ class default_1 {
                     updateDate();
                     return;
                 }
-                const topOfFeed = tweets[0].id_str;
-                const updateOffset = () => lock.offset = topOfFeed;
+                const updateOffset = (offset) => lock.offset = offset;
                 if (lock.offset === '-1') {
-                    updateOffset();
+                    updateOffset(tweets[0].id_str);
                     return;
                 }
                 if (lock.offset === '0')
@@ -145,10 +144,10 @@ class default_1 {
                                     const message = `已更新如下页面:${(0, exports.parseAction)(action)}`;
                                     return Promise.all(this.lock.subscribers.map(subscriber => this.bot.sendTo(subscriber, message)));
                                 }
-                            });
+                            }).then(updateDate).then(() => updateOffset(tweet.id_str));
                         }
                     }
-                })).then(updateDate).then(updateOffset);
+                }));
             })
                 .then(() => {
                 let timeout = this.workInterval * 1000;

+ 36 - 32
dist/wiki.js

@@ -70,7 +70,7 @@ class default_1 {
                     const mediaFileName = `${filename}.${ext}`;
                     (0, fs_1.writeFileSync)(mediaFileName, Buffer.from(data));
                     return (ext === 'mp4' ?
-                        (0, gifski_1.default)(mediaFileName, 640) :
+                        (0, gifski_1.default)(mediaFileName, 320) :
                         Promise.resolve(mediaFileName));
                 }
                 logger.warn('unable to find MIME type of fetched media, failing this fetch');
@@ -117,11 +117,13 @@ class default_1 {
         };
         this.appendMedia = (tweet, genre, indexOffset) => {
             const { pageTitle } = (0, twitter_1.processTweetBody)(tweet);
-            return this.uploadMediaItems(tweet, `公告-${genre}-${pageTitle}-`, indexOffset)
+            const pageLongTitle = `公告/${pageTitle}`;
+            const mediaFilePrefix = `公告-${genre}-${pageTitle}-`;
+            return this.uploadMediaItems(tweet, mediaFilePrefix, indexOffset)
                 .then(fileNames => {
-                logger.info(`updating page 公告/${pageTitle}...`);
+                logger.info(`updating page ${pageLongTitle}...`);
                 return this.bot.edit({
-                    title: `公告/${pageTitle}`,
+                    title: pageLongTitle,
                     appendtext: `${fileNames.map(fileName => `[[文件:${fileName}|无框|左]]\n`).join('')}`,
                     bot: true,
                     notminor: true,
@@ -134,30 +136,32 @@ class default_1 {
                     mediafiles: fileNames,
                     result,
                     timestamp: new Date(newtimestamp).toString(),
-                }))
-                    .catch(error => {
-                    logger.error(`error updating page, error: ${error}`);
-                    return {
-                        pageid: undefined,
-                        title: `公告/${pageTitle}`,
-                        new: undefined,
-                        mediafiles: [],
-                        result: 'Failed',
-                        timestamp: undefined,
-                    };
-                });
+                }));
+            })
+                .catch(error => {
+                logger.error(`error updating page, error: ${error}`);
+                return {
+                    pageid: undefined,
+                    title: pageLongTitle,
+                    new: undefined,
+                    mediafiles: [],
+                    result: 'Failed',
+                    timestamp: undefined,
+                };
             });
         };
         this.post = (tweet, genre) => {
             const { title, body, pageTitle, date } = (0, twitter_1.processTweetBody)(tweet);
-            const sameTitleAction = this.lock.lastActions.find(action => action.title === title);
+            const pageLongTitle = `公告/${pageTitle}`;
+            const mediaFilePrefix = `公告-${genre}-${pageTitle}-`;
+            const sameTitleAction = this.lock.lastActions.find(action => action.title === pageLongTitle);
             if (sameTitleAction)
                 return this.appendMedia(tweet, genre, sameTitleAction.mediafiles.length);
-            return this.uploadMediaItems(tweet, `公告-${genre}-${pageTitle}-`)
+            return this.uploadMediaItems(tweet, mediaFilePrefix)
                 .then(fileNames => {
-                logger.info(`creating page 公告/${pageTitle}...`);
+                logger.info(`creating page ${pageLongTitle}`);
                 return this.bot.edit({
-                    title: `公告/${pageTitle}`,
+                    title: pageLongTitle,
                     basetimestamp: new Date(),
                     text: `{{文章戳
 |文章上级页面=公告
@@ -185,18 +189,18 @@ ${fileNames.map(fileName => `[[文件:${fileName}|无框|左]]`).join('\n')}
                     mediafiles: fileNames,
                     result,
                     timestamp: new Date(newtimestamp).toString(),
-                }))
-                    .catch(error => {
-                    logger.error(`error creating page, error: ${error}`);
-                    return {
-                        pageid: undefined,
-                        title: `公告/${pageTitle}`,
-                        new: undefined,
-                        mediafiles: [],
-                        result: 'Failed',
-                        timestamp: undefined,
-                    };
-                });
+                }));
+            })
+                .catch(error => {
+                logger.error(`error creating page, error: ${error}`);
+                return {
+                    pageid: undefined,
+                    title: pageLongTitle,
+                    new: undefined,
+                    mediafiles: [],
+                    result: 'Failed',
+                    timestamp: undefined,
+                };
             });
         };
         this.bot = new mediawiki2_1.MWBot(`${baseUrl}/api.php`);

+ 7 - 3
src/gifski.ts

@@ -5,21 +5,25 @@ import { getLogger } from './loggers';
 
 const logger = getLogger('gifski');
 
-const sizeLimit = +Infinity;
+const sizeLimit = 8000000;
 const roundToEven = (n: number) => Math.ceil(n / 2) * 2;
 
 export default async (inputFilePath: string, targetWidth?: number) => {
   const outputFilePath = inputFilePath.replace(/(?:\.[^.]*)?$/, '.gif')
+  if (existsSync(outputFilePath) && statSync(outputFilePath).size > 0) {
+    logger.info(`converted gif exists, skipping conversion...`);
+    return outputFilePath;
+  }
   try {
     const args = [
       inputFilePath,
       '-o',
       outputFilePath,
       '--fps',
-      '14.985',
+      '11.988',
       '--quiet',
       '--quality',
-      '96',
+      '95',
     ];
     if (typeof(targetWidth) === 'number') {
       args.push('--width', roundToEven(targetWidth).toString());

+ 5 - 6
src/twitter.ts

@@ -46,7 +46,7 @@ export const keywordMap = {
 };
 
 export const recurringKeywords = [
-  '(育成応援|お仕事).*開催', 'イベント開催決定', 'ガチャ',
+  '(育成応援|お仕事).*開催', 'イベント開催決定', 'ガチャ$',
   'アップデート情報', 'キャラクター紹介',
   '(生放送|配信)予告', 'メンテナンス予告'
 ];
@@ -184,10 +184,9 @@ export default class {
       const updateDate = () => lock.updatedAt = new Date().toString();
       if (tweets.length === 0) { updateDate(); return; }
 
-      const topOfFeed = tweets[0].id_str;
-      const updateOffset = () => lock.offset = topOfFeed;
+      const updateOffset = (offset: string) => lock.offset = offset;
 
-      if (lock.offset === '-1') { updateOffset(); return; }
+      if (lock.offset === '-1') { updateOffset(tweets[0].id_str); return; }
       if (lock.offset === '0') tweets.splice(1);
 
       return chainPromises(tweets.reverse().map(tweet => () => {
@@ -208,10 +207,10 @@ export default class {
                     this.lock.subscribers.map(subscriber => this.bot.sendTo(subscriber, message))
                   );
                 }
-              });
+              }).then(updateDate).then(() => updateOffset(tweet.id_str));
           }
         }
-      })).then(updateDate).then(updateOffset);
+      }));
     })
       .then(() => {
         let timeout = this.workInterval * 1000;

+ 34 - 30
src/wiki.ts

@@ -83,7 +83,7 @@ export default class {
           const mediaFileName = `${filename}.${ext}`;
           writeFileSync(mediaFileName, Buffer.from(data));
           return (ext === 'mp4' ?
-            gifski(mediaFileName, 640) :
+            gifski(mediaFileName, 320) :
             Promise.resolve(mediaFileName)
           );
         }
@@ -129,11 +129,13 @@ export default class {
 
     public appendMedia = (tweet: Tweet, genre: string, indexOffset: number): Promise<WikiEditResult> => {
       const {pageTitle} = processTweetBody(tweet);
-      return this.uploadMediaItems(tweet, `公告-${genre}-${pageTitle}-`, indexOffset)
+      const pageLongTitle = `公告/${pageTitle}`;
+      const mediaFilePrefix = `公告-${genre}-${pageTitle}-`;
+      return this.uploadMediaItems(tweet, mediaFilePrefix, indexOffset)
         .then(fileNames => {
-          logger.info(`updating page 公告/${pageTitle}...`);
+          logger.info(`updating page ${pageLongTitle}...`);
           return this.bot.edit({
-            title: `公告/${pageTitle}`,
+            title: pageLongTitle,
             appendtext: `${fileNames.map(fileName => `[[文件:${fileName}|无框|左]]\n`).join('')}`,
             bot: true,
             notminor: true,
@@ -147,29 +149,31 @@ export default class {
               result,
               timestamp: new Date(newtimestamp).toString(),
             }))
-            .catch(error => {
-              logger.error(`error updating page, error: ${error}`);
-              return {
-                pageid: undefined as number,
-                title: `公告/${pageTitle}`,
-                new: undefined as boolean,
-                mediafiles: [],
-                result: 'Failed',
-                timestamp: undefined as string,
-              };
-            });
+        })
+        .catch(error => {
+          logger.error(`error updating page, error: ${error}`);
+          return {
+            pageid: undefined as number,
+            title: pageLongTitle,
+            new: undefined as boolean,
+            mediafiles: [],
+            result: 'Failed',
+            timestamp: undefined as string,
+          };
         });
     };
 
     public post = (tweet: Tweet, genre: string): Promise<WikiEditResult> => {
       const {title, body, pageTitle, date} = processTweetBody(tweet);
-      const sameTitleAction = this.lock.lastActions.find(action => action.title === title);
+      const pageLongTitle = `公告/${pageTitle}`;
+      const mediaFilePrefix = `公告-${genre}-${pageTitle}-`;
+      const sameTitleAction = this.lock.lastActions.find(action => action.title === pageLongTitle);
       if (sameTitleAction) return this.appendMedia(tweet, genre, sameTitleAction.mediafiles.length);
-      return this.uploadMediaItems(tweet, `公告-${genre}-${pageTitle}-`)
+      return this.uploadMediaItems(tweet, mediaFilePrefix)
         .then(fileNames => {
-          logger.info(`creating page 公告/${pageTitle}...`);
+          logger.info(`creating page ${pageLongTitle}`);
           return this.bot.edit({
-            title: `公告/${pageTitle}`,
+            title: pageLongTitle,
             basetimestamp: new Date(),
             text: `{{文章戳
 |文章上级页面=公告
@@ -198,17 +202,17 @@ ${fileNames.map(fileName => `[[文件:${fileName}|无框|左]]`).join('\n')}
               result,
               timestamp: new Date(newtimestamp).toString(),
             }))
-            .catch(error => {
-              logger.error(`error creating page, error: ${error}`);
-              return {
-                pageid: undefined as number,
-                title: `公告/${pageTitle}`,
-                new: undefined as boolean,
-                mediafiles: [],
-                result: 'Failed',
-                timestamp: undefined as string,
-              };
-            });
+        })
+        .catch(error => {
+          logger.error(`error creating page, error: ${error}`);
+          return {
+            pageid: undefined as number,
+            title: pageLongTitle,
+            new: undefined as boolean,
+            mediafiles: [],
+            result: 'Failed',
+            timestamp: undefined as string,
+          };
         });
     };
 }