Skip to content

Commit 3df7111

Browse files
committed
[v5] add missing end-points to channels, descriptive function naming
1 parent 2dcb254 commit 3df7111

3 files changed

Lines changed: 120 additions & 37 deletions

File tree

resources/lib/twitch/api/parameters.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ class SortBy(_Parameter):
4141
_valid = [CREATED_AT, LAST_BROADCAST, LOGIN]
4242

4343

44+
class VideoSort(_Parameter):
45+
VIEWS = 'views'
46+
TIME = 'time'
47+
48+
_valid = [VIEWS, TIME]
49+
50+
4451
class BroadcastType(_Parameter):
4552
ARCHIVE = 'archive'
4653
HIGHLIGHT = 'highlight'
@@ -73,3 +80,21 @@ def validate(cls, value):
7380
return value
7481
except ValueError:
7582
raise ValueError(value)
83+
84+
85+
class Language(_Parameter):
86+
ALL = 'all'
87+
# add twitch supported language codes
88+
_valid = [ALL]
89+
90+
@classmethod
91+
def validate(cls, value):
92+
split_values = value.split(',')
93+
for val in split_values:
94+
if val not in cls._valid:
95+
raise ValueError(value)
96+
return value
97+
98+
99+
class Duration(_Parameter):
100+
_valid = [30, 60, 90, 120, 150, 180]
Lines changed: 89 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,72 @@
11
# -*- encoding: utf-8 -*-
22
# https://dev.twitch.tv/docs/v5/reference/channels/
33

4-
from twitch import keys
4+
from twitch import keys, methods
55
from twitch.queries import V5Query as Qry
66
from twitch.queries import query
7-
from twitch.api.parameters import Boolean, BroadcastType, Direction
7+
from twitch.api.parameters import Boolean, BroadcastType, Cursor, Direction, Duration, Language, VideoSort
88

99

1010
@query
11-
def by_id(channel_id):
12-
q = Qry('channels/{id}')
13-
q.add_urlkw(keys.ID, channel_id)
11+
def get_channel():
12+
q = Qry('channels')
1413
return q
1514

1615

1716
@query
18-
def channel():
19-
raise NotImplementedError
20-
21-
22-
@query
23-
def editors(name):
24-
raise NotImplementedError
17+
def get_channel_by_id(channel_id):
18+
q = Qry('channels/{channel_id}')
19+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
20+
return q
2521

2622

27-
# TODO needs Authentication and put requests
2823
@query
29-
def update(name, status=None, game=None, delay=0):
30-
raise NotImplementedError
24+
def update_channel(channel_id, status=None, game=None, delay=None, channel_feed_enabled=None):
25+
q = Qry('channels/{channel_id}', method=methods.PUT)
26+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
27+
channel = {}
28+
if status is not None:
29+
channel[keys.STATUS] = status
30+
if game is not None:
31+
channel[keys.GAME] = game
32+
if delay is not None:
33+
channel[keys.DELAY] = delay
34+
if channel_feed_enabled is not None:
35+
channel[keys.CHANNEL_FEED_ENABLED] = Boolean.validate(channel_feed_enabled)
36+
q.add_data(keys.CHANNEL, channel)
37+
return q
3138

3239

33-
# TODO needs auth
3440
@query
35-
def delete(name):
36-
raise NotImplementedError
41+
def get_channel_editors(channel_id):
42+
q = Qry('channels/{channel_id}/editors')
43+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
44+
return q
3745

3846

39-
# TODO needs auth, needs POST request
4047
@query
41-
def commercial(name, length=30):
42-
raise NotImplementedError
48+
def get_channel_followers(channel_id, limit=25, offset=0, cursor='MA==', direction=Direction.DESC):
49+
q = Qry('channels/{channel_id}/follows')
50+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
51+
q.add_param(keys.LIMIT, limit, 25)
52+
q.add_param(keys.OFFSET, offset, 0)
53+
q.add_param(keys.CURSOR, Cursor.validate(cursor), 'MA==')
54+
q.add_param(keys.DIRECTION, direction, Direction.DESC)
55+
return q
4356

4457

4558
@query
46-
def teams(channel_id):
47-
q = Qry('channels/{id}/teams')
48-
q.add_urlkw(keys.ID, channel_id)
59+
def get_channel_teams(channel_id):
60+
q = Qry('channels/{channel_id}/teams')
61+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
4962
return q
5063

5164

65+
# Needs Authentication
5266
@query
53-
def followers(channel_id, limit=25, offset=0, direction=Direction.DESC):
54-
q = Qry('channels/{id}/follows')
55-
q.add_urlkw(keys.ID, channel_id)
67+
def get_channel_subscribers(channel_id, limit=25, offset=0, direction=Direction.ASC):
68+
q = Qry('channels/{channel_id}/subscriptions')
69+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
5670
q.add_param(keys.LIMIT, limit, 25)
5771
q.add_param(keys.OFFSET, offset, 0)
5872
q.add_param(keys.DIRECTION, direction, Direction.DESC)
@@ -61,23 +75,61 @@ def followers(channel_id, limit=25, offset=0, direction=Direction.DESC):
6175

6276
# Needs Authentication
6377
@query
64-
def subscribers(channel_id, limit=25, offset=0, direction=Direction.ASC):
65-
raise NotImplementedError
66-
67-
68-
# Needs Authentication
69-
@query
70-
def subscription_status(channel_id, user_id):
71-
raise NotImplementedError
78+
def check_channel_subscription(channel_id, user_id):
79+
q = Qry('channels/{channel_id}/subscriptions/{user_id}')
80+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
81+
q.add_urlkw(keys.USER_ID, user_id)
82+
return q
7283

7384

7485
@query
75-
def videos(channel_id, limit=10, offset=0,
76-
broadcast_type=BroadcastType.HIGHLIGHT, hls=Boolean.FALSE):
86+
def get_channel_videos(channel_id, limit=10, offset=0,
87+
broadcast_type=BroadcastType.HIGHLIGHT,
88+
hls=Boolean.FALSE, sort_by=VideoSort.TIME,
89+
language=Language.ALL):
7790
q = Qry('channels/{id}/videos')
7891
q.add_urlkw(keys.ID, channel_id)
7992
q.add_param(keys.LIMIT, limit, 10)
8093
q.add_param(keys.OFFSET, offset, 0)
8194
q.add_param(keys.BROADCAST_TYPE, BroadcastType.validate(broadcast_type))
95+
q.add_param(keys.SORT, VideoSort.validate(sort_by), VideoSort.TIME)
96+
q.add_param(keys.LANGUAGE, Language.validate(language), Language.ALL)
8297
q.add_param(keys.HLS, Boolean.validate(hls), Boolean.FALSE)
8398
return q
99+
100+
101+
@query
102+
def start_commercial(channel_id, duration=30):
103+
q = Qry('channels/{channel_id}/commercial', method=methods.POST)
104+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
105+
q.add_data(keys.DURATION, Duration.validate(duration))
106+
return q
107+
108+
109+
@query
110+
def reset_stream_key(channel_id):
111+
q = Qry('channels/{channel_id}/stream_key', method=methods.DELETE)
112+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
113+
return q
114+
115+
116+
@query
117+
def get_channel_community(channel_id):
118+
q = Qry('channels/{channel_id}/community')
119+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
120+
return q
121+
122+
123+
@query
124+
def set_channel_community(channel_id, community_id):
125+
q = Qry('channels/{channel_id}/community/{community_id}', method=methods.PUT)
126+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
127+
q.add_urlkw(keys.COMMUNITY_ID, community_id)
128+
return q
129+
130+
131+
@query
132+
def delete_channel_from_community(channel_id):
133+
q = Qry('channels/{channel_id}/community', method=methods.DELETE)
134+
q.add_urlkw(keys.CHANNEL_ID, channel_id)
135+
return q

resources/lib/twitch/keys.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
BROADCAST_TYPE = 'broadcast_type'
1111
BROADCASTS = 'broadcasts'
1212
CHANNEL = 'channel'
13+
CHANNEL_FEED_ENABLED = 'channel_feed_enabled'
1314
CHANNEL_ID = 'channel_id'
1415
COLLECTION_ID = 'collection_id'
1516
COMMENT_ID = 'comment_id'
@@ -20,7 +21,9 @@
2021
CONTENT = 'content'
2122
CURSOR = 'cursor'
2223
CLIENT_ID = 'client_id'
24+
DELAY = 'delay'
2325
DIRECTION = 'direction'
26+
DURATION = 'duration'
2427
EMOTE_ID = 'emote_id'
2528
EMOTESETS = 'emotesets'
2629
ERROR = 'error'
@@ -47,7 +50,9 @@
4750
QUERY = 'query'
4851
SHARE = 'share'
4952
SIG = 'sig'
53+
SORT = 'sort'
5054
SORT_BY = 'sortby'
55+
STATUS = 'status'
5156
STREAM_TYPE = 'stream_type'
5257
TARGET = 'target'
5358
TEAM = 'team'
@@ -58,4 +63,5 @@
5863
USER_AGENT = 'User-Agent'
5964
USER_AGENT_STRING = ('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) '
6065
'Gecko/20100101 Firefox/6.0')
66+
USER_ID = 'user_id'
6167
VOD = 'vod'

0 commit comments

Comments
 (0)