DeviantArtResolverを追加 (#52)
This commit is contained in:
		
							
								
								
									
										42
									
								
								app/MetadataResolver/DeviantArtResolver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								app/MetadataResolver/DeviantArtResolver.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\MetadataResolver;
 | 
			
		||||
 | 
			
		||||
class DeviantArtResolver implements Resolver
 | 
			
		||||
{
 | 
			
		||||
    public function resolve(string $url): Metadata
 | 
			
		||||
    {
 | 
			
		||||
        $client = new \GuzzleHttp\Client();
 | 
			
		||||
        $res = $client->get($url);
 | 
			
		||||
        if ($res->getStatusCode() === 200) {
 | 
			
		||||
            $ogpResolver = new OGPResolver();
 | 
			
		||||
            $metadata = $ogpResolver->parse($res->getBody());
 | 
			
		||||
 | 
			
		||||
            $dom = new \DOMDocument();
 | 
			
		||||
            @$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8'));
 | 
			
		||||
            $xpath = new \DOMXPath($dom);
 | 
			
		||||
 | 
			
		||||
            $node = $xpath->query('//*[@id="pimp-preload"]/following-sibling::div//img')->item(0);
 | 
			
		||||
            $srcset = $node->getAttribute('srcset');
 | 
			
		||||
            $srcset_array = explode('w,', $srcset);
 | 
			
		||||
            $src = end($srcset_array);
 | 
			
		||||
            $src = preg_replace('~ \d+w$~', '', $src);
 | 
			
		||||
 | 
			
		||||
            if (preg_match('~\.wixmp\.com$~', parse_url($src)['host'])) {
 | 
			
		||||
                // アスペクト比を保ったまま、縦か横が最大700pxになるように変換する。
 | 
			
		||||
                // Ref: https://support.wixmp.com/en/article/image-service-3835799
 | 
			
		||||
                if (strpos($src, '/v1/fill/')) {
 | 
			
		||||
                    $src = preg_replace('~/v1/fill/w_\d+,h_\d+,q_\d+,strp~', '/v1/fit/w_700,h_700,q_70,strp', $src);
 | 
			
		||||
                } else {
 | 
			
		||||
                    $src = $src . '/v1/fit/w_700,h_700,q_70,strp/image.jpg';
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $metadata->image = $src;
 | 
			
		||||
 | 
			
		||||
            return $metadata;
 | 
			
		||||
        } else {
 | 
			
		||||
            throw new \RuntimeException("{$res->getStatusCode()}: $url");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -15,6 +15,7 @@ class MetadataResolver implements Resolver
 | 
			
		||||
        '~www\.pixiv\.net/member_illust\.php\?illust_id=\d+~' => PixivResolver::class,
 | 
			
		||||
        '~fantia\.jp/posts/\d+~' => FantiaResolver::class,
 | 
			
		||||
        '~dmm\.co\.jp/~' => FanzaResolver::class,
 | 
			
		||||
        '~www\.deviantart\.com/.*/art/.*~' => DeviantArtResolver::class,
 | 
			
		||||
        '/.*/' => OGPResolver::class
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user