Class: MetalArchives::Release

Inherits:
Base
  • Object
show all
Defined in:
lib/metal_archives/models/release.rb

Overview

Represents a release

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#==, #cached?, #initialize, #inspect, #load!, #loaded?, properties, #set

Constructor Details

This class inherits a constructor from MetalArchives::Base

Class Method Details

.allObject

Get all releases

Returns Collection of Release

Raises
  • MetalArchives::Errors::APIError when receiving a status code >= 400

  • MetalArchives::Errors::ParserError when parsing failed. Please report this error.



344
345
346
# File 'lib/metal_archives/models/release.rb', line 344

def all
  search ""
end

.find(id) ⇒ Object

Find by ID

Returns Release, even when ID is invalid (because the data is lazily fetched)

id

Integer



141
142
143
144
145
# File 'lib/metal_archives/models/release.rb', line 141

def find(id)
  return MetalArchives.cache[id] if MetalArchives.cache.include? id

  Release.new id: id
end

.find!(id) ⇒ Object

Find by ID (no lazy loading)

Returns Release

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)

  • MetalArchives::Errors::ParserError when parsing failed. Please report this error.

id

Integer



160
161
162
163
164
165
# File 'lib/metal_archives/models/release.rb', line 160

def find!(id)
  obj = find id
  obj.load! if obj && !obj.loaded?

  obj
end

.find_by(query) ⇒ Object

Find by attributes

Refer to MA’s FAQ for search tips.

Returns Release or nil when no results

Raises
  • MetalArchives::Errors::APIError when receiving a status code >= 400

  • MetalArchives::Errors::ParserError when parsing failed. Please report this error.

query

Hash containing one or more of the following keys:

  • :band_name: String

  • :title: String

  • :from_year: Integer

  • :from_month: Integer

  • :to_year: Integer

  • :to_month: Integer

  • :country: ISO3166::Country or Array of ISO3166::Country

  • :location: String

  • :label_name: String

  • :indie: Boolean

  • :catalog_id: String

  • :identifier: String, identifier (barcode, matrix, etc.)

  • :recording_info: String, recording information (studio, city, etc.)

  • :version_description: String, version description (country, digipak, etc.)

  • :notes: String

  • :genre: String

  • :types: Array of Symbol, see Release.type

  • :formats: Array of Symbol, see Release.format



199
200
201
202
203
204
205
206
207
208
209
210
211
# File 'lib/metal_archives/models/release.rb', line 199

def find_by(query)
  params = Parsers::Release.map_params query

  response = MetalArchives.http.get "/search/ajax-advanced/searching/albums", params
  json = JSON.parse response.to_s

  return nil if json["aaData"].empty?

  data = json["aaData"].first
  id = Nokogiri::HTML(data[1]).xpath("//a/@href").first.value.delete('\\').split("/").last.gsub(/\D/, "").to_i

  find id
end

.find_by!(query) ⇒ Object

Find by attributes (no lazy loading)

Refer to MA’s FAQ for search tips.

Returns Release or nil when no results

Raises
  • MetalArchives::Errors::APIError when receiving a status code >= 400

  • MetalArchives::Errors::ParserError when parsing failed. Please report this error.

query

Hash containing one or more of the following keys:

  • :band_name: String

  • :title: String

  • :from_year: Integer

  • :from_month: Integer

  • :to_year: Integer

  • :to_month: Integer

  • :country: ISO3166::Country or Array of ISO3166::Country

  • :location: String

  • :label_name: String

  • :indie: Boolean

  • :catalog_id: String

  • :identifier: String, identifier (barcode, matrix, etc.)

  • :recording_info: String, recording information (studio, city, etc.)

  • :version_description: String, version description (country, digipak, etc.)

  • :notes: String

  • :genre: String

  • :types: Array of Symbol, see Release.type

  • :formats: Array of Symbol, see Release.format



245
246
247
248
249
250
# File 'lib/metal_archives/models/release.rb', line 245

def find_by!(query)
  obj = find_by query
  obj.load! if obj && !obj.loaded?

  obj
end

.search(title) ⇒ Object

Search by title, resolves to Release.search_by (:title => title)

Refer to MA’s FAQ for search tips.

Returns (possibly empty) Array of Release

Raises
  • MetalArchives::Errors::APIError when receiving a status code >= 400

  • MetalArchives::Errors::ArgumentError when title isn’t a String

title

String



329
330
331
332
333
# File 'lib/metal_archives/models/release.rb', line 329

def search(title)
  raise MetalArchives::Errors::ArgumentError unless title.is_a? String

  search_by title: title
end

.search_by(query) ⇒ Object

Search by attributes

Refer to MA’s FAQ for search tips.

Returns Collection of Release

Raises
  • MetalArchives::Errors::APIError when receiving a status code >= 400

  • MetalArchives::Errors::ParserError when parsing failed. Please report this error.

query

Hash containing one or more of the following keys:

  • :band_name: String

  • :title: String

  • :from_year: Integer

  • :from_month: Integer

  • :to_year: Integer

  • :to_month: Integer

  • :country: ISO3166::Country or Array of ISO3166::Country

  • :location: String

  • :label_name: String

  • :indie: Boolean

  • :catalog_id: String

  • :identifier: String, identifier (barcode, matrix, etc.)

  • :recording_info: String, recording information (studio, city, etc.)

  • :version_description: String, version description (country, digipak, etc.)

  • :notes: String

  • :genre: String

  • :types: Array of Symbol, see Release.type

  • :formats: Array of Symbol, see Release.format



284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
# File 'lib/metal_archives/models/release.rb', line 284

def search_by(query)
  params = Parsers::Release.map_params query

  l = lambda do
    @start ||= 0

    if @max_items && @start >= @max_items
      []
    else
      response = MetalArchives.http.get "/search/ajax-advanced/searching/albums", params.merge(iDisplayStart: @start)
      json = JSON.parse response.to_s

      @max_items = json["iTotalRecords"]

      objects = []

      json["aaData"].each do |data|
        # Create Release object for every ID in the results list
        id = Nokogiri::HTML(data.first).xpath("//a/@href").first.value.delete('\\').split("/").last.gsub(/\D/, "").to_i
        objects << Release.find(id)
      end

      @start += 200

      objects
    end
  end

  MetalArchives::Collection.new l
end

Instance Method Details

#catalog_idObject

:attr_reader_: catalog_id

Return String

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)



62
# File 'lib/metal_archives/models/release.rb', line 62

property :catalog_id

#date_releasedObject

:attr_reader: date_released

Returns Date

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)



51
# File 'lib/metal_archives/models/release.rb', line 51

property :date_released, type: Date

#formatObject

:attr_reader: format

Returns :cd, :cassette, :vinyl, :vhs, :dvd, :digital, :blu_ray, :other, :unknown

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)



86
# File 'lib/metal_archives/models/release.rb', line 86

property :format

#idObject

:attr_reader: id

Returns Integer



16
# File 'lib/metal_archives/models/release.rb', line 16

property :id, type: Integer

#limitationObject

:attr_reader: limitation

Returns Integer

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)



97
# File 'lib/metal_archives/models/release.rb', line 97

property :limitation

#notesObject

:attr_reader: notes

Returns raw HTML String

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)



114
# File 'lib/metal_archives/models/release.rb', line 114

property :notes

#titleObject

:attr_reader: title

Returns String

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)



27
# File 'lib/metal_archives/models/release.rb', line 27

property :title

#typeObject

:attr_reader: type

Returns :full_length, :live, :demo, :single, :ep, :video, :boxed_set, :split, :compilation, :split_video, :collaboration

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)



40
# File 'lib/metal_archives/models/release.rb', line 40

enum :type, values: [:full_length, :live, :demo, :single, :ep, :video, :boxed_set, :split, :compilation, :split_video, :collaboration]

#version_descriptionObject

:attr_reader_: version_description

Return String

Raises
  • MetalArchives::Errors::InvalidIDError when no or invalid id

  • MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)



73
# File 'lib/metal_archives/models/release.rb', line 73

property :version_description