qa 4.2.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/controllers/qa/linked_data_terms_controller.rb +17 -39
- data/app/controllers/qa/terms_controller.rb +26 -2
- data/app/services/qa/linked_data/authority_url_service.rb +35 -21
- data/app/services/qa/linked_data/graph_service.rb +2 -4
- data/app/services/qa/linked_data/request_header_service.rb +97 -0
- data/lib/qa/authorities/discogs/discogs_instance_builder.rb +17 -19
- data/lib/qa/authorities/discogs/discogs_translation.rb +26 -22
- data/lib/qa/authorities/discogs/discogs_utils.rb +32 -20
- data/lib/qa/authorities/discogs/discogs_works_builder.rb +26 -47
- data/lib/qa/authorities/discogs/generic_authority.rb +64 -33
- data/lib/qa/authorities/getty/tgn.rb +1 -1
- data/lib/qa/authorities/linked_data/find_term.rb +60 -18
- data/lib/qa/authorities/linked_data/search_query.rb +43 -15
- data/lib/qa/authorities/loc/generic_authority.rb +2 -2
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +36 -0
- data/spec/controllers/terms_controller_spec.rb +26 -2
- data/spec/fixtures/discogs-find-response-json.json +1 -1
- data/spec/lib/authorities/discogs/generic_authority_spec.rb +103 -9
- data/spec/lib/authorities/getty/tgn_spec.rb +2 -2
- data/spec/lib/authorities/linked_data/find_term_spec.rb +11 -11
- data/spec/lib/authorities/linked_data/search_query_spec.rb +9 -9
- data/spec/lib/authorities/loc_spec.rb +9 -9
- data/spec/services/linked_data/authority_url_service_spec.rb +14 -8
- data/spec/services/linked_data/graph_service_spec.rb +2 -1
- data/spec/services/linked_data/request_header_service_spec.rb +124 -0
- metadata +9 -7
@@ -11,14 +11,14 @@ module Qa::Authorities
|
|
11
11
|
# to the URIs of corresponding objects in the Library of Congress vocabulary.
|
12
12
|
# @param [Hash] the http response from discogs
|
13
13
|
# @param [String] the subauthority
|
14
|
-
# @return [Array] jsonld
|
15
|
-
def build_graph(response, subauthority = "")
|
14
|
+
# @return [Array, String] requested RDF serialzation (supports: jsonld Array, n3 String, n-triples String)
|
15
|
+
def build_graph(response, subauthority = "", format: :jsonld)
|
16
16
|
graph = RDF::Graph.new
|
17
17
|
|
18
18
|
rdf_statements = compile_rdf_statements(response, subauthority)
|
19
19
|
graph.insert_statements(rdf_statements)
|
20
20
|
|
21
|
-
graph.dump(
|
21
|
+
graph.dump(format, standard_prefixes: true)
|
22
22
|
end
|
23
23
|
|
24
24
|
# @param [Hash] the http response from discogs
|
@@ -30,14 +30,16 @@ module Qa::Authorities
|
|
30
30
|
# all we need is a work and not an instance. If there's no subauthority, we can determine
|
31
31
|
# if the discogs record is a master because it will have a main_release field.
|
32
32
|
if master_only(response, subauthority)
|
33
|
+
self.work_uri = response["uri"].present? ? response["uri"] : response["resource_url"]
|
33
34
|
complete_rdf_stmts.concat(build_master_statements(response))
|
34
35
|
else
|
35
|
-
# If the subauthority is
|
36
|
+
# If the subauthority is "release," we need to define an instance as well as a
|
36
37
|
# work. If the discogs record has a master_id, fetch that and use the results to
|
37
38
|
# build the statements for the work.
|
38
39
|
master_resp = response["master_id"].present? ? json("https://api.discogs.com/masters/#{response['master_id']}") : response
|
39
40
|
complete_rdf_stmts.concat(build_master_statements(master_resp))
|
40
|
-
# Now do the statements for the instance.
|
41
|
+
# Now do the statements for the release/instance.
|
42
|
+
self.instance_uri = response["uri"].present? ? response["uri"] : response["resource_url"]
|
41
43
|
complete_rdf_stmts.concat(build_instance_statements(response))
|
42
44
|
end
|
43
45
|
end
|
@@ -77,11 +79,12 @@ module Qa::Authorities
|
|
77
79
|
# @return [Array] rdf statements
|
78
80
|
def get_primary_work_definition(response)
|
79
81
|
stmts = []
|
80
|
-
stmts << contruct_stmt_uri_object(
|
81
|
-
stmts << contruct_stmt_uri_object(
|
82
|
-
stmts << contruct_stmt_literal_object("
|
83
|
-
stmts << contruct_stmt_uri_object("
|
84
|
-
stmts
|
82
|
+
stmts << contruct_stmt_uri_object(work_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Work")
|
83
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/title", "titlen1")
|
84
|
+
stmts << contruct_stmt_literal_object("titlen1", bf_main_title_predicate, response["title"])
|
85
|
+
stmts << contruct_stmt_uri_object("titlen1", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Title")
|
86
|
+
stmts << contruct_stmt_uri_object(work_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Audio")
|
87
|
+
stmts << contruct_stmt_literal_object(work_uri, "http://id.loc.gov/ontologies/bibframe/originDate", response["year"].to_s) if response["year"].present?
|
85
88
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
86
89
|
end
|
87
90
|
|
@@ -89,14 +92,14 @@ module Qa::Authorities
|
|
89
92
|
# @return [Array] rdf statements
|
90
93
|
def get_primary_instance_definition(response)
|
91
94
|
stmts = []
|
92
|
-
stmts << contruct_stmt_uri_object(
|
93
|
-
stmts << contruct_stmt_uri_object(
|
94
|
-
stmts << contruct_stmt_uri_object(
|
95
|
-
stmts << contruct_stmt_literal_object("
|
96
|
-
stmts << contruct_stmt_uri_object("
|
97
|
-
stmts << contruct_stmt_uri_object(
|
98
|
-
stmts <<
|
99
|
-
stmts
|
95
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/instanceOf", work_uri)
|
96
|
+
stmts << contruct_stmt_uri_object(instance_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Instance")
|
97
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/title", "titlen2")
|
98
|
+
stmts << contruct_stmt_literal_object("titlen2", bf_main_title_predicate, response["title"])
|
99
|
+
stmts << contruct_stmt_uri_object("titlen2", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Title")
|
100
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/identifiedBy", "widn1")
|
101
|
+
stmts << contruct_stmt_uri_object("widn1", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Identifier")
|
102
|
+
stmts << contruct_stmt_literal_object("widn1", "http://www.w3.org/1999/02/22-rdf-syntax-ns#value", response["id"])
|
100
103
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
101
104
|
end
|
102
105
|
|
@@ -112,10 +115,11 @@ module Qa::Authorities
|
|
112
115
|
# we need the primary artists later when we loop through the track list, so build this array
|
113
116
|
primary_artists << artist
|
114
117
|
|
115
|
-
stmts << contruct_stmt_uri_object(
|
116
|
-
stmts << contruct_stmt_uri_object("
|
117
|
-
stmts << contruct_stmt_uri_object("
|
118
|
-
stmts << contruct_stmt_uri_object(
|
118
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn#{count}")
|
119
|
+
stmts << contruct_stmt_uri_object("contrbn#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bflc/PrimaryContribution")
|
120
|
+
stmts << contruct_stmt_uri_object("contrbn#{count}", bf_agent_predicate, "agentn#{count}")
|
121
|
+
stmts << contruct_stmt_uri_object("agentn#{count}", rdf_type_predicate, bf_agent_type_object)
|
122
|
+
stmts << contruct_stmt_literal_object("agentn#{count}", rdfs_label_predicate, artist["name"])
|
119
123
|
count += 1
|
120
124
|
end
|
121
125
|
end
|
@@ -9,9 +9,11 @@ module Qa::Authorities
|
|
9
9
|
# @param [String] either a string used to create a unique URI or an LOC uri in string format
|
10
10
|
# @param [String] or [Class] either a BIBFRAME property uri in string format or an RDF::URI
|
11
11
|
# @param [String] or [Class] strings can be a label or BIBFRAME class uri; class is always RDF::URI
|
12
|
-
# @return [Class] RDF::Statement with uri as the object
|
12
|
+
# @return [Class] RDF::Statement with either a uri or a bnode as the object
|
13
13
|
def contruct_stmt_uri_object(subject, predicate, object)
|
14
|
-
|
14
|
+
s = subject.include?("http") ? RDF::URI.new(subject) : subject.to_sym
|
15
|
+
o = object.to_s.include?("http") ? RDF::URI.new(object) : object.to_sym
|
16
|
+
RDF::Statement(s, RDF::URI(predicate), o)
|
15
17
|
end
|
16
18
|
|
17
19
|
# Constructs an RDF statement where the subject and predicate are URIs and the object is a literal
|
@@ -20,7 +22,8 @@ module Qa::Authorities
|
|
20
22
|
# @param [String] or [Class] strings can be a label or BIBFRAME class uri; class is always RDF::URI
|
21
23
|
# @return [Class] RDF::Statement with a literal as the object
|
22
24
|
def contruct_stmt_literal_object(subject, predicate, object)
|
23
|
-
|
25
|
+
s = subject.include?("http") ? RDF::URI.new(subject) : subject.to_sym
|
26
|
+
RDF::Statement(s, RDF::URI(predicate), RDF::Literal.new(object))
|
24
27
|
end
|
25
28
|
|
26
29
|
# frequently used predicates and objects
|
@@ -41,7 +44,7 @@ module Qa::Authorities
|
|
41
44
|
end
|
42
45
|
|
43
46
|
def bf_agent_type_object
|
44
|
-
|
47
|
+
"http://id.loc.gov/ontologies/bibframe/Agent"
|
45
48
|
end
|
46
49
|
|
47
50
|
def bf_role_predicate
|
@@ -49,7 +52,7 @@ module Qa::Authorities
|
|
49
52
|
end
|
50
53
|
|
51
54
|
def bf_role_type_object
|
52
|
-
|
55
|
+
"http://id.loc.gov/ontologies/bibframe/Role"
|
53
56
|
end
|
54
57
|
|
55
58
|
def discogs_genres
|
@@ -62,27 +65,36 @@ module Qa::Authorities
|
|
62
65
|
|
63
66
|
# both the work and the instance require a statement for the release year
|
64
67
|
# @param [Hash] the http response from discogs
|
65
|
-
# @param [String] either "Work" or "Instance"
|
66
68
|
# @return [Array] rdf statements
|
67
|
-
def build_year_statements(response
|
69
|
+
def build_year_statements(response)
|
68
70
|
year_stmts = []
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
year_stmts = get_year_rdf(type + "1", response["released"])
|
73
|
-
end
|
71
|
+
year_stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/provisionActivity", "daten1")
|
72
|
+
year_stmts << contruct_stmt_uri_object("daten1", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Publication")
|
73
|
+
year_stmts << contruct_stmt_literal_object("daten1", RDF::URI("http://id.loc.gov/ontologies/bibframe/date"), response["released"].to_s)
|
74
74
|
year_stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
75
75
|
end
|
76
76
|
|
77
|
-
# @param [
|
78
|
-
# @param [
|
77
|
+
# @param [Hash] the extraartists defined at the release level, not the track level
|
78
|
+
# @param [Integer] gives the role a unique uri
|
79
|
+
# @param [String] the entity type name
|
79
80
|
# @return [Array] rdf statements
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
def build_role_stmts(subject_node, role_node, label)
|
82
|
+
stmts = []
|
83
|
+
stmts << contruct_stmt_uri_object(subject_node, bf_role_predicate, role_node)
|
84
|
+
stmts << contruct_stmt_uri_object(role_node, rdf_type_predicate, bf_role_type_object)
|
85
|
+
stmts << contruct_stmt_literal_object(role_node, rdfs_label_predicate, label)
|
86
|
+
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
87
|
+
end
|
88
|
+
|
89
|
+
# @param [String] the playing speed in string format
|
90
|
+
# @param [Integer] gives the playing speed a unique uri
|
91
|
+
# @return [Array] rdf statements
|
92
|
+
def build_playing_speed_stmts(label, count)
|
93
|
+
stmts = []
|
94
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/soundCharacteristic", "speed#{count}")
|
95
|
+
stmts << contruct_stmt_uri_object("speed#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/PlayingSpeed")
|
96
|
+
stmts << contruct_stmt_literal_object("speed#{count}", rdfs_label_predicate, label)
|
97
|
+
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
86
98
|
end
|
87
99
|
end
|
88
100
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rdf'
|
2
2
|
module Qa::Authorities
|
3
3
|
module Discogs
|
4
|
-
module DiscogsWorksBuilder
|
4
|
+
module DiscogsWorksBuilder
|
5
5
|
include Discogs::DiscogsUtils
|
6
6
|
|
7
7
|
# @param [Hash] the http response from discogs
|
@@ -12,27 +12,17 @@ module Qa::Authorities
|
|
12
12
|
count = 1
|
13
13
|
return stmts unless response["extraartists"].present?
|
14
14
|
response["extraartists"].each do |artist|
|
15
|
-
stmts << contruct_stmt_uri_object(
|
16
|
-
stmts << contruct_stmt_uri_object("
|
17
|
-
stmts << contruct_stmt_uri_object("
|
18
|
-
stmts << contruct_stmt_uri_object(
|
19
|
-
stmts
|
15
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn1#{count}")
|
16
|
+
stmts << contruct_stmt_uri_object("contrbn1#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Contribution")
|
17
|
+
stmts << contruct_stmt_uri_object("contrbn1#{count}", bf_agent_predicate, "agentn1#{count}")
|
18
|
+
stmts << contruct_stmt_uri_object("agentn1#{count}", rdf_type_predicate, bf_agent_type_object)
|
19
|
+
stmts << contruct_stmt_literal_object("agentn1#{count}", rdfs_label_predicate, artist["name"])
|
20
|
+
stmts += build_role_stmts("agentn1#{count}", "rolen1#{count}", artist["role"])
|
20
21
|
count += 1
|
21
22
|
end
|
22
23
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
23
24
|
end
|
24
25
|
|
25
|
-
# @param [Hash] the extraartists defined at the release level, not the track level
|
26
|
-
# @param [Integer] gives the role a unique uri
|
27
|
-
# @return [Array] rdf statements
|
28
|
-
def build_artist_role_stmts(artist, count)
|
29
|
-
stmts = []
|
30
|
-
stmts << contruct_stmt_uri_object(artist["name"], bf_role_predicate, "Work1SecondaryContributor_Role#{count}")
|
31
|
-
stmts << contruct_stmt_uri_object("Work1SecondaryContributor_Role#{count}", rdf_type_predicate, bf_role_type_object)
|
32
|
-
stmts << contruct_stmt_literal_object("Work1SecondaryContributor_Role#{count}", rdfs_label_predicate, artist["role"])
|
33
|
-
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
34
|
-
end
|
35
|
-
|
36
26
|
# @param [Hash] the http response from discogs
|
37
27
|
# @return [Array] rdf statements
|
38
28
|
def get_genres_stmts(response)
|
@@ -54,24 +44,13 @@ module Qa::Authorities
|
|
54
44
|
stmts = []
|
55
45
|
dg = discogs_genres[genre.gsub(/\s+/, "")]
|
56
46
|
if dg.present?
|
57
|
-
stmts << contruct_stmt_uri_object(
|
47
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/genreForm", dg["uri"])
|
58
48
|
stmts << contruct_stmt_uri_object(dg["uri"], rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/GenreForm")
|
59
49
|
stmts << contruct_stmt_literal_object(dg["uri"], rdfs_label_predicate, dg["label"])
|
60
50
|
end
|
61
51
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
62
52
|
end
|
63
53
|
|
64
|
-
# @param [String] the uri of the genreForm
|
65
|
-
# @param [String] the genreForm label
|
66
|
-
# @return [Array] rdf statements
|
67
|
-
def build_genres_and_styles(uri, dg_label)
|
68
|
-
stmts = []
|
69
|
-
stmts << contruct_stmt_uri_object("Work1", "http://id.loc.gov/ontologies/bibframe/genreForm", uri)
|
70
|
-
stmts << contruct_stmt_uri_object(uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/GenreForm")
|
71
|
-
stmts << contruct_stmt_literal_object(uri, rdfs_label_predicate, dg_label)
|
72
|
-
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
73
|
-
end
|
74
|
-
|
75
54
|
# @param [Hash] the http response from discogs
|
76
55
|
# @return [Array] rdf statements
|
77
56
|
def get_tracklist_artists_stmts(response)
|
@@ -103,13 +82,13 @@ module Qa::Authorities
|
|
103
82
|
# @return [Array] rdf statements
|
104
83
|
def build_secondary_works(track, w_count)
|
105
84
|
stmts = []
|
106
|
-
stmts << contruct_stmt_uri_object(
|
107
|
-
stmts << contruct_stmt_uri_object("
|
108
|
-
stmts << contruct_stmt_uri_object("
|
109
|
-
stmts << contruct_stmt_uri_object("
|
110
|
-
stmts << contruct_stmt_uri_object("
|
111
|
-
stmts << contruct_stmt_literal_object("
|
112
|
-
stmts << contruct_stmt_literal_object("
|
85
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/hasPart", "workn#{w_count}")
|
86
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Work")
|
87
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Audio")
|
88
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", "http://id.loc.gov/ontologies/bibframe/title", "titlen3#{w_count}")
|
89
|
+
stmts << contruct_stmt_uri_object("titlen3#{w_count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Title")
|
90
|
+
stmts << contruct_stmt_literal_object("titlen3#{w_count}", bf_main_title_predicate, track["title"])
|
91
|
+
stmts << contruct_stmt_literal_object("workn#{w_count}", "http://id.loc.gov/ontologies/bibframe/duration", track["duration"]) if track["duration"].present?
|
113
92
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
114
93
|
end
|
115
94
|
|
@@ -120,10 +99,11 @@ module Qa::Authorities
|
|
120
99
|
stmts = []
|
121
100
|
count = 1
|
122
101
|
artists.each do |artist|
|
123
|
-
stmts << contruct_stmt_uri_object("
|
124
|
-
stmts << contruct_stmt_uri_object("
|
125
|
-
stmts << contruct_stmt_uri_object("
|
126
|
-
stmts << contruct_stmt_uri_object(
|
102
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn#{w_count}#{count}")
|
103
|
+
stmts << contruct_stmt_uri_object("contrbn#{w_count}#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bflc/PrimaryContribution")
|
104
|
+
stmts << contruct_stmt_uri_object("contrbn#{w_count}#{count}", bf_agent_predicate, "agentn#{w_count}#{count}")
|
105
|
+
stmts << contruct_stmt_uri_object("agentn#{w_count}#{count}", rdf_type_predicate, bf_agent_type_object)
|
106
|
+
stmts << contruct_stmt_literal_object("agentn#{w_count}#{count}", rdfs_label_predicate, artist["name"])
|
127
107
|
count += 1
|
128
108
|
end
|
129
109
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
@@ -137,13 +117,12 @@ module Qa::Authorities
|
|
137
117
|
# to distinguish among contributors to a track/work and their roles
|
138
118
|
count = 1
|
139
119
|
extraartists.each do |artist|
|
140
|
-
stmts << contruct_stmt_uri_object("
|
141
|
-
stmts << contruct_stmt_uri_object("
|
142
|
-
stmts << contruct_stmt_uri_object("
|
143
|
-
stmts << contruct_stmt_uri_object(
|
144
|
-
stmts <<
|
145
|
-
stmts
|
146
|
-
stmts << contruct_stmt_literal_object("Work#{w_count}ContributorRole#{count}", rdfs_label_predicate, artist["role"])
|
120
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn#{w_count}2#{count}")
|
121
|
+
stmts << contruct_stmt_uri_object("contrbn#{w_count}2#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Contribution")
|
122
|
+
stmts << contruct_stmt_uri_object("contrbn#{w_count}2#{count}", bf_agent_predicate, "agentn#{w_count}2#{count}")
|
123
|
+
stmts << contruct_stmt_uri_object("agentn#{w_count}2#{count}", rdf_type_predicate, bf_agent_type_object)
|
124
|
+
stmts << contruct_stmt_literal_object("agentn#{w_count}2#{count}", rdfs_label_predicate, artist["name"])
|
125
|
+
stmts += build_role_stmts("agentn#{w_count}2#{count}", "role2#{w_count}#{count}", artist["role"])
|
147
126
|
count += 1
|
148
127
|
end
|
149
128
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
@@ -1,16 +1,19 @@
|
|
1
1
|
require 'rdf'
|
2
|
+
require 'rdf/ntriples'
|
2
3
|
module Qa::Authorities
|
3
4
|
class Discogs::GenericAuthority < Base
|
4
5
|
include WebServiceBase
|
5
6
|
include Discogs::DiscogsTranslation
|
6
7
|
|
7
8
|
class_attribute :discogs_secret, :discogs_key
|
8
|
-
attr_accessor :primary_artists
|
9
|
+
attr_accessor :primary_artists, :selected_format, :work_uri, :instance_uri
|
9
10
|
|
10
11
|
# @param [String] subauthority to use
|
11
12
|
def initialize(subauthority)
|
12
13
|
@subauthority = subauthority
|
13
14
|
self.primary_artists = []
|
15
|
+
self.work_uri = "workn1"
|
16
|
+
self.instance_uri = "instn1"
|
14
17
|
end
|
15
18
|
|
16
19
|
# @param [String] the query
|
@@ -35,10 +38,14 @@ module Qa::Authorities
|
|
35
38
|
#
|
36
39
|
# @param [String] the Discogs id of the selected item
|
37
40
|
# @param [Class] QA::TermsController
|
38
|
-
# @return
|
41
|
+
# @return results in requested format (supports: json, jsonld, n3, ntriples)
|
39
42
|
def find(id, tc)
|
40
43
|
response = tc.params["subauthority"].include?("all") ? fetch_discogs_results(id) : json(find_url(id, tc.params["subauthority"]))
|
41
|
-
|
44
|
+
self.selected_format = tc.params["format"]
|
45
|
+
return response if response["message"].present?
|
46
|
+
return build_graph(response, format: :jsonld) if jsonld?(tc)
|
47
|
+
return build_graph(response, format: :n3) if n3?(tc)
|
48
|
+
return build_graph(response, format: :ntriples) if ntriples?(tc)
|
42
49
|
response
|
43
50
|
end
|
44
51
|
|
@@ -94,46 +101,48 @@ module Qa::Authorities
|
|
94
101
|
|
95
102
|
# @param [Hash] the http response from discogs
|
96
103
|
# @example returns parsed discogs data with context
|
97
|
-
# {
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
#
|
104
|
-
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
111
|
-
#
|
112
|
-
#
|
113
|
-
#
|
114
|
-
#
|
115
|
-
#
|
116
|
-
#
|
117
|
-
#
|
118
|
-
# "release"
|
119
|
-
# ]
|
120
|
-
# }
|
104
|
+
# [{
|
105
|
+
# "uri": "https://www.discogs.com/Frank-Sinatra-And-The-Modernaires-Sorry-Why-Remind-Me/release/4212473",
|
106
|
+
# "id": "4212473",
|
107
|
+
# "label": "Frank Sinatra And The Modernaires - Sorry / Why Remind Me",
|
108
|
+
# "context": [{
|
109
|
+
# "property": "Image URL",
|
110
|
+
# "values": ["https://img.discogs.com/1358693671-5430.jpeg.jpg"]
|
111
|
+
# }, {
|
112
|
+
# "property": "Year",
|
113
|
+
# "values": ["1950"]
|
114
|
+
# }, {
|
115
|
+
# "property": "Record Labels",
|
116
|
+
# "values": ["Columbia"]
|
117
|
+
# }, {
|
118
|
+
# "property": "Formats",
|
119
|
+
# "values": ["Shellac", "10\"", "78 RPM"]
|
120
|
+
# }, {
|
121
|
+
# "property": "Type",
|
122
|
+
# "values": ["release"]
|
123
|
+
# }]
|
124
|
+
# }]
|
121
125
|
def parse_authority_response(response)
|
122
126
|
response['results'].map do |result|
|
123
|
-
{ 'uri' => result
|
127
|
+
{ 'uri' => build_uri(result),
|
124
128
|
'id' => result['id'].to_s,
|
125
129
|
'label' => result['title'].to_s,
|
126
130
|
'context' => assemble_search_context(result) }
|
127
131
|
end
|
128
132
|
end
|
129
133
|
|
134
|
+
# @param [Hash] the results hash from the JSON returned by Discogs
|
135
|
+
def build_uri(result)
|
136
|
+
result['uri'].present? ? "https://www.discogs.com" + result['uri'].to_s : result['resource_url'].to_s
|
137
|
+
end
|
138
|
+
|
130
139
|
# @param [Hash] the results hash from the JSON returned by Discogs
|
131
140
|
def assemble_search_context(result)
|
132
|
-
{ "Image URL" => get_context_for_string(result['cover_image']),
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
141
|
+
[{ "property" => "Image URL", "values" => get_context_for_string(result['cover_image']) },
|
142
|
+
{ "property" => "Year", "values" => get_context_for_string(result['year']) },
|
143
|
+
{ "property" => "Record Labels", "values" => get_context_for_array(result['label']) },
|
144
|
+
{ "property" => "Formats", "values" => get_context_for_array(result['format']) },
|
145
|
+
{ "property" => "Type", "values" => get_context_for_string(result['type']) }]
|
137
146
|
end
|
138
147
|
|
139
148
|
# checks if the param is null, returns appropriate value
|
@@ -147,5 +156,27 @@ module Qa::Authorities
|
|
147
156
|
def get_context_for_array(item)
|
148
157
|
item.present? ? item : [""]
|
149
158
|
end
|
159
|
+
|
160
|
+
def format(tc)
|
161
|
+
return 'json' unless tc.params.key?('format')
|
162
|
+
return 'json' if tc.params['format'].blank?
|
163
|
+
tc.params['format']
|
164
|
+
end
|
165
|
+
|
166
|
+
def jsonld?(tc)
|
167
|
+
format(tc).casecmp?('jsonld')
|
168
|
+
end
|
169
|
+
|
170
|
+
def n3?(tc)
|
171
|
+
format(tc).casecmp?('n3')
|
172
|
+
end
|
173
|
+
|
174
|
+
def ntriples?(tc)
|
175
|
+
format(tc).casecmp?('ntriples')
|
176
|
+
end
|
177
|
+
|
178
|
+
def graph_format?(tc)
|
179
|
+
jsonld?(tc) || n3?(tc) || ntriples?(tc)
|
180
|
+
end
|
150
181
|
end
|
151
182
|
end
|