thegamesdb 1.1.2 → 2.1.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/main.yml +26 -0
- data/.github/workflows/rubocop.yml +20 -0
- data/.rubocop.yml +39 -0
- data/CHANGELOG.md +49 -0
- data/Gemfile +2 -0
- data/README.md +313 -52
- data/Rakefile +3 -0
- data/lib/thegamesdb/developers.rb +17 -0
- data/lib/thegamesdb/error.rb +12 -0
- data/lib/thegamesdb/games.rb +130 -0
- data/lib/thegamesdb/genres.rb +13 -0
- data/lib/thegamesdb/images.rb +7 -0
- data/lib/thegamesdb/platforms.rb +106 -0
- data/lib/thegamesdb/publishers.rb +15 -0
- data/lib/thegamesdb/utils.rb +66 -0
- data/lib/thegamesdb/version.rb +3 -1
- data/lib/thegamesdb.rb +78 -226
- data/test/client_test.rb +26 -0
- data/test/developers_test.rb +16 -0
- data/test/games_test.rb +92 -42
- data/test/genres_test.rb +16 -0
- data/test/platform_test.rb +85 -51
- data/test/publishers_test.rb +16 -0
- data/test/test_helper.rb +3 -2
- data/thegamesdb.gemspec +14 -9
- metadata +25 -8
- data/.travis.yml +0 -24
- data/lib/thegamesdb/config.rb +0 -9
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gamesdb
|
4
|
+
# Developers related API Endpoints
|
5
|
+
module Developers
|
6
|
+
# Fetches Developers list
|
7
|
+
#
|
8
|
+
# @see https://api.thegamesdb.net/#/Developers/Developers
|
9
|
+
#
|
10
|
+
# @return Array of Hashes with id and name as keys
|
11
|
+
def developers
|
12
|
+
url = 'Developers'
|
13
|
+
data = perform_request(url)
|
14
|
+
data['data']['developers'].map { |_id, developer| developer }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gamesdb
|
4
|
+
# Games related API Endpoints
|
5
|
+
module Games
|
6
|
+
# Method for listing platform's games
|
7
|
+
#
|
8
|
+
# @see https://api.thegamesdb.net/#/Games/GamesByPlatformID
|
9
|
+
#
|
10
|
+
# @param id [Integer]
|
11
|
+
# @param page [Integer]
|
12
|
+
#
|
13
|
+
# @return [Array] Array of Hashes with games info
|
14
|
+
#
|
15
|
+
def games_by_platform_id(platform_id, page = 1)
|
16
|
+
url = 'Games/ByPlatformID'
|
17
|
+
params = { id: platform_id, page: page, include: 'boxart' }
|
18
|
+
data = perform_request(url, params)
|
19
|
+
process_platform_games(data)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Method for getting game info
|
23
|
+
#
|
24
|
+
# @see https://api.thegamesdb.net/#/Games/GamesByGameID
|
25
|
+
#
|
26
|
+
# @param id [Integer|String] Game id or string of ',' delimited list
|
27
|
+
#
|
28
|
+
# @return [Array|Hash] Hash with game info
|
29
|
+
#
|
30
|
+
# rubocop:disable Metrics/MethodLength
|
31
|
+
def games_by_id(id)
|
32
|
+
url = 'Games/ByGameID'
|
33
|
+
params = {
|
34
|
+
id: id,
|
35
|
+
fields:
|
36
|
+
'players,publishers,genres,overview,last_updated,rating,platform,coop,youtube,os,processor,ram,hdd,'\
|
37
|
+
'video,sound,alternates',
|
38
|
+
include: 'boxart,platform'
|
39
|
+
}
|
40
|
+
data = perform_request(url, params)
|
41
|
+
return [] if (data['data']['count']).zero?
|
42
|
+
|
43
|
+
games = data['data']['games']
|
44
|
+
return Gamesdb::Utils.symbolize_keys(games.first) if games.count == 1
|
45
|
+
|
46
|
+
games.map { |game| Gamesdb::Utils.symbolize_keys(game) }
|
47
|
+
end
|
48
|
+
# rubocop:enable Metrics/MethodLength
|
49
|
+
|
50
|
+
# The GetGamesList API search returns a listing of games matched up with loose search terms.
|
51
|
+
#
|
52
|
+
# @see https://api.thegamesdb.net/#/Games/GamesByGameName
|
53
|
+
#
|
54
|
+
# @param name [String] game name (required)
|
55
|
+
# @param platform [Integer] (optional - platform id)
|
56
|
+
# @param page [Integer] (optional)
|
57
|
+
#
|
58
|
+
# @return [Hash] Hash with game info: id, name (not-unique), release_date, platform, etc.
|
59
|
+
#
|
60
|
+
# rubocop:disable Metrics/MethodLength
|
61
|
+
def games_by_name(name, platform: nil, page: 1)
|
62
|
+
url = 'Games/ByGameName'
|
63
|
+
params = {
|
64
|
+
fields:
|
65
|
+
'players,publishers,genres,overview,last_updated,rating,platform,coop,youtube,os,processor,ram,hdd'\
|
66
|
+
',video,sound,alternates',
|
67
|
+
include: 'boxart',
|
68
|
+
name: name,
|
69
|
+
page: page
|
70
|
+
}
|
71
|
+
params.merge!('filter[platform]' => platform) unless platform.nil?
|
72
|
+
|
73
|
+
data = perform_request(url, params)
|
74
|
+
process_platform_games(data)
|
75
|
+
end
|
76
|
+
# rubocop:enable Metrics/MethodLength
|
77
|
+
|
78
|
+
# This API feature returns a list of available artwork types and
|
79
|
+
# locations specific to the requested game id in the database. It
|
80
|
+
# also lists the resolution of any images available. Scrapers can be
|
81
|
+
# set to use a minimum or maximum resolution for specific images
|
82
|
+
#
|
83
|
+
# @see https://api.thegamesdb.net/#/Games/GamesImages
|
84
|
+
#
|
85
|
+
# @param id [Integer] The numeric ID of the game in Gamesdb that you like to fetch artwork details for
|
86
|
+
#
|
87
|
+
# @return [Hash] Hash with game art info: fanart (array), boxart (Hash,
|
88
|
+
# :front, :back), screenshots (array), fanart (array)
|
89
|
+
#
|
90
|
+
# rubocop:disable Metrics/AbcSize
|
91
|
+
def games_images(id)
|
92
|
+
url = 'Games/Images'
|
93
|
+
data = perform_request(url, games_id: id)
|
94
|
+
return [] if data.dig('data', 'count') == (0 || nil)
|
95
|
+
|
96
|
+
response = {}
|
97
|
+
response[:base_url] = data['data']['base_url']['original']
|
98
|
+
response[:logo] = Gamesdb::Utils.process_logo(data['data'], id)
|
99
|
+
response[:boxart] = Gamesdb::Utils.process_covers(data['data'], id)
|
100
|
+
response[:screenshot] = Gamesdb::Utils.process_screenshots(data['data'], id)
|
101
|
+
response[:fanart] = Gamesdb::Utils.process_fanart(data['data'], id)
|
102
|
+
response
|
103
|
+
end
|
104
|
+
|
105
|
+
# Fetch games update
|
106
|
+
#
|
107
|
+
# @see https://api.thegamesdb.net/#/Games/GamesUpdates
|
108
|
+
#
|
109
|
+
# @param last_edit_id [Integer] Required
|
110
|
+
# @param time [Integer] (optional)
|
111
|
+
# @param page [Integer] results page offset to return (optional)
|
112
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
113
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
114
|
+
def games_update(last_edit_id, arguments = {})
|
115
|
+
url = 'Games/Updates'
|
116
|
+
params = arguments.merge({ last_edit_id: last_edit_id })
|
117
|
+
data = perform_request(url, params)
|
118
|
+
|
119
|
+
regexp = /page=([0-9]+)/
|
120
|
+
response = {}
|
121
|
+
response[:updates] = data['data']['updates']
|
122
|
+
response[:previous_page] = data.dig('pages', 'previous')&.match(regexp)&.captures&.first&.to_i
|
123
|
+
response[:next_page] = data.dig('pages', 'next')&.match(regexp)&.captures&.first&.to_i
|
124
|
+
response
|
125
|
+
end
|
126
|
+
# rubocop:enable Metrics/AbcSize
|
127
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
128
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gamesdb
|
4
|
+
# Genres related API Endpoints
|
5
|
+
module Genres
|
6
|
+
# Fetches genres list
|
7
|
+
def genres
|
8
|
+
url = 'Genres'
|
9
|
+
data = perform_request(url)
|
10
|
+
data['data']['genres'].map { |_id, genre| genre }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gamesdb
|
4
|
+
# Platforms related API Endpoints
|
5
|
+
module Platforms
|
6
|
+
# Method for listing platforms
|
7
|
+
#
|
8
|
+
# @see https://api.thegamesdb.net/#/Platforms/Platforms
|
9
|
+
#
|
10
|
+
# @return [Array] Array of Hashes with platforms info
|
11
|
+
#
|
12
|
+
def platforms
|
13
|
+
url = 'Platforms'
|
14
|
+
params = { fields:
|
15
|
+
'icon,console,controller,developer,manufacturer,media,cpu,memory,graphics,sound,maxcontrollers,'\
|
16
|
+
'display,overview,youtube' }
|
17
|
+
data = perform_request(url, params)
|
18
|
+
|
19
|
+
data['data']['platforms'].map do |p|
|
20
|
+
Gamesdb::Utils.symbolize_keys(p.last)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# This API feature returns a set of metadata and artwork data for a specified Platform ID.
|
25
|
+
#
|
26
|
+
# @see https://api.thegamesdb.net/#/Platforms/PlatformsByPlatformID
|
27
|
+
#
|
28
|
+
# @param id [Integer|String] The numeric ID of the platform in the GamesDB
|
29
|
+
# database or a String with comma delimited list of Ids.
|
30
|
+
#
|
31
|
+
# @return [Hash|Array] Returns a Hash when there's one result or an Array of
|
32
|
+
# Hashes when there's more than one
|
33
|
+
#
|
34
|
+
def platforms_by_id(id)
|
35
|
+
url = 'Platforms/ByPlatformID'
|
36
|
+
params = {
|
37
|
+
id: id,
|
38
|
+
fields:
|
39
|
+
'icon,console,controller,developer,manufacturer,media,cpu,memory,graphics,sound,maxcontrollers,' \
|
40
|
+
'display,overview,youtube'
|
41
|
+
}
|
42
|
+
data = perform_request(url, params)
|
43
|
+
|
44
|
+
platform_api_response(data)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Fetches platforms by name
|
48
|
+
#
|
49
|
+
# @see https://api.thegamesdb.net/#/Platforms/PlatformsByPlatformName
|
50
|
+
#
|
51
|
+
# @param name [String] Platform name (Required)
|
52
|
+
#
|
53
|
+
# @return [Hash|Array] Returns a Hash when there's one result or an Array of
|
54
|
+
# Hashes when there's more than one
|
55
|
+
def platforms_by_name(name)
|
56
|
+
url = 'Platforms/ByPlatformName'
|
57
|
+
params = {
|
58
|
+
name: name,
|
59
|
+
fields:
|
60
|
+
'icon,console,controller,developer,manufacturer,media,cpu,memory,graphics,sound,maxcontrollers,display,' \
|
61
|
+
'overview,youtube'
|
62
|
+
}
|
63
|
+
data = perform_request(url, params)
|
64
|
+
|
65
|
+
platform_api_response(data)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Fetch platform(s) images by platform(s) id
|
69
|
+
#
|
70
|
+
# @see https://api.thegamesdb.net/#/Platforms/PlatformsImages
|
71
|
+
#
|
72
|
+
# @param platforms_id [Integer|String] The numeric ID of the platform in the GamesDB
|
73
|
+
# database or a String with comma delimited list of Ids. (Required)
|
74
|
+
# @param filter [String] options: 'fanart', 'banner', 'boxart' (supports
|
75
|
+
# comma delimited list)
|
76
|
+
# @param page [Integer]
|
77
|
+
#
|
78
|
+
# @return Array of Hashes
|
79
|
+
def platform_images(platforms_id, args = {})
|
80
|
+
url = 'Platforms/Images'
|
81
|
+
args['filter[type]'] = args.delete(:type) if args[:type]
|
82
|
+
args = args.merge({ platforms_id: platforms_id })
|
83
|
+
data = perform_request(url, args)
|
84
|
+
data['data']['images'].values.flatten
|
85
|
+
end
|
86
|
+
|
87
|
+
# Auxiliary method to return either one hash when there's only one result or
|
88
|
+
# an Array of Hashes for several results
|
89
|
+
def platform_api_response(data)
|
90
|
+
return [] if data['data']['count'].zero?
|
91
|
+
|
92
|
+
platforms = data['data']['platforms']
|
93
|
+
|
94
|
+
response = case platforms
|
95
|
+
when Hash
|
96
|
+
platforms.map { |_k, platform| Gamesdb::Utils.symbolize_keys(platform) }
|
97
|
+
when Array
|
98
|
+
platforms.map { |platform| Gamesdb::Utils.symbolize_keys(platform) }
|
99
|
+
end
|
100
|
+
|
101
|
+
return response.first if response.count == 1
|
102
|
+
|
103
|
+
response
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gamesdb
|
4
|
+
# Publishers related API Endpoints
|
5
|
+
module Publishers
|
6
|
+
def publishers
|
7
|
+
url = 'Publishers'
|
8
|
+
|
9
|
+
data = perform_request(url)
|
10
|
+
data['data']['publishers'].map do |_id, publisher|
|
11
|
+
publisher
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gamesdb
|
4
|
+
# Several reusable functions
|
5
|
+
module Utils
|
6
|
+
class << self
|
7
|
+
def process_logo(data, id)
|
8
|
+
logo = data['images'][id.to_s].select { |a| a['type'] == 'clearlogo' }
|
9
|
+
logo.empty? ? '' : logo.first['filename']
|
10
|
+
end
|
11
|
+
|
12
|
+
def process_fanart(data, id)
|
13
|
+
fanart = select_images(data, id, 'fanart')
|
14
|
+
return [] if fanart.empty?
|
15
|
+
|
16
|
+
fanart.map { |art| build_individual_fanart(art) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def process_covers(data, id)
|
20
|
+
covers = {}
|
21
|
+
boxart = select_images(data, id, 'boxart')
|
22
|
+
return [] if boxart.empty?
|
23
|
+
|
24
|
+
boxart.each do |art|
|
25
|
+
width, height = art['resolution'].split('x') unless art['resolution'].nil?
|
26
|
+
covers[art['side'].to_sym] = art_structure(art, width, height)
|
27
|
+
end
|
28
|
+
covers
|
29
|
+
end
|
30
|
+
|
31
|
+
def build_individual_fanart(art)
|
32
|
+
width, height = art['resolution'].split('x') unless art['resolution'].nil?
|
33
|
+
art_structure(art, width, height)
|
34
|
+
end
|
35
|
+
|
36
|
+
def art_structure(art, width, height)
|
37
|
+
{
|
38
|
+
url: art['filename'],
|
39
|
+
resolution: art['resolution'],
|
40
|
+
width: width,
|
41
|
+
height: height
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def process_screenshots(data, id)
|
46
|
+
select_images(data, id, 'screenshot').map do |b|
|
47
|
+
Gamesdb::Utils.symbolize_keys(b)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def select_images(data, id, image_type)
|
52
|
+
data['images'][id.to_s].select do |a|
|
53
|
+
a['type'] == image_type
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def symbolize_keys(hash)
|
58
|
+
new_hash = {}
|
59
|
+
hash.each_key do |key|
|
60
|
+
new_hash[key.to_sym] = hash.delete(key)
|
61
|
+
end
|
62
|
+
new_hash
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|