OSDN Git Service

Instagramのサムネイルを表示するURLのパターンを追加
authorKimura Youichi <kim.upsilon@bucyou.net>
Sat, 22 Jan 2022 12:19:06 +0000 (21:19 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 22 Jan 2022 12:27:03 +0000 (21:27 +0900)
OpenTween.Tests/Thumbnail/ThumbnailGeneratorTest.cs [new file with mode: 0644]
OpenTween/Resources/ChangeLog.txt
OpenTween/Thumbnail/Services/SimpleThumbnailService.cs
OpenTween/Thumbnail/ThumbnailGenerator.cs

diff --git a/OpenTween.Tests/Thumbnail/ThumbnailGeneratorTest.cs b/OpenTween.Tests/Thumbnail/ThumbnailGeneratorTest.cs
new file mode 100644 (file)
index 0000000..0c61bd7
--- /dev/null
@@ -0,0 +1,50 @@
+// OpenTween - Client of Twitter
+// Copyright (c) 2022 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
+// All rights reserved.
+//
+// This file is part of OpenTween.
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the terms of the GNU 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 General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program. If not, see <http://www.gnu.org/licenses/>, or write to
+// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
+// Boston, MA 02110-1301, USA.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace OpenTween.Thumbnail
+{
+    public class ThumbnailGeneratorTest
+    {
+        [Theory]
+        [InlineData("https://www.instagram.com/p/aaaaaaaaaaa/", "aaaaaaaaaaa")]
+        [InlineData("http://www.instagram.com/p/aaaaaaaaaaa/", "aaaaaaaaaaa")]
+        [InlineData("https://i.instagram.com/p/aaaaaaaaaaa/", "aaaaaaaaaaa")]
+        [InlineData("https://instagram.com/p/aaaaaaaaaaa/", "aaaaaaaaaaa")]
+        [InlineData("https://instagr.am/p/aaaaaaaaaaa/", "aaaaaaaaaaa")]
+        [InlineData("https://www.instagram.com/hogehoge/p/aaaaaaaaaaa/", "aaaaaaaaaaa")] // ユーザー名付き
+        [InlineData("https://www.instagram.com/p/aaaaaaaaaaa/?utm_medium=copy_link", "aaaaaaaaaaa")] // トラッキングパラメータ付き
+        [InlineData("https://www.instagram.com/hogehoge/", null)] // プロフィールページ
+        public void InstagramPattern_IsMatchTest(string testUrl, string expected)
+        {
+            var match = ThumbnailGenerator.InstagramPattern.Match(testUrl);
+
+            var matchedMediaId = match.Success ? match.Groups["mediaId"].Value : null;
+            Assert.Equal(expected, matchedMediaId);
+        }
+    }
+}
index 75b85ff..6bc611b 100644 (file)
@@ -2,6 +2,7 @@
 
 ==== Ver 2.4.4-dev(2019/xx/xx)
  * CHG: pic.twitter.com の画像URLのフォーマット変更に対応
+ * CHG: Instagramのサムネイルを表示するURLのパターンを追加
  * FIX: DMの添付画像をブラウザで開く場合に使用するURLを変更
  * FIX: 大文字アルファベットを含むハッシュタグがユーザー情報画面で正しくリンク化されない不具合を修正 (thx @naminodarie!)
 
index 8de0cd5..6b9d316 100644 (file)
@@ -48,8 +48,13 @@ namespace OpenTween.Thumbnail.Services
         }
 
         public SimpleThumbnailService(string pattern, string replacement, string? file_replacement)
+            : this(new Regex(pattern, RegexOptions.IgnoreCase), replacement, file_replacement)
         {
-            this.regex = new Regex(pattern, RegexOptions.IgnoreCase);
+        }
+
+        public SimpleThumbnailService(Regex regex, string replacement, string? file_replacement)
+        {
+            this.regex = regex;
             this.thumb_replacement = replacement;
             this.fullsize_replacement = file_replacement;
         }
index e84e473..74b93ec 100644 (file)
@@ -36,6 +36,11 @@ namespace OpenTween.Thumbnail
 {
     class ThumbnailGenerator
     {
+        public static readonly Regex InstagramPattern = new Regex(
+            @"^https?://(?:instagram.com|instagr\.am|i\.instagram\.com|www\.instagram\.com)/([^/]+/)?p/(?<mediaId>[^/]+)/(\?.*)?$",
+            RegexOptions.IgnoreCase
+        );
+
         public static List<IThumbnailService> Services { get; protected set; }
 
         internal static ImgAzyobuziNet ImgAzyobuziNetInstance { get; private set; } = null!;
@@ -132,9 +137,9 @@ namespace OpenTween.Thumbnail
 
                 // Instagram
                 new SimpleThumbnailService(
-                    @"^https?://(?:instagram.com|instagr\.am|i\.instagram\.com|www\.instagram\.com)/p/.+/",
-                    "${0}media/?size=m",
-                    "${0}media/?size=l"),
+                    InstagramPattern,
+                    "https://www.instagram.com/p/${mediaId}/media/?size=m",
+                    "https://www.instagram.com/p/${mediaId}/media/?size=l"),
 
                 // Foursquare
                 new FoursquareCheckin(),