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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd10641f0e69fa7afbe99d0793c420da27d11eab54189fed566b2a325b66bc89
4
- data.tar.gz: 71ebb9c12171e06849e3a4e05c2724197e823634ae1199e2810654ac7e663b75
3
+ metadata.gz: f2715a3395e43d5ad43f35bedae84dbfe25a4cd533f964cbcc4cdaf953bc0c4b
4
+ data.tar.gz: '059e23e1ca4831bc58c62a4a7ccd4ed87010fee75b7e8997560fe49f43486f01'
5
5
  SHA512:
6
- metadata.gz: c220c35ab007fc582a680fa8212d42e38c6796d6b7d4cac52504e137b172e775572d42dc283483b7687561d77df7f64860d476fbba375e5728365af4c1499acc
7
- data.tar.gz: 98ece3d0b40b99a991e9d12a9e7abb011a4d83d31f852a3192c9800391839fc1972d3e426c46bba40c8f248617f5d71513eb25aafea054c98ec7561b373eef68
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- panchira (0.1.1)
4
+ panchira (0.2.0)
5
5
  fastimage (~> 2.1.7)
6
6
  nokogiri (~> 1.10.9)
7
7
 
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
2
- [![Build Status](https://travis-ci.org/nuita/panchira.svg?branch=master)](https://travis-ci.org/nuita/panchira.svg?branch=master)
2
+ ![Ruby](https://github.com/nuita/panchira/workflows/Ruby/badge.svg)
3
3
  [![Gem Version](https://badge.fury.io/rb/panchira.svg)](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/resolvers/dlsite_resolver'
11
- require_relative 'panchira/resolvers/komiflo_resolver'
12
- require_relative 'panchira/resolvers/melonbooks_resolver'
13
- require_relative 'panchira/resolvers/nijie_resolver'
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
- case url
30
- when %r{komiflo\.com(?:/#!)?/comics/(\d+)}
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(%r{komiflo\.com(?:/#!)?/comics/(\d+)}, 1)
11
- json_uri = URI.parse("https://api.komiflo.com/content/id/#{@id}")
12
- @json = JSON.parse(Net::HTTP.get(json_uri))
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(%r{melonbooks.co.jp/detail/detail.php\?product_id=(\d+)}, 1)
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,6 +2,7 @@
2
2
 
3
3
  module Panchira
4
4
  class NijieResolver < Resolver
5
+ URL_REGEXP = /nijie.*view.*id=\d+/.freeze
5
6
 
6
7
  private
7
8
 
@@ -24,4 +25,6 @@ module Panchira
24
25
  end
25
26
  end
26
27
  end
28
+
29
+ ::Panchira::Extensions.register(Panchira::NijieResolver)
27
30
  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(%r{pixiv\.net/(member_illust.php?.*illust_id=|artworks/)(\d+)}, 2)
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
- illust_id = @url.slice(%r{pixiv\.net/(member_illust.php?.*illust_id=|artworks/)(\d+)}, 2)
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Panchira
2
- VERSION = "0.1.1"
4
+ VERSION = '0.2.0'
3
5
  end
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.1.1
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-13 00:00:00.000000000 Z
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
data/.travis.yml DELETED
@@ -1,9 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.6.2
7
- before_install: gem install bundler -v 2.0.2
8
- script:
9
- - bundle exec rake test