# frozen_string_literal: true module Onebox class JsonLd < Normalizer # Full schema.org hierarchy can be found here: https://schema.org/docs/full.html MOVIE_JSON_LD_TYPE = "Movie" SUPPORTED_TYPES = [MOVIE_JSON_LD_TYPE] def initialize(doc) @data = extract(doc) end private def extract(doc) return {} if Onebox::Helpers.blank?(doc) doc .css('script[type="application/ld+json"]') .each do |element| parsed_json = parse_json(element.text) if parsed_json.kind_of?(Array) parsed_json = parsed_json.detect { |x| SUPPORTED_TYPES.include?(x["@type"]) } return {} if !parsed_json end case parsed_json["@type"] when MOVIE_JSON_LD_TYPE return Onebox::Movie.new(parsed_json).to_h end end {} end def parse_json(json) begin JSON[json] rescue JSON::ParserError => e Discourse.warn_exception(e, message: "Error parsing JSON-LD: #{json}") {} end end end end