lib/picturehouse_uk/cinema.rb in picturehouse_uk-1.0.1 vs lib/picturehouse_uk/cinema.rb in picturehouse_uk-1.0.2
- old
+ new
@@ -45,10 +45,39 @@
# # => <PicturehouseUK::Cinema brand="Picturehouse" name="Duke's At Komedia" slug="dukes-at-komedia" id="Dukes_At_Komedia" url="...">
def self.find(id)
all.select { |cinema| cinema.id == id }[0]
end
+ # Address of the cinema
+ # @return [Hash] of different address parts
+ # @example
+ # cinema = PicturehouseUk::Cinema.find('Dukes_At_Komedia')
+ # cinema.adr
+ # #=> { street_address: '44-47 Gardner Street', extended_address: 'North Laine', locality: 'Brighton', postal_code: 'BN1 1UN', country_name: 'United Kingdom' }
+ # @note Uses the standard method naming as at http://microformats.org/wiki/adr
+ def adr
+ {
+ street_address: street_address,
+ extended_address: extended_address,
+ locality: locality,
+ postal_code: postal_code,
+ country: 'United Kingdom'
+ }
+ end
+ alias_method :address, :adr
+
+ # The second address line of of the cinema
+ # @return [String, nil]
+ # @example
+ # cinema = PicturehouseUk::Cinema.find('Dukes_At_Komedia')
+ # cinema.extended_address
+ # #=> 'North Laine'
+ # @note Uses the standard method naming as at http://microformats.org/wiki/adr
+ def extended_address
+ address_strings.length > 3 ? address_strings[1] : nil
+ end
+
# Films with showings scheduled at this cinema
# @return [Array<PicturehouseUk::Film>]
# @example
# cinema = PicturehouseUk::Cinema.find('Dukes_At_Komedia')
# cinema.films
@@ -58,28 +87,71 @@
parser = PicturehouseUk::Internal::FilmWithScreeningsParser.new node.to_s
PicturehouseUk::Film.new parser.film_name
end.uniq
end
+ # The name of the cinema (might include brand)
+ # @return [String]
+ # @example
+ # cinema = PicturehouseUk::Cinema.find('Dukes_At_Komedia')
+ # cinema.full_name
+ # #=> "Duke's At Komedia"
+ def full_name
+ name
+ end
+
+ # The locality (town) of the cinema
+ # @return [String]
+ # @example
+ # cinema = PicturehouseUk::Cinema.find('Dukes_At_Komedia')
+ # cinema.locality
+ # #=> 'Brighton'
+ # @note Uses the standard method naming as at http://microformats.org/wiki/adr
+ def locality
+ address_strings[-2]
+ end
+
+ # Post code of the cinema
+ # @return [String]
+ # @example
+ # cinema = PicturehouseUk::Cinema.find('Dukes_At_Komedia')
+ # cinema.postal_code
+ # #=> 'BN1 1UN'
+ # @note Uses the standard method naming as at http://microformats.org/wiki/adr
+ def postal_code
+ address_strings[-1]
+ end
+
# All planned screenings
# @return [Array<PicturehouseUk::Screening>]
# @example
# cinema = PicturehouseUk::Cinema.find('Dukes_At_Komedia')
# cinema.screenings
- # # => [<PicturehouseUk::Screening film_name="Iron Man 3" cinema_name="Duke's At Komedia" when="..." varient="...">, <PicturehouseUk::Screening ...>]
+ # # => [<PicturehouseUk::Screening film_name="Iron Man 3" cinema_name="Duke's At Komedia" when="..." variant="...">, <PicturehouseUk::Screening ...>]
def screenings
film_nodes.map do |node|
parser = PicturehouseUk::Internal::FilmWithScreeningsParser.new node.to_s
parser.showings.map do |screening_type, times|
times.map do |time|
- varient = screening_type == '2d' ? nil : screening_type
- PicturehouseUk::Screening.new parser.film_name, self.name, time, varient
+ variant = screening_type == '2d' ? nil : screening_type
+ PicturehouseUk::Screening.new parser.film_name, self.name, time, variant
end
end
end.flatten
end
+ # The street adress of the cinema
+ # @return a String
+ # @example
+ # cinema = PicturehouseUk::Cinema.find('Dukes_At_Komedia')
+ # cinema.street_address
+ # #=> '44-47 Gardner Street'
+ # @note Uses the standard method naming as at http://microformats.org/wiki/adr
+ def street_address
+ address_strings[0]
+ end
+
private
def self.cinema_links
parsed_homepage.css('#cinemalisthome .cinemas a')
end
@@ -97,10 +169,35 @@
def self.parsed_homepage
Nokogiri::HTML(homepage_response)
end
+ def address_parts
+ if pure_address_parts.length > 0 && pure_address_parts[0].match(/\d+\Z/)
+ ["#{pure_address_parts[0]} #{pure_address_parts[1]}"] + pure_address_parts[2..-1]
+ else
+ pure_address_parts
+ end
+ end
+
+ def address_strings
+ if address_parts && address_parts.length > 0
+ address_parts[0..post_code_index]
+ else
+ # this is a horrendous hack for Hackney Picturehouse
+ address_node.css('p').to_s.split('Box Office')[0].split('<br> ')[1..-1]
+ end
+ end
+
+ def address_node
+ parsed_contact_us.css('.box6 .txt6')
+ end
+
+ def contact_us_response
+ @contact_us_response ||= HTTParty.get("#{@url}Hires_Info/Contact_Us/")
+ end
+
def cinema_response
@cinema_response ||= HTTParty.get(@url)
end
def film_nodes
@@ -109,7 +206,20 @@
def parsed_cinema
Nokogiri::HTML(cinema_response)
end
+ def parsed_contact_us
+ Nokogiri::HTML(contact_us_response)
+ end
+
+ def post_code_index
+ address_parts.index { |e| e.match /[A-Z]{1,2}\d{1,2}[A-Z]?\s\d{1,2}[A-Z]{1,2}/ }
+ end
+
+ def pure_address_parts
+ @pure_address_parts = address_node.css('.cinemaListBox').map do |e|
+ e.children[0].to_s
+ end.select { |e| e != '' }
+ end
end
end