merlin_uk 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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +10 -0
- data/COMM-LICENSE +22 -0
- data/LICENSE +617 -0
- data/README.md +157 -0
- data/lib/merlin_uk/cinema.rb +189 -0
- data/lib/merlin_uk/internal/http.rb +39 -0
- data/lib/merlin_uk/internal/parser/schedule.rb +102 -0
- data/lib/merlin_uk/internal/parser/showing.rb +71 -0
- data/lib/merlin_uk/internal/title_sanitizer.rb +39 -0
- data/lib/merlin_uk/internal/website.rb +20 -0
- data/lib/merlin_uk/performance.rb +72 -0
- data/lib/merlin_uk/version.rb +6 -0
- data/lib/merlin_uk.rb +19 -0
- metadata +152 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module MerlinUk
|
|
2
|
+
# A single screening of a film on the Merlin Cinemas website
|
|
3
|
+
class Performance < Cinebase::Performance
|
|
4
|
+
# @!attribute [r] booking_url
|
|
5
|
+
# @return [String] the booking URL on the venue's Admit One site
|
|
6
|
+
# @!attribute [r] cinema_name
|
|
7
|
+
# @return [String] the cinema name
|
|
8
|
+
# @!attribute [r] cinema_id
|
|
9
|
+
# @return [String] the cinema id
|
|
10
|
+
# @!attribute [r] dimension
|
|
11
|
+
# @return [String] 2d or 3d
|
|
12
|
+
# @!attribute [r] film_name
|
|
13
|
+
# @return [String] the film name
|
|
14
|
+
|
|
15
|
+
# @!method initialize(options)
|
|
16
|
+
# @param [Hash] options options hash
|
|
17
|
+
# @option options [String] :booking_url (nil) buying url for the screening
|
|
18
|
+
# @option options [String] :cinema_name name of the cinema
|
|
19
|
+
# @option options [String] :cinema_id website id of the cinema
|
|
20
|
+
# @option options [String] :dimension ('2d') dimension of the screening
|
|
21
|
+
# @option options [Cinebase::Festival] :festival (nil) festival edition
|
|
22
|
+
# @option options [String] :film_name name of the film
|
|
23
|
+
# @option options [Integer] :film_year (nil) year from the film's title
|
|
24
|
+
# @option options [String] :language (nil) audio language, e.g. 'Hindi'
|
|
25
|
+
# @option options [Time] :starting_at listed start time of the performance
|
|
26
|
+
|
|
27
|
+
TIME_ZONE = 'Europe/London'.freeze
|
|
28
|
+
|
|
29
|
+
# Performances within an inclusive range of showing dates, from one
|
|
30
|
+
# request: the venue's home page holds every advertised date.
|
|
31
|
+
# @param [String] cinema_id the website's cinema code, e.g. 'MER_REDR'
|
|
32
|
+
# @param [Date] from first date (defaults to today in London)
|
|
33
|
+
# @param [Date] to last date (defaults to 13 days after from)
|
|
34
|
+
# @return [Array<MerlinUk::Performance>]
|
|
35
|
+
def self.at(
|
|
36
|
+
cinema_id,
|
|
37
|
+
from: TZInfo::Timezone.get(TIME_ZONE).now.to_date,
|
|
38
|
+
to: from + 13
|
|
39
|
+
)
|
|
40
|
+
raise ArgumentError, 'to must not precede from' if to < from
|
|
41
|
+
|
|
42
|
+
cinema = Cinema.new(cinema_id)
|
|
43
|
+
if cinema.url.empty?
|
|
44
|
+
[]
|
|
45
|
+
else
|
|
46
|
+
html = MerlinUk::Internal::Website.new.home(cinema.url)
|
|
47
|
+
showings = MerlinUk::Internal::Parser::Schedule.new(html).showings
|
|
48
|
+
performances = showings.select { |showing| (from..to).cover?(london_date(showing.starting_at)) }.map do |showing|
|
|
49
|
+
new(showing.to_hash.merge(cinema_id: cinema.id, cinema_name: cinema.name))
|
|
50
|
+
end
|
|
51
|
+
performances.sort_by(&:starting_at)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @!method showing_on
|
|
56
|
+
# The date of the screening
|
|
57
|
+
# @return [Date]
|
|
58
|
+
|
|
59
|
+
# @!method starting_at
|
|
60
|
+
# UTC time of the screening
|
|
61
|
+
# @return [Time]
|
|
62
|
+
|
|
63
|
+
# @!method variant
|
|
64
|
+
# The kinds of screening (arts, baby, q&a, relaxed, subtitled)
|
|
65
|
+
# @return <Array[String]>
|
|
66
|
+
|
|
67
|
+
def self.london_date(time)
|
|
68
|
+
TZInfo::Timezone.get(TIME_ZONE).to_local(time).to_date
|
|
69
|
+
end
|
|
70
|
+
private_class_method :london_date
|
|
71
|
+
end
|
|
72
|
+
end
|
data/lib/merlin_uk.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'cgi/escape'
|
|
2
|
+
require 'date'
|
|
3
|
+
|
|
4
|
+
require 'cinebase'
|
|
5
|
+
|
|
6
|
+
require_relative './merlin_uk/version'
|
|
7
|
+
|
|
8
|
+
require_relative './merlin_uk/internal/http'
|
|
9
|
+
require_relative './merlin_uk/internal/website'
|
|
10
|
+
require_relative './merlin_uk/internal/title_sanitizer'
|
|
11
|
+
require_relative './merlin_uk/internal/parser/showing'
|
|
12
|
+
require_relative './merlin_uk/internal/parser/schedule'
|
|
13
|
+
|
|
14
|
+
require_relative './merlin_uk/cinema'
|
|
15
|
+
require_relative './merlin_uk/performance'
|
|
16
|
+
|
|
17
|
+
# merlin_uk gem
|
|
18
|
+
module MerlinUk
|
|
19
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: merlin_uk
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Andy Croll
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: bundler
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '2.0'
|
|
19
|
+
type: :development
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '2.0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: minitest-mock
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '0'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: minitest-reporters
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: rake
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '0'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '0'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: simplecov
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "<"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '2'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "<"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '2'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: webmock
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '0'
|
|
89
|
+
type: :development
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - ">="
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '0'
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: cinebase
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - "~>"
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '5.7'
|
|
103
|
+
type: :runtime
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - "~>"
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '5.7'
|
|
110
|
+
description: Pull movie & cinema information from the Merlin Cinemas website
|
|
111
|
+
email:
|
|
112
|
+
- andy@goodscary.com
|
|
113
|
+
executables: []
|
|
114
|
+
extensions: []
|
|
115
|
+
extra_rdoc_files: []
|
|
116
|
+
files:
|
|
117
|
+
- CHANGELOG.md
|
|
118
|
+
- COMM-LICENSE
|
|
119
|
+
- LICENSE
|
|
120
|
+
- README.md
|
|
121
|
+
- lib/merlin_uk.rb
|
|
122
|
+
- lib/merlin_uk/cinema.rb
|
|
123
|
+
- lib/merlin_uk/internal/http.rb
|
|
124
|
+
- lib/merlin_uk/internal/parser/schedule.rb
|
|
125
|
+
- lib/merlin_uk/internal/parser/showing.rb
|
|
126
|
+
- lib/merlin_uk/internal/title_sanitizer.rb
|
|
127
|
+
- lib/merlin_uk/internal/website.rb
|
|
128
|
+
- lib/merlin_uk/performance.rb
|
|
129
|
+
- lib/merlin_uk/version.rb
|
|
130
|
+
homepage: https://github.com/andycroll/merlin_uk
|
|
131
|
+
licenses:
|
|
132
|
+
- AGPL
|
|
133
|
+
- MIT
|
|
134
|
+
metadata: {}
|
|
135
|
+
rdoc_options: []
|
|
136
|
+
require_paths:
|
|
137
|
+
- lib
|
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
|
+
requirements:
|
|
140
|
+
- - ">="
|
|
141
|
+
- !ruby/object:Gem::Version
|
|
142
|
+
version: '3.4'
|
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
|
+
requirements:
|
|
145
|
+
- - ">="
|
|
146
|
+
- !ruby/object:Gem::Version
|
|
147
|
+
version: '0'
|
|
148
|
+
requirements: []
|
|
149
|
+
rubygems_version: 4.0.20
|
|
150
|
+
specification_version: 4
|
|
151
|
+
summary: It's a scraper, but a nice one
|
|
152
|
+
test_files: []
|