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

#==, cache, #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.



353
354
355
# File 'lib/metal_archives/models/release.rb', line 353

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



150
151
152
153
154
# File 'lib/metal_archives/models/release.rb', line 150

def find(id)
  return MetalArchives.cache[cache(id)] if MetalArchives.cache.include? cache(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



169
170
171
172
173
174
# File 'lib/metal_archives/models/release.rb', line 169

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



208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/metal_archives/models/release.rb', line 208

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



254
255
256
257
258
259
# File 'lib/metal_archives/models/release.rb', line 254

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



338
339
340
341
342
# File 'lib/metal_archives/models/release.rb', line 338

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



293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
# File 'lib/metal_archives/models/release.rb', line 293

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

#bandObject

:attr_reader: band

Returns rdoc-ref:MetalArchives::Band

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

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



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

property :band, type: Band

#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)



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

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)



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

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)



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

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)



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

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)



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

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)



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

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)



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

property :version_description