yt 0.6.1 → 0.6.2
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/.travis.yml +1 -0
- data/Gemfile.lock +1 -1
- data/HISTORY.md +3 -0
- data/README.md +5 -1
- data/TODO.md +0 -2
- data/bin/yt +2 -0
- data/lib/yt/actions/delete_all.rb +2 -2
- data/lib/yt/associations/authentications.rb +17 -2
- data/lib/yt/collections/base.rb +6 -0
- data/lib/yt/collections/statuses.rb +22 -0
- data/lib/yt/collections/subscriptions.rb +1 -1
- data/lib/yt/collections/videos.rb +6 -1
- data/lib/yt/models/account.rb +6 -12
- data/lib/yt/models/base.rb +28 -2
- data/lib/yt/models/channel.rb +37 -2
- data/lib/yt/models/playlist.rb +24 -0
- data/lib/yt/models/video.rb +19 -0
- data/lib/yt/version.rb +1 -1
- data/spec/associations/device_auth/account_spec.rb +31 -0
- data/spec/associations/device_auth/channel_spec.rb +114 -0
- data/spec/associations/device_auth/content_owner_spec.rb +8 -0
- data/spec/associations/device_auth/earnings_spec.rb +2 -0
- data/spec/associations/device_auth/playlist_spec.rb +136 -0
- data/spec/associations/device_auth/{ids_spec.rb → resource_spec.rb} +2 -2
- data/spec/associations/device_auth/video_spec.rb +42 -0
- data/spec/associations/no_auth/video_spec.rb +13 -0
- data/spec/associations/server_auth/channel_spec.rb +50 -0
- data/spec/associations/server_auth/playlist_spec.rb +36 -0
- data/spec/associations/server_auth/{ids_spec.rb → resource_spec.rb} +2 -2
- data/spec/associations/server_auth/video_spec.rb +22 -0
- data/spec/models/channel_spec.rb +7 -0
- metadata +25 -60
- data/lib/yt/associations.rb +0 -38
- data/lib/yt/associations/annotations.rb +0 -15
- data/lib/yt/associations/channels.rb +0 -20
- data/lib/yt/associations/details_sets.rb +0 -20
- data/lib/yt/associations/ids.rb +0 -20
- data/lib/yt/associations/partnered_channels.rb +0 -14
- data/lib/yt/associations/playlist_items.rb +0 -34
- data/lib/yt/associations/playlists.rb +0 -22
- data/lib/yt/associations/ratings.rb +0 -39
- data/lib/yt/associations/snippets.rb +0 -20
- data/lib/yt/associations/statuses.rb +0 -14
- data/lib/yt/associations/subscriptions.rb +0 -34
- data/lib/yt/associations/user_infos.rb +0 -21
- data/lib/yt/associations/videos.rb +0 -14
- data/spec/associations/device_auth/channels_spec.rb +0 -8
- data/spec/associations/device_auth/details_sets_spec.rb +0 -18
- data/spec/associations/device_auth/partnered_channels_spec.rb +0 -15
- data/spec/associations/device_auth/playlist_items_spec.rb +0 -79
- data/spec/associations/device_auth/playlists_spec.rb +0 -61
- data/spec/associations/device_auth/ratings_spec.rb +0 -28
- data/spec/associations/device_auth/snippets_spec.rb +0 -28
- data/spec/associations/device_auth/subscriptions_spec.rb +0 -35
- data/spec/associations/device_auth/user_infos_spec.rb +0 -12
- data/spec/associations/device_auth/videos_spec.rb +0 -20
- data/spec/associations/no_auth/annotations_spec.rb +0 -15
- data/spec/associations/server_auth/channels_spec.rb +0 -2
- data/spec/associations/server_auth/details_sets_spec.rb +0 -18
- data/spec/associations/server_auth/playlist_items_spec.rb +0 -17
- data/spec/associations/server_auth/playlists_spec.rb +0 -17
- data/spec/associations/server_auth/ratings_spec.rb +0 -2
- data/spec/associations/server_auth/snippets_spec.rb +0 -28
- data/spec/associations/server_auth/subscriptions_spec.rb +0 -2
- data/spec/associations/server_auth/user_infos_spec.rb +0 -2
- data/spec/associations/server_auth/videos_spec.rb +0 -20
data/lib/yt/associations.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/module/delegation'
|
2
|
-
require 'active_support/dependencies/autoload'
|
3
|
-
require 'active_support/core_ext/string/inflections' # for camelize
|
4
|
-
|
5
|
-
module Yt
|
6
|
-
module Associations
|
7
|
-
# @note: Using Autoload to avoid circular dependencies.
|
8
|
-
# For instance: Yt::Channel requires Yt::Base, which requires
|
9
|
-
# Yt::Associations, which requires Yt::Associations::Subscription,
|
10
|
-
# which requires Yt::Subscription, which requires Yt::Base
|
11
|
-
extend ActiveSupport::Autoload
|
12
|
-
|
13
|
-
autoload :Annotations
|
14
|
-
autoload :Authentications
|
15
|
-
autoload :Channels
|
16
|
-
autoload :DetailsSets
|
17
|
-
autoload :Earnings
|
18
|
-
autoload :Ids
|
19
|
-
autoload :PartneredChannels
|
20
|
-
autoload :PlaylistItems
|
21
|
-
autoload :Playlists
|
22
|
-
autoload :Ratings
|
23
|
-
autoload :Snippets
|
24
|
-
autoload :Statuses
|
25
|
-
autoload :Subscriptions
|
26
|
-
autoload :UserInfos
|
27
|
-
autoload :Videos
|
28
|
-
autoload :Views
|
29
|
-
|
30
|
-
def has_many(attributes, options = {})
|
31
|
-
mod = attributes.to_s.sub(/.*\./, '').camelize
|
32
|
-
include "Yt::Associations::#{mod.pluralize}".constantize
|
33
|
-
delegate *options[:delegate], to: attributes if options[:delegate]
|
34
|
-
end
|
35
|
-
|
36
|
-
alias has_one has_many
|
37
|
-
end
|
38
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'yt/collections/annotations'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_many :annotations` method to YouTube resources,
|
6
|
-
# which allows to access to content annotation set-specific methods.
|
7
|
-
# YouTube resources with annotations are: videos.
|
8
|
-
module Annotations
|
9
|
-
def annotations
|
10
|
-
@annotations ||= Collections::Annotations.of self
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'yt/collections/channels'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_one :channel` method to YouTube resources, which
|
6
|
-
# allows to access to channel-specific methods like.
|
7
|
-
# YouTube resources with a channel are: account.
|
8
|
-
module Channels
|
9
|
-
def channel
|
10
|
-
@channel ||= channels.first
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def channels
|
16
|
-
@channels ||= Collections::Channels.of self
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'yt/collections/details_sets'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_one :details_set` method to YouTube resources, which
|
6
|
-
# allows to access to content detail set-specific methods like `duration`.
|
7
|
-
# YouTube resources with content details are: videos.
|
8
|
-
module DetailsSets
|
9
|
-
def details_set
|
10
|
-
@detail_set ||= details_sets.first!
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def details_sets
|
16
|
-
@details_sets ||= Collections::DetailsSets.of self
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/yt/associations/ids.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'yt/collections/ids'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_one :id` method to YouTube resources, which
|
6
|
-
# allows to retrieve the id of a resource knowing only its username.
|
7
|
-
# YouTube resources with ids are: resources.
|
8
|
-
module Ids
|
9
|
-
def id
|
10
|
-
@id ||= ids.first!
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def ids
|
16
|
-
@ids ||= Collections::Ids.of self
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'yt/collections/partnered_channels'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_many :partnered_channels` method to YouTube resources,
|
6
|
-
# which allows to access to partnered channel-specific methods.
|
7
|
-
# YouTube resources with a channel are: content owners.
|
8
|
-
module PartneredChannels
|
9
|
-
def partnered_channels
|
10
|
-
@partnered_channels ||= Collections::PartneredChannels.of self
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'yt/collections/playlist_items'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_many :playlist_items` method to YouTube resources, which
|
6
|
-
# allows to invoke playlist_item-related methods, such as .add_video.
|
7
|
-
# YouTube resources with playlist items are: playlists.
|
8
|
-
module PlaylistItems
|
9
|
-
def playlist_items
|
10
|
-
@playlist_items ||= Collections::PlaylistItems.of self
|
11
|
-
end
|
12
|
-
|
13
|
-
def add_video(video_id)
|
14
|
-
playlist_items.insert({id: video_id, kind: :video}, ignore_errors: true)
|
15
|
-
end
|
16
|
-
|
17
|
-
def add_video!(video_id)
|
18
|
-
playlist_items.insert id: video_id, kind: :video
|
19
|
-
end
|
20
|
-
|
21
|
-
def add_videos(video_ids = [])
|
22
|
-
video_ids.map{|video_id| add_video video_id}
|
23
|
-
end
|
24
|
-
|
25
|
-
def add_videos!(video_ids = [])
|
26
|
-
video_ids.map{|video_id| add_video! video_id}
|
27
|
-
end
|
28
|
-
|
29
|
-
def delete_playlist_items(attrs = {})
|
30
|
-
playlist_items.delete_all attrs
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'yt/collections/playlists'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_many :playlists` method to YouTube resources, which
|
6
|
-
# allows to invoke playlist-related methods, such as .create_playlist.
|
7
|
-
# YouTube resources with playlist are: channels.
|
8
|
-
module Playlists
|
9
|
-
def playlists
|
10
|
-
@playlists ||= Collections::Playlists.of self
|
11
|
-
end
|
12
|
-
|
13
|
-
def create_playlist(params = {})
|
14
|
-
playlists.insert params
|
15
|
-
end
|
16
|
-
|
17
|
-
def delete_playlists(attrs = {})
|
18
|
-
playlists.delete_all attrs
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'yt/collections/ratings'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_one :rating` method to YouTube resources, which
|
6
|
-
# allows to invoke rating-related methods, such as .like.
|
7
|
-
# YouTube resources with rating are: videos.
|
8
|
-
module Ratings
|
9
|
-
def rating
|
10
|
-
@rating ||= ratings.first
|
11
|
-
end
|
12
|
-
|
13
|
-
def liked?
|
14
|
-
rating.rating == :like
|
15
|
-
end
|
16
|
-
|
17
|
-
def like
|
18
|
-
rating.update :like
|
19
|
-
liked?
|
20
|
-
end
|
21
|
-
|
22
|
-
def dislike
|
23
|
-
rating.update :dislike
|
24
|
-
!liked?
|
25
|
-
end
|
26
|
-
|
27
|
-
def unlike
|
28
|
-
rating.update :none
|
29
|
-
!liked?
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def ratings
|
35
|
-
@ratings ||= Collections::Ratings.of self
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'yt/collections/snippets'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_one :snippet` method to YouTube resources, which
|
6
|
-
# allows to access to content detail set-specific methods like `title`.
|
7
|
-
# YouTube resources with content details are: videos and channels.
|
8
|
-
module Snippets
|
9
|
-
def snippet
|
10
|
-
@snippet ||= snippets.first!
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def snippets
|
16
|
-
@snippets ||= Collections::Snippets.of self
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'yt/models/status'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_one :status` method to YouTube resources, which
|
6
|
-
# allows to access to status-specific methods like `public?`.
|
7
|
-
# YouTube resources with status are: playlists.
|
8
|
-
module Statuses
|
9
|
-
def status
|
10
|
-
@status
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'yt/collections/subscriptions'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_one :subscription` method to YouTube resources, which
|
6
|
-
# allows to invoke subscription-related methods, such as .subscribe.
|
7
|
-
# YouTube resources with subscription are: channels.
|
8
|
-
module Subscriptions
|
9
|
-
def subscriptions
|
10
|
-
@subscriptions ||= Collections::Subscriptions.of self
|
11
|
-
end
|
12
|
-
|
13
|
-
def subscribed?
|
14
|
-
subscriptions.any?{|s| s.exists?}
|
15
|
-
end
|
16
|
-
|
17
|
-
def subscribe
|
18
|
-
subscriptions.insert ignore_errors: true
|
19
|
-
end
|
20
|
-
|
21
|
-
def subscribe!
|
22
|
-
subscriptions.insert
|
23
|
-
end
|
24
|
-
|
25
|
-
def unsubscribe
|
26
|
-
subscriptions.delete_all({}, ignore_errors: true)
|
27
|
-
end
|
28
|
-
|
29
|
-
def unsubscribe!
|
30
|
-
subscriptions.delete_all
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'yt/collections/user_infos'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_one :user_info` method to YouTube resources, which
|
6
|
-
# allows to access to user_info-specific methods like `email`.
|
7
|
-
# YouTube resources with user infos are: accounts.
|
8
|
-
module UserInfos
|
9
|
-
def user_info
|
10
|
-
@user_info ||= user_infos.first!
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def user_infos
|
16
|
-
@user_infos ||= Collections::UserInfos.of self
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'yt/collections/videos'
|
2
|
-
|
3
|
-
module Yt
|
4
|
-
module Associations
|
5
|
-
# Provides the `has_many :videos` method to YouTube resources, which
|
6
|
-
# allows to access only the videos that belong to a specific resource.
|
7
|
-
# YouTube resources with videos are: channels.
|
8
|
-
module Videos
|
9
|
-
def videos
|
10
|
-
@videos ||= Collections::Videos.of self
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'yt/associations/details_sets'
|
3
|
-
|
4
|
-
describe Yt::Associations::DetailsSets, :device_app do
|
5
|
-
let(:video) { Yt::Video.new id: 'fsdfsfsdMESycYJytkU', auth: $account }
|
6
|
-
|
7
|
-
describe '#details_set' do
|
8
|
-
context 'given an existing video' do
|
9
|
-
let(:video) { Yt::Video.new id: 'MESycYJytkU', auth: $account }
|
10
|
-
it { expect(video.details_set).to be_a Yt::DetailsSet }
|
11
|
-
end
|
12
|
-
|
13
|
-
context 'given an unknown video' do
|
14
|
-
let(:video) { Yt::Video.new id: 'not-a-video-id', auth: $account }
|
15
|
-
it { expect{video.details_set}.to raise_error Yt::Errors::NoItems }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Yt::Associations::PartneredChannels, :partner do
|
4
|
-
describe '#partnered_channels' do
|
5
|
-
let(:partnered_channels) { content_owner.partnered_channels }
|
6
|
-
|
7
|
-
context 'given a content owner with partnered channels' do
|
8
|
-
let(:content_owner) { $content_owner }
|
9
|
-
|
10
|
-
# NOTE: Uncomment once size does not runs through *all* the pages
|
11
|
-
# it { expect(partnered_channels.size).to be > 0 }
|
12
|
-
it { expect(partnered_channels.first).to be_a Yt::Channel }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'yt/associations/playlist_items'
|
3
|
-
|
4
|
-
# TODO: Delete playlist item after tests that create them
|
5
|
-
|
6
|
-
describe Yt::Associations::PlaylistItems, :device_app do
|
7
|
-
before:all do
|
8
|
-
@playlist = $account.create_playlist title: "Yt Test Playlist Items"
|
9
|
-
end
|
10
|
-
after(:all) { @playlist.delete }
|
11
|
-
|
12
|
-
describe '#playlist_items' do
|
13
|
-
let(:video_id) { 'MESycYJytkU' }
|
14
|
-
before { @playlist.add_video video_id }
|
15
|
-
|
16
|
-
it { expect(@playlist.playlist_items.count).to be > 0 }
|
17
|
-
it { expect(@playlist.playlist_items.first).to be_a Yt::PlaylistItem }
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#add_video' do
|
21
|
-
context 'given an existing video' do
|
22
|
-
let(:video_id) { 'MESycYJytkU' }
|
23
|
-
it { expect(@playlist.add_video video_id).to be_a Yt::PlaylistItem }
|
24
|
-
it { expect{@playlist.add_video video_id}.to change{@playlist.playlist_items.count}.by(1) }
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'given an unknown video' do
|
28
|
-
let(:video_id) { 'not-a-video' }
|
29
|
-
it { expect(@playlist.add_video video_id).to be_nil }
|
30
|
-
it { expect{@playlist.add_video video_id}.not_to change{@playlist.playlist_items.count} }
|
31
|
-
end
|
32
|
-
|
33
|
-
context 'given a video of a terminated account' do
|
34
|
-
let(:video_id) { 'kDCpdKeTe5g' }
|
35
|
-
it { expect(@playlist.add_video video_id).to be_nil }
|
36
|
-
it { expect{@playlist.add_video video_id}.not_to change{@playlist.playlist_items.count} }
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe '#add_video!' do
|
41
|
-
context 'given an existing video' do
|
42
|
-
let(:video_id) { 'MESycYJytkU' }
|
43
|
-
it { expect(@playlist.add_video video_id).to be_a Yt::PlaylistItem }
|
44
|
-
end
|
45
|
-
|
46
|
-
context 'given an unknown video' do
|
47
|
-
let(:video_id) { 'not-a-video' }
|
48
|
-
it { expect{@playlist.add_video! video_id}.to fail.with 'videoNotFound' }
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'given a video of a terminated account' do
|
52
|
-
let(:video_id) { 'kDCpdKeTe5g' }
|
53
|
-
it { expect{@playlist.add_video! video_id}.to fail.with 'forbidden' }
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe '#add_videos' do
|
58
|
-
context 'given one existing and one unknown video' do
|
59
|
-
let(:video_ids) { ['MESycYJytkU', 'not-a-video'] }
|
60
|
-
it { expect(@playlist.add_videos(video_ids).length).to eq 2 }
|
61
|
-
it { expect{@playlist.add_videos video_ids}.to change{@playlist.playlist_items.count}.by(1) }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe '#add_videos!' do
|
66
|
-
context 'given one existing and one unknown video' do
|
67
|
-
let(:video_ids) { ['MESycYJytkU', 'not-a-video'] }
|
68
|
-
it { expect{@playlist.add_videos! video_ids}.to fail.with 'videoNotFound'}
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
describe '#delete_playlist_items' do
|
73
|
-
let(:video_id) { 'MESycYJytkU' }
|
74
|
-
before { @playlist.add_video video_id }
|
75
|
-
|
76
|
-
it { expect(@playlist.delete_playlist_items.uniq).to eq [true] }
|
77
|
-
it { expect{@playlist.delete_playlist_items}.to change{@playlist.playlist_items.count} }
|
78
|
-
end
|
79
|
-
end
|