panchira 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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