panchira 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +33 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/panchira.rb +8 -18
- data/lib/panchira/extensions.rb +16 -0
- data/lib/panchira/resolvers/dlsite_resolver.rb +4 -0
- data/lib/panchira/resolvers/komiflo_resolver.rb +7 -3
- data/lib/panchira/resolvers/melonbooks_resolver.rb +5 -1
- data/lib/panchira/resolvers/narou_resolver.rb +20 -0
- data/lib/panchira/resolvers/nijie_resolver.rb +3 -0
- data/lib/panchira/resolvers/pixiv_resolver.rb +7 -4
- data/lib/panchira/resolvers/resolver.rb +14 -1
- data/lib/panchira/version.rb +3 -1
- metadata +5 -3
- data/.travis.yml +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2715a3395e43d5ad43f35bedae84dbfe25a4cd533f964cbcc4cdaf953bc0c4b
|
4
|
+
data.tar.gz: '059e23e1ca4831bc58c62a4a7ccd4ed87010fee75b7e8997560fe49f43486f01'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5ed936514fec2e05dfcaeb727189d1bcc6328e1a27559bd925acba7dc3037c26c57c99fece2c88bad95c7d0d7ae7ffd6840f9e33dde58aef81db81ae600d829
|
7
|
+
data.tar.gz: 8383db6bdc9c78e2e845651e7206d702f5a8566475b8161c9e464364da7b6aa9c5f9886125771c636e0465e8eec7f1ee1dda3c0865a1f0d478131510451c4a74
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
|
21
|
+
steps:
|
22
|
+
- uses: actions/checkout@v2
|
23
|
+
- name: Set up Ruby
|
24
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
25
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
26
|
+
# uses: ruby/setup-ruby@v1
|
27
|
+
uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
|
28
|
+
with:
|
29
|
+
ruby-version: 2.6
|
30
|
+
- name: Install dependencies
|
31
|
+
run: bundle install
|
32
|
+
- name: Run tests
|
33
|
+
run: bundle exec rake test
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
+
## 0.2.0 - 2020-05-18
|
8
|
+
### Added
|
9
|
+
- Added support for Shousetsuka Ni Narou (novel18.syosetu.com).
|
10
|
+
- Added support for external resolvers.
|
11
|
+
- Added method Panchira::Resolvers#applicable?.
|
12
|
+
|
7
13
|
## 0.1.1 - 2020-05-13
|
8
14
|
### Fixed
|
9
15
|
- Fix serious requirement issue and make this gem at least executable.
|
@@ -12,4 +18,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
12
18
|
### Added
|
13
19
|
- Released Panchira gem. At this time we can parse only 5 websites.
|
14
20
|
|
21
|
+
[0.2.0]: https://github.com/nuita/panchira/releases/tag/v0.2.0
|
22
|
+
[0.1.1]: https://github.com/nuita/panchira/releases/tag/v0.1.1
|
15
23
|
[0.1.0]: https://github.com/nuita/panchira/releases/tag/v0.1.0
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
[](https://opensource.org/licenses/MIT)
|
2
|
-
|
2
|
+

|
3
3
|
[](https://badge.fury.io/rb/panchira)
|
4
4
|
|
5
5
|
# Panchira
|
data/lib/panchira.rb
CHANGED
@@ -7,11 +7,10 @@ require 'json'
|
|
7
7
|
|
8
8
|
require_relative 'panchira/version'
|
9
9
|
require_relative 'panchira/resolvers/resolver'
|
10
|
-
require_relative 'panchira/
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
require_relative 'panchira/resolvers/pixiv_resolver'
|
10
|
+
require_relative 'panchira/extensions'
|
11
|
+
|
12
|
+
project_root = File.dirname(File.absolute_path(__FILE__))
|
13
|
+
Dir.glob(project_root + '/panchira/resolvers/*_resolver.rb').sort.each { |file| require file }
|
15
14
|
|
16
15
|
# Main Panchira code goes here.
|
17
16
|
module Panchira
|
@@ -26,20 +25,11 @@ module Panchira
|
|
26
25
|
private
|
27
26
|
|
28
27
|
def select_resolver(url)
|
29
|
-
|
30
|
-
|
31
|
-
Panchira::KomifloResolver
|
32
|
-
when %r{melonbooks.co.jp/detail/detail.php\?product_id=(\d+)}
|
33
|
-
Panchira::MelonbooksResolver
|
34
|
-
when %r{pixiv\.net/(member_illust.php?.*illust_id=|artworks/)(\d+)}
|
35
|
-
Panchira::PixivResolver
|
36
|
-
when /nijie.*view.*id=\d+/
|
37
|
-
Panchira::NijieResolver
|
38
|
-
when /dlsite/
|
39
|
-
Panchira::DlsiteResolver
|
40
|
-
else
|
41
|
-
Panchira::Resolver
|
28
|
+
Panchira::Extensions.resolvers.each do |resolver|
|
29
|
+
return resolver if resolver.applicable?(url)
|
42
30
|
end
|
31
|
+
|
32
|
+
Panchira::Resolver
|
43
33
|
end
|
44
34
|
end
|
45
35
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Panchira
|
4
|
+
module Extensions
|
5
|
+
@resolvers = []
|
6
|
+
|
7
|
+
class << self
|
8
|
+
# Register a resolver class which extends Panchira::Resolver.
|
9
|
+
def register(resolver)
|
10
|
+
@resolvers.push(resolver) unless @resolvers.include?(resolver)
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :resolvers
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -2,10 +2,14 @@
|
|
2
2
|
|
3
3
|
module Panchira
|
4
4
|
class DlsiteResolver < Resolver
|
5
|
+
URL_REGEXP = /dlsite/.freeze
|
6
|
+
|
5
7
|
private
|
6
8
|
|
7
9
|
def parse_image_url
|
8
10
|
@page.css('//meta[property="og:image"]/@content').first.to_s.sub(/sam/, 'main')
|
9
11
|
end
|
10
12
|
end
|
13
|
+
|
14
|
+
::Panchira::Extensions.register(Panchira::DlsiteResolver)
|
11
15
|
end
|
@@ -4,12 +4,14 @@ module Panchira
|
|
4
4
|
# KomifloResolver resolves Komiflo.
|
5
5
|
# Komiflo has its API server, so we can utilize it.
|
6
6
|
class KomifloResolver < Resolver
|
7
|
+
URL_REGEXP = %r{komiflo\.com(?:/#!)?/comics/(\d+)}.freeze
|
8
|
+
|
7
9
|
def initialize(url)
|
8
10
|
@url = url
|
9
11
|
|
10
|
-
@id = url.slice(
|
11
|
-
|
12
|
-
@json = JSON.parse(
|
12
|
+
@id = url.slice(URL_REGEXP, 1)
|
13
|
+
raw_json = URI.parse("https://api.komiflo.com/content/id/#{@id}").read('User-Agent' => USER_AGENT)
|
14
|
+
@json = JSON.parse(raw_json)
|
13
15
|
end
|
14
16
|
|
15
17
|
private
|
@@ -36,4 +38,6 @@ module Panchira
|
|
36
38
|
'https://komiflo.com/comics/' + id
|
37
39
|
end
|
38
40
|
end
|
41
|
+
|
42
|
+
::Panchira::Extensions.register(Panchira::KomifloResolver)
|
39
43
|
end
|
@@ -2,10 +2,12 @@
|
|
2
2
|
|
3
3
|
module Panchira
|
4
4
|
class MelonbooksResolver < Resolver
|
5
|
+
URL_REGEXP = %r{melonbooks.co.jp/detail/detail.php\?product_id=(\d+)}.freeze
|
6
|
+
|
5
7
|
private
|
6
8
|
|
7
9
|
def parse_canonical_url
|
8
|
-
product_id = @url.slice(
|
10
|
+
product_id = @url.slice(URL_REGEXP, 1)
|
9
11
|
'https://www.melonbooks.co.jp/detail/detail.php?product_id=' + product_id + '&adult_view=1'
|
10
12
|
end
|
11
13
|
|
@@ -24,4 +26,6 @@ module Panchira
|
|
24
26
|
@page.css('//meta[property="og:image"]/@content').first.to_s.sub(/&c=1/, '')
|
25
27
|
end
|
26
28
|
end
|
29
|
+
|
30
|
+
::Panchira::Extensions.register(Panchira::MelonbooksResolver)
|
27
31
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'net/https'
|
4
|
+
|
5
|
+
module Panchira
|
6
|
+
class NarouResolver < Resolver
|
7
|
+
URL_REGEXP = %r{novel18\.syosetu\.com/}.freeze
|
8
|
+
|
9
|
+
def fetch_page(uri)
|
10
|
+
u = URI.parse(uri)
|
11
|
+
http = Net::HTTP.new(u.host, u.port)
|
12
|
+
http.use_ssl = u.port == 443
|
13
|
+
res = http.get u.request_uri, { 'cookie' => 'over18=yes;' }
|
14
|
+
|
15
|
+
Nokogiri::HTML.parse(res.body, uri)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
::Panchira::Extensions.register(Panchira::NarouResolver)
|
20
|
+
end
|
@@ -2,21 +2,22 @@
|
|
2
2
|
|
3
3
|
module Panchira
|
4
4
|
class PixivResolver < Resolver
|
5
|
+
URL_REGEXP = %r{pixiv\.net/(member_illust.php?.*illust_id=|artworks/)(\d+)}.freeze
|
6
|
+
|
5
7
|
def initialize(url)
|
6
8
|
super(url)
|
7
|
-
@illust_id = url.slice(
|
9
|
+
@illust_id = url.slice(URL_REGEXP, 2)
|
8
10
|
end
|
9
11
|
|
10
12
|
private
|
11
13
|
|
12
14
|
def parse_canonical_url
|
13
|
-
|
14
|
-
'https://pixiv.net/member_illust.php?mode=medium&illust_id=' + illust_id
|
15
|
+
'https://pixiv.net/member_illust.php?mode=medium&illust_id=' + @illust_id
|
15
16
|
end
|
16
17
|
|
17
18
|
def parse_image_url
|
18
19
|
proxy_url = "https://pixiv.cat/#{@illust_id}.jpg"
|
19
|
-
|
20
|
+
|
20
21
|
case Net::HTTP.get_response(URI.parse(proxy_url))
|
21
22
|
when Net::HTTPNotFound
|
22
23
|
proxy_url = "https://pixiv.cat/#{@illust_id}-1.jpg"
|
@@ -27,4 +28,6 @@ module Panchira
|
|
27
28
|
@page.css('//meta[property="og:image"]/@content').first.to_s
|
28
29
|
end
|
29
30
|
end
|
31
|
+
|
32
|
+
::Panchira::Extensions.register(Panchira::PixivResolver)
|
30
33
|
end
|
@@ -5,6 +5,12 @@
|
|
5
5
|
# and is inherited by the other resolvers.
|
6
6
|
module Panchira
|
7
7
|
class Resolver
|
8
|
+
# The URL pattern that this resolver tries to resolve.
|
9
|
+
# Should be redefined in subclasses.
|
10
|
+
URL_REGEXP = URI::DEFAULT_PARSER.make_regexp
|
11
|
+
|
12
|
+
USER_AGENT = "Mozilla/5.0 (compatible; Panchira/#{VERSION}; +https://github.com/nuita/panchira)"
|
13
|
+
|
8
14
|
def initialize(url)
|
9
15
|
@url = url
|
10
16
|
end
|
@@ -26,10 +32,17 @@ module Panchira
|
|
26
32
|
attributes
|
27
33
|
end
|
28
34
|
|
35
|
+
class << self
|
36
|
+
# Tell whether the url is applicable for this resolver.
|
37
|
+
def applicable?(url)
|
38
|
+
url =~ self::URL_REGEXP
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
29
42
|
private
|
30
43
|
|
31
44
|
def fetch_page(url)
|
32
|
-
raw_page = URI.parse(url).read
|
45
|
+
raw_page = URI.parse(url).read('User-Agent' => USER_AGENT)
|
33
46
|
charset = raw_page.charset
|
34
47
|
Nokogiri::HTML.parse(raw_page, url, charset)
|
35
48
|
end
|
data/lib/panchira/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: panchira
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kyp
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -89,8 +89,8 @@ executables: []
|
|
89
89
|
extensions: []
|
90
90
|
extra_rdoc_files: []
|
91
91
|
files:
|
92
|
+
- ".github/workflows/ruby.yml"
|
92
93
|
- ".gitignore"
|
93
|
-
- ".travis.yml"
|
94
94
|
- CHANGELOG.md
|
95
95
|
- Gemfile
|
96
96
|
- Gemfile.lock
|
@@ -100,9 +100,11 @@ files:
|
|
100
100
|
- bin/console
|
101
101
|
- bin/setup
|
102
102
|
- lib/panchira.rb
|
103
|
+
- lib/panchira/extensions.rb
|
103
104
|
- lib/panchira/resolvers/dlsite_resolver.rb
|
104
105
|
- lib/panchira/resolvers/komiflo_resolver.rb
|
105
106
|
- lib/panchira/resolvers/melonbooks_resolver.rb
|
107
|
+
- lib/panchira/resolvers/narou_resolver.rb
|
106
108
|
- lib/panchira/resolvers/nijie_resolver.rb
|
107
109
|
- lib/panchira/resolvers/pixiv_resolver.rb
|
108
110
|
- lib/panchira/resolvers/resolver.rb
|