onebox 1.1.0 → 1.2.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 +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +7 -452
- data/Gemfile +1 -1
- data/README.md +23 -45
- data/lib/onebox.rb +21 -13
- data/lib/onebox/engine.rb +53 -43
- data/lib/onebox/engine/amazon_onebox.rb +34 -7
- data/lib/onebox/engine/classic_google_maps_onebox.rb +37 -0
- data/lib/onebox/engine/github_blob_onebox.rb +27 -7
- data/lib/onebox/engine/github_commit_onebox.rb +8 -15
- data/lib/onebox/engine/github_gist_onebox.rb +10 -10
- data/lib/onebox/engine/github_pullrequest_onebox.rb +7 -15
- data/lib/onebox/engine/google_play_app_onebox.rb +30 -0
- data/lib/onebox/engine/html.rb +10 -1
- data/lib/onebox/engine/image_onebox.rb +13 -0
- data/lib/onebox/engine/stack_exchange_onebox.rb +25 -11
- data/lib/onebox/engine/standard_embed.rb +48 -0
- data/lib/onebox/engine/twitter_status_onebox.rb +100 -0
- data/lib/onebox/engine/whitelisted_generic_onebox.rb +223 -0
- data/lib/onebox/engine/wikipedia_onebox.rb +27 -5
- data/lib/onebox/engine/youtube_onebox.rb +22 -0
- data/lib/onebox/helpers.rb +24 -0
- data/lib/onebox/layout.rb +67 -0
- data/lib/onebox/layout_support.rb +16 -0
- data/lib/onebox/matcher.rb +6 -1
- data/lib/onebox/preview.rb +19 -6
- data/lib/onebox/version.rb +1 -1
- data/lib/onebox/view.rb +7 -12
- data/onebox.gemspec +7 -5
- data/spec/fixtures/amazon.response +1336 -2971
- data/spec/fixtures/githubblob.response +49 -921
- data/spec/fixtures/{android.response → googleplayapp.response} +1 -1
- data/spec/fixtures/stackexchange.response +1 -1889
- data/spec/fixtures/twitterstatus.response +3006 -0
- data/spec/fixtures/youtube-json.response +1 -0
- data/spec/fixtures/youtube.response +1625 -0
- data/spec/lib/onebox/engine/amazon_onebox_spec.rb +5 -20
- data/spec/lib/onebox/engine/classic_google_maps_onebox_spec.rb +28 -0
- data/spec/lib/onebox/engine/github_blob_onebox_spec.rb +6 -15
- data/spec/lib/onebox/engine/github_commit_onebox_spec.rb +14 -22
- data/spec/lib/onebox/engine/github_gist_onebox_spec.rb +6 -14
- data/spec/lib/onebox/engine/github_pullrequest_onebox_spec.rb +14 -26
- data/spec/lib/onebox/engine/google_play_app_onebox_spec.rb +28 -0
- data/spec/lib/onebox/engine/html_spec.rb +4 -6
- data/spec/lib/onebox/engine/json_spec.rb +4 -6
- data/spec/lib/onebox/engine/stack_exchange_onebox_spec.rb +4 -17
- data/spec/lib/onebox/engine/twitter_status_onebox_spec.rb +103 -0
- data/spec/lib/onebox/engine/whitelisted_generic_onebox_spec.rb +51 -0
- data/spec/lib/onebox/engine/wikipedia_onebox_spec.rb +4 -17
- data/spec/lib/onebox/engine/youtube_onebox_spec.rb +17 -0
- data/spec/lib/onebox/engine_spec.rb +35 -32
- data/spec/lib/onebox/layout_spec.rb +77 -0
- data/spec/lib/onebox/matcher_spec.rb +0 -15
- data/spec/lib/onebox/preview_spec.rb +39 -9
- data/spec/lib/onebox_spec.rb +15 -11
- data/spec/spec_helper.rb +60 -4
- data/spec/support/html_spec_helper.rb +2 -1
- data/templates/_layout.mustache +11 -4
- data/templates/amazon.mustache +4 -3
- data/templates/githubblob.mustache +7 -5
- data/templates/githubcommit.mustache +20 -11
- data/templates/githubpullrequest.mustache +19 -12
- data/templates/googleplayapp.mustache +4 -0
- data/templates/stackexchange.mustache +19 -3
- data/templates/twitterstatus.mustache +12 -0
- data/templates/whitelistedgeneric.mustache +5 -0
- data/templates/wikipedia.mustache +4 -3
- metadata +57 -166
- data/lib/onebox/engine/bliptv_onebox.rb +0 -28
- data/lib/onebox/engine/clikthrough_onebox.rb +0 -25
- data/lib/onebox/engine/college_humor_onebox.rb +0 -27
- data/lib/onebox/engine/dailymotion_onebox.rb +0 -28
- data/lib/onebox/engine/dotsub_onebox.rb +0 -27
- data/lib/onebox/engine/example_onebox.rb +0 -24
- data/lib/onebox/engine/flickr_onebox.rb +0 -26
- data/lib/onebox/engine/funny_or_die_onebox.rb +0 -28
- data/lib/onebox/engine/hulu_onebox.rb +0 -29
- data/lib/onebox/engine/imgur_image_onebox.rb +0 -26
- data/lib/onebox/engine/itunes_onebox.rb +0 -28
- data/lib/onebox/engine/kinomap_onebox.rb +0 -27
- data/lib/onebox/engine/nfb_onebox.rb +0 -28
- data/lib/onebox/engine/open_graph.rb +0 -11
- data/lib/onebox/engine/qik_onebox.rb +0 -25
- data/lib/onebox/engine/revision3_onebox.rb +0 -27
- data/lib/onebox/engine/slideshare_onebox.rb +0 -27
- data/lib/onebox/engine/sound_cloud_onebox.rb +0 -27
- data/lib/onebox/engine/spotify_onebox.rb +0 -27
- data/lib/onebox/engine/ted_onebox.rb +0 -28
- data/lib/onebox/engine/twitter_onebox.rb +0 -31
- data/lib/onebox/engine/viddler_onebox.rb +0 -28
- data/lib/onebox/engine/vimeo_onebox.rb +0 -27
- data/lib/onebox/engine/yfrog_onebox.rb +0 -28
- data/spec/fixtures/bliptv.response +0 -724
- data/spec/fixtures/clikthrough.response +0 -1472
- data/spec/fixtures/collegehumor.response +0 -1272
- data/spec/fixtures/dailymotion.response +0 -575
- data/spec/fixtures/dotsub.response +0 -1257
- data/spec/fixtures/example.response +0 -50
- data/spec/fixtures/flickr.response +0 -1292
- data/spec/fixtures/funnyordie.response +0 -2010
- data/spec/fixtures/githubgist.response +0 -468
- data/spec/fixtures/hulu.response +0 -339
- data/spec/fixtures/imguralbum.response +0 -941
- data/spec/fixtures/imgurimage.response +0 -872
- data/spec/fixtures/itunes.response +0 -402
- data/spec/fixtures/kinomap.response +0 -299
- data/spec/fixtures/nfb.response +0 -810
- data/spec/fixtures/opengraph.response +0 -27
- data/spec/fixtures/qik.response +0 -371
- data/spec/fixtures/revision3.response +0 -985
- data/spec/fixtures/rottentomatoesfresh.response +0 -3275
- data/spec/fixtures/rottentomatoesincomplete.response +0 -2313
- data/spec/fixtures/rottentomatoesrotten.response +0 -3549
- data/spec/fixtures/slideshare.response +0 -1745
- data/spec/fixtures/soundcloud.response +0 -1409
- data/spec/fixtures/spotify.response +0 -250
- data/spec/fixtures/ted.response +0 -1341
- data/spec/fixtures/twitter.response +0 -1712
- data/spec/fixtures/viddler.response +0 -442
- data/spec/fixtures/vimeo.response +0 -571
- data/spec/fixtures/yfrog.response +0 -464
- data/spec/lib/onebox/engine/bliptv_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/clikthrough_onebox_spec.rb +0 -29
- data/spec/lib/onebox/engine/college_humor_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/dailymotion_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/dotsub_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/example_onebox_spec.rb +0 -21
- data/spec/lib/onebox/engine/flickr_onebox_spec.rb +0 -33
- data/spec/lib/onebox/engine/funny_or_die_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/hulu_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/imgur_image_onebox_spec.rb +0 -29
- data/spec/lib/onebox/engine/itunes_onebox_spec.rb +0 -29
- data/spec/lib/onebox/engine/kinomap_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/nfb_onebox_spec.rb +0 -38
- data/spec/lib/onebox/engine/open_graph_spec.rb +0 -27
- data/spec/lib/onebox/engine/qik_onebox_spec.rb +0 -38
- data/spec/lib/onebox/engine/revision3_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/slideshare_onebox_spec.rb +0 -33
- data/spec/lib/onebox/engine/sound_cloud_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/spotify_onebox_spec.rb +0 -36
- data/spec/lib/onebox/engine/ted_onebox_spec.rb +0 -33
- data/spec/lib/onebox/engine/twitter_onebox_spec.rb +0 -47
- data/spec/lib/onebox/engine/viddler_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/vimeo_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/yfrog_onebox_spec.rb +0 -33
- data/spec/lib/onebox/view_spec.rb +0 -16
- data/templates/bliptv.mustache +0 -5
- data/templates/clikthrough.mustache +0 -4
- data/templates/collegehumor.mustache +0 -5
- data/templates/dailymotion.mustache +0 -5
- data/templates/dotsub.mustache +0 -5
- data/templates/example.mustache +0 -2
- data/templates/flickr.mustache +0 -4
- data/templates/funnyordie.mustache +0 -6
- data/templates/githubgist.mustache +0 -3
- data/templates/hulu.mustache +0 -6
- data/templates/imgurimage.mustache +0 -3
- data/templates/itunes.mustache +0 -4
- data/templates/kinomap.mustache +0 -5
- data/templates/nfb.mustache +0 -5
- data/templates/qik.mustache +0 -4
- data/templates/revision3.mustache +0 -5
- data/templates/slideshare.mustache +0 -4
- data/templates/soundcloud.mustache +0 -5
- data/templates/spotify.mustache +0 -4
- data/templates/ted.mustache +0 -5
- data/templates/twitter.mustache +0 -7
- data/templates/viddler.mustache +0 -5
- data/templates/vimeo.mustache +0 -5
- data/templates/yfrog.mustache +0 -4
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -10,6 +10,14 @@ onebox
|
|
|
10
10
|
|
|
11
11
|
Onebox is a library for turning media URLs into simple HTML previews of the resource.
|
|
12
12
|
|
|
13
|
+
Onebox currently has support for page, image, and video URLs for many popular sites.
|
|
14
|
+
|
|
15
|
+
It's great if you want users to input URLs and have your application convert them into
|
|
16
|
+
rich previews for display. For example, a link to a YouTube video would be automatically
|
|
17
|
+
converted into a video player.
|
|
18
|
+
|
|
19
|
+
It was originally created for [Discourse](http://discourse.org) but has since been
|
|
20
|
+
extracted into this convenient gem for all to use!
|
|
13
21
|
|
|
14
22
|
Usage
|
|
15
23
|
=====
|
|
@@ -51,12 +59,12 @@ preview = Onebox.preview(url, cache: Rails.cache)
|
|
|
51
59
|
"#{preview}" == preview.to_s #=> true
|
|
52
60
|
```
|
|
53
61
|
|
|
54
|
-
In addition you can set your own
|
|
62
|
+
In addition you can set your own options with this handy interface:
|
|
55
63
|
|
|
56
64
|
``` ruby
|
|
57
65
|
require "onebox"
|
|
58
66
|
|
|
59
|
-
Onebox.
|
|
67
|
+
Onebox.options = {
|
|
60
68
|
cache: Rails.cache
|
|
61
69
|
}
|
|
62
70
|
|
|
@@ -66,10 +74,14 @@ preview = Onebox.preview(url)
|
|
|
66
74
|
```
|
|
67
75
|
|
|
68
76
|
|
|
69
|
-
|
|
70
|
-
|
|
77
|
+
Adding Support for a new URL
|
|
78
|
+
============================
|
|
79
|
+
|
|
80
|
+
1. Check if the site supports [oEmbed](http://oembed.com/) or [Open Graph](https://developers.facebook.com/docs/opengraph/).
|
|
81
|
+
If it does, you can probably get away with just whitelisting the URL in `Onebox::Engine::WhitelistedGenericOnebox`.
|
|
82
|
+
If the site does not support open standards, you can create a new engine.
|
|
71
83
|
|
|
72
|
-
|
|
84
|
+
2. Create new onebox engine
|
|
73
85
|
|
|
74
86
|
``` ruby
|
|
75
87
|
# in lib/onebox/engine/name_onebox.rb
|
|
@@ -77,7 +89,7 @@ Setup
|
|
|
77
89
|
module Onebox
|
|
78
90
|
module Engine
|
|
79
91
|
class NameOnebox
|
|
80
|
-
include
|
|
92
|
+
include LayoutSupport
|
|
81
93
|
include HTML
|
|
82
94
|
|
|
83
95
|
private
|
|
@@ -95,7 +107,7 @@ Setup
|
|
|
95
107
|
end
|
|
96
108
|
```
|
|
97
109
|
|
|
98
|
-
|
|
110
|
+
3. Create new onebox spec
|
|
99
111
|
|
|
100
112
|
``` ruby
|
|
101
113
|
# in spec/lib/onebox/engine/name_spec.rb
|
|
@@ -127,7 +139,7 @@ Setup
|
|
|
127
139
|
end
|
|
128
140
|
```
|
|
129
141
|
|
|
130
|
-
|
|
142
|
+
4. Create new handlebars template
|
|
131
143
|
|
|
132
144
|
``` html
|
|
133
145
|
# in templates/name.handlebars
|
|
@@ -141,52 +153,18 @@ Setup
|
|
|
141
153
|
</div>
|
|
142
154
|
```
|
|
143
155
|
|
|
144
|
-
|
|
156
|
+
5. Create new fixture from HTML response
|
|
145
157
|
|
|
146
158
|
``` bash
|
|
147
159
|
curl --output spec/fixtures/oneboxname.response -L -X -GET http://example.com
|
|
148
160
|
```
|
|
149
161
|
|
|
150
|
-
|
|
162
|
+
6. Require in Engine module
|
|
151
163
|
|
|
152
164
|
``` ruby
|
|
153
165
|
# in lib/onebox/engine/engine.rb
|
|
154
166
|
require_relative "engine/name_onebox"
|
|
155
167
|
```
|
|
156
|
-
|
|
157
|
-
Onebox currently has support for page, image, and video URLs from these sites:
|
|
158
|
-
|
|
159
|
-
- Amazon
|
|
160
|
-
- Android App Store
|
|
161
|
-
- Apple Store
|
|
162
|
-
- BlipTV
|
|
163
|
-
- Clikthrough
|
|
164
|
-
- College Humor
|
|
165
|
-
- Dailymotion
|
|
166
|
-
- Dotsub
|
|
167
|
-
- Flickr
|
|
168
|
-
- Funny or Die
|
|
169
|
-
- GitHub
|
|
170
|
-
- Blob
|
|
171
|
-
- Commit
|
|
172
|
-
- Gist
|
|
173
|
-
- Pull Request
|
|
174
|
-
- Hulu
|
|
175
|
-
- Imgur
|
|
176
|
-
- Kinomap
|
|
177
|
-
- NFB
|
|
178
|
-
- Open Graph
|
|
179
|
-
- Qik
|
|
180
|
-
- Revision
|
|
181
|
-
- Rotten Tomatoes
|
|
182
|
-
- Slideshare
|
|
183
|
-
- SmugMug
|
|
184
|
-
- SoundCloud
|
|
185
|
-
- Stack Exchange
|
|
186
|
-
- TED
|
|
187
|
-
- Twitter
|
|
188
|
-
- Wikipedia
|
|
189
|
-
- yFrog
|
|
190
168
|
|
|
191
169
|
|
|
192
170
|
Installing
|
|
@@ -194,7 +172,7 @@ Installing
|
|
|
194
172
|
|
|
195
173
|
Add this line to your application's Gemfile:
|
|
196
174
|
|
|
197
|
-
gem "onebox". "~> 1.
|
|
175
|
+
gem "onebox". "~> 1.2"
|
|
198
176
|
|
|
199
177
|
And then execute:
|
|
200
178
|
|
data/lib/onebox.rb
CHANGED
|
@@ -7,30 +7,38 @@ require "hexpress"
|
|
|
7
7
|
require "hexpress/web"
|
|
8
8
|
require "ostruct"
|
|
9
9
|
require "moneta"
|
|
10
|
-
|
|
11
|
-
require_relative "onebox/version"
|
|
12
|
-
require_relative "onebox/preview"
|
|
13
|
-
require_relative "onebox/matcher"
|
|
14
|
-
require_relative "onebox/engine"
|
|
15
|
-
require_relative "onebox/view"
|
|
10
|
+
require "cgi"
|
|
16
11
|
|
|
17
12
|
module Onebox
|
|
18
13
|
DEFAULTS = {
|
|
19
14
|
cache: Moneta.new(:Memory, expires: true, serializer: :json),
|
|
20
|
-
timeout: 10
|
|
15
|
+
timeout: 10,
|
|
16
|
+
load_paths: [File.join(Gem::Specification.find_by_name("onebox").gem_dir, "templates")]
|
|
21
17
|
}
|
|
22
18
|
|
|
23
|
-
@@
|
|
19
|
+
@@options = DEFAULTS
|
|
24
20
|
|
|
25
|
-
def self.preview(url, options = Onebox.
|
|
21
|
+
def self.preview(url, options = Onebox.options)
|
|
26
22
|
Preview.new(url, options)
|
|
27
23
|
end
|
|
28
24
|
|
|
29
|
-
def self.
|
|
30
|
-
OpenStruct.new(@@
|
|
25
|
+
def self.options
|
|
26
|
+
OpenStruct.new(@@options)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.has_matcher?(url)
|
|
30
|
+
result = Matcher.new(url).oneboxed
|
|
31
|
+
!!result
|
|
31
32
|
end
|
|
32
33
|
|
|
33
|
-
def self.
|
|
34
|
-
@@
|
|
34
|
+
def self.options=(options)
|
|
35
|
+
@@options = DEFAULTS.merge(options)
|
|
35
36
|
end
|
|
36
37
|
end
|
|
38
|
+
|
|
39
|
+
require_relative "onebox/version"
|
|
40
|
+
require_relative "onebox/preview"
|
|
41
|
+
require_relative "onebox/matcher"
|
|
42
|
+
require_relative "onebox/engine"
|
|
43
|
+
require_relative "onebox/layout"
|
|
44
|
+
require_relative "onebox/view"
|
data/lib/onebox/engine.rb
CHANGED
|
@@ -13,92 +13,102 @@ module Onebox
|
|
|
13
13
|
attr_reader :url
|
|
14
14
|
attr_reader :cache
|
|
15
15
|
attr_reader :timeout
|
|
16
|
-
attr_reader :view
|
|
17
16
|
|
|
18
17
|
def initialize(link, cache = nil, timeout = nil)
|
|
19
18
|
@url = link
|
|
20
|
-
@cache = cache || Onebox.
|
|
21
|
-
@timeout = timeout || Onebox.
|
|
22
|
-
@view = View.new(self.class.template_name, true)
|
|
19
|
+
@cache = cache || Onebox.options.cache
|
|
20
|
+
@timeout = timeout || Onebox.options.timeout
|
|
23
21
|
end
|
|
24
22
|
|
|
23
|
+
# raises error if not defined in onebox engine. This is the output method for
|
|
24
|
+
# an engine.
|
|
25
25
|
def to_html
|
|
26
|
-
|
|
26
|
+
fail NoMethodError, "Engines need to implement this method"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Some oneboxes create iframes or other complicated controls. If you're using
|
|
30
|
+
# a live editor with HTML preview, rendering those complicated controls can
|
|
31
|
+
# be slow or cause flickering.
|
|
32
|
+
#
|
|
33
|
+
# This method allows engines to produce a placeholder such as static image
|
|
34
|
+
# frame of a video.
|
|
35
|
+
#
|
|
36
|
+
# By default it just calls `to_html` unless implemented.
|
|
37
|
+
def placeholder_html
|
|
38
|
+
to_html
|
|
27
39
|
end
|
|
28
40
|
|
|
29
41
|
private
|
|
30
42
|
|
|
31
43
|
def record
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
cache.store(url, data)
|
|
36
|
-
end
|
|
44
|
+
result = cache.fetch(url) { data }
|
|
45
|
+
cache[url] = result if cache.respond_to?(:key?)
|
|
46
|
+
result
|
|
37
47
|
end
|
|
38
48
|
|
|
39
49
|
# raises error if not defined in onebox engine
|
|
40
|
-
# in each onebox, uses either Nokogiri or
|
|
50
|
+
# in each onebox, uses either Nokogiri or StandardEmbed to get raw HTML from url
|
|
41
51
|
def raw
|
|
42
|
-
|
|
52
|
+
fail NoMethodError, "Engines need to implement this method"
|
|
43
53
|
end
|
|
44
54
|
|
|
45
55
|
# raises error if not defined in onebox engine
|
|
46
56
|
# in each onebox, returns hash of desired onebox content
|
|
47
57
|
def data
|
|
48
|
-
|
|
58
|
+
fail NoMethodError, "Engines need this method defined"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def link
|
|
62
|
+
@url.gsub(/['\"<>]/, {
|
|
63
|
+
"'" => ''',
|
|
64
|
+
'&' => '&',
|
|
65
|
+
'"' => '"',
|
|
66
|
+
'<' => '<',
|
|
67
|
+
'>' => '>',
|
|
68
|
+
})
|
|
49
69
|
end
|
|
50
70
|
|
|
51
71
|
module ClassMethods
|
|
52
|
-
def ===(
|
|
53
|
-
if
|
|
54
|
-
!!(
|
|
72
|
+
def ===(other)
|
|
73
|
+
if other.kind_of?(URI)
|
|
74
|
+
!!(other.to_s =~ class_variable_get(:@@matcher))
|
|
55
75
|
else
|
|
56
76
|
super
|
|
57
77
|
end
|
|
58
78
|
end
|
|
59
79
|
|
|
60
80
|
def matches(&block)
|
|
61
|
-
|
|
81
|
+
matches_regexp(Hexpress.new(&block).to_r)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def matches_regexp(r)
|
|
85
|
+
class_variable_set :@@matcher, r
|
|
62
86
|
end
|
|
63
87
|
|
|
64
|
-
# calculates
|
|
65
|
-
def
|
|
88
|
+
# calculates a name for onebox using the class name of engine
|
|
89
|
+
def onebox_name
|
|
66
90
|
name.split("::").last.downcase.gsub(/onebox/, "")
|
|
67
91
|
end
|
|
92
|
+
|
|
68
93
|
end
|
|
69
94
|
end
|
|
70
95
|
end
|
|
71
96
|
|
|
72
|
-
require_relative "
|
|
97
|
+
require_relative "helpers"
|
|
98
|
+
require_relative "layout_support"
|
|
99
|
+
require_relative "engine/standard_embed"
|
|
73
100
|
require_relative "engine/html"
|
|
74
101
|
require_relative "engine/json"
|
|
75
|
-
require_relative "engine/example_onebox"
|
|
76
102
|
require_relative "engine/amazon_onebox"
|
|
77
|
-
require_relative "engine/
|
|
78
|
-
require_relative "engine/clikthrough_onebox"
|
|
79
|
-
require_relative "engine/college_humor_onebox"
|
|
80
|
-
require_relative "engine/dailymotion_onebox"
|
|
81
|
-
require_relative "engine/dotsub_onebox"
|
|
82
|
-
require_relative "engine/flickr_onebox"
|
|
83
|
-
require_relative "engine/funny_or_die_onebox"
|
|
103
|
+
require_relative "engine/classic_google_maps_onebox"
|
|
84
104
|
require_relative "engine/github_blob_onebox"
|
|
85
105
|
require_relative "engine/github_commit_onebox"
|
|
86
106
|
require_relative "engine/github_gist_onebox"
|
|
87
107
|
require_relative "engine/github_pullrequest_onebox"
|
|
88
|
-
require_relative "engine/
|
|
89
|
-
require_relative "engine/
|
|
90
|
-
require_relative "engine/itunes_onebox"
|
|
91
|
-
require_relative "engine/kinomap_onebox"
|
|
92
|
-
require_relative "engine/nfb_onebox"
|
|
93
|
-
require_relative "engine/qik_onebox"
|
|
94
|
-
require_relative "engine/revision3_onebox"
|
|
95
|
-
require_relative "engine/slideshare_onebox"
|
|
96
|
-
require_relative "engine/sound_cloud_onebox"
|
|
97
|
-
require_relative "engine/spotify_onebox"
|
|
108
|
+
require_relative "engine/google_play_app_onebox"
|
|
109
|
+
require_relative "engine/image_onebox"
|
|
98
110
|
require_relative "engine/stack_exchange_onebox"
|
|
99
|
-
require_relative "engine/
|
|
100
|
-
require_relative "engine/twitter_onebox"
|
|
101
|
-
require_relative "engine/viddler_onebox"
|
|
102
|
-
require_relative "engine/vimeo_onebox"
|
|
111
|
+
require_relative "engine/twitter_status_onebox"
|
|
103
112
|
require_relative "engine/wikipedia_onebox"
|
|
104
|
-
require_relative "engine/
|
|
113
|
+
require_relative "engine/youtube_onebox"
|
|
114
|
+
require_relative "engine/whitelisted_generic_onebox"
|
|
@@ -2,6 +2,7 @@ module Onebox
|
|
|
2
2
|
module Engine
|
|
3
3
|
class AmazonOnebox
|
|
4
4
|
include Engine
|
|
5
|
+
include LayoutSupport
|
|
5
6
|
include HTML
|
|
6
7
|
|
|
7
8
|
matches do
|
|
@@ -11,16 +12,42 @@ module Onebox
|
|
|
11
12
|
has(".").either("com", "ca").maybe("/")
|
|
12
13
|
end
|
|
13
14
|
|
|
15
|
+
def url
|
|
16
|
+
return "http://www.amazon.com/gp/aw/d/" + URI::encode(match[:id]) if match && match[:id]
|
|
17
|
+
@url
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def http_params
|
|
21
|
+
{'User-Agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3'}
|
|
22
|
+
end
|
|
23
|
+
|
|
14
24
|
private
|
|
15
25
|
|
|
26
|
+
def match
|
|
27
|
+
@match ||= @url.match(/(?:d|g)p\/(?:product\/)?(?<id>[^\/]+)(?:\/|$)/mi)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def image
|
|
31
|
+
case
|
|
32
|
+
when raw.css("#main-image").any?
|
|
33
|
+
raw.css("#main-image").first["src"]
|
|
34
|
+
when raw.css("#landingImage").any?
|
|
35
|
+
raw.css("#landingImage").first["src"]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
16
39
|
def data
|
|
17
|
-
{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
40
|
+
result = { link: link,
|
|
41
|
+
title: raw.css("h1").inner_text,
|
|
42
|
+
image: image,
|
|
43
|
+
price: raw.css(".priceLarge").inner_text }
|
|
44
|
+
|
|
45
|
+
result[:by_info] = raw.at("#by-line")
|
|
46
|
+
result[:by_info] = Onebox::Helpers.clean(result[:by_info].inner_html) if result[:by_info]
|
|
47
|
+
|
|
48
|
+
summary = raw.at("#about-item span")
|
|
49
|
+
result[:description] = summary.inner_html if summary
|
|
50
|
+
result
|
|
24
51
|
end
|
|
25
52
|
end
|
|
26
53
|
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Onebox
|
|
2
|
+
module Engine
|
|
3
|
+
class ClassicGoogleMapsOnebox
|
|
4
|
+
include Engine
|
|
5
|
+
include LayoutSupport
|
|
6
|
+
|
|
7
|
+
matches_regexp /^(https?:)?\/\/(maps\.google\.[\w.]{2,}|goo\.gl)\/maps?.+$/
|
|
8
|
+
|
|
9
|
+
def url
|
|
10
|
+
@url = get_long_url if @url.include?("//goo.gl/maps/")
|
|
11
|
+
@url
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_html
|
|
15
|
+
"<iframe src='#{url}&output=embed' width='690px' height='400px' frameborder='0' style='border:0'></iframe>"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def data
|
|
21
|
+
{link: url, title: url}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def get_long_url
|
|
25
|
+
uri = URI(@url)
|
|
26
|
+
http = Net::HTTP.start(uri.host, uri.port)
|
|
27
|
+
http.open_timeout = timeout
|
|
28
|
+
http.read_timeout = timeout
|
|
29
|
+
response = http.head(uri.path)
|
|
30
|
+
response["Location"] if response.code == "301"
|
|
31
|
+
rescue
|
|
32
|
+
@url
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -2,7 +2,7 @@ module Onebox
|
|
|
2
2
|
module Engine
|
|
3
3
|
class GithubBlobOnebox
|
|
4
4
|
include Engine
|
|
5
|
-
include
|
|
5
|
+
include LayoutSupport
|
|
6
6
|
|
|
7
7
|
matches do
|
|
8
8
|
http
|
|
@@ -15,13 +15,33 @@ module Onebox
|
|
|
15
15
|
|
|
16
16
|
private
|
|
17
17
|
|
|
18
|
+
def raw
|
|
19
|
+
return @raw if @raw
|
|
20
|
+
m = @url.match(/github\.com\/(?<user>[^\/]+)\/(?<repo>[^\/]+)\/blob\/(?<sha1>[^\/]+)\/(?<file>[^#]+)(#(L(?<from>[^-]*)(-L(?<to>.*))?))?/mi)
|
|
21
|
+
if m
|
|
22
|
+
from = (m[:from] || -1).to_i
|
|
23
|
+
to = (m[:to] || -1).to_i
|
|
24
|
+
@file = m[:file]
|
|
25
|
+
contents = open("https://raw.github.com/#{m[:user]}/#{m[:repo]}/#{m[:sha1]}/#{m[:file]}", read_timeout: timeout).read
|
|
26
|
+
if from > 0
|
|
27
|
+
if to < 0
|
|
28
|
+
from = from - 10
|
|
29
|
+
to = from + 20
|
|
30
|
+
end
|
|
31
|
+
if to > from
|
|
32
|
+
contents = contents.split("\n")[from..to].join("\n")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
if contents.length > 5000
|
|
36
|
+
contents = contents[0..5000]
|
|
37
|
+
@truncated = true
|
|
38
|
+
end
|
|
39
|
+
@raw = contents
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
18
43
|
def data
|
|
19
|
-
{
|
|
20
|
-
url: @url,
|
|
21
|
-
filename: raw.css(".final-path").inner_text,
|
|
22
|
-
lines: raw.css("#files .file .info .mode + span").inner_text,
|
|
23
|
-
file: raw.css("#files .file .blob-wrapper").inner_text
|
|
24
|
-
}
|
|
44
|
+
@data ||= {title: link, link: link, content: raw, truncated: @truncated}
|
|
25
45
|
end
|
|
26
46
|
end
|
|
27
47
|
end
|