lita-youtube-me 0.0.2 → 0.0.3
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/README.md +37 -1
- data/lib/lita/handlers/youtube_me.rb +52 -3
- data/lita-youtube-me.gemspec +1 -1
- data/spec/lita/handlers/youtube_me_spec.rb +44 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b452c59b9836a8899cbf89e470dd184f5782658
|
4
|
+
data.tar.gz: c2b7a1c05505d331542fdc0f3fbbde9886232b74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26e367d1fe3800f44cf5b43def7b1ce396ad52ddbad3ca2b4de514790cd16557c5ae6736889959f3db9ec69e76b17e4458ab4509da8d1a94c32c4a152ef001b7
|
7
|
+
data.tar.gz: 3690cbfb65f64948e4b35f9b164cbe6dfb97f471ce8cc8c8e2302e5f9e52afbcb4f8e9b248fd7f6d7c60787136475c898f710c42b216826126871dfa0b8bd4f2
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# lita-youtube-me
|
2
2
|
|
3
|
-
Replies with a video that matches a string.
|
3
|
+
Replies with a video that matches a string. Optionally detects YouTube URLs and returns title, duration, etc.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -10,11 +10,47 @@ Add lita-youtube to your Lita instance's Gemfile:
|
|
10
10
|
gem "lita-youtube-me"
|
11
11
|
```
|
12
12
|
|
13
|
+
## Configuration
|
14
|
+
|
15
|
+
### Optional attributes
|
16
|
+
* `video_info` (boolean) - When set to `true`, Lita will return additional information (title, duration, etc.) about the video. Default: `false`
|
17
|
+
* `detect_urls` (boolean) - When set to `true`, Lita will return additional information about any YouTube URLs it detects. Default: `false`
|
18
|
+
|
19
|
+
### Example
|
20
|
+
``` ruby
|
21
|
+
Lita.configure do |config|
|
22
|
+
config.handlers.youtube_me.video_info = true
|
23
|
+
config.handlers.youtube_me.detect_urls = true
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
13
27
|
## Usage
|
14
28
|
|
29
|
+
The following are all equivalent ways of asking Lita to search for a video about "soccer":
|
15
30
|
```
|
16
31
|
@bot: youtube me soccer
|
17
32
|
@bot: youtube soccer
|
33
|
+
@bot: yt me soccer
|
34
|
+
@bot: yt soccer
|
35
|
+
```
|
36
|
+
|
37
|
+
Lita's default response will be a YouTube URL:
|
38
|
+
```
|
39
|
+
<bot> https://www.youtube.com/watch?v=SZJldG6bP1s
|
40
|
+
```
|
41
|
+
|
42
|
+
Enabling the config variable `video_info` will add another line to Lita's response:
|
43
|
+
```
|
44
|
+
<bot> https://www.youtube.com/watch?v=SZJldG6bP1s
|
45
|
+
<bot> Soccer Kid Thug [0:23] by turdmalone on 2015-04-10 (49.5k views, 96% liked)
|
46
|
+
```
|
47
|
+
|
48
|
+
Enabling `detect_urls` will make Lita return information about any YouTube URLs it detects:
|
49
|
+
```
|
50
|
+
<jack> hey @jill check out the new game of thrones trailer https://www.youtube.com/watch?v=dQw4w9WgXcQ lol
|
51
|
+
<bot> Rick Astley - Never Gonna Give You Up [3:33] by RickAstleyVEVO on 2009-10-25 (115.2M views, 94% liked)
|
52
|
+
<jill> nope, not falling for it this time!
|
53
|
+
<jack> drat
|
18
54
|
```
|
19
55
|
|
20
56
|
## License
|
@@ -1,14 +1,22 @@
|
|
1
|
+
require "date"
|
2
|
+
|
1
3
|
module Lita
|
2
4
|
module Handlers
|
3
5
|
class YoutubeMe < Handler
|
4
6
|
API_URL = "https://gdata.youtube.com/feeds/api/videos"
|
5
7
|
|
6
|
-
|
8
|
+
config :video_info, types: [TrueClass, FalseClass], default: false
|
9
|
+
config :detect_urls, types: [TrueClass, FalseClass], default: false
|
10
|
+
|
11
|
+
route(/^(?:youtube|yt)(?: me)?\s+(.*)/i, :find_video, command: true, help: {
|
7
12
|
"youtube (me) QUERY" => "Gets a youtube video."
|
8
13
|
})
|
14
|
+
# Detect YouTube links in non-commands and display video info
|
15
|
+
route(/\byoutube\.com\/watch\?v=([^?&#\s]+)/i, :display_info, command: false)
|
16
|
+
route(/\byoutu\.be\/([^?&#\s]+)/i, :display_info, command: false)
|
9
17
|
|
10
18
|
def find_video(response)
|
11
|
-
query = response.matches[0][
|
19
|
+
query = response.matches[0][0]
|
12
20
|
http_response = http.get(API_URL,
|
13
21
|
q: query,
|
14
22
|
orderBy: "relevance",
|
@@ -19,9 +27,50 @@ module Lita
|
|
19
27
|
video = videos.sample
|
20
28
|
video["link"].each do |link|
|
21
29
|
if link["rel"] == "alternate" && link["type"] == "text/html"
|
22
|
-
response.reply link["href"]
|
30
|
+
response.reply link["href"].split("&").first
|
23
31
|
end
|
24
32
|
end
|
33
|
+
if config.video_info
|
34
|
+
response.reply info(video)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def display_info(response)
|
39
|
+
if config.detect_urls
|
40
|
+
id = response.matches[0][0]
|
41
|
+
http_response = http.get("#{API_URL}/#{id}", alt: "json")
|
42
|
+
video = MultiJson.load(http_response.body)["entry"]
|
43
|
+
response.reply info(video)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def info(video)
|
48
|
+
title = video["title"]["$t"]
|
49
|
+
uploader = video["author"][0]["name"]["$t"]
|
50
|
+
date = DateTime.iso8601(video["published"]["$t"]).strftime("%F")
|
51
|
+
|
52
|
+
# Format time, only show hours if necessary
|
53
|
+
sec = video["media$group"]["yt$duration"]["seconds"].to_i
|
54
|
+
min = sec / 60
|
55
|
+
hr = min / 60
|
56
|
+
time = "%d:%02d" % [min, sec%60]
|
57
|
+
if hr > 0
|
58
|
+
time = "%d:%02d:%02d" % [hr, min%60, sec%60]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Abbreviate view count, based on http://stackoverflow.com/a/2693484
|
62
|
+
n = video["yt$statistics"]["viewCount"].to_i
|
63
|
+
i = 0
|
64
|
+
while n >= 1e3 do
|
65
|
+
n /= 1e3
|
66
|
+
i += 1
|
67
|
+
end
|
68
|
+
views = "%.#{n.to_s.length>3?1:0}f%s" % [n.round(1), " kMBT"[i]]
|
69
|
+
|
70
|
+
# Calculate rating, accounting for YouTube's 1-5 score range
|
71
|
+
rating = "%.f" % [(video.fetch("gd$rating", {}).fetch("average", 1) - 1) / 4 * 100]
|
72
|
+
|
73
|
+
"#{title} [#{time}] by #{uploader} on #{date} (#{views.strip} views, #{rating}% liked)"
|
25
74
|
end
|
26
75
|
end
|
27
76
|
|
data/lita-youtube-me.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "lita-youtube-me"
|
3
|
-
spec.version = "0.0.
|
3
|
+
spec.version = "0.0.3"
|
4
4
|
spec.authors = ["Taylor Lapeyre"]
|
5
5
|
spec.email = ["taylorlapeyre@gmail.com"]
|
6
6
|
spec.description = %q{A Lita handler that replies with a youtube URL when given a query.}
|
@@ -7,10 +7,54 @@ describe Lita::Handlers::YoutubeMe, lita_handler: true do
|
|
7
7
|
it { is_expected.to route_command("youtube something") }
|
8
8
|
it { is_expected.to route_command("youtube something").to(:find_video) }
|
9
9
|
|
10
|
+
it { is_expected.to route_command("yt me something") }
|
11
|
+
it { is_expected.to route_command("yt me something").to(:find_video) }
|
12
|
+
|
13
|
+
it { is_expected.to route_command("yt something") }
|
14
|
+
it { is_expected.to route_command("yt something").to(:find_video) }
|
15
|
+
|
16
|
+
it { is_expected.to route("https://www.youtube.com/watch?v=nG7RiygTwR4&feature=youtube_gdata") }
|
17
|
+
it { is_expected.to route("https://www.youtube.com/watch?v=nG7RiygTwR4&feature=youtube_gdata").to(:display_info) }
|
18
|
+
|
19
|
+
it { is_expected.to route("taco https://youtu.be/nG7RiygTwR4?t=9m13s taco") }
|
20
|
+
it { is_expected.to route("taco https://youtu.be/nG7RiygTwR4?t=9m13s taco").to(:display_info) }
|
21
|
+
|
10
22
|
it "can find a youtube video with a query" do
|
11
23
|
send_command("youtube me soccer")
|
12
24
|
expect(replies.count).to eq 1
|
13
25
|
expect(replies.last).to_not be_nil
|
14
26
|
expect(replies.last).to match(/youtube\.com/)
|
15
27
|
end
|
28
|
+
|
29
|
+
it "displays info for a requested video when the video_info config variable is true" do
|
30
|
+
registry.config.handlers.youtube_me.video_info = true
|
31
|
+
send_command("yt soccer")
|
32
|
+
expect(replies.count).to eq 2
|
33
|
+
expect(replies.first).to_not be_nil
|
34
|
+
expect(replies.first).to match(/youtube\.com/)
|
35
|
+
expect(replies.last).to_not be_nil
|
36
|
+
expect(replies.last).to match(/views/)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "does not display info for a requested video when the video_info config variable is false" do
|
40
|
+
registry.config.handlers.youtube_me.video_info = false
|
41
|
+
send_command("youtube me soccer")
|
42
|
+
expect(replies.count).to eq 1
|
43
|
+
expect(replies.last).to_not be_nil
|
44
|
+
expect(replies.last).to match(/youtube\.com/)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "displays video info for detected YouTube URLs when the detect_urls config variable is true" do
|
48
|
+
registry.config.handlers.youtube_me.detect_urls = true
|
49
|
+
send_message("taco taco https://www.youtube.com/watch?v=nG7RiygTwR4 taco taco")
|
50
|
+
expect(replies.count).to eq 1
|
51
|
+
expect(replies.first).to_not be_nil
|
52
|
+
expect(replies.first).to match(/10 minutes of DJ Mbenga saying Tacos \[10:02\] by RickFreeloader on 2011-09-12 \(\S+ views, \d+% liked\)/)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "does not display video info for detected YouTube URLs when the detect_urls config variable is false" do
|
56
|
+
registry.config.handlers.youtube_me.detect_urls = false
|
57
|
+
send_message("https://www.youtube.com/watch?v=nG7RiygTwR4")
|
58
|
+
expect(replies.count).to eq 0
|
59
|
+
end
|
16
60
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-youtube-me
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taylor Lapeyre
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
119
|
version: '0'
|
120
120
|
requirements: []
|
121
121
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.4.5
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
125
|
summary: A Lita handler that replies with a youtube URL when given a query.
|