Compare commits
27 Commits
feature/fi
...
feature/ok
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cc905a0bce | ||
![]() |
f7c9e83b12 | ||
![]() |
a1850b666b | ||
![]() |
dddb47f68a | ||
![]() |
1b2b043be2 | ||
![]() |
c535153e1f | ||
![]() |
830de3a5e3 | ||
![]() |
ab46117138 | ||
![]() |
3c2fec21a0 | ||
![]() |
370d1cc01b | ||
![]() |
5517cd5fab | ||
![]() |
3c083a7c60 | ||
![]() |
fa6b8b87af | ||
![]() |
d290bf4107 | ||
![]() |
b274c6bc40 | ||
![]() |
018532f01f | ||
![]() |
e4ef935dd2 | ||
![]() |
fb84a1d416 | ||
![]() |
358580a15e | ||
![]() |
000b89f380 | ||
![]() |
c5cbad4475 | ||
![]() |
f4abb08921 | ||
![]() |
38eb0348f9 | ||
![]() |
4f5595dae0 | ||
![]() |
733e97bc58 | ||
![]() |
c4768ded38 | ||
![]() |
598d27f6b8 |
@@ -1,6 +1,6 @@
|
|||||||
version: 2
|
version: 2.1
|
||||||
|
|
||||||
jobs:
|
executors:
|
||||||
build:
|
build:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/php:7.1-node-browsers
|
- image: circleci/php:7.1-node-browsers
|
||||||
@@ -17,38 +17,75 @@ jobs:
|
|||||||
POSTGRES_DB: tissue
|
POSTGRES_DB: tissue
|
||||||
POSTGRES_USER: tissue
|
POSTGRES_USER: tissue
|
||||||
POSTGRES_PASSWORD: tissue
|
POSTGRES_PASSWORD: tissue
|
||||||
|
|
||||||
|
commands:
|
||||||
|
initialize:
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
|
||||||
- run: sudo apt update
|
- run: sudo apt update
|
||||||
- run: sudo apt install -y libpq-dev
|
- run: sudo apt install -y libpq-dev
|
||||||
- run: sudo docker-php-ext-install zip
|
- run: sudo docker-php-ext-install zip
|
||||||
- run: sudo docker-php-ext-install pdo_pgsql
|
- run: sudo docker-php-ext-install pdo_pgsql
|
||||||
|
restore_composer:
|
||||||
|
steps:
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
keys:
|
keys:
|
||||||
- v1-dependencies-{{ checksum "composer.json" }}
|
- v1-dependencies-{{ checksum "composer.json" }}
|
||||||
- v1-dependencies-
|
- v1-dependencies-
|
||||||
- run: composer install -n --prefer-dist
|
save_composer:
|
||||||
|
steps:
|
||||||
- save_cache:
|
- save_cache:
|
||||||
key: v1-dependencies-{{ checksum "composer.json" }}
|
key: v1-dependencies-{{ checksum "composer.json" }}
|
||||||
paths:
|
paths:
|
||||||
- ./vendor
|
- ./vendor
|
||||||
|
restore_npm:
|
||||||
|
steps:
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
keys:
|
keys:
|
||||||
- v1-dependencies-{{ checksum "package.json" }}
|
- v1-dependencies-{{ checksum "package.json" }}
|
||||||
- v1-dependencies-
|
- v1-dependencies-
|
||||||
- run: yarn install
|
save_npm:
|
||||||
|
steps:
|
||||||
- save_cache:
|
- save_cache:
|
||||||
key: v1-dependencies-{{ checksum "package.json" }}
|
key: v1-dependencies-{{ checksum "package.json" }}
|
||||||
paths:
|
paths:
|
||||||
- ./node_modules
|
- ./node_modules
|
||||||
- ~/.yarn
|
- ~/.yarn
|
||||||
|
|
||||||
- run: php artisan migrate
|
jobs:
|
||||||
|
build:
|
||||||
|
executor: build
|
||||||
|
steps:
|
||||||
|
- initialize
|
||||||
|
|
||||||
|
- restore_composer
|
||||||
|
- run: composer install -n --prefer-dist
|
||||||
|
- save_composer
|
||||||
|
|
||||||
|
- restore_npm
|
||||||
|
- run: yarn install
|
||||||
|
- save_npm
|
||||||
|
|
||||||
- run: yarn run prod
|
- run: yarn run prod
|
||||||
|
|
||||||
|
- persist_to_workspace:
|
||||||
|
root: .
|
||||||
|
paths:
|
||||||
|
- public
|
||||||
|
|
||||||
|
test:
|
||||||
|
executor: build
|
||||||
|
steps:
|
||||||
|
- initialize
|
||||||
|
|
||||||
|
- restore_composer
|
||||||
|
- restore_npm
|
||||||
|
|
||||||
|
- attach_workspace:
|
||||||
|
at: .
|
||||||
|
|
||||||
|
- run: php artisan migrate
|
||||||
|
|
||||||
# Run linter
|
# Run linter
|
||||||
- run:
|
- run:
|
||||||
command: |
|
command: |
|
||||||
@@ -79,3 +116,51 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
command: bash <(curl -s https://codecov.io/bash) -f /tmp/phpunit/coverage.xml
|
command: bash <(curl -s https://codecov.io/bash) -f /tmp/phpunit/coverage.xml
|
||||||
when: always
|
when: always
|
||||||
|
|
||||||
|
test_resolver:
|
||||||
|
executor: build
|
||||||
|
environment:
|
||||||
|
TEST_USE_HTTP_MOCK: false
|
||||||
|
steps:
|
||||||
|
- initialize
|
||||||
|
|
||||||
|
- restore_composer
|
||||||
|
|
||||||
|
- attach_workspace:
|
||||||
|
at: .
|
||||||
|
|
||||||
|
- run: php artisan migrate
|
||||||
|
|
||||||
|
# Run unit test
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
mkdir -p /tmp/phpunit
|
||||||
|
./vendor/bin/phpunit --testsuite MetadataResolver --log-junit /tmp/phpunit/phpunit.xml --coverage-clover=/tmp/phpunit/coverage.xml
|
||||||
|
when: always
|
||||||
|
- store_test_results:
|
||||||
|
path: /tmp/phpunit
|
||||||
|
- store_artifacts:
|
||||||
|
path: /tmp/phpunit/coverage.xml
|
||||||
|
|
||||||
|
workflows:
|
||||||
|
version: 2.1
|
||||||
|
test:
|
||||||
|
jobs:
|
||||||
|
- build
|
||||||
|
- test:
|
||||||
|
requires:
|
||||||
|
- build
|
||||||
|
scheduled_resolver_test:
|
||||||
|
triggers:
|
||||||
|
- schedule:
|
||||||
|
cron: "4 0 * * 1"
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- develop
|
||||||
|
jobs:
|
||||||
|
- build
|
||||||
|
- test_resolver:
|
||||||
|
requires:
|
||||||
|
- build
|
||||||
|
|
||||||
|
@@ -10,6 +10,7 @@ RUN apt-get update \
|
|||||||
&& pecl install xdebug \
|
&& pecl install xdebug \
|
||||||
&& curl -sS https://getcomposer.org/installer | php \
|
&& curl -sS https://getcomposer.org/installer | php \
|
||||||
&& mv composer.phar /usr/local/bin/composer \
|
&& mv composer.phar /usr/local/bin/composer \
|
||||||
|
&& composer global require hirak/prestissimo \
|
||||||
&& sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
|
&& sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
|
||||||
&& sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf \
|
&& sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf \
|
||||||
&& a2enmod rewrite
|
&& a2enmod rewrite
|
||||||
|
@@ -36,7 +36,6 @@ docker-compose up -d
|
|||||||
4. Composer と yarn を使い必要なライブラリをインストールします。
|
4. Composer と yarn を使い必要なライブラリをインストールします。
|
||||||
|
|
||||||
```
|
```
|
||||||
docker-compose exec web composer global require hirak/prestissimo
|
|
||||||
docker-compose exec web composer install
|
docker-compose exec web composer install
|
||||||
docker-compose exec web yarn install
|
docker-compose exec web yarn install
|
||||||
```
|
```
|
||||||
|
@@ -1,82 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Console\Commands;
|
|
||||||
|
|
||||||
use Illuminate\Console\Command;
|
|
||||||
|
|
||||||
class UpdateFixture extends Command
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The name and signature of the console command.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $signature = 'test:fixture:update {resolver : Some Resolver Name }';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The console command description.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $description = 'Update specific fixtures';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new command instance.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute the console command.
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function handle()
|
|
||||||
{
|
|
||||||
$resolver_base_path = __DIR__ . '/../../../tests/Unit/MetadataResolver/';
|
|
||||||
$test_file_path = $resolver_base_path . $this->argument('resolver') . 'ResolverTest.php';
|
|
||||||
|
|
||||||
if (!file_exists($test_file_path)) {
|
|
||||||
throw new \RuntimeException($this->argument('resolver') . 'ResolverTest.php is not found.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->info($this->argument('resolver') . 'ResolverTest.php is found.');
|
|
||||||
|
|
||||||
$test_file = file_get_contents($test_file_path);
|
|
||||||
$test_file_without_comment = '';
|
|
||||||
// コメントを削除する
|
|
||||||
$tokens = token_get_all($test_file);
|
|
||||||
foreach ($tokens as $token) {
|
|
||||||
if (is_string($token)) {
|
|
||||||
$test_file_without_comment .= $token;
|
|
||||||
} else {
|
|
||||||
list($id, $text) = $token;
|
|
||||||
if (token_name($id) !== 'T_COMMENT') {
|
|
||||||
$test_file_without_comment .= $text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
preg_match_all('~file_get_contents\(__DIR__ . \'/(.+)\'\);~', $test_file_without_comment, $fixtures);
|
|
||||||
preg_match_all('~\$this->assertSame\(\'(.+)\', \(string\) \$this->handler->getLastRequest\(\)->getUri\(\)\);~m', $test_file_without_comment, $urls);
|
|
||||||
$update_list = array_combine($fixtures[1], $urls[1]);
|
|
||||||
|
|
||||||
$progress = $this->output->createProgressBar(count($update_list));
|
|
||||||
$progress->setFormat('Updating %path% from %url%' . PHP_EOL . '%current%/%max% [%bar%] %percent:3s%%');
|
|
||||||
|
|
||||||
foreach ($update_list as $path => $url) {
|
|
||||||
sleep(1);
|
|
||||||
$progress->setMessage($path, 'path');
|
|
||||||
$progress->setMessage($url, 'url');
|
|
||||||
file_put_contents($resolver_base_path . $path, file_get_contents($url));
|
|
||||||
$progress->advance();
|
|
||||||
}
|
|
||||||
|
|
||||||
$progress->finish();
|
|
||||||
$this->output->newLine();
|
|
||||||
$this->info('Update Complete!');
|
|
||||||
}
|
|
||||||
}
|
|
@@ -109,13 +109,6 @@ SQL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 月間グラフ用の配列初期化
|
|
||||||
$month = Carbon::now()->firstOfMonth()->subMonth(11); // 直近12ヶ月
|
|
||||||
for ($i = 0; $i < 12; $i++) {
|
|
||||||
$monthlySum[$month->format('Y/m')] = 0;
|
|
||||||
$month->addMonth();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($groupByDay as $data) {
|
foreach ($groupByDay as $data) {
|
||||||
$date = Carbon::createFromFormat('Y/m/d', $data->date);
|
$date = Carbon::createFromFormat('Y/m/d', $data->date);
|
||||||
$yearAndMonth = $date->format('Y/m');
|
$yearAndMonth = $date->format('Y/m');
|
||||||
@@ -123,9 +116,7 @@ SQL
|
|||||||
$dailySum[$date->timestamp] = $data->count;
|
$dailySum[$date->timestamp] = $data->count;
|
||||||
$yearlySum[$date->year] += $data->count;
|
$yearlySum[$date->year] += $data->count;
|
||||||
$dowSum[$date->dayOfWeek] += $data->count;
|
$dowSum[$date->dayOfWeek] += $data->count;
|
||||||
if (isset($monthlySum[$yearAndMonth])) {
|
$monthlySum[$yearAndMonth] = ($monthlySum[$yearAndMonth] ?? 0) + $data->count;
|
||||||
$monthlySum[$yearAndMonth] += $data->count;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($groupByHour as $data) {
|
foreach ($groupByHour as $data) {
|
||||||
@@ -136,8 +127,7 @@ SQL
|
|||||||
$graphData = [
|
$graphData = [
|
||||||
'dailySum' => $dailySum,
|
'dailySum' => $dailySum,
|
||||||
'dowSum' => $dowSum,
|
'dowSum' => $dowSum,
|
||||||
'monthlyKey' => array_keys($monthlySum),
|
'monthlySum' => $monthlySum,
|
||||||
'monthlySum' => array_values($monthlySum),
|
|
||||||
'yearlyKey' => array_keys($yearlySum),
|
'yearlyKey' => array_keys($yearlySum),
|
||||||
'yearlySum' => array_values($yearlySum),
|
'yearlySum' => array_values($yearlySum),
|
||||||
'hourlyKey' => array_keys($hourlySum),
|
'hourlyKey' => array_keys($hourlySum),
|
||||||
|
@@ -28,6 +28,7 @@ class MetadataResolver implements Resolver
|
|||||||
'~www\.plurk\.com\/p\/.*~' => PlurkResolver::class,
|
'~www\.plurk\.com\/p\/.*~' => PlurkResolver::class,
|
||||||
'~(adult\.)?contents\.fc2\.com\/article_search\.php\?id=\d+~' => FC2ContentsResolver::class,
|
'~(adult\.)?contents\.fc2\.com\/article_search\.php\?id=\d+~' => FC2ContentsResolver::class,
|
||||||
'~store\.steampowered\.com/app/\d+~' => SteamResolver::class,
|
'~store\.steampowered\.com/app/\d+~' => SteamResolver::class,
|
||||||
|
'~www\.xtube\.com/video-watch/.*-\d+$~'=> XtubeResolver::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
public $mimeTypes = [
|
public $mimeTypes = [
|
||||||
|
@@ -24,11 +24,19 @@ class ToranoanaResolver implements Resolver
|
|||||||
|
|
||||||
public function resolve(string $url): Metadata
|
public function resolve(string $url): Metadata
|
||||||
{
|
{
|
||||||
$cookieJar = CookieJar::fromArray(['adflg' => '0'], 'ec.toranoana.jp');
|
$res = $this->client->get($url);
|
||||||
|
|
||||||
$res = $this->client->get($url, ['cookies' => $cookieJar]);
|
|
||||||
if ($res->getStatusCode() === 200) {
|
if ($res->getStatusCode() === 200) {
|
||||||
return $this->ogpResolver->parse($res->getBody());
|
$metadata = $this->ogpResolver->parse($res->getBody());
|
||||||
|
|
||||||
|
$dom = new \DOMDocument();
|
||||||
|
@$dom->loadHTML(mb_convert_encoding($res->getBody(), 'HTML-ENTITIES', 'UTF-8'));
|
||||||
|
$xpath = new \DOMXPath($dom);
|
||||||
|
$imgNode = $xpath->query('//*[@id="preview"]//img')->item(0);
|
||||||
|
if ($imgNode !== null) {
|
||||||
|
$metadata->image = $imgNode->getAttribute('src');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $metadata;
|
||||||
} else {
|
} else {
|
||||||
throw new \RuntimeException("{$res->getStatusCode()}: $url");
|
throw new \RuntimeException("{$res->getStatusCode()}: $url");
|
||||||
}
|
}
|
||||||
|
41
app/MetadataResolver/XtubeResolver.php
Normal file
41
app/MetadataResolver/XtubeResolver.php
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\MetadataResolver;
|
||||||
|
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
|
||||||
|
class XtubeResolver implements Resolver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Client
|
||||||
|
*/
|
||||||
|
private $client;
|
||||||
|
|
||||||
|
public function __construct(Client $client)
|
||||||
|
{
|
||||||
|
$this->client = $client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function resolve(string $url): Metadata
|
||||||
|
{
|
||||||
|
if (preg_match('~www\.xtube\.com/video-watch/.*-(\d+)$~', $url, $matches) !== 1) {
|
||||||
|
throw new \RuntimeException("Unmatched URL Pattern: $url");
|
||||||
|
}
|
||||||
|
$videoid = $matches[1];
|
||||||
|
|
||||||
|
$res = $this->client->get('https://www.xtube.com/webmaster/api/getvideobyid?video_id=' . $videoid);
|
||||||
|
if ($res->getStatusCode() === 200) {
|
||||||
|
$data = json_decode($res->getBody()->getContents(), true);
|
||||||
|
$metadata = new Metadata();
|
||||||
|
|
||||||
|
$metadata->title = $data['title'] ?? '';
|
||||||
|
$metadata->description = strip_tags(str_replace('\n', PHP_EOL, html_entity_decode($data['description'] ?? '')));
|
||||||
|
$metadata->image = str_replace('eSuQ8f', 'eSK08f', $data['thumb'] ?? ''); // 300x169 to 300x210
|
||||||
|
$metadata->tags = array_values(array_unique($data['tags']));
|
||||||
|
|
||||||
|
return $metadata;
|
||||||
|
} else {
|
||||||
|
throw new \RuntimeException("{$res->getStatusCode()}: $url");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -16,6 +16,7 @@
|
|||||||
"cal-heatmap": "^3.3.10",
|
"cal-heatmap": "^3.3.10",
|
||||||
"chart.js": "^2.7.1",
|
"chart.js": "^2.7.1",
|
||||||
"cross-env": "^5.2.0",
|
"cross-env": "^5.2.0",
|
||||||
|
"date-fns": "^1.30.1",
|
||||||
"husky": "^1.3.1",
|
"husky": "^1.3.1",
|
||||||
"jquery": "^3.2.1",
|
"jquery": "^3.2.1",
|
||||||
"js-cookie": "^2.2.0",
|
"js-cookie": "^2.2.0",
|
||||||
|
@@ -16,6 +16,10 @@
|
|||||||
<testsuite name="Unit">
|
<testsuite name="Unit">
|
||||||
<directory suffix="Test.php">./tests/Unit</directory>
|
<directory suffix="Test.php">./tests/Unit</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
|
||||||
|
<testsuite name="MetadataResolver">
|
||||||
|
<directory suffix="Test.php">./tests/Unit/MetadataResolver</directory>
|
||||||
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
<filter>
|
<filter>
|
||||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-else-if="state === MetadataLoadState.Success" class="row no-gutters">
|
<div v-else-if="state === MetadataLoadState.Success" class="row no-gutters">
|
||||||
<div v-if="hasImage" class="col-4 justify-content-center align-items-center">
|
<div v-if="hasImage" class="col-4 justify-content-center align-items-center">
|
||||||
<img :src="metadata.image" alt="Thumbnail" class="card-img-top-to-left bg-secondary">
|
<img :src="metadata.image" alt="Thumbnail" class="w-100 bg-secondary">
|
||||||
</div>
|
</div>
|
||||||
<div :class="descClasses">
|
<div :class="descClasses">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
<p class="card-text mb-2" style="font-size: small;">タグ候補<br><span class="text-secondary">(クリックするとタグ入力欄にコピーできます)</span></p>
|
<p class="card-text mb-2" style="font-size: small;">タグ候補<br><span class="text-secondary">(クリックするとタグ入力欄にコピーできます)</span></p>
|
||||||
<ul class="list-inline d-inline">
|
<ul class="list-inline d-inline">
|
||||||
<li v-for="tag in suggestions"
|
<li v-for="tag in suggestions"
|
||||||
class="list-inline-item badge badge-primary metadata-tag-item"
|
:class="tagClasses(tag)"
|
||||||
@click="addTag(tag)"><span class="oi oi-tag"></span> {{ tag }}</li>
|
@click="addTag(tag.name)"><span class="oi oi-tag"></span> {{ tag.name }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
@@ -54,6 +54,11 @@
|
|||||||
}[],
|
}[],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type Suggestion = {
|
||||||
|
name: string,
|
||||||
|
used: boolean,
|
||||||
|
}
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
export default class MetadataPreview extends Vue {
|
export default class MetadataPreview extends Vue {
|
||||||
@Prop() readonly state!: MetadataLoadState;
|
@Prop() readonly state!: MetadataLoadState;
|
||||||
@@ -62,16 +67,38 @@
|
|||||||
// for use in v-if
|
// for use in v-if
|
||||||
private readonly MetadataLoadState = MetadataLoadState;
|
private readonly MetadataLoadState = MetadataLoadState;
|
||||||
|
|
||||||
|
tags: string[] = [];
|
||||||
|
|
||||||
|
created() {
|
||||||
|
bus.$on("change-tag", (tags: string[]) => this.tags = tags);
|
||||||
|
bus.$emit("resend-tag");
|
||||||
|
}
|
||||||
|
|
||||||
addTag(tag: string) {
|
addTag(tag: string) {
|
||||||
bus.$emit("add-tag", tag);
|
bus.$emit("add-tag", tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
get suggestions() {
|
tagClasses(s: Suggestion) {
|
||||||
|
return {
|
||||||
|
"list-inline-item": true,
|
||||||
|
"badge": true,
|
||||||
|
"badge-primary": !s.used,
|
||||||
|
"badge-secondary": s.used,
|
||||||
|
"metadata-tag-item": true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
get suggestions(): Suggestion[] {
|
||||||
if (this.metadata === null) {
|
if (this.metadata === null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.metadata.tags.map(t => t.name);
|
return this.metadata.tags.map(t => {
|
||||||
|
return {
|
||||||
|
name: t.name,
|
||||||
|
used: this.tags.indexOf(t.name) !== -1
|
||||||
|
};
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
get hasImage() {
|
get hasImage() {
|
||||||
@@ -90,10 +117,7 @@
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.link-card-mini {
|
.link-card-mini {
|
||||||
$height: 150px;
|
$height: 150px;
|
||||||
|
overflow: hidden;
|
||||||
.row > div {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.row > div:first-child {
|
.row > div:first-child {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {Vue, Component, Prop} from "vue-property-decorator";
|
import {Vue, Component, Prop, Watch} from "vue-property-decorator";
|
||||||
import {bus} from "../checkin";
|
import {bus} from "../checkin";
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
created() {
|
created() {
|
||||||
bus.$on("add-tag", (tag: string) => this.tags.indexOf(tag) === -1 && this.tags.push(tag));
|
bus.$on("add-tag", (tag: string) => this.tags.indexOf(tag) === -1 && this.tags.push(tag));
|
||||||
|
bus.$on("resend-tag", () => bus.$emit("change-tag", this.tags));
|
||||||
}
|
}
|
||||||
|
|
||||||
onKeyDown(event: KeyboardEvent) {
|
onKeyDown(event: KeyboardEvent) {
|
||||||
@@ -56,6 +57,11 @@
|
|||||||
this.tags.splice(index, 1);
|
this.tags.splice(index, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Watch("tags")
|
||||||
|
onTagsChanged() {
|
||||||
|
bus.$emit("change-tag", this.tags);
|
||||||
|
}
|
||||||
|
|
||||||
get containerClass(): object {
|
get containerClass(): object {
|
||||||
return {
|
return {
|
||||||
"form-control": true,
|
"form-control": true,
|
||||||
|
57
resources/assets/js/user/stats.js
vendored
57
resources/assets/js/user/stats.js
vendored
@@ -1,9 +1,12 @@
|
|||||||
import CalHeatMap from 'cal-heatmap';
|
import CalHeatMap from 'cal-heatmap';
|
||||||
import Chart from 'chart.js';
|
import Chart from 'chart.js';
|
||||||
|
import {addMonths, format, startOfMonth, subMonths} from 'date-fns';
|
||||||
|
|
||||||
|
const graphData = JSON.parse(document.getElementById('graph-data').textContent);
|
||||||
|
|
||||||
function createLineGraph(id, labels, data) {
|
function createLineGraph(id, labels, data) {
|
||||||
const context = document.getElementById(id).getContext('2d');
|
const context = document.getElementById(id).getContext('2d');
|
||||||
new Chart(context, {
|
return new Chart(context, {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: {
|
data: {
|
||||||
labels: labels,
|
labels: labels,
|
||||||
@@ -62,7 +65,22 @@ function createBarGraph(id, labels, data) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const graphData = JSON.parse(document.getElementById('graph-data').textContent);
|
/**
|
||||||
|
* @param {Date} from
|
||||||
|
*/
|
||||||
|
function createMonthlyGraphData(from) {
|
||||||
|
const keys = [];
|
||||||
|
const values = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < 12; i++) {
|
||||||
|
const current = addMonths(from, i);
|
||||||
|
const yearAndMonth = format(current, 'YYYY/MM');
|
||||||
|
keys.push(yearAndMonth);
|
||||||
|
values.push(graphData.monthlySum[yearAndMonth] || 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {keys, values};
|
||||||
|
}
|
||||||
|
|
||||||
new CalHeatMap().init({
|
new CalHeatMap().init({
|
||||||
itemSelector: '#cal-heatmap',
|
itemSelector: '#cal-heatmap',
|
||||||
@@ -76,7 +94,40 @@ new CalHeatMap().init({
|
|||||||
legend: [1, 2, 3, 4]
|
legend: [1, 2, 3, 4]
|
||||||
});
|
});
|
||||||
|
|
||||||
createLineGraph('monthly-graph', graphData.monthlyKey, graphData.monthlySum);
|
// 直近1年の月間グラフのデータを準備
|
||||||
|
const monthlyTermFrom = subMonths(startOfMonth(new Date()), 11);
|
||||||
|
const {keys: monthlyKey, values: monthlySum} = createMonthlyGraphData(monthlyTermFrom);
|
||||||
|
|
||||||
|
const monthlyGraph = createLineGraph('monthly-graph', monthlyKey, monthlySum);
|
||||||
createLineGraph('yearly-graph', graphData.yearlyKey, graphData.yearlySum);
|
createLineGraph('yearly-graph', graphData.yearlyKey, graphData.yearlySum);
|
||||||
createBarGraph('hourly-graph', graphData.hourlyKey, graphData.hourlySum);
|
createBarGraph('hourly-graph', graphData.hourlyKey, graphData.hourlySum);
|
||||||
createBarGraph('dow-graph', ['日', '月', '火', '水', '木', '金', '土'], graphData.dowSum);
|
createBarGraph('dow-graph', ['日', '月', '火', '水', '木', '金', '土'], graphData.dowSum);
|
||||||
|
|
||||||
|
// 月間グラフの期間セレクターを準備
|
||||||
|
const monthlyTermSelector = document.getElementById('monthly-term');
|
||||||
|
for (let year = monthlyTermFrom.getFullYear(); year <= new Date().getFullYear(); year++) {
|
||||||
|
const opt = document.createElement('option');
|
||||||
|
opt.setAttribute('value', year);
|
||||||
|
opt.textContent = `${year}年`;
|
||||||
|
monthlyTermSelector.insertBefore(opt, monthlyTermSelector.firstChild);
|
||||||
|
}
|
||||||
|
if (monthlyTermSelector.children.length) {
|
||||||
|
monthlyTermSelector.selectedIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
monthlyTermSelector.addEventListener('change', function (e) {
|
||||||
|
let monthlyTermFrom;
|
||||||
|
if (e.target.selectedIndex === 0) {
|
||||||
|
// 今年のデータを表示する時は、直近12ヶ月を表示
|
||||||
|
monthlyTermFrom = subMonths(startOfMonth(new Date()), 11);
|
||||||
|
} else {
|
||||||
|
// 過去のデータを表示する時は、選択年の1〜12月を表示
|
||||||
|
monthlyTermFrom = new Date(e.target.value, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const {keys, values} = createMonthlyGraphData(monthlyTermFrom);
|
||||||
|
|
||||||
|
monthlyGraph.data.labels = keys;
|
||||||
|
monthlyGraph.data.datasets[0].data = values;
|
||||||
|
monthlyGraph.update();
|
||||||
|
});
|
||||||
|
19
resources/assets/sass/_bootstrap-custom.scss
vendored
19
resources/assets/sass/_bootstrap-custom.scss
vendored
@@ -1,19 +0,0 @@
|
|||||||
.card-img-left {
|
|
||||||
width: 100%;
|
|
||||||
@include border-left-radius($card-inner-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-img-right {
|
|
||||||
width: 100%;
|
|
||||||
@include border-right-radius($card-inner-border-radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-img-top-to-left {
|
|
||||||
width: 100%;
|
|
||||||
@include media-breakpoint-down(md) {
|
|
||||||
@include border-top-radius($card-inner-border-radius);
|
|
||||||
}
|
|
||||||
@include media-breakpoint-up(lg) {
|
|
||||||
@include border-left-radius($card-inner-border-radius);
|
|
||||||
}
|
|
||||||
}
|
|
1
resources/assets/sass/app.scss
vendored
1
resources/assets/sass/app.scss
vendored
@@ -3,7 +3,6 @@ $primary: #e53fb1;
|
|||||||
|
|
||||||
// Bootstrap
|
// Bootstrap
|
||||||
@import "~bootstrap/scss/bootstrap";
|
@import "~bootstrap/scss/bootstrap";
|
||||||
@import "bootstrap-custom";
|
|
||||||
|
|
||||||
// Open Iconic
|
// Open Iconic
|
||||||
@import "~open-iconic/font/css/open-iconic-bootstrap";
|
@import "~open-iconic/font/css/open-iconic-bootstrap";
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
.link-card {
|
.link-card {
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
.row > div {
|
.row > div {
|
||||||
max-height: 400px;
|
max-height: 400px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
1
resources/assets/sass/tissue.css
vendored
1
resources/assets/sass/tissue.css
vendored
@@ -77,3 +77,4 @@
|
|||||||
#navbarAccountDropdownSp {
|
#navbarAccountDropdownSp {
|
||||||
max-width: calc(100vw - 5em);
|
max-width: calc(100vw - 5em);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
<a class="text-dark card-link" href="{{ $link }}" target="_blank" rel="noopener">
|
<a class="text-dark card-link" href="{{ $link }}" target="_blank" rel="noopener">
|
||||||
<div class="row no-gutters">
|
<div class="row no-gutters">
|
||||||
<div class="col-12 col-md-6 justify-content-center align-items-center">
|
<div class="col-12 col-md-6 justify-content-center align-items-center">
|
||||||
<img src="" alt="Thumbnail" class="card-img-top-to-left bg-secondary">
|
<img src="" alt="Thumbnail" class="w-100 bg-secondary">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-6">
|
<div class="col-12 col-md-6">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
9
resources/views/components/okazu-card.blade.php
Normal file
9
resources/views/components/okazu-card.blade.php
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<div class="card okazu-card overflow-hidden d-none">
|
||||||
|
<a href="{{ $link }}" target="_blank" rel="noopener">
|
||||||
|
<img src="" class="card-img" alt="">
|
||||||
|
<div class="card-img-overlay d-flex align-items-end p-3">
|
||||||
|
<h5 class="card-title overflow-hidden m-0 font-weight-bold p-1" style="text-overflow: ellipsis;white-space: nowrap;background: rgba(229, 63, 177, 0.75);color: white;">Card title</h5>
|
||||||
|
<p class="card-text overflow-hidden d-none" style="text-overflow: ellipsis;white-space: nowrap;">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
@@ -31,6 +31,41 @@
|
|||||||
<p class="mt-4">
|
<p class="mt-4">
|
||||||
<span class="oi oi-lock-locked"></span> このユーザはチェックイン履歴を公開していません。
|
<span class="oi oi-lock-locked"></span> このユーザはチェックイン履歴を公開していません。
|
||||||
</p>
|
</p>
|
||||||
|
@elseif (Route::currentRouteName() === 'user.okazu')
|
||||||
|
@push('script')
|
||||||
|
<script>
|
||||||
|
document.querySelectorAll(".okazu-card").forEach(card => {
|
||||||
|
const title = card.querySelector(".card-title");
|
||||||
|
const description = card.querySelector(".card-text");
|
||||||
|
const image = card.querySelector(".card-img");
|
||||||
|
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
params.set('url', card.querySelector("a").href);
|
||||||
|
|
||||||
|
fetch("/api/checkin/card?" + params.toString())
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(json => {
|
||||||
|
if (json.image) {
|
||||||
|
title.innerText = json.title;
|
||||||
|
description.innerText = json.description;
|
||||||
|
image.setAttribute("src", json.image);
|
||||||
|
card.classList.remove("d-none");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
<div class="card-columns mt-3">
|
||||||
|
@forelse ($ejaculations as $ejaculation)
|
||||||
|
@component('components.okazu-card', ['link' => $ejaculation->link])
|
||||||
|
@endcomponent
|
||||||
|
@empty
|
||||||
|
<li class="list-group-item border-bottom-only">
|
||||||
|
<p>まだチェックインしていません。</p>
|
||||||
|
</li>
|
||||||
|
@endforelse
|
||||||
|
</div>
|
||||||
@else
|
@else
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
@forelse ($ejaculations as $ejaculation)
|
@forelse ($ejaculations as $ejaculation)
|
||||||
|
@@ -15,7 +15,14 @@
|
|||||||
<h5 class="my-4">Shikontribution graph</h5>
|
<h5 class="my-4">Shikontribution graph</h5>
|
||||||
<div id="cal-heatmap" class="tis-contribution-graph"></div>
|
<div id="cal-heatmap" class="tis-contribution-graph"></div>
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
<h5 class="my-4">月間チェックイン回数</h5>
|
<div class="row my-4">
|
||||||
|
<div class="col-12 col-lg-6 d-flex align-items-center">
|
||||||
|
<h5 class="my-0">月間チェックイン回数</h5>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-lg-6 mt-2 mt-lg-0">
|
||||||
|
<select id="monthly-term" class="form-control"></select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<canvas id="monthly-graph" class="w-100"></canvas>
|
<canvas id="monthly-graph" class="w-100"></canvas>
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
<h5 class="my-4">年間チェックイン回数</h5>
|
<h5 class="my-4">年間チェックイン回数</h5>
|
||||||
|
@@ -196,7 +196,8 @@ class DLsiteResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testSPLink()
|
public function testSPLink()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testSPLink.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHome.html');
|
||||||
|
// SP版(touch)のURLのテストだがリゾルバ側でURLから-touchを削除してPC版を取得するので、PC版の内容を使用する
|
||||||
|
|
||||||
$this->createResolver(DLsiteResolver::class, $responseText);
|
$this->createResolver(DLsiteResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -212,7 +213,7 @@ class DLsiteResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testShortLink()
|
public function testShortLink()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testShortLink.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/DLsite/testHome.html');
|
||||||
|
|
||||||
$this->createResolver(DLsiteResolver::class, $responseText);
|
$this->createResolver(DLsiteResolver::class, $responseText);
|
||||||
|
|
||||||
|
@@ -20,7 +20,7 @@ class NijieResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testStandardPicture()
|
public function testStandardPicture()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testStandardPicture.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testStandardPictureResponse.html');
|
||||||
|
|
||||||
$this->createResolver(NijieResolver::class, $responseText);
|
$this->createResolver(NijieResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ class NijieResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testMultiplePicture()
|
public function testMultiplePicture()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testMultiplePicture.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testMultiplePictureResponse.html');
|
||||||
|
|
||||||
$this->createResolver(NijieResolver::class, $responseText);
|
$this->createResolver(NijieResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ class NijieResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testAnimationGif()
|
public function testAnimationGif()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testAnimationGif.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testAnimationGifResponse.html');
|
||||||
|
|
||||||
$this->createResolver(NijieResolver::class, $responseText);
|
$this->createResolver(NijieResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ class NijieResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testMp4Movie()
|
public function testMp4Movie()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testMp4Movie.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testMp4MovieResponse.html');
|
||||||
|
|
||||||
$this->createResolver(NijieResolver::class, $responseText);
|
$this->createResolver(NijieResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ class NijieResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testStandardPictureSp()
|
public function testStandardPictureSp()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testStandardPictureSp.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testStandardPictureResponse.html');
|
||||||
|
|
||||||
$this->createResolver(NijieResolver::class, $responseText);
|
$this->createResolver(NijieResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ class NijieResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testMultiplePictureSp()
|
public function testMultiplePictureSp()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testMultiplePictureSp.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testMultiplePictureResponse.html');
|
||||||
|
|
||||||
$this->createResolver(NijieResolver::class, $responseText);
|
$this->createResolver(NijieResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ class NijieResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testAnimationGifSp()
|
public function testAnimationGifSp()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testAnimationGifSp.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testAnimationGifResponse.html');
|
||||||
|
|
||||||
$this->createResolver(NijieResolver::class, $responseText);
|
$this->createResolver(NijieResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ class NijieResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testMp4MovieSp()
|
public function testMp4MovieSp()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testMp4MovieSp.html');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Nijie/testMp4MovieResponse.html');
|
||||||
|
|
||||||
$this->createResolver(NijieResolver::class, $responseText);
|
$this->createResolver(NijieResolver::class, $responseText);
|
||||||
|
|
||||||
|
@@ -20,7 +20,7 @@ class PixivResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testIllust()
|
public function testIllust()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Pixiv/testIllust.json');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Pixiv/illust.json');
|
||||||
|
|
||||||
$this->createResolver(PixivResolver::class, $responseText);
|
$this->createResolver(PixivResolver::class, $responseText);
|
||||||
|
|
||||||
@@ -36,23 +36,23 @@ class PixivResolverTest extends TestCase
|
|||||||
|
|
||||||
public function testIllustMultiPages()
|
public function testIllustMultiPages()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Pixiv/testIllustMultiPages.json');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Pixiv/illustMultiPages.json');
|
||||||
|
|
||||||
$this->createResolver(PixivResolver::class, $responseText);
|
$this->createResolver(PixivResolver::class, $responseText);
|
||||||
|
|
||||||
$metadata = $this->resolver->resolve('https://www.pixiv.net/member_illust.php?mode=medium&illust_id=47220843');
|
$metadata = $this->resolver->resolve('https://www.pixiv.net/member_illust.php?mode=medium&illust_id=74939802');
|
||||||
$this->assertEquals('がぶ飲みミルクティー', $metadata->title);
|
$this->assertEquals('T-20S', $metadata->title);
|
||||||
$this->assertEquals('投稿者: きっぷる' . PHP_EOL . '劇中で度々お見かけするお姿がたまらなく愛おしいのです' . PHP_EOL . 'チラリズムでしょうか', $metadata->description);
|
$this->assertEquals('投稿者: amssc' . PHP_EOL . 'JUST FOR FUN' . PHP_EOL . '现在可以做到游戏内立绘修改拉!立绘动态皮肤都可以支持,想要资助获得新技术请站内信联系我。', $metadata->description);
|
||||||
$this->assertEquals('https://i.pixiv.cat/img-master/img/2014/11/23/15/52/00/47220843_p0_master1200.jpg', $metadata->image);
|
$this->assertEquals('https://i.pixiv.cat/img-master/img/2019/05/28/01/16/24/74939802_p0_master1200.jpg', $metadata->image);
|
||||||
$this->assertEquals(['SHIROBAKO', '小笠原綸子', 'ゴスロリ様', '中出し', 'SHIRUPAKO', 'くわえたくしあげ', 'ずらし挿入', 'SHIROBAKO1000users入り', '破れストッキング'], $metadata->tags);
|
$this->assertEquals(['巨乳', '母乳', 'lastorigin', 'Last_Origin', 'T-20S', 'おっぱい', '라스트오리진', '노움'], $metadata->tags);
|
||||||
if ($this->shouldUseMock()) {
|
if ($this->shouldUseMock()) {
|
||||||
$this->assertSame('https://www.pixiv.net/ajax/illust/47220843', (string) $this->handler->getLastRequest()->getUri());
|
$this->assertSame('https://www.pixiv.net/ajax/illust/74939802', (string) $this->handler->getLastRequest()->getUri());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testManga()
|
public function testManga()
|
||||||
{
|
{
|
||||||
$responseText = file_get_contents(__DIR__ . '/../../fixture/Pixiv/testManga.json');
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Pixiv/manga.json');
|
||||||
|
|
||||||
$this->createResolver(PixivResolver::class, $responseText);
|
$this->createResolver(PixivResolver::class, $responseText);
|
||||||
|
|
||||||
|
@@ -28,9 +28,6 @@ class SteamResolverTest extends TestCase
|
|||||||
$this->assertEquals('NEKOPARA Vol. 1', $metadata->title);
|
$this->assertEquals('NEKOPARA Vol. 1', $metadata->title);
|
||||||
$this->assertEquals('水無月嘉祥(みなづき かしょう)は伝統ある老舗和菓子屋である実家を出て、 パティシエとして自身のケーキ屋『ラ・ソレイユ』を一人で開店する。 しかし実家から送った引っ越し荷物の中に、 実家で飼っていた人型ネコのショコラとバニラが紛れ込んでいた。', $metadata->description);
|
$this->assertEquals('水無月嘉祥(みなづき かしょう)は伝統ある老舗和菓子屋である実家を出て、 パティシエとして自身のケーキ屋『ラ・ソレイユ』を一人で開店する。 しかし実家から送った引っ越し荷物の中に、 実家で飼っていた人型ネコのショコラとバニラが紛れ込んでいた。', $metadata->description);
|
||||||
$this->assertStringStartsWith('https://steamcdn-a.akamaihd.net/steam/apps/333600/header.jpg?t=', $metadata->image);
|
$this->assertStringStartsWith('https://steamcdn-a.akamaihd.net/steam/apps/333600/header.jpg?t=', $metadata->image);
|
||||||
if ($this->shouldUseMock()) {
|
|
||||||
$this->assertSame('https://store.steampowered.com/api/appdetails/?l=japanese&appids=333600', (string) $this->handler->getLastRequest()->getUri());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testR18()
|
public function testR18()
|
||||||
@@ -43,9 +40,6 @@ class SteamResolverTest extends TestCase
|
|||||||
$this->assertEquals('Broke Girl | 負債千金', $metadata->title);
|
$this->assertEquals('Broke Girl | 負債千金', $metadata->title);
|
||||||
$this->assertEquals('苦労知らずに育ったお嬢様は一夜にして1000万の借金を背負うことになった。借金を返済するために働かなければならない。しかし世間には悪意が満ちており、男達はお金で彼女を誘うか凌辱することしか考えていない。', $metadata->description);
|
$this->assertEquals('苦労知らずに育ったお嬢様は一夜にして1000万の借金を背負うことになった。借金を返済するために働かなければならない。しかし世間には悪意が満ちており、男達はお金で彼女を誘うか凌辱することしか考えていない。', $metadata->description);
|
||||||
$this->assertStringStartsWith('https://steamcdn-a.akamaihd.net/steam/apps/1077580/header.jpg?t=', $metadata->image);
|
$this->assertStringStartsWith('https://steamcdn-a.akamaihd.net/steam/apps/1077580/header.jpg?t=', $metadata->image);
|
||||||
if ($this->shouldUseMock()) {
|
|
||||||
$this->assertSame('https://store.steampowered.com/api/appdetails/?l=japanese&appids=1077580', (string) $this->handler->getLastRequest()->getUri());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testNotFound()
|
public function testNotFound()
|
||||||
@@ -57,8 +51,5 @@ class SteamResolverTest extends TestCase
|
|||||||
$this->createResolver(SteamResolver::class, $responseText);
|
$this->createResolver(SteamResolver::class, $responseText);
|
||||||
|
|
||||||
$this->resolver->resolve('https://store.steampowered.com/app/1');
|
$this->resolver->resolve('https://store.steampowered.com/app/1');
|
||||||
if ($this->shouldUseMock()) {
|
|
||||||
$this->assertSame('https://store.steampowered.com/api/appdetails/?l=japanese&appids=1', (string) $this->handler->getLastRequest()->getUri());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
140
tests/Unit/MetadataResolver/ToranoanaResolverTest.php
Normal file
140
tests/Unit/MetadataResolver/ToranoanaResolverTest.php
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\MetadataResolver;
|
||||||
|
|
||||||
|
use App\MetadataResolver\ToranoanaResolver;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class ToranoanaResolverTest extends TestCase
|
||||||
|
{
|
||||||
|
use CreateMockedResolver;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
if (!$this->shouldUseMock()) {
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testTora()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Toranoana/testTora.html');
|
||||||
|
|
||||||
|
$this->createResolver(ToranoanaResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://ec.toranoana.shop/tora/ec/item/040030720152');
|
||||||
|
$this->assertEquals('新・古明地喫茶~そしてまた扉は開く~', $metadata->title);
|
||||||
|
$this->assertEquals('サークル【ツキギのとこ】(槻木こうすけ)発行の「新・古明地喫茶~そしてまた扉は開く~」を買うなら、とらのあな全年齢向け通信販売!', $metadata->description);
|
||||||
|
$this->assertRegExp('~ecdnimg\.toranoana\.jp/ec/img/.*\.jpg~', $metadata->image);
|
||||||
|
if ($this->shouldUseMock()) {
|
||||||
|
$this->assertSame('https://ec.toranoana.shop/tora/ec/item/040030720152', (string) $this->handler->getLastRequest()->getUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testToraR()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Toranoana/testToraR.html');
|
||||||
|
|
||||||
|
$this->createResolver(ToranoanaResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://ec.toranoana.jp/tora_r/ec/item/040030720174');
|
||||||
|
$this->assertEquals('お姉ちゃんが妹のぱんつでひとりえっちしてました。', $metadata->title);
|
||||||
|
$this->assertEquals('サークル【没後】(RYO)発行の「お姉ちゃんが妹のぱんつでひとりえっちしてました。」を買うなら、とらのあな成年向け通信販売!', $metadata->description);
|
||||||
|
$this->assertRegExp('~ecdnimg\.toranoana\.jp/ec/img/.*\.jpg~', $metadata->image);
|
||||||
|
if ($this->shouldUseMock()) {
|
||||||
|
$this->assertSame('https://ec.toranoana.jp/tora_r/ec/item/040030720174', (string) $this->handler->getLastRequest()->getUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testToraD()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Toranoana/testToraD.html');
|
||||||
|
|
||||||
|
$this->createResolver(ToranoanaResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://ec.toranoana.shop/tora_d/digi/item/042000013358');
|
||||||
|
$this->assertEquals('虎の穴ラボの薄い本。vol 1.5', $metadata->title);
|
||||||
|
$this->assertEquals('サークル【虎の穴ラボ】(虎の穴ラボエンジニアチーム)発行の「虎の穴ラボの薄い本。vol 1.5」を買うなら、とらのあな全年齢向け電子書籍!', $metadata->description);
|
||||||
|
$this->assertRegExp('~ecdnimg\.toranoana\.jp/ec/img/.*\.jpg~', $metadata->image);
|
||||||
|
if ($this->shouldUseMock()) {
|
||||||
|
$this->assertSame('https://ec.toranoana.shop/tora_d/digi/item/042000013358', (string) $this->handler->getLastRequest()->getUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testToraRD()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Toranoana/testToraRD.html');
|
||||||
|
|
||||||
|
$this->createResolver(ToranoanaResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://ec.toranoana.jp/tora_rd/digi/item/042000013181');
|
||||||
|
$this->assertEquals('放課後のお花摘み', $metadata->title);
|
||||||
|
$this->assertEquals('サークル【給食泥棒】(村雲)発行の「放課後のお花摘み」を買うなら、とらのあな成年向け電子書籍!', $metadata->description);
|
||||||
|
$this->assertRegExp('~ecdnimg\.toranoana\.jp/ec/img/.*\.jpg~', $metadata->image);
|
||||||
|
if ($this->shouldUseMock()) {
|
||||||
|
$this->assertSame('https://ec.toranoana.jp/tora_rd/digi/item/042000013181', (string) $this->handler->getLastRequest()->getUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testJoshi()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Toranoana/testJoshi.html');
|
||||||
|
|
||||||
|
$this->createResolver(ToranoanaResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://ec.toranoana.shop/joshi/ec/item/040030702729');
|
||||||
|
$this->assertEquals('円卓のクソ漫画', $metadata->title);
|
||||||
|
$this->assertEquals('サークル【地獄のすなぎもカーニバル】(槌田)発行の「円卓のクソ漫画」を買うなら、とらのあなJOSHIBU全年齢向け通信販売!', $metadata->description);
|
||||||
|
$this->assertRegExp('~ecdnimg\.toranoana\.jp/ec/img/.*\.jpg~', $metadata->image);
|
||||||
|
if ($this->shouldUseMock()) {
|
||||||
|
$this->assertSame('https://ec.toranoana.shop/joshi/ec/item/040030702729', (string) $this->handler->getLastRequest()->getUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testJoshiR()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Toranoana/testJoshiR.html');
|
||||||
|
|
||||||
|
$this->createResolver(ToranoanaResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://ec.toranoana.jp/joshi_r/ec/item/040030730126');
|
||||||
|
$this->assertEquals('リバースナイトリバース', $metadata->title);
|
||||||
|
$this->assertEquals('サークル【雨傘サイクル】(チャリリズム)発行の「リバースナイトリバース」を買うなら、とらのあなJOSHIBU成年向け通信販売!', $metadata->description);
|
||||||
|
$this->assertRegExp('~ecdnimg\.toranoana\.jp/ec/img/.*\.jpg~', $metadata->image);
|
||||||
|
if ($this->shouldUseMock()) {
|
||||||
|
$this->assertSame('https://ec.toranoana.jp/joshi_r/ec/item/040030730126', (string) $this->handler->getLastRequest()->getUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testJoshiD()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Toranoana/testJoshiD.html');
|
||||||
|
|
||||||
|
$this->createResolver(ToranoanaResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://ec.toranoana.shop/joshi_d/digi/item/042000012192');
|
||||||
|
$this->assertEquals('超幸運ガール審神者GOLDEN', $metadata->title);
|
||||||
|
$this->assertEquals('サークル【Day Of The Dead】(ほんちゅ)発行の「超幸運ガール審神者GOLDEN」を買うなら、とらのあなJOSHIBU全年齢向け電子書籍!', $metadata->description);
|
||||||
|
$this->assertRegExp('~ecdnimg\.toranoana\.jp/ec/img/.*\.jpg~', $metadata->image);
|
||||||
|
if ($this->shouldUseMock()) {
|
||||||
|
$this->assertSame('https://ec.toranoana.shop/joshi_d/digi/item/042000012192', (string) $this->handler->getLastRequest()->getUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testJoshiRD()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Toranoana/testJoshiRD.html');
|
||||||
|
|
||||||
|
$this->createResolver(ToranoanaResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://ec.toranoana.jp/joshi_rd/digi/item/042000013472');
|
||||||
|
$this->assertEquals('UBWの裏側で非公式に遠坂凛をナデナデする本', $metadata->title);
|
||||||
|
$this->assertEquals('サークル【阿仁谷組】(阿仁谷ユイジ)発行の「UBWの裏側で非公式に遠坂凛をナデナデする本」を買うなら、とらのあなJOSHIBU成年向け電子書籍!', $metadata->description);
|
||||||
|
$this->assertRegExp('~ecdnimg\.toranoana\.jp/ec/img/.*\.jpg~', $metadata->image);
|
||||||
|
if ($this->shouldUseMock()) {
|
||||||
|
$this->assertSame('https://ec.toranoana.jp/joshi_rd/digi/item/042000013472', (string) $this->handler->getLastRequest()->getUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
51
tests/Unit/MetadataResolver/XtubeResolverTest.php
Normal file
51
tests/Unit/MetadataResolver/XtubeResolverTest.php
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\MetadataResolver;
|
||||||
|
|
||||||
|
use App\MetadataResolver\XtubeResolver;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class XtubeResolverTest extends TestCase
|
||||||
|
{
|
||||||
|
use CreateMockedResolver;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
if (!$this->shouldUseMock()) {
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test()
|
||||||
|
{
|
||||||
|
$responseText = file_get_contents(__DIR__ . '/../../fixture/Xtube/test.json');
|
||||||
|
|
||||||
|
$this->createResolver(XtubeResolver::class, $responseText);
|
||||||
|
|
||||||
|
$metadata = $this->resolver->resolve('https://www.xtube.com/video-watch/homegrown-big-tits-18634762');
|
||||||
|
$this->assertEquals('Homegrown Big Tits', $metadata->title);
|
||||||
|
$this->assertEquals('Dedicated to the fans of the beautiful amateur women with big natural tits. All user submitted - you can see big boob amateur hotties fucking and sucking as their tits bounce and sway.', $metadata->description);
|
||||||
|
$this->assertRegExp('~https://cdn\d-s-hw-e5\.xtube\.com/m=eSK08f/videos/201302/07/RF4Nk-S774-/240X180/1\.jpg~', $metadata->image);
|
||||||
|
$this->assertEquals(['bigtits', 'homeg'], $metadata->tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNotMatch()
|
||||||
|
{
|
||||||
|
$this->expectException(\RuntimeException::class);
|
||||||
|
$this->expectExceptionMessage('Unmatched URL Pattern: https://www.xtube.com/gallery/black-celebs-free-7686657');
|
||||||
|
|
||||||
|
$this->createResolver(XtubeResolver::class, '');
|
||||||
|
$this->resolver->resolve('https://www.xtube.com/gallery/black-celebs-free-7686657');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNotOK()
|
||||||
|
{
|
||||||
|
$this->expectException(\RuntimeException::class);
|
||||||
|
$this->expectExceptionMessage('404: https://www.xtube.com/video-watch/notfound-404');
|
||||||
|
|
||||||
|
$this->createResolver(XtubeResolver::class, '', [], 404);
|
||||||
|
$this->resolver->resolve('https://www.xtube.com/video-watch/notfound-404');
|
||||||
|
}
|
||||||
|
}
|
2159
tests/fixture/DLsite/testSPLink.html
vendored
2159
tests/fixture/DLsite/testSPLink.html
vendored
File diff suppressed because it is too large
Load Diff
2159
tests/fixture/DLsite/testShortLink.html
vendored
2159
tests/fixture/DLsite/testShortLink.html
vendored
File diff suppressed because it is too large
Load Diff
11
tests/fixture/Nijie/testAnimationGifSp.html
vendored
11
tests/fixture/Nijie/testAnimationGifSp.html
vendored
@@ -1,11 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"><head><link rel="alternate" media="handheld" href="http://mb.nijie.info/view.php?id=9537" /><link rel="alternate" media="only screen and (max-width: 640px)" href="https://sp.nijie.info/view.php?id=9537" /><link rel="canonical" href="https://nijie.info/view.php?id=9537" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=970" /><meta name="format-detection" content="telephone=no" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta http-equiv="Content-Style-Type" content="text/css; charset=utf-8" /><meta http-equiv="Content-Script-Type" content="text/javascript" /><meta http-equiv="Content-Language" content="ja" /><meta name="description" content="ニジエに投稿された、黒末アプコのイラスト「ニジエがgifに対応したんだってね 奥さん」です。この画像はニジエがgifに対応したんだってね 奥さん,黒末アプコ,おっぱい,陥没乳首,眼鏡,GIFアニメ,ぶるんぶるん,アニメgif,に関連があります。「アニメgifとか専門外なのでよくわかりませんでした」" /><meta name="keywords" content="ニジエがgifに対応したんだってね 奥さん,黒末アプコ,おっぱい,陥没乳首,眼鏡,GIFアニメ,ぶるんぶるん,アニメgif," /><meta property="og:title" content="ニジエがgifに対応したんだってね 奥さん | 黒末アプコ" /><meta property="og:type" content="article" /><meta property="og:description" content="アニメgifとか専門外なのでよくわかりませんでした" /><meta property="og:url" content="https://nijie.info/view.php?id=9537" /><meta property="og:image" content="https://nijie.info/pic/logo/nijie_logo_og.png?201902161557" /><meta property="og:site_name" content="ニジエがgifに対応したんだってね 奥さん | 黒末アプコ | ニジエ" /><meta property="og:email" content="info@nijie.co.jp" /><link rel="alternate" href="https://nijie.info/view.php?id=9537" hreflang="x-default" /><link rel="shortcut icon" href="https://nijie.info/icon/favicon.ico?201902161557" /><link rel="shortcut icon" type="image/vnd.microsoft.icon" href="https://nijie.info/pic/icon/nijie.png?201902161557" /><title>ニジエがgifに対応したんだってね 奥さん | 黒末アプコ | ニジエ</title></head>
|
|
||||||
<body>
|
|
||||||
<!-- pickup some json -->
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "ImageObject","name": "ニジエがgifに対応したんだってね 奥さん","description": "アニメgifとか専門外なのでよくわかりませんでした","text": "アニメgifとか専門外なのでよくわかりませんでした","interactionCount": "10862 UserPlays, 6 UserComments","datePublished": "Sun Apr 8 06:59:48 2012","uploadDate": "Sun Apr 8 06:59:48 2012","dateModified": "Mon Apr 9 17:09:30 2012","copyrightYear": "2012","genre":"Image","contentLocation":"Japan","width":160,"height":90,"thumbnailUrl": "https://pic01.nijie.info/__rs_l160x160/nijie_picture/201204080659341943.gif","author": {"@type": "Person","name": "黒末アプコ","description": "判子エロ絵師とはわたしのことです","sameAs": "https://nijie.info/members.php?id=1943","image": "https://pic04.nijie.info/members_picture/thumbnail/1943_1542569693.gif"},"creator": {"@type": "Person","name": "黒末アプコ","description": "判子エロ絵師とはわたしのことです","sameAs": "https://nijie.info/members.php?id=1943","image": "https://pic04.nijie.info/members_picture/thumbnail/1943_1542569693.gif"},"editor": {"@type": "Person","name": "黒末アプコ","description": "判子エロ絵師とはわたしのことです","sameAs": "https://nijie.info/members.php?id=1943","image": "https://pic04.nijie.info/members_picture/thumbnail/1943_1542569693.gif"},"copyrightHolder": {"@type": "Person","name": "黒末アプコ","description": "判子エロ絵師とはわたしのことです","sameAs": "https://nijie.info/members.php?id=1943","image": "https://pic04.nijie.info/members_picture/thumbnail/1943_1542569693.gif"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "ティッシュ","author": {"@type": "Person","name": "黒末アプコ","description": "判子エロ絵師とはわたしのことです","sameAs": "https://nijie.info/members.php?id=1943","image": "http://pic04.nijie.info/members_picture/thumbnail/1943_1542569693.gif"},"datePublished": "Wed Nov 19 12:57:57 2014","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "ニジエがgifに対応したんだってね 奥さん","sameAs": "https://nijie.info/view.php?id=9537"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "ひっ さくや様! ガタガタガタ ","author": {"@type": "Person","name": "黒末アプコ","description": "判子エロ絵師とはわたしのことです","sameAs": "https://nijie.info/members.php?id=1943","image": "http://pic04.nijie.info/members_picture/thumbnail/1943_1542569693.gif"},"datePublished": "Thu Apr 19 20:48:02 2012","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "ニジエがgifに対応したんだってね 奥さん","sameAs": "https://nijie.info/view.php?id=9537"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "さっ、最高です!!","author": {"@type": "Person","name": "黒末アプコ","description": "判子エロ絵師とはわたしのことです","sameAs": "https://nijie.info/members.php?id=1943","image": "http://pic04.nijie.info/members_picture/thumbnail/1943_1542569693.gif"},"datePublished": "Thu Apr 19 20:35:19 2012","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "ニジエがgifに対応したんだってね 奥さん","sameAs": "https://nijie.info/view.php?id=9537"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "ぎょっ 新着コメントがtopに表示されないバグ しこっていただけてさいわいです","author": {"@type": "Person","name": "黒末アプコ","description": "判子エロ絵師とはわたしのことです","sameAs": "https://nijie.info/members.php?id=1943","image": "http://pic04.nijie.info/members_picture/thumbnail/1943_1542569693.gif"},"datePublished": "Sun Apr 8 14:04:52 2012","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "ニジエがgifに対応したんだってね 奥さん","sameAs": "https://nijie.info/view.php?id=9537"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "BreadcrumbList","itemListElement":[{"@type": "ListItem","position": 1,"item":{"@id": "https://nijie.info/members.php?id=1943","name": "黒末アプコ"}},{"@type": "ListItem","position": 2,"item":{"@id": "https://nijie.info/members_illust.php?id=1943","name": "黒末アプコさんのイラスト一覧"}},{"@type": "ListItem","position": 3,"item":{"@id": "https://nijie.info/view.php?id=9537","name": "ニジエがgifに対応したんだってね 奥さん"}}]}</script>
|
|
||||||
</body></html>
|
|
||||||
|
|
30
tests/fixture/Nijie/testMp4MovieSp.html
vendored
30
tests/fixture/Nijie/testMp4MovieSp.html
vendored
File diff suppressed because one or more lines are too long
12
tests/fixture/Nijie/testMultiplePictureSp.html
vendored
12
tests/fixture/Nijie/testMultiplePictureSp.html
vendored
@@ -1,12 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"><head><link rel="alternate" media="handheld" href="http://mb.nijie.info/view.php?id=202707" /><link rel="alternate" media="only screen and (max-width: 640px)" href="https://sp.nijie.info/view.php?id=202707" /><link rel="canonical" href="https://nijie.info/view.php?id=202707" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=970" /><meta name="format-detection" content="telephone=no" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta http-equiv="Content-Style-Type" content="text/css; charset=utf-8" /><meta http-equiv="Content-Script-Type" content="text/javascript" /><meta http-equiv="Content-Language" content="ja" /><meta name="description" content="ニジエに投稿された、ニジエ運営のイラスト「ニジエ壁紙」です。この画像はニジエ壁紙,ニジエ運営,ニジエたん,壁紙,に関連があります。「ニジエのPCとiphone用(4.7inch推奨)の壁紙です。
|
|
||||||
保存してご自由にお使いくださいませ。」" /><meta name="keywords" content="ニジエ壁紙,ニジエ運営,ニジエたん,壁紙," />
|
|
||||||
<meta property="og:title" content="ニジエ壁紙 | ニジエ運営" /><meta property="og:type" content="article" /><meta property="og:description" content="ニジエのPCとiphone用(4.7inch推奨)の壁紙です。
|
|
||||||
保存してご自由にお使いくださいませ。" /><meta property="og:url" content="https://nijie.info/view.php?id=202707" /><meta property="og:image" content="https://nijie.info/pic/logo/nijie_logo_og.png?201902161557" /><meta property="og:site_name" content="ニジエ壁紙 | ニジエ運営 | ニジエ" /><meta property="og:email" content="info@nijie.co.jp" /><link rel="alternate" href="https://nijie.info/view.php?id=202707" hreflang="x-default" /><link rel="shortcut icon" href="https://nijie.info/icon/favicon.ico?201902161557" /><link rel="shortcut icon" type="image/vnd.microsoft.icon" href="https://nijie.info/pic/icon/nijie.png?201902161557" /><title>ニジエ壁紙 | ニジエ運営 | ニジエ</title></head>
|
|
||||||
<body>
|
|
||||||
<!-- pickup some JSON-LD -->
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "ImageObject","name": "ニジエ壁紙","description": "ニジエのPCとiphone用(4.7inch推奨)の壁紙です。
|
|
||||||
保存してご自由にお使いくださいませ。","text": "ニジエのPCとiphone用(4.7inch推奨)の壁紙です。
|
|
||||||
保存してご自由にお使いくださいませ。","interactionCount": "2301 UserPlays, 4 UserComments","datePublished": "Thu Feb 9 18:58:03 2017","uploadDate": "Thu Feb 9 18:58:03 2017","dateModified": "Thu Feb 9 18:58:03 2017","copyrightYear": "2017","genre":"Image","contentLocation":"Japan","width":160,"height":90,"thumbnailUrl": "https://pic03.nijie.info/__rs_l160x160/nijie_picture/38_20170209185801_0.png","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "https://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"creator": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "https://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"editor": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "https://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"copyrightHolder": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "https://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "やったぜ!","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "http://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"datePublished": "Fri Feb 17 01:31:00 2017","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "ニジエ壁紙","sameAs": "https://nijie.info/view.php?id=202707"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "ぺろぺろしたいです","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "http://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"datePublished": "Fri Feb 17 01:30:54 2017","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "ニジエ壁紙","sameAs": "https://nijie.info/view.php?id=202707"}}</script>
|
|
||||||
</body></html>
|
|
16
tests/fixture/Nijie/testStandardPictureSp.html
vendored
16
tests/fixture/Nijie/testStandardPictureSp.html
vendored
@@ -1,16 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"><head><link rel="alternate" media="handheld" href="http://mb.nijie.info/view.php?id=66384" /><link rel="alternate" media="only screen and (max-width: 640px)" href="https://sp.nijie.info/view.php?id=66384" /><link rel="canonical" href="https://nijie.info/view.php?id=66384" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=970" /><meta name="format-detection" content="telephone=no" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta http-equiv="Content-Style-Type" content="text/css; charset=utf-8" /><meta http-equiv="Content-Script-Type" content="text/javascript" /><meta http-equiv="Content-Language" content="ja" /><meta name="description" content="ニジエに投稿された、ニジエ運営のイラスト「チンポップくんの日常ep.1「チンポップくんと釣り」」です。この画像はチンポップくんの日常ep.1「チンポップくんと釣り」,ニジエ運営,ニジエたん,釣り,チンポップ君の日常,公式漫画,に関連があります。「メールマガジン漫画のバックナンバー第一話です!
|
|
||||||
最新話はメールマガジンより配信中です。」" /><meta name="keywords" content="チンポップくんの日常ep.1「チンポップくんと釣り」,ニジエ運営,ニジエたん,釣り,チンポップ君の日常,公式漫画," /><meta property="og:title" content="チンポップくんの日常ep.1「チンポップくんと釣り」 | ニジエ運営" /><meta property="og:type" content="article" /><meta property="og:description" content="メールマガジン漫画のバックナンバー第一話です!
|
|
||||||
最新話はメールマガジンより配信中です。" /><meta property="og:url" content="https://nijie.info/view.php?id=66384" /><meta property="og:image" content="https://nijie.info/pic/logo/nijie_logo_og.png?201902161557" /><meta property="og:site_name" content="チンポップくんの日常ep.1「チンポップくんと釣り」 | ニジエ運営 | ニジエ" /><meta property="og:email" content="info@nijie.co.jp" /><link rel="alternate" href="https://nijie.info/view.php?id=66384" hreflang="x-default" /><link rel="shortcut icon" href="https://nijie.info/icon/favicon.ico?201902161557" /><link rel="shortcut icon" type="image/vnd.microsoft.icon" href="https://nijie.info/pic/icon/nijie.png?201902161557" /><title>チンポップくんの日常ep.1「チンポップくんと釣り」 | ニジエ運営 | ニジエ</title></head>
|
|
||||||
<body>
|
|
||||||
<!-- pickup only json -->
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "ImageObject","name": "チンポップくんの日常ep.1「チンポップくんと釣り」","description": "メールマガジン漫画のバックナンバー第一話です!
|
|
||||||
最新話はメールマガジンより配信中です。","text": "メールマガジン漫画のバックナンバー第一話です!
|
|
||||||
最新話はメールマガジンより配信中です。","interactionCount": "13634 UserPlays, 24 UserComments","datePublished": "Sat Nov 30 15:56:26 2013","uploadDate": "Sat Nov 30 15:56:26 2013","dateModified": "Sat Nov 30 15:56:26 2013","copyrightYear": "2013","genre":"Image","contentLocation":"Japan","width":160,"height":90,"thumbnailUrl": "https://pic04.nijie.info/__rs_l160x160/nijie_picture/38_20131130155623.png","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "https://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"creator": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "https://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"editor": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "https://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"copyrightHolder": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "https://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "ミルコ字幕","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "http://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"datePublished": "Tue Jan 27 08:58:02 2015","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "チンポップくんの日常ep.1「チンポップくんと釣り」","sameAs": "https://nijie.info/view.php?id=66384"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "ティッシュ","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "http://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"datePublished": "Tue Aug 26 17:56:41 2014","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "チンポップくんの日常ep.1「チンポップくんと釣り」","sameAs": "https://nijie.info/view.php?id=66384"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "ヨダレもの","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "http://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"datePublished": "Mon Jun 23 10:17:29 2014","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "チンポップくんの日常ep.1「チンポップくんと釣り」","sameAs": "https://nijie.info/view.php?id=66384"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "おまわりさんこっちです","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "http://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"datePublished": "Thu Mar 27 10:49:56 2014","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "チンポップくんの日常ep.1「チンポップくんと釣り」","sameAs": "https://nijie.info/view.php?id=66384"}}</script>
|
|
||||||
<script type="application/ld+json">{"@context": "http://schema.org","@type": "Review","reviewBody": "めちゃシコ","author": {"@type": "Person","name": "ニジエ運営","description": "ニジエンジョイ!","sameAs": "https://nijie.info/members.php?id=38","image": "http://pic04.nijie.info/members_picture/thumbnail/38_1511696698.png"},"datePublished": "Sat Feb 15 18:47:22 2014","contentLocation": "Japan","itemReviewed": {"@type" : "ImageObject","name" : "チンポップくんの日常ep.1「チンポップくんと釣り」","sameAs": "https://nijie.info/view.php?id=66384"}}</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
227
tests/fixture/Pixiv/illustMultiPages.json
vendored
Normal file
227
tests/fixture/Pixiv/illustMultiPages.json
vendored
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
{
|
||||||
|
"error": false,
|
||||||
|
"message": "",
|
||||||
|
"body": {
|
||||||
|
"illustId": "74939802",
|
||||||
|
"illustTitle": "T-20S",
|
||||||
|
"illustComment": "JUST FOR FUN<br />现在可以做到游戏内立绘修改拉!立绘动态皮肤都可以支持,想要资助获得新技术请站内信联系我。",
|
||||||
|
"id": "74939802",
|
||||||
|
"title": "T-20S",
|
||||||
|
"description": "JUST FOR FUN<br />现在可以做到游戏内立绘修改拉!立绘动态皮肤都可以支持,想要资助获得新技术请站内信联系我。",
|
||||||
|
"illustType": 0,
|
||||||
|
"createDate": "2019-05-27T16:16:24+00:00",
|
||||||
|
"uploadDate": "2019-05-27T16:16:24+00:00",
|
||||||
|
"restrict": 0,
|
||||||
|
"xRestrict": 1,
|
||||||
|
"sl": 6,
|
||||||
|
"urls": {
|
||||||
|
"mini": "https://i.pximg.net/c/48x48/img-master/img/2019/05/28/01/16/24/74939802_p0_square1200.jpg",
|
||||||
|
"thumb": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/28/01/16/24/74939802_p0_square1200.jpg",
|
||||||
|
"small": "https://i.pximg.net/c/540x540_70/img-master/img/2019/05/28/01/16/24/74939802_p0_master1200.jpg",
|
||||||
|
"regular": "https://i.pximg.net/img-master/img/2019/05/28/01/16/24/74939802_p0_master1200.jpg",
|
||||||
|
"original": "https://i.pximg.net/img-original/img/2019/05/28/01/16/24/74939802_p0.jpg"
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"authorId": "17702579",
|
||||||
|
"isLocked": false,
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"tag": "R-18",
|
||||||
|
"locked": true,
|
||||||
|
"deletable": false,
|
||||||
|
"userId": "17702579",
|
||||||
|
"romaji": null,
|
||||||
|
"userName": "amssc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "巨乳",
|
||||||
|
"locked": true,
|
||||||
|
"deletable": false,
|
||||||
|
"userId": "17702579",
|
||||||
|
"romaji": "kyonyuu",
|
||||||
|
"translation": {
|
||||||
|
"en": "large breasts"
|
||||||
|
},
|
||||||
|
"userName": "amssc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "母乳",
|
||||||
|
"locked": true,
|
||||||
|
"deletable": false,
|
||||||
|
"userId": "17702579",
|
||||||
|
"romaji": "bonyuu",
|
||||||
|
"translation": {
|
||||||
|
"en": "breast milk"
|
||||||
|
},
|
||||||
|
"userName": "amssc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "lastorigin",
|
||||||
|
"locked": true,
|
||||||
|
"deletable": false,
|
||||||
|
"userId": "17702579",
|
||||||
|
"romaji": null,
|
||||||
|
"userName": "amssc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "Last_Origin",
|
||||||
|
"locked": true,
|
||||||
|
"deletable": false,
|
||||||
|
"userId": "17702579",
|
||||||
|
"romaji": null,
|
||||||
|
"userName": "amssc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "T-20S",
|
||||||
|
"locked": true,
|
||||||
|
"deletable": false,
|
||||||
|
"userId": "17702579",
|
||||||
|
"romaji": null,
|
||||||
|
"userName": "amssc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "おっぱい",
|
||||||
|
"locked": false,
|
||||||
|
"deletable": false,
|
||||||
|
"romaji": "oppai",
|
||||||
|
"translation": {
|
||||||
|
"en": "breasts"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "라스트오리진",
|
||||||
|
"locked": false,
|
||||||
|
"deletable": false,
|
||||||
|
"romaji": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "노움",
|
||||||
|
"locked": false,
|
||||||
|
"deletable": false,
|
||||||
|
"romaji": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"writable": false
|
||||||
|
},
|
||||||
|
"storableTags": [
|
||||||
|
"0xsDLqCEW6",
|
||||||
|
"5oPIfUbtd6",
|
||||||
|
"zZZn32I7eS",
|
||||||
|
"NLCPvW6hqg",
|
||||||
|
"uMloBPsM69",
|
||||||
|
"4HYAnF33v5",
|
||||||
|
"Ie2c51_4Sp",
|
||||||
|
"I8DVKb4T8n",
|
||||||
|
"HAtQGc-2dA"
|
||||||
|
],
|
||||||
|
"userId": "17702579",
|
||||||
|
"userName": "amssc",
|
||||||
|
"userAccount": "amsscggy",
|
||||||
|
"userIllusts": {
|
||||||
|
"74939802": {
|
||||||
|
"illustId": "74939802",
|
||||||
|
"illustTitle": "T-20S",
|
||||||
|
"id": "74939802",
|
||||||
|
"title": "T-20S",
|
||||||
|
"illustType": 0,
|
||||||
|
"xRestrict": 1,
|
||||||
|
"restrict": 0,
|
||||||
|
"sl": 6,
|
||||||
|
"url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/28/01/16/24/74939802_p0_square1200.jpg",
|
||||||
|
"description": "JUST FOR FUN<br />现在可以做到游戏内立绘修改拉!立绘动态皮肤都可以支持,想要资助获得新技术请站内信联系我。",
|
||||||
|
"tags": [
|
||||||
|
"R-18",
|
||||||
|
"巨乳",
|
||||||
|
"母乳",
|
||||||
|
"lastorigin",
|
||||||
|
"Last_Origin",
|
||||||
|
"T-20S",
|
||||||
|
"おっぱい",
|
||||||
|
"라스트오리진",
|
||||||
|
"노움"
|
||||||
|
],
|
||||||
|
"userId": "17702579",
|
||||||
|
"userName": "amssc",
|
||||||
|
"width": 1842,
|
||||||
|
"height": 3461,
|
||||||
|
"pageCount": 2,
|
||||||
|
"isBookmarkable": true,
|
||||||
|
"bookmarkData": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"likeData": false,
|
||||||
|
"width": 1842,
|
||||||
|
"height": 3461,
|
||||||
|
"pageCount": 2,
|
||||||
|
"bookmarkCount": 1874,
|
||||||
|
"likeCount": 843,
|
||||||
|
"commentCount": 18,
|
||||||
|
"responseCount": 0,
|
||||||
|
"viewCount": 15890,
|
||||||
|
"isHowto": false,
|
||||||
|
"isOriginal": false,
|
||||||
|
"imageResponseOutData": [],
|
||||||
|
"imageResponseData": [],
|
||||||
|
"imageResponseCount": 0,
|
||||||
|
"pollData": null,
|
||||||
|
"seriesNavData": null,
|
||||||
|
"descriptionBoothId": null,
|
||||||
|
"descriptionYoutubeId": null,
|
||||||
|
"comicPromotion": null,
|
||||||
|
"contestBanners": [],
|
||||||
|
"factoryGoods": {
|
||||||
|
"integratable": false,
|
||||||
|
"integrated": false
|
||||||
|
},
|
||||||
|
"isBookmarkable": true,
|
||||||
|
"bookmarkData": null,
|
||||||
|
"contestData": null,
|
||||||
|
"zoneConfig": {
|
||||||
|
"responsive": {
|
||||||
|
"url": "https://pixon.ads-pixiv.net/show?zone_id=illust_responsive&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4duho1bldte0zwn&num=5d124549863"
|
||||||
|
},
|
||||||
|
"300x250": {
|
||||||
|
"url": "https://pixon.ads-pixiv.net/show?zone_id=illust_rectangle&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4duho1bolgkimxn&num=5d124549198"
|
||||||
|
},
|
||||||
|
"500x500": {
|
||||||
|
"url": "https://pixon.ads-pixiv.net/show?zone_id=bigbanner&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4duho1br3q3ejn9&num=5d124549470"
|
||||||
|
},
|
||||||
|
"header": {
|
||||||
|
"url": "https://pixon.ads-pixiv.net/show?zone_id=header&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4duho1bthomvkhj&num=5d124549448"
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"url": "https://pixon.ads-pixiv.net/show?zone_id=footer&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4duho1bvuhatw9l&num=5d124549678"
|
||||||
|
},
|
||||||
|
"expandedFooter": {
|
||||||
|
"url": "https://pixon.ads-pixiv.net/show?zone_id=multiple_illust_viewer&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4duho1by6cv5o74&num=5d124549963"
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"url": "https://pixon.ads-pixiv.net/show?zone_id=logo_side&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4duho1c0k739zyq&num=5d124549322"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extraData": {
|
||||||
|
"meta": {
|
||||||
|
"title": "[R-18] 【巨乳】「T-20S」/「amssc」のイラスト [pixiv]",
|
||||||
|
"description": "この作品 「T-20S」 は 「R-18」「巨乳」 等のタグがつけられた「amssc」さんのイラストです。 「JUST FOR FUN现在可以做到游戏内立绘修改拉!立绘动态皮肤都可以支持,想要资助获得新技术请站内信联系我。」",
|
||||||
|
"keywords": "R-18,巨乳,母乳,lastorigin,Last_Origin,T-20S,おっぱい,라스트오리진,노움,イラスト,pixiv,ピクシブ",
|
||||||
|
"canonical": "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=74939802"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"noLoginData": {
|
||||||
|
"breadcrumbs": [
|
||||||
|
"日常",
|
||||||
|
"R-18"
|
||||||
|
],
|
||||||
|
"zengoIdWorks": {
|
||||||
|
"prev": {
|
||||||
|
"id": "74939801",
|
||||||
|
"title": "秋めいてるようで春にも見える"
|
||||||
|
},
|
||||||
|
"next": {
|
||||||
|
"id": "74939803",
|
||||||
|
"title": "愛言葉lll"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
329
tests/fixture/Pixiv/testIllustMultiPages.json
vendored
329
tests/fixture/Pixiv/testIllustMultiPages.json
vendored
@@ -1,329 +0,0 @@
|
|||||||
{
|
|
||||||
"error": false,
|
|
||||||
"message": "",
|
|
||||||
"body": {
|
|
||||||
"illustId": "47220843",
|
|
||||||
"illustTitle": "がぶ飲みミルクティー",
|
|
||||||
"illustComment": "劇中で度々お見かけするお姿がたまらなく愛おしいのです<br />チラリズムでしょうか",
|
|
||||||
"id": "47220843",
|
|
||||||
"title": "がぶ飲みミルクティー",
|
|
||||||
"description": "劇中で度々お見かけするお姿がたまらなく愛おしいのです<br />チラリズムでしょうか",
|
|
||||||
"illustType": 0,
|
|
||||||
"createDate": "2014-11-23T06:52:00+00:00",
|
|
||||||
"uploadDate": "2014-11-23T06:52:00+00:00",
|
|
||||||
"restrict": 0,
|
|
||||||
"xRestrict": 1,
|
|
||||||
"sl": 6,
|
|
||||||
"urls": {
|
|
||||||
"mini": "https://i.pximg.net/c/48x48/img-master/img/2014/11/23/15/52/00/47220843_p0_square1200.jpg",
|
|
||||||
"thumb": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/11/23/15/52/00/47220843_p0_square1200.jpg",
|
|
||||||
"small": "https://i.pximg.net/c/540x540_70/img-master/img/2014/11/23/15/52/00/47220843_p0_master1200.jpg",
|
|
||||||
"regular": "https://i.pximg.net/img-master/img/2014/11/23/15/52/00/47220843_p0_master1200.jpg",
|
|
||||||
"original": "https://i.pximg.net/img-original/img/2014/11/23/15/52/00/47220843_p0.jpg"
|
|
||||||
},
|
|
||||||
"tags": {
|
|
||||||
"authorId": "10589144",
|
|
||||||
"isLocked": false,
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"tag": "R-18",
|
|
||||||
"locked": true,
|
|
||||||
"deletable": false,
|
|
||||||
"userId": "10589144",
|
|
||||||
"romaji": null,
|
|
||||||
"userName": "きっぷる"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "SHIROBAKO",
|
|
||||||
"locked": true,
|
|
||||||
"deletable": false,
|
|
||||||
"userId": "10589144",
|
|
||||||
"romaji": null,
|
|
||||||
"userName": "きっぷる"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "小笠原綸子",
|
|
||||||
"locked": true,
|
|
||||||
"deletable": false,
|
|
||||||
"userId": "10589144",
|
|
||||||
"romaji": "ogasawararinnko",
|
|
||||||
"userName": "きっぷる"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "ゴスロリ様",
|
|
||||||
"locked": true,
|
|
||||||
"deletable": false,
|
|
||||||
"userId": "10589144",
|
|
||||||
"romaji": "gosurorisama",
|
|
||||||
"userName": "きっぷる"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "中出し",
|
|
||||||
"locked": true,
|
|
||||||
"deletable": false,
|
|
||||||
"userId": "10589144",
|
|
||||||
"romaji": "nakadashi",
|
|
||||||
"translation": {
|
|
||||||
"en": "creampie"
|
|
||||||
},
|
|
||||||
"userName": "きっぷる"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "SHIRUPAKO",
|
|
||||||
"locked": false,
|
|
||||||
"deletable": false,
|
|
||||||
"romaji": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "くわえたくしあげ",
|
|
||||||
"locked": false,
|
|
||||||
"deletable": false,
|
|
||||||
"romaji": "kuwaetakushiage",
|
|
||||||
"translation": {
|
|
||||||
"en": "shirt held up with the mouth"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "ずらし挿入",
|
|
||||||
"locked": false,
|
|
||||||
"deletable": false,
|
|
||||||
"romaji": "zurashisounyuu",
|
|
||||||
"translation": {
|
|
||||||
"en": "clothed penetration"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "SHIROBAKO1000users入り",
|
|
||||||
"locked": false,
|
|
||||||
"deletable": false,
|
|
||||||
"romaji": "shirobakoissennyu-za-zuiri"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"tag": "破れストッキング",
|
|
||||||
"locked": false,
|
|
||||||
"deletable": false,
|
|
||||||
"romaji": "yaburesutokkinngu",
|
|
||||||
"translation": {
|
|
||||||
"en": "torn stockings"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"writable": false
|
|
||||||
},
|
|
||||||
"storableTags": [
|
|
||||||
"0xsDLqCEW6",
|
|
||||||
"OFfMrDY0Rx",
|
|
||||||
"LUdsS_06nd",
|
|
||||||
"jOuNGy1xGb",
|
|
||||||
"MM6RXH_rlN",
|
|
||||||
"8MSz4vqmhj",
|
|
||||||
"G3Q8bNP7Gg",
|
|
||||||
"B_OtVkMSZT",
|
|
||||||
"0HPK64uuTz",
|
|
||||||
"jEfylbrgQX"
|
|
||||||
],
|
|
||||||
"userId": "10589144",
|
|
||||||
"userName": "きっぷる",
|
|
||||||
"userAccount": "kipples",
|
|
||||||
"userIllusts": {
|
|
||||||
"43288863": {
|
|
||||||
"illustId": "43288863",
|
|
||||||
"illustTitle": "だべの人",
|
|
||||||
"id": "43288863",
|
|
||||||
"title": "だべの人",
|
|
||||||
"illustType": 0,
|
|
||||||
"xRestrict": 0,
|
|
||||||
"restrict": 0,
|
|
||||||
"sl": 2,
|
|
||||||
"url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/05/04/13/05/50/43288863_p0_square1200.jpg",
|
|
||||||
"description": "",
|
|
||||||
"tags": [
|
|
||||||
"バトルスピリッツ",
|
|
||||||
"最強銀河究極ゼロ",
|
|
||||||
"マレーネ",
|
|
||||||
"CLIPSTUDIOPAINT"
|
|
||||||
],
|
|
||||||
"userId": "10589144",
|
|
||||||
"userName": "きっぷる",
|
|
||||||
"width": 648,
|
|
||||||
"height": 906,
|
|
||||||
"pageCount": 1,
|
|
||||||
"isBookmarkable": null,
|
|
||||||
"bookmarkData": null
|
|
||||||
},
|
|
||||||
"46440938": {
|
|
||||||
"illustId": "46440938",
|
|
||||||
"illustTitle": "二期で会おうぜ、ベイビー",
|
|
||||||
"id": "46440938",
|
|
||||||
"title": "二期で会おうぜ、ベイビー",
|
|
||||||
"illustType": 0,
|
|
||||||
"xRestrict": 0,
|
|
||||||
"restrict": 0,
|
|
||||||
"sl": 2,
|
|
||||||
"url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/10/09/10/14/37/46440938_p0_square1200.jpg",
|
|
||||||
"description": "",
|
|
||||||
"tags": [
|
|
||||||
"さばげぶっ!",
|
|
||||||
"カニ",
|
|
||||||
"ゲスかわ☆ガールズ",
|
|
||||||
"CLIPSTUDIOPAINT"
|
|
||||||
],
|
|
||||||
"userId": "10589144",
|
|
||||||
"userName": "きっぷる",
|
|
||||||
"width": 784,
|
|
||||||
"height": 1015,
|
|
||||||
"pageCount": 2,
|
|
||||||
"isBookmarkable": null,
|
|
||||||
"bookmarkData": null
|
|
||||||
},
|
|
||||||
"47220843": {
|
|
||||||
"illustId": "47220843",
|
|
||||||
"illustTitle": "がぶ飲みミルクティー",
|
|
||||||
"id": "47220843",
|
|
||||||
"title": "がぶ飲みミルクティー",
|
|
||||||
"illustType": 0,
|
|
||||||
"xRestrict": 1,
|
|
||||||
"restrict": 0,
|
|
||||||
"sl": 6,
|
|
||||||
"url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/11/23/15/52/00/47220843_p0_square1200.jpg",
|
|
||||||
"description": "劇中で度々お見かけするお姿がたまらなく愛おしいのです<br />チラリズムでしょうか",
|
|
||||||
"tags": [
|
|
||||||
"R-18",
|
|
||||||
"SHIROBAKO",
|
|
||||||
"小笠原綸子",
|
|
||||||
"ゴスロリ様",
|
|
||||||
"中出し",
|
|
||||||
"SHIRUPAKO",
|
|
||||||
"くわえたくしあげ",
|
|
||||||
"ずらし挿入",
|
|
||||||
"SHIROBAKO1000users入り",
|
|
||||||
"破れストッキング"
|
|
||||||
],
|
|
||||||
"userId": "10589144",
|
|
||||||
"userName": "きっぷる",
|
|
||||||
"width": 777,
|
|
||||||
"height": 1087,
|
|
||||||
"pageCount": 2,
|
|
||||||
"isBookmarkable": true,
|
|
||||||
"bookmarkData": null
|
|
||||||
},
|
|
||||||
"65079114": {
|
|
||||||
"illustId": "65079114",
|
|
||||||
"illustTitle": "あってます",
|
|
||||||
"id": "65079114",
|
|
||||||
"title": "あってます",
|
|
||||||
"illustType": 0,
|
|
||||||
"xRestrict": 0,
|
|
||||||
"restrict": 0,
|
|
||||||
"sl": 2,
|
|
||||||
"url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/09/22/10/40/35/65079114_p0_square1200.jpg",
|
|
||||||
"description": "",
|
|
||||||
"tags": [
|
|
||||||
"ニーアオートマタ",
|
|
||||||
"2B",
|
|
||||||
"9S",
|
|
||||||
"尻",
|
|
||||||
"尻神様",
|
|
||||||
"人類に栄光あれ",
|
|
||||||
"NieR:Automata",
|
|
||||||
"2B9S",
|
|
||||||
"ヨルハ二号B型",
|
|
||||||
"NieR1000users入り"
|
|
||||||
],
|
|
||||||
"userId": "10589144",
|
|
||||||
"userName": "きっぷる",
|
|
||||||
"width": 1171,
|
|
||||||
"height": 1447,
|
|
||||||
"pageCount": 5,
|
|
||||||
"isBookmarkable": null,
|
|
||||||
"bookmarkData": null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"likeData": false,
|
|
||||||
"width": 777,
|
|
||||||
"height": 1087,
|
|
||||||
"pageCount": 2,
|
|
||||||
"bookmarkCount": 2242,
|
|
||||||
"likeCount": 1718,
|
|
||||||
"commentCount": 12,
|
|
||||||
"responseCount": 0,
|
|
||||||
"viewCount": 85669,
|
|
||||||
"isHowto": false,
|
|
||||||
"isOriginal": false,
|
|
||||||
"imageResponseOutData": [],
|
|
||||||
"imageResponseData": [],
|
|
||||||
"imageResponseCount": 0,
|
|
||||||
"pollData": null,
|
|
||||||
"seriesNavData": null,
|
|
||||||
"descriptionBoothId": null,
|
|
||||||
"descriptionYoutubeId": null,
|
|
||||||
"comicPromotion": null,
|
|
||||||
"contestBanners": [],
|
|
||||||
"factoryGoods": {
|
|
||||||
"integratable": false,
|
|
||||||
"integrated": false
|
|
||||||
},
|
|
||||||
"isBookmarkable": true,
|
|
||||||
"bookmarkData": null,
|
|
||||||
"contestData": null,
|
|
||||||
"zoneConfig": {
|
|
||||||
"responsive": {
|
|
||||||
"url": "https://pixon.ads-pixiv.net/show?zone_id=illust_responsive&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4lgebkzsfhdvlrs&num=5d1af27028"
|
|
||||||
},
|
|
||||||
"300x250": {
|
|
||||||
"url": "https://pixon.ads-pixiv.net/show?zone_id=illust_rectangle&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4lgebkzvh1ugg9e&num=5d1af270873"
|
|
||||||
},
|
|
||||||
"500x500": {
|
|
||||||
"url": "https://pixon.ads-pixiv.net/show?zone_id=bigbanner&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4lgebkzxw1ynubq&num=5d1af270762"
|
|
||||||
},
|
|
||||||
"header": {
|
|
||||||
"url": "https://pixon.ads-pixiv.net/show?zone_id=header&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4lgebl00lfis546&num=5d1af270915"
|
|
||||||
},
|
|
||||||
"footer": {
|
|
||||||
"url": "https://pixon.ads-pixiv.net/show?zone_id=footer&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4lgebl02yvrd3wn&num=5d1af270474"
|
|
||||||
},
|
|
||||||
"expandedFooter": {
|
|
||||||
"url": "https://pixon.ads-pixiv.net/show?zone_id=multiple_illust_viewer&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4lgebl05avijuu5&num=5d1af270637"
|
|
||||||
},
|
|
||||||
"logo": {
|
|
||||||
"url": "https://pixon.ads-pixiv.net/show?zone_id=logo_side&format=js&s=0&up=0&ng=g&l=ja&uri=%2Fajax%2Fillust%2F_PARAM_&is_spa=1&ab_test_digits_first=5&ab_test_digits_second=5&Yuid=MjgDVlY&suid=Pg4lgebl07ypkz6k2&num=5d1af270788"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"extraData": {
|
|
||||||
"meta": {
|
|
||||||
"title": "[R-18] 【SHIROBAKO】「がぶ飲みミルクティー」/「きっぷる」のイラスト [pixiv]",
|
|
||||||
"description": "この作品 「がぶ飲みミルクティー」 は 「R-18」「SHIROBAKO」 等のタグがつけられた「きっぷる」さんのイラストです。 「劇中で度々お見かけするお姿がたまらなく愛おしいのですチラリズムでしょうか」",
|
|
||||||
"keywords": "R-18,SHIROBAKO,小笠原綸子,ゴスロリ様,中出し,SHIRUPAKO,くわえたくしあげ,ずらし挿入,SHIROBAKO1000users入り,破れストッキング,イラスト,pixiv,ピクシブ",
|
|
||||||
"canonical": "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=47220843",
|
|
||||||
"ogp": {
|
|
||||||
"description": "劇中で度々お見かけするお姿がたまらなく愛おしいのですチラリズムでしょうか",
|
|
||||||
"image": "https://s.pximg.net/www/images/pixiv_logo.gif?2",
|
|
||||||
"title": "「がぶ飲みミルクティー」/「きっぷる」[pixiv]",
|
|
||||||
"type": "article"
|
|
||||||
},
|
|
||||||
"twitter": {
|
|
||||||
"description": "劇中で度々お見かけするお姿がたまらなく愛おしいのです\r\nチラリズムでしょうか",
|
|
||||||
"image": "https://s.pximg.net/www/images/pixiv_logo.gif?2",
|
|
||||||
"title": "[R-18]がぶ飲みミルクティー",
|
|
||||||
"card": "summary"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"noLoginData": {
|
|
||||||
"breadcrumbs": [
|
|
||||||
"日常",
|
|
||||||
"R-18"
|
|
||||||
],
|
|
||||||
"zengoIdWorks": {
|
|
||||||
"prev": {
|
|
||||||
"id": "47220842",
|
|
||||||
"title": "優しく 終わりを告げ て"
|
|
||||||
},
|
|
||||||
"next": {
|
|
||||||
"id": "47220846",
|
|
||||||
"title": "今泉受けまとめ3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
1675
tests/fixture/Toranoana/testJoshi.html
vendored
Normal file
1675
tests/fixture/Toranoana/testJoshi.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1588
tests/fixture/Toranoana/testJoshiD.html
vendored
Normal file
1588
tests/fixture/Toranoana/testJoshiD.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1738
tests/fixture/Toranoana/testJoshiR.html
vendored
Normal file
1738
tests/fixture/Toranoana/testJoshiR.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1696
tests/fixture/Toranoana/testJoshiRD.html
vendored
Normal file
1696
tests/fixture/Toranoana/testJoshiRD.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1794
tests/fixture/Toranoana/testTora.html
vendored
Normal file
1794
tests/fixture/Toranoana/testTora.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1674
tests/fixture/Toranoana/testToraD.html
vendored
Normal file
1674
tests/fixture/Toranoana/testToraD.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1744
tests/fixture/Toranoana/testToraR.html
vendored
Normal file
1744
tests/fixture/Toranoana/testToraR.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1626
tests/fixture/Toranoana/testToraRD.html
vendored
Normal file
1626
tests/fixture/Toranoana/testToraRD.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
tests/fixture/Xtube/test.json
vendored
Normal file
1
tests/fixture/Xtube/test.json
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"duration":"180","views":3146,"video_id":"RF4Nk-S774-","rating":"4.000","ratings":"1","title":"Homegrown Big Tits","description":"Dedicated to the fans of the beautiful amateur women with big natural tits. All user submitted - you can see big boob amateur hotties fucking and sucking as their tits bounce and sway.","url":"https:\/\/www.xtube.com\/video-watch\/homegrown-big-tits-18634762","embedCode":"https:\/\/www.xtube.com\/video-watch\/embedded\/homegrown-big-tits-18634762","default_thumb":"https:\/\/cdn5-s-hw-e5.xtube.com\/m=eSuQ8f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/1.jpg","thumb":"https:\/\/cdn5-s-hw-e5.xtube.com\/m=eSuQ8f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/1.jpg","publish_date":"2013-02-07 17:41:10","tags":{"1396":"bigtits","472012":"homeg"},"thumbs":[{"width":300,"height":210,"src":"https:\/\/cdn4-s-hw-e5.xtube.com\/m=eSK08f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/1.jpg"},{"width":300,"height":210,"src":"https:\/\/cdn4-s-hw-e5.xtube.com\/m=eSK08f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/2.jpg"},{"width":300,"height":210,"src":"https:\/\/cdn10-s-hw-e5.xtube.com\/m=eSK08f\/videos\/201302\/07\/RF4Nk-S774-\/240X180\/3.jpg"}]}
|
@@ -2333,7 +2333,7 @@ d3@^3.0.6:
|
|||||||
resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8"
|
resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8"
|
||||||
integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=
|
integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=
|
||||||
|
|
||||||
date-fns@^1.27.2:
|
date-fns@^1.27.2, date-fns@^1.30.1:
|
||||||
version "1.30.1"
|
version "1.30.1"
|
||||||
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
|
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
|
||||||
integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
|
integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
|
||||||
@@ -4607,9 +4607,9 @@ lodash.uniq@^4.5.0:
|
|||||||
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
|
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
|
||||||
|
|
||||||
lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5:
|
lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5:
|
||||||
version "4.17.11"
|
version "4.17.15"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||||
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
|
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||||
|
|
||||||
log-symbols@^1.0.2:
|
log-symbols@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
|
Reference in New Issue
Block a user