gwitch 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +44 -15
- data/bin/gwitch +24 -0
- data/lib/gwitch.rb +2 -2
- data/lib/gwitch/cli.rb +56 -0
- data/lib/gwitch/country.rb +16 -13
- data/lib/gwitch/game.rb +8 -15
- data/lib/gwitch/region.rb +15 -9
- data/lib/gwitch/region/americas.rb +3 -8
- data/lib/gwitch/region/asia.rb +3 -5
- data/lib/gwitch/region/europe.rb +3 -5
- data/lib/gwitch/version.rb +2 -4
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82b6169c6117ff674bb11ac60e62d9eadaa6445755e6b6ebc0c1ea23d62a0254
|
4
|
+
data.tar.gz: 1b83dd4d0243c328917d997f6c9463cc4b464711560172d8cf2afb6d45167a1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eff925c25baaba1530f03d0389669e337249a4997420e2ca22760950e2ecaf5055e7c724ccbf407d1f0cd3b1702de0a93eab734cdd680e2adb532f883df9d4a3
|
7
|
+
data.tar.gz: b3099b85d58a4c74ac6aa6a6d5bf971b038484d03b501da5c6f6026f37b3758b1f4ddf8ad5565fff49993c3b278dd7cea816730ea6ed5e2e43d7b20e9b347106
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
## [1.0.0](https://github.com/dounx/gwitch/releases/tag/1.0.0) (2020-05-25)
|
2
|
+
|
3
|
+
* Fix typo
|
4
|
+
* Fix a bug
|
5
|
+
* Update gemspec
|
6
|
+
* Update readme
|
7
|
+
* Refactor code
|
8
|
+
* Add some rake tasks
|
9
|
+
* Add gitignore
|
10
|
+
* Add mutex for multi threads
|
11
|
+
* Remove redundant comments
|
12
|
+
* Make get all games simultaneously
|
13
|
+
* Add cli
|
14
|
+
* Add some tests
|
15
|
+
|
1
16
|
## [0.0.1](https://github.com/dounx/gwitch/releases/tag/0.0.1) (2020-05-21)
|
2
17
|
|
3
18
|
* Initial import
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Gwitch
|
2
2
|
|
3
|
-
Gwitch can get switch games info (including price) from nintendo official API.
|
3
|
+
Gwitch can get switch games' info (including price) from nintendo official API.
|
4
4
|
|
5
5
|
## Prerequisites
|
6
6
|
|
@@ -24,21 +24,37 @@ And then execute:
|
|
24
24
|
|
25
25
|
## Basic Usage
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
### Bash
|
28
|
+
|
29
|
+
```
|
30
|
+
Usage: gwitch [options]
|
31
|
+
-g, --games Get all games (without price info)
|
32
|
+
-p, --price alpha2,nsuid1,nsuid2 Get games' price (Max 50 nsuids)
|
33
|
+
-c, --countries Get avaliable countries' alpha2 code
|
34
|
+
-v, --version Print version and exit
|
35
|
+
-h, --help Show help
|
36
|
+
```
|
37
|
+
|
38
|
+
The returned data will always be in json format.
|
39
|
+
|
40
|
+
Can be used with pipes and redirects.
|
41
|
+
|
42
|
+
eg.
|
43
|
+
|
44
|
+
```bash
|
45
|
+
gwitch -g >> games.json
|
29
46
|
```
|
30
47
|
|
31
|
-
|
48
|
+
### Ruby
|
32
49
|
|
33
50
|
```ruby
|
34
|
-
|
51
|
+
require 'gwitch'
|
35
52
|
```
|
36
53
|
|
37
|
-
Get all games
|
54
|
+
Get all games.
|
38
55
|
|
39
56
|
```ruby
|
40
|
-
|
41
|
-
games = Gwitch::Game.all('Americas')
|
57
|
+
games = Gwitch::Game.all
|
42
58
|
```
|
43
59
|
|
44
60
|
Get all avaliable countries.
|
@@ -50,16 +66,21 @@ countries = Gwitch::Country.all
|
|
50
66
|
Get country's info.
|
51
67
|
|
52
68
|
```ruby
|
53
|
-
country =
|
54
|
-
country.alpha2
|
55
|
-
country.region
|
56
|
-
country.currency
|
69
|
+
country = countries.first
|
70
|
+
country.alpha2 # => 'US'
|
71
|
+
country.region # => 'Americas'
|
72
|
+
country.currency # => 'USD'
|
73
|
+
country.avaliable? # => true
|
57
74
|
```
|
58
75
|
|
59
|
-
Query
|
76
|
+
Query games' price (Max 50 games).
|
60
77
|
|
61
78
|
```ruby
|
62
|
-
|
79
|
+
prices = Gwitch::Game.price('US', 'en', '70010000000141,70010000000142')
|
80
|
+
|
81
|
+
prices = Gwitch::Game.price('US', 'en', ['70010000000141', '70010000000142'])
|
82
|
+
|
83
|
+
prices = Gwitch::Game.price('US', 'en', [70010000000141, 70010000000142])
|
63
84
|
```
|
64
85
|
|
65
86
|
## Build
|
@@ -68,7 +89,15 @@ price = Gwitch::Game.price('US', 'en', '70010000000141')
|
|
68
89
|
git clone https://github.com/Dounx/gwitch
|
69
90
|
cd gwitch
|
70
91
|
gem build gwitch.gemspec
|
71
|
-
gem install --local gwitch
|
92
|
+
gem install --local gwitch-*.gem
|
93
|
+
```
|
94
|
+
|
95
|
+
## Rake
|
96
|
+
|
97
|
+
List of available tasks
|
98
|
+
|
99
|
+
```bash
|
100
|
+
rake --tasks
|
72
101
|
```
|
73
102
|
|
74
103
|
## License
|
data/bin/gwitch
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative "../lib/gwitch"
|
6
|
+
require_relative "../lib/gwitch/cli"
|
7
|
+
|
8
|
+
cli = Gwitch::CLI.new
|
9
|
+
cli.parse
|
10
|
+
|
11
|
+
options = cli.options
|
12
|
+
|
13
|
+
if options[:game]
|
14
|
+
puts Gwitch::Game.all.to_json
|
15
|
+
elsif options[:price]
|
16
|
+
opts = options[:price]
|
17
|
+
country = Gwitch::Country.new opts[0]
|
18
|
+
nsuids = opts.drop(1).map(&:to_i)
|
19
|
+
puts Gwitch::Game.price(country.alpha2, nsuids.join(',')).to_json
|
20
|
+
elsif options[:country]
|
21
|
+
puts Gwitch::Country.all.map(&:alpha2).to_json
|
22
|
+
else
|
23
|
+
puts cli.parser
|
24
|
+
end
|
data/lib/gwitch.rb
CHANGED
data/lib/gwitch/cli.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "optparse"
|
4
|
+
require_relative "version"
|
5
|
+
|
6
|
+
module Gwitch
|
7
|
+
class CLI
|
8
|
+
attr_reader :options, :parser
|
9
|
+
|
10
|
+
def parse(args = ARGV)
|
11
|
+
@options = setup_options(args)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def setup_options(args)
|
17
|
+
parse_options(args)
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_options(argv)
|
21
|
+
opts = {}
|
22
|
+
@parser = option_parser(opts)
|
23
|
+
@parser.parse!(argv)
|
24
|
+
opts
|
25
|
+
end
|
26
|
+
|
27
|
+
def option_parser(opts)
|
28
|
+
parser = OptionParser.new { |o|
|
29
|
+
o.on "-g", "--games", "Get all games (without price info)" do |arg|
|
30
|
+
opts[:game] = arg
|
31
|
+
end
|
32
|
+
|
33
|
+
o.on "-p", "--price alpha2,nsuid1,nsuid2", Array, "Get games' price (Max 50 nsuids)" do |arg|
|
34
|
+
opts[:price] = arg
|
35
|
+
end
|
36
|
+
|
37
|
+
o.on "-c", "--countries", "Get avaliable countries' alpha2 code" do |arg|
|
38
|
+
opts[:country] = arg
|
39
|
+
end
|
40
|
+
|
41
|
+
o.on "-v", "--version", "Print version and exit" do |arg|
|
42
|
+
puts "Gwitch #{VERSION}"
|
43
|
+
exit 0
|
44
|
+
end
|
45
|
+
}
|
46
|
+
|
47
|
+
parser.banner = "Usage: gwitch [options]"
|
48
|
+
parser.on_tail "-h", "--help", "Show help" do
|
49
|
+
puts parser
|
50
|
+
exit 1
|
51
|
+
end
|
52
|
+
|
53
|
+
parser
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/gwitch/country.rb
CHANGED
@@ -1,30 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require_relative
|
3
|
+
require "countries"
|
4
|
+
require_relative "game"
|
5
5
|
|
6
6
|
module Gwitch
|
7
7
|
class Country
|
8
|
+
InvaildAlpha2CodeError = Class.new(StandardError)
|
9
|
+
|
8
10
|
class << self
|
9
11
|
# All avaliable countries
|
10
12
|
def all
|
11
|
-
ISO3166::Country.all.map
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
13
|
+
countries = ISO3166::Country.all.map do |country|
|
14
|
+
Country.new(country.alpha2)
|
15
|
+
end
|
17
16
|
|
18
|
-
|
19
|
-
# An americas game
|
20
|
-
nsuid = '70010000000141'
|
21
|
-
|
22
|
-
!Game.price(alpha2, nsuid).nil?
|
17
|
+
countries.select{ |country| country.avaliable? }
|
23
18
|
end
|
24
19
|
end
|
25
20
|
|
26
21
|
def initialize(alpha2)
|
27
22
|
@country = ISO3166::Country[alpha2]
|
23
|
+
raise InvaildAlpha2CodeError unless @country
|
28
24
|
end
|
29
25
|
|
30
26
|
def alpha2
|
@@ -38,5 +34,12 @@ module Gwitch
|
|
38
34
|
def currency
|
39
35
|
@country.currency_code
|
40
36
|
end
|
37
|
+
|
38
|
+
def avaliable?
|
39
|
+
# An americas game
|
40
|
+
nsuid = '70010000000141'
|
41
|
+
|
42
|
+
!Game.price(alpha2, nsuid).nil?
|
43
|
+
end
|
41
44
|
end
|
42
45
|
end
|
data/lib/gwitch/game.rb
CHANGED
@@ -1,34 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "region"
|
4
4
|
|
5
5
|
module Gwitch
|
6
6
|
class Game
|
7
7
|
IdsExceedMaxError = Class.new(StandardError)
|
8
8
|
|
9
|
+
MAX_IDS_SIZE = 50
|
10
|
+
|
9
11
|
class << self
|
10
|
-
def all
|
11
|
-
|
12
|
-
when 'Americas'
|
13
|
-
Region::Americas.games
|
14
|
-
when 'Asia'
|
15
|
-
Region::Asia.games
|
16
|
-
when 'Europe'
|
17
|
-
Region::Europe.games
|
18
|
-
else
|
19
|
-
Region.games
|
20
|
-
end
|
12
|
+
def all
|
13
|
+
Region.games
|
21
14
|
end
|
22
15
|
|
23
|
-
# ids can be String or Array
|
24
16
|
def price(alpha2, ids, lang = 'en')
|
25
|
-
|
17
|
+
ids = ids.split(',') if ids.is_a?(String)
|
18
|
+
raise IdsExceedMaxError if ids.size > MAX_IDS_SIZE
|
26
19
|
|
27
20
|
api_url = 'https://api.ec.nintendo.com/v1/price'
|
28
21
|
queries = {
|
29
22
|
country: alpha2,
|
30
23
|
lang: lang,
|
31
|
-
ids: ids
|
24
|
+
ids: ids.join(',')
|
32
25
|
}
|
33
26
|
|
34
27
|
uri = URI.parse(api_url)
|
data/lib/gwitch/region.rb
CHANGED
@@ -1,19 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
3
|
+
require_relative "region/americas"
|
4
|
+
require_relative "region/asia"
|
5
|
+
require_relative "region/europe"
|
6
6
|
|
7
7
|
module Gwitch
|
8
|
-
|
9
|
-
# Get all games from americas, asia and europe eshops
|
10
8
|
class Region
|
11
9
|
def self.games
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
semaphore = Mutex.new
|
11
|
+
games = []
|
12
|
+
|
13
|
+
threads =
|
14
|
+
[Americas, Asia, Europe].map do |region|
|
15
|
+
Thread.new do
|
16
|
+
semaphore.synchronize {
|
17
|
+
games += region.games
|
18
|
+
}
|
19
|
+
end
|
15
20
|
end
|
16
|
-
|
21
|
+
threads.each(&:join)
|
22
|
+
games
|
17
23
|
end
|
18
24
|
end
|
19
25
|
end
|
@@ -1,11 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "algoliasearch"
|
4
4
|
|
5
5
|
module Gwitch
|
6
6
|
class Region
|
7
|
-
|
8
|
-
# A class which get games from americas eshop.
|
9
7
|
class Americas
|
10
8
|
CLIENT = Algolia::Client.new(
|
11
9
|
application_id: 'U3B6GR4UA3',
|
@@ -18,10 +16,8 @@ module Gwitch
|
|
18
16
|
|
19
17
|
# Trick for API limitation.
|
20
18
|
# Nintendo limit each facet can only get 1000 results.
|
21
|
-
# So
|
19
|
+
# So use facets as much as possible to get results.
|
22
20
|
# Maybe incompletely got.
|
23
|
-
# DON'T use this directly.
|
24
|
-
# Use filters method.
|
25
21
|
FACETS = {
|
26
22
|
generalFilters: ['Deals', 'DLC available', 'Demo available', 'Online Play via Nintendo Switch Online', 'Nintendo Switch Game Voucher'],
|
27
23
|
availability: ['New releases', 'Available now', 'Pre-purchase', 'Coming soon'],
|
@@ -78,8 +74,6 @@ module Gwitch
|
|
78
74
|
hits
|
79
75
|
end
|
80
76
|
|
81
|
-
# GalleryParsedError = Class.new
|
82
|
-
|
83
77
|
def parse(raw)
|
84
78
|
host = 'https://www.nintendo.com'
|
85
79
|
microsite_host = 'https://assets.nintendo.com/image/upload/f_auto,q_auto,w_960,h_540'
|
@@ -132,6 +126,7 @@ module Gwitch
|
|
132
126
|
categories: game['categories'],
|
133
127
|
maker: game['publishers']&.join(', '),
|
134
128
|
player: game['players'],
|
129
|
+
region: 'Americas',
|
135
130
|
images: image_urls,
|
136
131
|
url: url,
|
137
132
|
release_at: game['releaseDateMask']
|
data/lib/gwitch/region/asia.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "open-uri"
|
4
|
+
require "json"
|
5
5
|
|
6
6
|
module Gwitch
|
7
7
|
class Region
|
8
|
-
|
9
|
-
# A class which get games from asia eshop.
|
10
8
|
class Asia
|
11
9
|
API_URL = 'https://search.nintendo.jp/nintendo_soft/search.json'
|
12
10
|
QUERIES = {
|
@@ -17,7 +15,6 @@ module Gwitch
|
|
17
15
|
}.freeze
|
18
16
|
|
19
17
|
class << self
|
20
|
-
# Get all games from asia eshop.
|
21
18
|
def games
|
22
19
|
games = []
|
23
20
|
uri = URI.parse(API_URL)
|
@@ -66,6 +63,7 @@ module Gwitch
|
|
66
63
|
languages: game['lang'],
|
67
64
|
modes: modes,
|
68
65
|
dlcs: game['cnsuid'] || [],
|
66
|
+
region: 'Asia',
|
69
67
|
images: image_urls,
|
70
68
|
url: url,
|
71
69
|
release_at: game['pdate']
|
data/lib/gwitch/region/europe.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "open-uri"
|
4
|
+
require "json"
|
5
5
|
|
6
6
|
module Gwitch
|
7
7
|
class Region
|
8
|
-
|
9
|
-
# A class which get games from europe eshop.
|
10
8
|
class Europe
|
11
9
|
RowsTooSmallError = Class.new(StandardError)
|
12
10
|
|
@@ -23,7 +21,6 @@ module Gwitch
|
|
23
21
|
}.freeze
|
24
22
|
|
25
23
|
class << self
|
26
|
-
# Get all games from asia eshop.
|
27
24
|
def games
|
28
25
|
uri = URI.parse(API_URL)
|
29
26
|
uri.query = URI.encode_www_form(QUERIES)
|
@@ -62,6 +59,7 @@ module Gwitch
|
|
62
59
|
languages: game['language_availability']&.first&.split(',') || [],
|
63
60
|
modes: modes,
|
64
61
|
cloud_save: game['cloud_saves_b'],
|
62
|
+
region: 'Europe',
|
65
63
|
images: [
|
66
64
|
schema + game['image_url'],
|
67
65
|
schema + game['image_url_sq_s'],
|
data/lib/gwitch/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gwitch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dounx
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: algoliasearch
|
@@ -38,16 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3.0'
|
41
|
-
description:
|
41
|
+
description: Gwitch can get switch games' info (including price) from nintendo official
|
42
|
+
API.
|
42
43
|
email: imdounx@gmail.com
|
43
|
-
executables:
|
44
|
+
executables:
|
45
|
+
- gwitch
|
44
46
|
extensions: []
|
45
47
|
extra_rdoc_files: []
|
46
48
|
files:
|
47
49
|
- CHANGELOG.md
|
48
50
|
- LICENSE
|
49
51
|
- README.md
|
52
|
+
- bin/gwitch
|
50
53
|
- lib/gwitch.rb
|
54
|
+
- lib/gwitch/cli.rb
|
51
55
|
- lib/gwitch/country.rb
|
52
56
|
- lib/gwitch/game.rb
|
53
57
|
- lib/gwitch/region.rb
|
@@ -81,5 +85,5 @@ requirements: []
|
|
81
85
|
rubygems_version: 3.1.2
|
82
86
|
signing_key:
|
83
87
|
specification_version: 4
|
84
|
-
summary: Nintendo switch
|
88
|
+
summary: Nintendo switch games' info API.
|
85
89
|
test_files: []
|