odeon_uk 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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>