yt-audit 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +23 -12
- data/bin/yt-audit +18 -0
- data/lib/yt/audit.rb +21 -42
- data/lib/yt/audit/version.rb +2 -2
- data/lib/yt/video_audit/base.rb +19 -0
- data/lib/yt/video_audit/brand_anchoring.rb +27 -0
- data/lib/yt/video_audit/end_card.rb +29 -0
- data/lib/yt/video_audit/info_card.rb +24 -0
- data/lib/yt/video_audit/subscribe_annotation.rb +25 -0
- data/lib/yt/video_audit/youtube_association.rb +25 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7da22a57ea6de80903cdfaedc43242975109e22b
|
4
|
+
data.tar.gz: 3e77764bc854359f62880bc4576a7ac86e667ac9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 999786ef7ebdccbcbafe39c075105db541b5f6292022b2505d2e7df6fbde93dbfbcef176529de0b425f4b01b6ed8526fbe535142deab875b2ae1cfb6f7a4d42d
|
7
|
+
data.tar.gz: b0219b654d9e6a59bcec46a554690d1e7ce433b88f9374724ed45b9aa672564ab6ae59ce54630f955ad69e1ee72776915d8aac2c4275da5c418cd927030f2f9d
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,19 @@ For more information about changelogs, check
|
|
6
6
|
[Keep a Changelog](http://keepachangelog.com) and
|
7
7
|
[Vandamme](http://tech-angels.github.io/vandamme).
|
8
8
|
|
9
|
+
## 0.2.0 - 2016.02.18
|
10
|
+
|
11
|
+
**How to upgrade**
|
12
|
+
|
13
|
+
If your code calls any of `has_end_cards?`, `has_link_to_own_channel?`, `has_subscribe_annotations?`, `has_brand_anchoring?`, or `has_info_cards?` method with a video id, they are removed. Instead, call `run` method from a `Yt::Audit` instance to get information of a channel.
|
14
|
+
|
15
|
+
* [FEATURE] Add `run` method to audit a channel and count how many videos have each audit subject out of its recent 10 videos.
|
16
|
+
* [REMOVAL] Remove `has_end_cards?`
|
17
|
+
* [REMOVAL] Remove `has_link_to_own_channel?`
|
18
|
+
* [REMOVAL] Remove `has_subscribe_annotations?`
|
19
|
+
* [REMOVAL] Remove `has_brand_anchoring?`
|
20
|
+
* [REMOVAL] Remove `has_info_cards?`
|
21
|
+
|
9
22
|
## 0.1.5 - 2016.02.17
|
10
23
|
|
11
24
|
* [BUGFIX] Fix `has_end_cards?` for cases when Float `ends_at` is
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Yt::Audit
|
2
2
|
|
3
|
-
Welcome! This is a Ruby library you can audit a YouTube
|
3
|
+
Welcome! This is a Ruby library you can audit a YouTube channel.
|
4
4
|
|
5
5
|
The **source code** is available on [GitHub](https://github.com/Fullscreen/yt-audit) and the **documentation** on [RubyDoc](http://www.rubydoc.info/github/fullscreen/yt-audit/master/Yt/Audit).
|
6
6
|
|
@@ -16,7 +16,7 @@ The **source code** is available on [GitHub](https://github.com/Fullscreen/yt-au
|
|
16
16
|
|
17
17
|
$ bin/setup
|
18
18
|
|
19
|
-
$ YT_API_KEY="
|
19
|
+
$ YT_API_KEY="123456789012345678901234567890123456789" rake
|
20
20
|
$ open coverage/index.html
|
21
21
|
|
22
22
|
$ yardoc
|
@@ -24,15 +24,26 @@ The **source code** is available on [GitHub](https://github.com/Fullscreen/yt-au
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
+
`run` method returns an array of objects. It uses channel title as brand name, and 10 recent videos of channel, currently.
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
audit = Yt::Audit.new(channel_id: 'UCPCk_8dtVyR1lLHMBEILW4g')
|
31
|
+
# => #<Yt::Audit:0x007f94ec8050b0 @channel_id="UCPCk_8dtVyR1lLHMBEILW4g">
|
32
|
+
audit.run
|
33
|
+
# => [#<Yt::VideoAudit::InfoCard:0x007f94ec8c6f30 @videos=[...]>, #<Yt::VideoAudit::BrandAnchoring...>, #<Yt::VideoAudit::SubscribeAnnotation...>, #<Yt::VideoAudit::YoutubeAssociation...>, #<Yt::VideoAudit::EndCard...>]
|
34
|
+
```
|
35
|
+
|
36
|
+
You can call four available methods `total_count`, `valid_count`, `title`, and `description` from each `Yt::VideoAudit` object.
|
37
|
+
|
27
38
|
```ruby
|
28
|
-
|
29
|
-
# =>
|
30
|
-
|
31
|
-
# =>
|
32
|
-
|
33
|
-
# =>
|
34
|
-
|
35
|
-
# =>
|
36
|
-
|
37
|
-
# =>
|
39
|
+
video_audit = audit.run[0]
|
40
|
+
# => #<Yt::VideoAudit::InfoCard:0x007f94ec979ab8 @videos=[...]>
|
41
|
+
video_audit.total_count
|
42
|
+
# => 10
|
43
|
+
video_audit.valid_count
|
44
|
+
# => 10
|
45
|
+
video_audit.title
|
46
|
+
# => "Info Cards"
|
47
|
+
video_audit.description
|
48
|
+
# => "The number of videos with an info card"
|
38
49
|
```
|
data/bin/yt-audit
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'yt/audit'
|
5
|
+
rescue LoadError
|
6
|
+
require 'rubygems'
|
7
|
+
require 'yt/audit'
|
8
|
+
end
|
9
|
+
|
10
|
+
channel_id = ARGV[0] || 'UCKM-eG7PBcw3flaBvd0q2TQ'
|
11
|
+
audit = Yt::Audit.new(channel_id: channel_id)
|
12
|
+
puts "Channel: https://www.youtube.com/channel/#{channel_id}"
|
13
|
+
audit.run.each do |video_audit|
|
14
|
+
puts
|
15
|
+
puts "#{video_audit.description}"
|
16
|
+
puts "#{video_audit.title}: #{video_audit.valid_count} out of #{video_audit.total_count}"
|
17
|
+
end
|
18
|
+
|
data/lib/yt/audit.rb
CHANGED
@@ -1,56 +1,35 @@
|
|
1
1
|
require 'yt'
|
2
2
|
require 'yt/annotations'
|
3
|
+
require 'yt/video_audit/info_card'
|
4
|
+
require 'yt/video_audit/brand_anchoring'
|
5
|
+
require 'yt/video_audit/subscribe_annotation'
|
6
|
+
require 'yt/video_audit/youtube_association'
|
7
|
+
require 'yt/video_audit/end_card'
|
3
8
|
|
4
9
|
module Yt
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
# @return [Boolean] if the video has any info card.
|
9
|
-
def self.has_info_cards?(video_id)
|
10
|
-
Yt::Annotations.for(video_id).any? do |annotation|
|
11
|
-
annotation.is_a? Yt::Annotations::Card
|
12
|
-
end
|
10
|
+
class Audit
|
11
|
+
def initialize(channel_id:)
|
12
|
+
@channel_id = channel_id
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
def run
|
16
|
+
[
|
17
|
+
Yt::VideoAudit::InfoCard.new(videos: videos),
|
18
|
+
Yt::VideoAudit::BrandAnchoring.new(videos: videos, brand: channel.title),
|
19
|
+
Yt::VideoAudit::SubscribeAnnotation.new(videos: videos),
|
20
|
+
Yt::VideoAudit::YoutubeAssociation.new(videos: videos),
|
21
|
+
Yt::VideoAudit::EndCard.new(videos: videos)
|
22
|
+
]
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
# @param [String] video_id the video to audit.
|
26
|
-
# @return [Boolean] if the video has any link to subscribe in the annotations.
|
27
|
-
def self.has_subscribe_annotations?(video_id)
|
28
|
-
Yt::Annotations.for(video_id).any? do |annotation|
|
29
|
-
annotation.link && annotation.link[:type] == :subscribe
|
30
|
-
end
|
31
|
-
end
|
25
|
+
private
|
32
26
|
|
33
|
-
|
34
|
-
|
35
|
-
# @return [Boolean] if the video description has link to its own channel.
|
36
|
-
def self.has_link_to_own_channel?(video_id)
|
37
|
-
video = Yt::Video.new(id: video_id)
|
38
|
-
video.description.split(' ')
|
39
|
-
.select {|word| Yt::URL.new(word).kind == :channel }
|
40
|
-
.any? {|link| Yt::Channel.new(url: link).id == video.channel_id }
|
27
|
+
def videos
|
28
|
+
@videos ||= channel.videos.first 10
|
41
29
|
end
|
42
30
|
|
43
|
-
|
44
|
-
|
45
|
-
# @return [Boolean] if the video has any annotation, other than info cards,
|
46
|
-
# with a link in it, at the end of video, stays for more than 5 seconds.
|
47
|
-
def self.has_end_cards?(video_id)
|
48
|
-
video_duration = Yt::Video.new(id: video_id).duration
|
49
|
-
Yt::Annotations.for(video_id).any? do |annotation|
|
50
|
-
!annotation.is_a?(Yt::Annotations::Card) && annotation.link &&
|
51
|
-
(annotation.ends_at.floor..annotation.ends_at.ceil).include?(video_duration) &&
|
52
|
-
video_duration - annotation.starts_at > 5
|
53
|
-
end
|
31
|
+
def channel
|
32
|
+
@channel ||= Yt::Channel.new id: @channel_id
|
54
33
|
end
|
55
34
|
end
|
56
35
|
end
|
data/lib/yt/audit/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Yt
|
2
|
+
module VideoAudit
|
3
|
+
class Base
|
4
|
+
def initialize(options = {})
|
5
|
+
@videos = options[:videos]
|
6
|
+
end
|
7
|
+
|
8
|
+
# @return [Fixnum] number of all given videos.
|
9
|
+
def total_count
|
10
|
+
@videos.size
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [Fixnum] number of videos satisfy given condition.
|
14
|
+
def valid_count
|
15
|
+
@videos.count {|video| valid? video}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'yt/video_audit/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module VideoAudit
|
5
|
+
# Count how many subject videos include its brand name in the title.
|
6
|
+
class BrandAnchoring < Base
|
7
|
+
def initialize(options = {})
|
8
|
+
super
|
9
|
+
@brand = options[:brand]
|
10
|
+
end
|
11
|
+
|
12
|
+
def title
|
13
|
+
'Brand Anchoring'
|
14
|
+
end
|
15
|
+
|
16
|
+
def description
|
17
|
+
'The number of videos with the brand name in the title'
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def valid?(video)
|
23
|
+
!!video.title[/#{@brand}/i]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yt/video_audit/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module VideoAudit
|
5
|
+
# Count how many subject videos have any end card. An end card
|
6
|
+
# can be described as an annotation, not an info card, with a link in it,
|
7
|
+
# at the end of video, stays for more than 5 seconds.
|
8
|
+
class EndCard < Base
|
9
|
+
def title
|
10
|
+
'Possible End Card Annotations'
|
11
|
+
end
|
12
|
+
|
13
|
+
def description
|
14
|
+
'The number of videos with a link annotation'\
|
15
|
+
' longer than 5 seconds, not an info card, at the end of its duration'
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def valid?(video)
|
21
|
+
Yt::Annotations.for(video.id).any? do |annotation|
|
22
|
+
!annotation.is_a?(Yt::Annotations::Card) && annotation.link &&
|
23
|
+
(annotation.ends_at.floor..annotation.ends_at.ceil).include?(video.duration) &&
|
24
|
+
video.duration - annotation.starts_at > 5
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'yt/video_audit/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module VideoAudit
|
5
|
+
# Count how many subject videos have an info card.
|
6
|
+
class InfoCard < Base
|
7
|
+
def title
|
8
|
+
'Info Cards'
|
9
|
+
end
|
10
|
+
|
11
|
+
def description
|
12
|
+
'The number of videos with an info card'
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def valid?(video)
|
18
|
+
Yt::Annotations.for(video.id).any? do |annotation|
|
19
|
+
annotation.is_a? Yt::Annotations::Card
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'yt/video_audit/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module VideoAudit
|
5
|
+
# Count how many subject videos have an annotation
|
6
|
+
# with a subscribe link.
|
7
|
+
class SubscribeAnnotation < Base
|
8
|
+
def title
|
9
|
+
'Subscribe Annotations'
|
10
|
+
end
|
11
|
+
|
12
|
+
def description
|
13
|
+
'The number of videos with a link to subscribe in its annotations'
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def valid?(video)
|
19
|
+
Yt::Annotations.for(video.id).any? do |annotation|
|
20
|
+
annotation.link && annotation.link[:type] == :subscribe
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'yt/video_audit/base'
|
2
|
+
|
3
|
+
module Yt
|
4
|
+
module VideoAudit
|
5
|
+
# Count how many videos have video description includes
|
6
|
+
# a link to its own channel.
|
7
|
+
class YoutubeAssociation < Base
|
8
|
+
def title
|
9
|
+
'YouTube Association'
|
10
|
+
end
|
11
|
+
|
12
|
+
def description
|
13
|
+
'The number of videos with description has a link to its own channel'
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def valid?(video)
|
19
|
+
video.description.split(' ')
|
20
|
+
.select {|word| Yt::URL.new(word).kind == :channel }
|
21
|
+
.any? {|link| Yt::Channel.new(url: link).id == video.channel_id }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yt-audit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kang-Kyu Lee
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yt
|
@@ -126,8 +126,15 @@ files:
|
|
126
126
|
- Rakefile
|
127
127
|
- bin/console
|
128
128
|
- bin/setup
|
129
|
+
- bin/yt-audit
|
129
130
|
- lib/yt/audit.rb
|
130
131
|
- lib/yt/audit/version.rb
|
132
|
+
- lib/yt/video_audit/base.rb
|
133
|
+
- lib/yt/video_audit/brand_anchoring.rb
|
134
|
+
- lib/yt/video_audit/end_card.rb
|
135
|
+
- lib/yt/video_audit/info_card.rb
|
136
|
+
- lib/yt/video_audit/subscribe_annotation.rb
|
137
|
+
- lib/yt/video_audit/youtube_association.rb
|
131
138
|
- yt-audit.gemspec
|
132
139
|
homepage: https://github.com/fullscreen/yt-audit
|
133
140
|
licenses:
|