odeon_uk 0.0.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +46 -2
  3. data/Rakefile +9 -1
  4. data/lib/odeon_uk.rb +10 -1
  5. data/lib/odeon_uk/cinema.rb +152 -0
  6. data/lib/odeon_uk/film.rb +18 -0
  7. data/lib/odeon_uk/internal/film_with_screenings_parser.rb +51 -0
  8. data/lib/odeon_uk/screening.rb +34 -0
  9. data/lib/odeon_uk/version.rb +1 -1
  10. data/odeon_uk.gemspec +7 -0
  11. data/test/fixtures/brighton-showtimes/about-time.html +175 -0
  12. data/test/fixtures/brighton-showtimes/autism-friendly-planes.html +75 -0
  13. data/test/fixtures/brighton-showtimes/bolshoi-spartacus-live.html +67 -0
  14. data/test/fixtures/brighton-showtimes/cinemagic-echo-planet.html +67 -0
  15. data/test/fixtures/brighton-showtimes/globe-on-screen-twelfth-night.html +67 -0
  16. data/test/fixtures/brighton-showtimes/met-opera-eugene-onegin.html +67 -0
  17. data/test/fixtures/brighton-showtimes/national-theatre-live-frankenstein.html +78 -0
  18. data/test/fixtures/brighton-showtimes/nt-live-war-horse.html +67 -0
  19. data/test/fixtures/brighton-showtimes/royal-opera-house-turandot.html +66 -0
  20. data/test/fixtures/brighton-showtimes/rsc-richard-ii.html +67 -0
  21. data/test/fixtures/brighton-showtimes/star-trek-into-darkness-2d.html +83 -0
  22. data/test/fixtures/brighton-showtimes/ukjff-from-cable-street-to-brick-lane.html +67 -0
  23. data/test/fixtures/manchester-showtimes/thor-the-dark-world.html +300 -0
  24. data/test/fixtures/odeon-brighton-showtimes.html +1238 -0
  25. data/test/fixtures/odeon-brighton.html +2706 -0
  26. data/test/fixtures/odeon-sitemap.html +1263 -0
  27. data/test/lib/odeon_uk/cinema_test.rb +185 -0
  28. data/test/lib/odeon_uk/film_test.rb +13 -0
  29. data/test/lib/odeon_uk/internal/film_with_screenings_parser_test.rb +167 -0
  30. data/test/lib/odeon_uk/screening_test.rb +32 -0
  31. data/test/test_helper.rb +3 -0
  32. metadata +126 -2
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ .DS_Store
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # OdeonUk
2
2
 
3
- TODO: Write a gem description
3
+ A simple gem to parse the (Odeon UK website)[http://odeon.co.uk] and spit out useful formatted info.
4
+
5
+ [![Code Climate](https://codeclimate.com/github/andycroll/odeon_uk.png)](https://codeclimate.com/github/andycroll/odeon_uk)
4
6
 
5
7
  ## Installation
6
8
 
@@ -18,7 +20,49 @@ Or install it yourself as:
18
20
 
19
21
  ## Usage
20
22
 
21
- TODO: Write usage instructions here
23
+ ### Cinema
24
+
25
+ ``` ruby
26
+ OdeonUk::Cinema.all
27
+ #=> [<OdeonUk::Cinema brand="Odeon" name="Odeon Tunbridge Wells" slug="odeon-tunbridge-wells" chain_id="23" url="...">, #=> <OdeonUk::Cinema brand="Odeon" name="Odeon Brighton" slug="odeon-brighton" chain_id="71" url="...">, ...]
28
+
29
+ OdeonUk::Cinema.find_by_id('71')
30
+ #=> <OdeonUk::Cinema brand="Odeon" name="Odeon Brighton" slug="odeon-brighton" address="..." chain_id="71" url="...">
31
+
32
+ OdeonUk::Cinema.find_by_id(71)
33
+ #=> <OdeonUk::Cinema brand="Odeon" name="Odeon Brighton" slug="odeon-brighton" address="..." chain_id="71" url="...">
34
+
35
+ cinema = OdeonUk::Cinema.find_by_slug('odeon-brighton')
36
+ #=> <OdeonUk::Cinema brand="Odeon" name="Odeon Brighton" slug="odeon-brighton" chain_id="71" url="...">
37
+
38
+ cinema.brand
39
+ #=> 'Odeon'
40
+
41
+ cinema.chain_id
42
+ #=> '71'
43
+
44
+ cinema.url
45
+ #=> "http://www.odeon.co.uk/cinemas/brighton/71/"
46
+
47
+ cinema.films
48
+ #=> [<OdeonUk::Film name="Iron Man 3">, <OdeonUk::Film name="Star Trek: Into Darkness">]
49
+
50
+ cinema.screenings
51
+ #=> [<OdeonUk::Screening film="About Time" when="2013-09-09 11:00 UTC" varient="3d">, <OdeonUk::Screening film="Iron Man 3" when="2013-09-09 13:50 UTC" varient="kids">, <OdeonUk::Screening ..>, <OdeonUk::Screening ...>]
52
+
53
+ cinema.screenings_of 'Iron Man 3'
54
+ #=> [<OdeonUk::Screening film="Iron Man 3" when="2013-09-09 11:00 UTC" varient="3d">, <OdeonUk::Screening film="Iron Man 3" when="2013-09-09 13:50 UTC" varient="kids">]
55
+
56
+ cinema.screenings_of <OdeonUk::Film name="Iron Man 3">
57
+ #=> [<OdeonUk::Screening film="Iron Man 3" when="2013-09-09 11:00 UTC" varient="3d">, <OdeonUk::Screening film="Iron Man 3" when="2013-09-09 13:50 UTC" varient="kids">]
58
+ ```
59
+
60
+ ### Film
61
+
62
+ ``` ruby
63
+ OdeonUk::Film.all
64
+ #=> [<OdeonUk::Film name="Iron Man 3" slug="iron-man-3">, <OdeonUk::Film name="Star Trek Into Darkness" slug="star-trek-into-darkness">, <OdeonUk::Film name="Captain America: The First Avenger" slug="captain-america-the-first-avenger">, <OdeonUk::Film name="Thor: The Dark World" slug="thor-the-dark-world">]
65
+ ```
22
66
 
23
67
  ## Contributing
24
68
 
data/Rakefile CHANGED
@@ -5,8 +5,16 @@ require 'rake/testtask'
5
5
 
6
6
  Rake::TestTask.new do |t|
7
7
  t.libs << 'lib/odeon_uk'
8
- t.test_files = FileList['test/lib/odeon_uk/*_test.rb']
8
+ t.test_files = FileList['test/lib/odeon_uk/*_test.rb', 'test/lib/odeon_uk/internal/*_test.rb']
9
9
  t.verbose = true
10
10
  end
11
11
 
12
+ task :build do
13
+ system "gem build odeon_uk.gemspec"
14
+ end
15
+
16
+ task :release => :build do
17
+ system "gem push odeon_uk-#{OdeonUk::VERSION}"
18
+ end
19
+
12
20
  task :default => :test
@@ -1,4 +1,13 @@
1
- require "odeon_uk/version"
1
+ require 'httparty'
2
+ require 'nokogiri'
3
+ require 'tzinfo'
4
+ require 'pp'
5
+
6
+ require_relative './odeon_uk/internal/film_with_screenings_parser'
7
+ require_relative './odeon_uk/version'
8
+ require_relative './odeon_uk/cinema'
9
+ require_relative './odeon_uk/film'
10
+ require_relative './odeon_uk/screening'
2
11
 
3
12
  module OdeonUk
4
13
  # Your code goes here...
@@ -0,0 +1,152 @@
1
+ module OdeonUk
2
+
3
+ # Public: The object representing a cinema on the Odeon UK website
4
+ class Cinema
5
+
6
+ # Public: Returns the String brand of the cinema #=> 'Odeon'
7
+ attr_reader :brand
8
+ # Public: Returns the Integer id of the cinema on teh odeon website
9
+ attr_reader :id
10
+ # Public: Returns the String name of the cinema
11
+ attr_reader :name
12
+ # Public: Returns the String slug of the cinema
13
+ attr_reader :slug
14
+ # Public: Returns the String url of the cinema's page on odeon.co.uk
15
+ attr_reader :url
16
+
17
+ # Public: Initialize a cinema
18
+ #
19
+ # id - Integer/String of the cinema on the odeon website
20
+ # name - String of cinema name
21
+ # url - String of cinema url on the odeon website
22
+ def initialize(id, name, url)
23
+ @brand = 'Odeon'
24
+ @id = id.to_i
25
+ @name = name
26
+ @slug = name.downcase.gsub(/[^0-9a-z ]/,'').gsub(/\s+/, '-')
27
+ @url = (url[0] == '/') ? "http://www.odeon.co.uk#{url}" : url
28
+ end
29
+
30
+ # Public: Return basic cinema information for all Odeon cinemas
31
+ #
32
+ # Examples
33
+ #
34
+ # OdeonUk::Cinema.all
35
+ # # => [<OdeonUk::Cinema brand="Odeon" name="Odeon Tunbridge Wells" slug="odeon-tunbridge-wells" id=23 url="...">, #=> <OdeonUk::Cinema brand="Odeon" name="Odeon Brighton" slug="odeon-brighton" chain_id="71" url="...">, ...]
36
+ #
37
+ # Returns an array of hashes of cinema information.
38
+ def self.all
39
+ cinema_links.map do |link|
40
+ new_from_link link
41
+ end
42
+ end
43
+
44
+ # Public: Return single cinema information for an Odeon cinema
45
+ #
46
+ # id_string - a string/int representing the cinema id
47
+ # of the format '32'/32 as used on the odeon.co.uk website
48
+ #
49
+ # Examples
50
+ #
51
+ # OdeonUk::Cinema.find('71')
52
+ # # => <OdeonUk::Cinema brand="Odeon" name="Brighton" slug="brighton" id=71 url="...">
53
+ #
54
+ # Returns an Odeon::Cinema or nil if none was found
55
+ def self.find(id)
56
+ id = id.to_i
57
+ return nil unless id > 0
58
+
59
+ all.select { |cinema| cinema.id == id }[0]
60
+ end
61
+
62
+ # Public: Returns films for an Odeon cinema
63
+ #
64
+ # Examples
65
+ #
66
+ # cinema = OdeonUk::Cinema.find('71')
67
+ # cinema.films
68
+ # # => [<OdeonUk::Film name="Iron Man 3">, <OdeonUk::Film name="Star Trek Into Darkness">]
69
+ #
70
+ # Returns an array of Odeon::Film objects
71
+ def films
72
+ film_nodes.map do |node|
73
+ parser = OdeonUk::Internal::FilmWithScreeningsParser.new node.to_s
74
+ OdeonUk::Film.new parser.film_name
75
+ end
76
+ end
77
+
78
+ # Public: Returns screenings for an Odeon cinema
79
+ #
80
+ # Examples
81
+ #
82
+ # cinema = OdeonUk::Cinema.find('71')
83
+ # cinema.screenings
84
+ # # => [<OdeonUk::Screening film_name="Iron Man 3" cinema_name="Brighton" when="..." varient="...">, <OdeonUk::Screening ...>]
85
+ #
86
+ # Returns an array of Odeon::Screening objects
87
+ def screenings
88
+ film_nodes.map do |node|
89
+ parser = OdeonUk::Internal::FilmWithScreeningsParser.new node.to_s
90
+ parser.showings.map do |screening_type, times|
91
+ times.map do |time|
92
+ OdeonUk::Screening.new parser.film_name, self.name, time.strftime('%d/%m/%Y'), time.strftime('%H:%M:%S'), nil
93
+ end
94
+ end
95
+ end.flatten
96
+ end
97
+
98
+ # Public: Returns screenings for particular film at an Odeon cinema
99
+ #
100
+ # Examples
101
+ #
102
+ # cinema = OdeonUk::Cinema.find('71')
103
+ # cinema.screenings_of 'Iron Man 3'
104
+ # # => [<OdeonUk::Screening film_name="Iron Man 3" cinema_name="Brighton" when="..." varient="...">, <OdeonUk::Screening ...>]
105
+ # cinema.screenings_of <OdeonUk::Film name="Iron Man 3">
106
+ # # => [<OdeonUk::Screening film_name="Iron Man 3" cinema_name="Brighton" when="..." varient="...">, <OdeonUk::Screening ...>]
107
+ #
108
+ # Returns an array of Odeon::Screening objects
109
+ def screenings_of film
110
+ film_name = (film.is_a?(OdeonUk::Film) ? film.name : film)
111
+ screenings.select { |s| s.film_name == film_name }
112
+ end
113
+
114
+ private
115
+
116
+ def self.cinema_links
117
+ links = parsed_sitemap.css('.sitemap > .span12:nth-child(4) a[href*=cinemas]')
118
+ links.select { |link| link.get_attribute('href').match(/\/\d+\/$/) }
119
+ end
120
+
121
+ def self.new_from_link(link)
122
+ url = link.get_attribute('href')
123
+ id = url.match(/\/(\d+)\/$/)[1]
124
+ name = link.children.first.to_s
125
+ new id, name, url
126
+ end
127
+
128
+ def self.parsed_sitemap
129
+ Nokogiri::HTML(sitemap_response)
130
+ end
131
+
132
+ def self.sitemap_response
133
+ @sitemap_response ||= HTTParty.get('http://www.odeon.co.uk/sitemap/')
134
+ end
135
+
136
+ def cinema_response
137
+ @cinema_response ||= HTTParty.get(@url)
138
+ end
139
+
140
+ def film_nodes
141
+ parsed_showtimes.css('.film-detail')
142
+ end
143
+
144
+ def parsed_showtimes
145
+ Nokogiri::HTML(showtimes_response)
146
+ end
147
+
148
+ def showtimes_response
149
+ @showtimes_response ||= HTTParty.get("http://www.odeon.co.uk/showtimes/week/#{@id}?siteId=#{@id}")
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,18 @@
1
+ module OdeonUk
2
+
3
+ # Public: The object representing a film on the Odeon UK website
4
+ class Film
5
+
6
+ # Public: Returns the String name of the film
7
+ attr_reader :name
8
+
9
+ # Public: Initialize a screening
10
+ #
11
+ # name - String of the film name
12
+ def initialize(name)
13
+ @name = name
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,51 @@
1
+ module OdeonUk
2
+ module Internal
3
+ # Private: An object to parse a film HTML snippet
4
+ class FilmWithScreeningsParser
5
+
6
+ def initialize(film_html)
7
+ @nokogiri_html = Nokogiri::HTML(film_html)
8
+ end
9
+
10
+ def film_name
11
+ name = @nokogiri_html.css('.presentation-info h4 a').children.first.to_s
12
+
13
+ # screening types
14
+ name = name.gsub /\s+[23][dD]/, '' #remove 2d or 3d from title
15
+ name = name.gsub 'Autism Friendly Screening -', '' # remove autism friendly
16
+
17
+ # special screenings
18
+ name = name.gsub 'ROH -', 'Royal Opera House:' # fill out Royal Opera House
19
+ name = name.gsub 'Met Opera -', 'Met Opera:' # fill out Met Opera
20
+ name = name.gsub /Cinemagic \d{1,4} \-/, '' # remove cinemagic stuff
21
+ name = name.gsub 'UKJFF -', '' # remove UK Jewish festival prefix
22
+ name = name.gsub 'NT Live -', 'National Theatre:' # National theatre
23
+ name = name.gsub 'National Theatre Live -', 'National Theatre:'
24
+ name = name.gsub /\(Encore.+\)/, '' # National theatre, remove encore
25
+ name = name.gsub 'Bolshoi -', 'Bolshoi:' # bolshoi ballet
26
+ name = name.gsub /\([Ll]ive\)/, '' # remove bolshoi-style live
27
+ name = name.gsub 'Globe On Screen:', 'Globe:' # globe
28
+ if name.match /RSC Live/
29
+ name = 'Royal Shakespeare Company: ' + name.gsub(/\- RSC Live \d{1,4}/, '')
30
+ end
31
+
32
+ name = name.squeeze(' ') # spaces compressed
33
+ name = name.gsub /\A\s+/, '' # remove leading spaces
34
+ name = name.gsub /\s+\z/, '' # remove trailing spaces
35
+ end
36
+
37
+ def showings
38
+ tz = TZInfo::Timezone.get('Europe/London')
39
+ @nokogiri_html.css('.times-all.accordion-group').inject({}) do |result, varient_node|
40
+ varient = varient_node.css('.tech a').text.gsub('in ', '').upcase
41
+
42
+ times = varient_node.css('.performance-detail').map do |screening_node|
43
+ tz.local_to_utc(Time.parse(screening_node['title'].match(/\d+\/\d+\/\d+ \d{2}\:\d{2}/).to_s))
44
+ end
45
+
46
+ result.merge(varient => times)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,34 @@
1
+ module OdeonUk
2
+
3
+ # Public: The object representing a screening of a film on the Odeon UK website
4
+ class Screening
5
+
6
+ # Public: Returns the String name of the cinema
7
+ attr_reader :cinema_name
8
+ # Public: Returns the String name of the film
9
+ attr_reader :film_name
10
+ # Public: Returns the Time of the screening
11
+ attr_reader :when
12
+ # Public: Returns the Type of screening (3d, baby, kids, live)
13
+ attr_reader :varient
14
+
15
+ # Public: Initialize a screening
16
+ #
17
+ # film_name - String of the film name
18
+ # cinema_name - String of the cinema name on the Odeon website
19
+ # date - String/Date representing the date of the screening
20
+ # time - String representing the time of the screening (24 hour clock)
21
+ # varient - String representing the type of showing (e.g. 3d/baby/live)
22
+ def initialize(film_name, cinema_name, date, time, varient=nil)
23
+ @cinema_name, @film_name, @varient = cinema_name, film_name, varient
24
+ @when = Time.parse("#{date} #{time} UTC")
25
+ end
26
+
27
+ # Public: The Date of the screening
28
+ #
29
+ # Returns a Date
30
+ def date
31
+ @when.to_date
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module OdeonUk
2
- VERSION = "0.0.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -18,5 +18,12 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ["lib"]
19
19
 
20
20
  gem.version = OdeonUk::VERSION
21
+
21
22
  gem.add_development_dependency 'rake'
23
+ gem.add_development_dependency 'webmock'
24
+
25
+ gem.add_runtime_dependency 'httparty'
26
+ gem.add_runtime_dependency 'nokogiri'
27
+ gem.add_runtime_dependency 'tzinfo'
28
+ gem.add_runtime_dependency 'tzinfo-data'
22
29
  end
@@ -0,0 +1,175 @@
1
+ <div id="22876" class="film-detail WEEK">
2
+ <div class="content-container film _WEEK" id="film-22876">
3
+ <div class="grad-hor">
4
+ <a href="/films/about_time/14426/">
5
+ <img src="http://odeon-fastly.krankikom.de.global.prod.fastly.net/_uploads/asset_management/70x108_fedb25894d81108e06f9dd8903ea1d51.jpg"></a>
6
+ <div class="presentation-info">
7
+ <h4>
8
+ <a href="/films/about_time/14426/">About Time</a>
9
+ </h4>
10
+ <div class="cert-icon-uk-12A-small"></div>
11
+ <span class="description"></span>
12
+ </div>
13
+ <p> <strong>Charming time-travelling rom-com with Rachel McAdams</strong>
14
+ </p>
15
+ <div class="presentation-info">
16
+ <div rating-master-id="14426" class="star-rating-container star-rating rating-icon-star-light-small-inactive">
17
+ <div class="rating-icon-star-small-active s7">
18
+ <div class="rate-over s1"></div>
19
+ <div class="rate-over s2"></div>
20
+ <div class="rate-over s3"></div>
21
+ <div class="rate-over s4"></div>
22
+ <div class="rate-over s5"></div>
23
+ </div>
24
+ </div>
25
+ <span class="description"> <strong>Film length: 123 mins</strong>
26
+ </span>
27
+ </div>
28
+ <p class="description">
29
+ Contains infrequent strong language and moderate sex references
30
+ </p>
31
+ </div>
32
+ <div class="info-corner">
33
+ <div class="img-bundle">
34
+ <div class="film-icon-WEEK feature-icon-light-2d-medium WEEK_2D" data-schedule="2D" data-film="22876"></div>
35
+ </div>
36
+ <div class="btn-group">
37
+ <a href="http://odeon.trailer.cineweb.de/about_time.mp4" class="btn btn-primary trailer kkvideo-trigger" data-film-id="14426" data-showbooknowbutton="false"> <i class="film-icon-btn-play"></i>
38
+ Trailer
39
+ </a>
40
+ <button class="btn btn-primary trailer dropdown-toggle" data-toggle="dropdown">
41
+ <span class="caret"></span>
42
+ </button>
43
+ <ul class="dropdown-menu">
44
+ <li>
45
+ <a href="#">Add to Playlist</a>
46
+ </li>
47
+ </ul>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ <div id="performances-WEEK-22876" class="content-container times-all _WEEK">
52
+ <div class="accordion-group times-all performances-WEEK _22876" id="tech-22876-0">
53
+ <div class="content-container tech accordion-heading _WEEK">
54
+ <a data-toggle="collapse" data-parent="#tech-22876-0-WEEK" class="accordion-toggle" href="#collapse-22876-0-WEEK">in 2D</a>
55
+ <a href="#" class="icon-info-blue info-icon-form-info-small" data-toggle="popover" title="" data-placement="bottom" data-content="2D means two dimensional. No 3D glasses required. Sit back, relax and enjoy."></a>
56
+ </div>
57
+ <div id="collapse-22876-0-WEEK" class="accordion-body in collapse" style="height: auto;">
58
+ <div class="accordion-inner">
59
+ <div class="content-container times containerWEEK">
60
+ <div class="presentation-info week">
61
+ <strong>Saturday</strong>
62
+ <br>14 Sep</div>
63
+ <ul class="unstyled inline">
64
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_AFTERNOON WEEK_2D WEEK_GENRE_7 show">
65
+ <a href="/booking/init/MUZFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 14/09/2013 12:20" data-popup="popup" data-duration="123" data-start="12:20" data-end="14:23" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">12:20</a>
66
+ </li>
67
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_AFTERNOON WEEK_2D WEEK_GENRE_7 show">
68
+ <a href="/booking/init/RkRFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 14/09/2013 15:10" data-popup="popup" data-duration="123" data-start="15:10" data-end="17:13" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">15:10</a>
69
+ </li>
70
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
71
+ <a href="/booking/init/NUVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 14/09/2013 17:50" data-popup="popup" data-duration="123" data-start="17:50" data-end="19:53" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">17:50</a>
72
+ </li>
73
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
74
+ <a href="/booking/init/QkVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 14/09/2013 20:30" data-popup="popup" data-duration="123" data-start="20:30" data-end="22:33" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">20:30</a>
75
+ </li>
76
+ </ul>
77
+ </div>
78
+ <div class="content-container times containerWEEK">
79
+ <div class="presentation-info week">
80
+ <strong>Sunday</strong>
81
+ <br>15 Sep</div>
82
+ <ul class="unstyled inline">
83
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_AFTERNOON WEEK_2D WEEK_GENRE_7 show">
84
+ <a href="/booking/init/M0ZFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 15/09/2013 12:20" data-popup="popup" data-duration="123" data-start="12:20" data-end="14:23" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">12:20</a>
85
+ </li>
86
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_AFTERNOON WEEK_2D WEEK_GENRE_7 show">
87
+ <a href="/booking/init/MEVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 15/09/2013 15:10" data-popup="popup" data-duration="123" data-start="15:10" data-end="17:13" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">15:10</a>
88
+ </li>
89
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
90
+ <a href="/booking/init/NkVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 15/09/2013 17:50" data-popup="popup" data-duration="123" data-start="17:50" data-end="19:53" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">17:50</a>
91
+ </li>
92
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
93
+ <a href="/booking/init/Q0VFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 15/09/2013 20:30" data-popup="popup" data-duration="123" data-start="20:30" data-end="22:33" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">20:30</a>
94
+ </li>
95
+ </ul>
96
+ </div>
97
+ <div class="content-container times containerWEEK">
98
+ <div class="presentation-info week">
99
+ <strong>Monday</strong>
100
+ <br>16 Sep</div>
101
+ <ul class="unstyled inline">
102
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-lightblue WEEK_ISSUPERSAVER WEEK_12A WEEK_AFTERNOON WEEK_2D WEEK_GENRE_7 show">
103
+ <a href="/booking/init/MUVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Super Saver - book About Time on 16/09/2013 15:10" data-popup="popup" data-duration="123" data-start="15:10" data-end="17:13" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">15:10</a>
104
+ </li>
105
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
106
+ <a href="/booking/init/N0VFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 16/09/2013 17:50" data-popup="popup" data-duration="123" data-start="17:50" data-end="19:53" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">17:50</a>
107
+ </li>
108
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
109
+ <a href="/booking/init/REVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 16/09/2013 20:30" data-popup="popup" data-duration="123" data-start="20:30" data-end="22:33" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">20:30</a>
110
+ </li>
111
+ </ul>
112
+ </div>
113
+ <div class="content-container times containerWEEK">
114
+ <div class="presentation-info week">
115
+ <strong>Tuesday</strong>
116
+ <br>17 Sep</div>
117
+ <ul class="unstyled inline">
118
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-lightblue WEEK_ISSAVER WEEK_12A WEEK_AFTERNOON WEEK_2D WEEK_GENRE_7 show">
119
+ <a href="/booking/init/MkVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Saver - book About Time on 17/09/2013 15:10" data-popup="popup" data-duration="123" data-start="15:10" data-end="17:13" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">15:10</a>
120
+ </li>
121
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-lightblue WEEK_ISSAVER WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
122
+ <a href="/booking/init/OEVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Saver - book About Time on 17/09/2013 17:50" data-popup="popup" data-duration="123" data-start="17:50" data-end="19:53" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">17:50</a>
123
+ </li>
124
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-lightblue WEEK_ISSAVER WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
125
+ <a href="/booking/init/RUVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Saver - book About Time on 17/09/2013 20:30" data-popup="popup" data-duration="123" data-start="20:30" data-end="22:33" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">20:30</a>
126
+ </li>
127
+ </ul>
128
+ </div>
129
+ <div class="content-container times containerWEEK">
130
+ <div class="presentation-info week">
131
+ <strong>Wednesday</strong>
132
+ <br>18 Sep</div>
133
+ <ul class="unstyled inline">
134
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-lightblue WEEK_ISSUPERSAVER WEEK_12A WEEK_AFTERNOON WEEK_2D WEEK_GENRE_7 show">
135
+ <a href="/booking/init/M0VFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Super Saver - book About Time on 18/09/2013 15:10" data-popup="popup" data-duration="123" data-start="15:10" data-end="17:13" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">15:10</a>
136
+ </li>
137
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
138
+ <a href="/booking/init/OUVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 18/09/2013 17:50" data-popup="popup" data-duration="123" data-start="17:50" data-end="19:53" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">17:50</a>
139
+ </li>
140
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
141
+ <a href="/booking/init/RkVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 18/09/2013 20:30" data-popup="popup" data-duration="123" data-start="20:30" data-end="22:33" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">20:30</a>
142
+ </li>
143
+ </ul>
144
+ </div>
145
+ <div class="content-container times containerWEEK">
146
+ <div class="content-container brown">
147
+ <h6>Newbies</h6>
148
+ </div>
149
+ <div class="presentation-info week">
150
+ <strong>Thursday</strong>
151
+ <br>19 Sep</div>
152
+ <ul class="unstyled inline">
153
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-lightblue WEEK_ISSUPERSAVER WEEK_12A WEEK_MORNING WEEK_NEWBIES WEEK_2D WEEK_GENRE_7 show">
154
+ <a href="/booking/init/NUZFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Super Saver - book About Time on 19/09/2013 10:45" data-popup="popup" data-duration="123" data-start="10:45" data-end="12:48" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 4 (Wheelchair Accessible)" data-is-online="1">10:45</a>
155
+ </li>
156
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-lightblue WEEK_ISSUPERSAVER WEEK_12A WEEK_AFTERNOON WEEK_2D WEEK_GENRE_7 show">
157
+ <a href="/booking/init/NEVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Super Saver - book About Time on 19/09/2013 15:10" data-popup="popup" data-duration="123" data-start="15:10" data-end="17:13" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">15:10</a>
158
+ </li>
159
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
160
+ <a href="/booking/init/QUVFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 19/09/2013 17:50" data-popup="popup" data-duration="123" data-start="17:50" data-end="19:53" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">17:50</a>
161
+ </li>
162
+ <li class="WEEK performance-darkgreen WEEK_WHEELCHAIR performance-blue WEEK_ISPEAK WEEK_12A WEEK_EVENING WEEK_2D WEEK_GENRE_7 show">
163
+ <a href="/booking/init/MEZFRjAwMDAwMjNVRFBETVhHIzcxIzE0NDI2/" class="performance-detail" title="Peak - book About Time on 19/09/2013 20:30" data-popup="popup" data-duration="123" data-start="20:30" data-end="22:33" data-status="normal" data-type="WEEK" data-auditorium-info="Screen 8 (Wheelchair Accessible)" data-is-online="1">20:30</a>
164
+ </li>
165
+ </ul>
166
+ </div>
167
+ <div class="content-container times stopper performances-WEEK _22876"></div>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ <!-- <div class="content-container times stopper performances-WEEK _22876"></div>
172
+ -->
173
+ <div class="content-container white performances-WEEK _22876"></div>
174
+ </div>
175
+ </div>