lita-youtube-me 0.0.3 → 0.0.4
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 +8 -1
- data/lib/lita/handlers/youtube_me.rb +40 -24
- data/lita-youtube-me.gemspec +2 -1
- data/spec/lita/handlers/youtube_me_spec.rb +23 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84e50b2bf564204b460ec3da6d9b267aab005701
|
4
|
+
data.tar.gz: 816c091089bbf1ad1eb6c816003b6f28894cde66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c5b96f5cc3a162f7a02fdeb76260ca56d98f4ed44ebbdb5d1f64a9c687a2cd58599ece5c8d05fe3558826fc24a86bfca6852ff6e22f8b5328c175183ffbba6b
|
7
|
+
data.tar.gz: c9d9a3686daafd6057a7c6eba8adda27e5b3fc6bec140838ea8ac1aaf24835d0495071d94dfe4c2e17e74eee518373c8d966a9f5d9425078aa04f62a07aee5ec
|
data/README.md
CHANGED
@@ -12,11 +12,18 @@ gem "lita-youtube-me"
|
|
12
12
|
|
13
13
|
## Configuration
|
14
14
|
|
15
|
+
This plugin requires an API key for the [YouTube Data API (v3)](https://developers.google.com/youtube/v3/).
|
16
|
+
|
17
|
+
``` ruby
|
18
|
+
Lita.configure do |config|
|
19
|
+
config.handlers.youtube_me.api_key = "FooBarBazLuhrmann"
|
20
|
+
end
|
21
|
+
```
|
22
|
+
|
15
23
|
### Optional attributes
|
16
24
|
* `video_info` (boolean) - When set to `true`, Lita will return additional information (title, duration, etc.) about the video. Default: `false`
|
17
25
|
* `detect_urls` (boolean) - When set to `true`, Lita will return additional information about any YouTube URLs it detects. Default: `false`
|
18
26
|
|
19
|
-
### Example
|
20
27
|
``` ruby
|
21
28
|
Lita.configure do |config|
|
22
29
|
config.handlers.youtube_me.video_info = true
|
@@ -1,15 +1,17 @@
|
|
1
1
|
require "date"
|
2
|
+
require "iso8601"
|
2
3
|
|
3
4
|
module Lita
|
4
5
|
module Handlers
|
5
6
|
class YoutubeMe < Handler
|
6
|
-
API_URL = "https://
|
7
|
+
API_URL = "https://www.googleapis.com/youtube/v3"
|
7
8
|
|
9
|
+
config :api_key, type: String, required: true
|
8
10
|
config :video_info, types: [TrueClass, FalseClass], default: false
|
9
11
|
config :detect_urls, types: [TrueClass, FalseClass], default: false
|
10
12
|
|
11
13
|
route(/^(?:youtube|yt)(?: me)?\s+(.*)/i, :find_video, command: true, help: {
|
12
|
-
"youtube (me) QUERY" => "Gets a
|
14
|
+
"youtube (me) QUERY" => "Gets a YouTube video."
|
13
15
|
})
|
14
16
|
# Detect YouTube links in non-commands and display video info
|
15
17
|
route(/\byoutube\.com\/watch\?v=([^?&#\s]+)/i, :display_info, command: false)
|
@@ -17,40 +19,52 @@ module Lita
|
|
17
19
|
|
18
20
|
def find_video(response)
|
19
21
|
query = response.matches[0][0]
|
20
|
-
http_response = http.get(
|
22
|
+
http_response = http.get(
|
23
|
+
"#{API_URL}/search",
|
21
24
|
q: query,
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
+
order: "relevance",
|
26
|
+
maxResults: 15,
|
27
|
+
part: "snippet",
|
28
|
+
key: config.api_key
|
25
29
|
)
|
26
|
-
|
30
|
+
return if http_response.status != 200
|
31
|
+
videos = MultiJson.load(http_response.body)["items"]
|
27
32
|
video = videos.sample
|
28
|
-
video["
|
29
|
-
|
30
|
-
response.reply link["href"].split("&").first
|
31
|
-
end
|
32
|
-
end
|
33
|
+
id = video["id"]["videoId"]
|
34
|
+
response.reply "https://www.youtube.com/watch?v=#{id}"
|
33
35
|
if config.video_info
|
34
|
-
response.reply info(
|
36
|
+
response.reply info(id)
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
40
|
def display_info(response)
|
39
41
|
if config.detect_urls
|
40
42
|
id = response.matches[0][0]
|
41
|
-
|
42
|
-
|
43
|
-
|
43
|
+
info_string = info(id)
|
44
|
+
unless info_string.nil?
|
45
|
+
response.reply info_string
|
46
|
+
end
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
47
|
-
def info(
|
48
|
-
|
49
|
-
|
50
|
-
|
50
|
+
def info(id)
|
51
|
+
http_response = http.get(
|
52
|
+
"#{API_URL}/videos",
|
53
|
+
id: id,
|
54
|
+
part: "contentDetails,snippet,statistics",
|
55
|
+
key: config.api_key
|
56
|
+
)
|
57
|
+
return nil if http_response.status != 200
|
58
|
+
videos = MultiJson.load(http_response.body)["items"]
|
59
|
+
return nil if videos.empty?
|
60
|
+
video = videos[0]
|
61
|
+
title = video["snippet"]["title"]
|
62
|
+
uploader = video["snippet"]["channelTitle"]
|
63
|
+
date = DateTime.iso8601(video["snippet"]["publishedAt"]).strftime("%F")
|
51
64
|
|
52
65
|
# Format time, only show hours if necessary
|
53
|
-
|
66
|
+
duration = ISO8601::Duration.new(video["contentDetails"]["duration"])
|
67
|
+
sec = duration.to_seconds.to_i
|
54
68
|
min = sec / 60
|
55
69
|
hr = min / 60
|
56
70
|
time = "%d:%02d" % [min, sec%60]
|
@@ -59,7 +73,7 @@ module Lita
|
|
59
73
|
end
|
60
74
|
|
61
75
|
# Abbreviate view count, based on http://stackoverflow.com/a/2693484
|
62
|
-
n = video["
|
76
|
+
n = video["statistics"]["viewCount"].to_i
|
63
77
|
i = 0
|
64
78
|
while n >= 1e3 do
|
65
79
|
n /= 1e3
|
@@ -67,8 +81,10 @@ module Lita
|
|
67
81
|
end
|
68
82
|
views = "%.#{n.to_s.length>3?1:0}f%s" % [n.round(1), " kMBT"[i]]
|
69
83
|
|
70
|
-
# Calculate rating
|
71
|
-
|
84
|
+
# Calculate rating percentage
|
85
|
+
likes = video["statistics"]["likeCount"].to_f
|
86
|
+
dislikes = video["statistics"]["dislikeCount"].to_f
|
87
|
+
rating = "%.f" % (likes / (likes + dislikes) * 100)
|
72
88
|
|
73
89
|
"#{title} [#{time}] by #{uploader} on #{date} (#{views.strip} views, #{rating}% liked)"
|
74
90
|
end
|
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.4"
|
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.}
|
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.require_paths = ["lib"]
|
16
16
|
|
17
17
|
spec.add_runtime_dependency "lita", ">= 4.0"
|
18
|
+
spec.add_runtime_dependency "iso8601", ">= 0.8.6"
|
18
19
|
|
19
20
|
spec.add_development_dependency "bundler", "~> 1.3"
|
20
21
|
spec.add_development_dependency "rake"
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Lita::Handlers::YoutubeMe, lita_handler: true do
|
4
|
+
before do
|
5
|
+
registry.config.handlers.youtube_me.api_key = ENV["YOUTUBE_KEY"]
|
6
|
+
end
|
7
|
+
|
4
8
|
it { is_expected.to route_command("youtube me something") }
|
5
9
|
it { is_expected.to route_command("youtube me something").to(:find_video) }
|
6
10
|
|
@@ -57,4 +61,23 @@ describe Lita::Handlers::YoutubeMe, lita_handler: true do
|
|
57
61
|
send_message("https://www.youtube.com/watch?v=nG7RiygTwR4")
|
58
62
|
expect(replies.count).to eq 0
|
59
63
|
end
|
64
|
+
|
65
|
+
it "does not send a message when the detected YouTube URL does not lead to a valid video" do
|
66
|
+
registry.config.handlers.youtube_me.detect_urls = true
|
67
|
+
send_message("https://www.youtube.com/watch?v=foo")
|
68
|
+
expect(replies.count).to eq 0
|
69
|
+
end
|
70
|
+
|
71
|
+
it "does not return a video in response to a query when the API key is invalid" do
|
72
|
+
registry.config.handlers.youtube_me.api_key = "this key doesn't work"
|
73
|
+
send_command("youtube me soccer")
|
74
|
+
expect(replies.count).to eq 0
|
75
|
+
end
|
76
|
+
|
77
|
+
it "does not display video info for detected YouTube URLs when the API key is invalid" do
|
78
|
+
registry.config.handlers.youtube_me.detect_urls = true
|
79
|
+
registry.config.handlers.youtube_me.api_key = "this key doesn't work"
|
80
|
+
send_message("https://www.youtube.com/watch?v=nG7RiygTwR4")
|
81
|
+
expect(replies.count).to eq 0
|
82
|
+
end
|
60
83
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taylor Lapeyre
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: iso8601
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.8.6
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.8.6
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|