module Qa::Authorities::Discogs::DiscogsTranslation

Public Instance Methods

build_graph(response, subauthority = "", format: :jsonld) click to toggle source

Returns modified Discogs data in json-ld format. The data is first structured as RDF statements that use the BIBFRAME ontology. Where applicable, Discogs terms are mapped to the URIs of corresponding objects in the Library of Congress vocabulary. @param [Hash] the http response from discogs @param [String] the subauthority @return [Array, String] requested RDF serialzation (supports: jsonld Array, n3 String, n-triples String)

# File lib/qa/authorities/discogs/discogs_translation.rb, line 15
def build_graph(response, subauthority = "", format: :jsonld)
  graph = RDF::Graph.new

  rdf_statements = compile_rdf_statements(response, subauthority)
  graph.insert_statements(rdf_statements)

  graph.dump(format, standard_prefixes: true)
end
build_instance_statements(response) click to toggle source

@param [Hash] the http response from discogs @return [Array] rdf statements

# File lib/qa/authorities/discogs/discogs_translation.rb, line 70
def build_instance_statements(response)
  # get the statements that define the instance
  instance_stmts = get_primary_instance_definition(response)
  instance_stmts.concat(get_format_stmts(response))
  instance_stmts.concat(get_labels_stmts(response))
  instance_stmts.concat(get_identifiers_stmts(response))
end
build_master_statements(response) click to toggle source

@param [Hash] the http response from discogs @return [Array] rdf statements

# File lib/qa/authorities/discogs/discogs_translation.rb, line 58
def build_master_statements(response)
  # get the statements that define the primary work
  master_stmts = get_primary_work_definition(response)
  master_stmts.concat(get_primary_artists_stmts(response))
  master_stmts.concat(get_extra_artists_stmts(response))
  master_stmts.concat(get_genres_stmts(response))
  # get the statements that define the secondary works by converting the tracklist
  master_stmts.concat(get_tracklist_artists_stmts(response))
end
compile_rdf_statements(response, subauthority) click to toggle source

@param [Hash] the http response from discogs @param [String] the subauthority @return [Array] rdf statements

# File lib/qa/authorities/discogs/discogs_translation.rb, line 27
def compile_rdf_statements(response, subauthority)
  complete_rdf_stmts = []
  # The necessary statements depend on the subauthority. If the subauthority is master,
  # all we need is a work and not an instance. If there's no subauthority, we can determine
  # if the discogs record is a master because it will have a main_release field.
  if master_only(response, subauthority)
    self.work_uri = response["uri"].present? ? response["uri"] : response["resource_url"]
    complete_rdf_stmts.concat(build_master_statements(response))
  else
    # If the subauthority is "release," we need to define an instance as well as a
    # work. If the discogs record has a master_id, fetch that and use the results to
    # build the statements for the work.
    master_resp = response["master_id"].present? ? json("https://api.discogs.com/masters/#{response['master_id']}") : response
    complete_rdf_stmts.concat(build_master_statements(master_resp))
    # Now do the statements for the release/instance.
    self.instance_uri = response["uri"].present? ? response["uri"] : response["resource_url"]
    complete_rdf_stmts.concat(build_instance_statements(response))
  end
end
get_primary_artists_stmts(response) click to toggle source

@param [Hash] the http response from discogs @return [Array] rdf statements

# File lib/qa/authorities/discogs/discogs_translation.rb, line 108
def get_primary_artists_stmts(response)
  stmts = []
  # can have multiple artists as primary contributors to the work; need to distinguish among them
  count = 1
  # for secondary contributors to the work
  if response["artists"].present?
    response["artists"].each do |artist|
      # we need the primary artists later when we loop through the track list, so build this array
      primary_artists << artist

      stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn#{count}")
      stmts << contruct_stmt_uri_object("contrbn#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bflc/PrimaryContribution")
      stmts << contruct_stmt_uri_object("contrbn#{count}", bf_agent_predicate, "agentn#{count}")
      stmts << contruct_stmt_uri_object("agentn#{count}", rdf_type_predicate, bf_agent_type_object)
      stmts << contruct_stmt_literal_object("agentn#{count}", rdfs_label_predicate, artist["name"])
      count += 1
    end
  end
  stmts
end
get_primary_instance_definition(response) click to toggle source

@param [Hash] the http response from discogs @return [Array] rdf statements

# File lib/qa/authorities/discogs/discogs_translation.rb, line 93
def get_primary_instance_definition(response)
  stmts = []
  stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/instanceOf", work_uri)
  stmts << contruct_stmt_uri_object(instance_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Instance")
  stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/title", "titlen2")
  stmts << contruct_stmt_literal_object("titlen2", bf_main_title_predicate, response["title"])
  stmts << contruct_stmt_uri_object("titlen2", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Title")
  stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/identifiedBy", "widn1")
  stmts << contruct_stmt_uri_object("widn1", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Identifier")
  stmts << contruct_stmt_literal_object("widn1", "http://www.w3.org/1999/02/22-rdf-syntax-ns#value", response["id"])
  stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
end
get_primary_work_definition(response) click to toggle source

@param [Hash] the http response from discogs @return [Array] rdf statements

# File lib/qa/authorities/discogs/discogs_translation.rb, line 80
def get_primary_work_definition(response)
  stmts = []
  stmts << contruct_stmt_uri_object(work_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Work")
  stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/title", "titlen1")
  stmts << contruct_stmt_literal_object("titlen1", bf_main_title_predicate, response["title"])
  stmts << contruct_stmt_uri_object("titlen1", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Title")
  stmts << contruct_stmt_uri_object(work_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Audio")
  stmts << contruct_stmt_literal_object(work_uri, "http://id.loc.gov/ontologies/bibframe/originDate", response["year"].to_s) if response["year"].present?
  stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
end
master_only(response, subauthority) click to toggle source

@param [Hash] the http response from discogs @param [String] the subauthority @return [Boolean] returns true if the subauthority is “master” or the response contains a master

# File lib/qa/authorities/discogs/discogs_translation.rb, line 50
def master_only(response, subauthority)
  return true if subauthority == "master"
  return true if response["main_release"].present?
  false
end