Browse Source

Added bridge for Pixiv.
This bridge is slow, as caching of images is required (REFERER header required to access the full size images)

teromene 6 years ago
parent
commit
494169f959
1 changed files with 73 additions and 0 deletions
  1. 73 0
      bridges/PixivBridge.php

+ 73 - 0
bridges/PixivBridge.php

@@ -0,0 +1,73 @@
+<?php
+class PixivBridge extends BridgeAbstract {
+
+	const MAINTAINER = 'teromene';
+	const NAME = 'Pixiv Bridge';
+	const URI = 'https://www.pixiv.net/';
+	const DESCRIPTION = 'Returns the tag search from pixiv.net';
+
+
+	const PARAMETERS = array( array(
+		'tag' => array(
+			'name' => 'Tag to search',
+			'exampleValue' => 'example',
+			'required' => true
+		),
+	));
+
+
+	public function collectData(){
+
+		$html = getContents(static::URI.'search.php?word=' . urlencode($this->getInput('tag')))
+			or returnClientError('Unable to query pixiv.net');
+		$regex = '/<input type="hidden"id="js-mount-point-search-result-list"data-items="([^"]*)/';
+		$timeRegex = '/img\/([0-9]{4})\/([0-9]{2})\/([0-9]{2})\/([0-9]{2})\/([0-9]{2})\/([0-9]{2})\//';
+
+		preg_match_all($regex, $html, $matches, PREG_SET_ORDER, 0);
+		if(!$matches) return;
+
+		$content = json_decode(html_entity_decode($matches[0][1]), true);
+		$count = 0;
+		foreach($content as $result) {
+			if($count == 10) break;
+			$count++;
+
+			$item = array();
+			$item["id"] = $result["illustId"];
+			$item["uri"] = "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=" . $result["illustId"];
+			$item["title"] = $result["illustTitle"];
+			$item["author"] = $result["userName"];
+
+			preg_match_all($timeRegex, $result["url"], $dt, PREG_SET_ORDER, 0);
+			$elementDate = DateTime::createFromFormat("YmdHis",
+						$dt[0][1] . $dt[0][2] . $dt[0][3] . $dt[0][4] . $dt[0][5] . $dt[0][6]);
+			$item["timestamp"] = $elementDate->getTimestamp();
+
+			$item["content"] = "<img src='" . $this->cacheImage($result['url'], $item["id"]) . "' />";
+			$this->items[] = $item;
+		}
+	}
+
+	public function cacheImage($url, $illustId) {
+
+		$url = str_replace("_master1200", "", $url);
+		$url = str_replace("c/240x240/img-master/", "img-original/", $url);
+		$path = CACHE_DIR . '/pixiv_img';
+
+		if(!is_dir($path))
+			mkdir($path, 0755, true);
+
+		if(!is_file($path . '/' . $illustId . '.jpeg')) {
+			$headers = array("Referer:  https://www.pixiv.net/member_illust.php?mode=medium&illust_id=" . $illustId);
+			$illust = getContents($url, $headers);
+			if(strpos($illust, "404 Not Found") !== false) {
+				$illust = getContents(str_replace("jpg", "png", $url), $headers);
+			}
+			file_put_contents($path . '/' . $illustId . '.jpeg', $illust);
+		}
+
+		return 'cache/pixiv_img/' . $illustId . ".jpeg";
+
+	}
+
+}