You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.4 KiB
98 lines
3.4 KiB
6 years ago
|
from requests_futures.sessions import FuturesSession
|
||
|
|
||
|
|
||
|
class Twitch(object):
|
||
6 years ago
|
def __init__(self, client_id, oauth_token):
|
||
6 years ago
|
self.client_id = client_id
|
||
6 years ago
|
self.oauth_token = oauth_token
|
||
6 years ago
|
|
||
|
def fetch_videos(self, channel_id):
|
||
|
if not channel_id:
|
||
|
return []
|
||
|
session = FuturesSession()
|
||
|
def get_videos(offset, limit):
|
||
|
url = 'https://api.twitch.tv/v5/channels/{0}/videos'.format(channel_id)
|
||
|
params = dict(
|
||
|
client_id=self.client_id,
|
||
|
offset=offset,
|
||
|
limit=limit)
|
||
|
return session.get(url, params=params)
|
||
|
request = get_videos(0, 1)
|
||
|
total = request.result().json().get('_total')
|
||
|
if not total:
|
||
|
return []
|
||
|
requests = []
|
||
|
limit = 100
|
||
|
for offset in range(0, total, limit):
|
||
|
requests.append(get_videos(offset, limit))
|
||
|
result = []
|
||
|
for request in requests:
|
||
|
result.extend(request.result().json().get('videos', []))
|
||
|
return result
|
||
|
|
||
|
def fetch_comments(self, videos):
|
||
|
if not videos:
|
||
|
return []
|
||
|
session = FuturesSession(max_workers=len(videos))
|
||
|
def get_comments(video_id, cursor):
|
||
|
url = 'https://api.twitch.tv/v5/videos/{0}/comments'.format(video_id)
|
||
|
params = dict(
|
||
|
client_id=self.client_id,
|
||
|
cursor=cursor)
|
||
|
return session.get(url, params=params)
|
||
|
pairs = [(video_id, '') for video_id in videos]
|
||
|
result = []
|
||
|
while pairs:
|
||
|
requests = []
|
||
|
for video_id, cursor in pairs:
|
||
|
requests.append(get_comments(video_id, cursor))
|
||
|
videos, _ = zip(*pairs)
|
||
|
pairs = []
|
||
|
for video_id, request in zip(videos, requests):
|
||
|
data = request.result().json()
|
||
|
result.extend(data.get('comments', []))
|
||
|
cursor = data.get('_next')
|
||
|
if cursor:
|
||
|
pairs.append((video_id, cursor))
|
||
|
return result
|
||
6 years ago
|
|
||
|
def fetch_emotes(self, channel_id):
|
||
|
if not channel_id:
|
||
|
return []
|
||
|
session = FuturesSession()
|
||
|
def get_emotes():
|
||
|
url = 'https://api.twitch.tv/v5/users/{0}/emotes'.format(channel_id)
|
||
|
params = dict(client_id=self.client_id)
|
||
|
headers = dict(authorization='OAuth {0}'.format(self.oauth_token))
|
||
|
return session.get(url, params=params, headers=headers)
|
||
|
request = get_emotes()
|
||
|
data = request.result().json()
|
||
|
result = []
|
||
|
for val in data.get('emoticon_sets', {}).values():
|
||
|
result.extend(val)
|
||
|
return result
|
||
6 years ago
|
|
||
|
def fetch_clips(self, channel_name):
|
||
|
if not channel_name:
|
||
|
return []
|
||
|
session = FuturesSession()
|
||
|
def get_clips(cursor):
|
||
|
url = 'https://api.twitch.tv/v5/clips/top'
|
||
|
params = dict(
|
||
|
client_id=self.client_id,
|
||
|
channel=channel_name,
|
||
|
period='all',
|
||
|
limit=100,
|
||
|
cursor=cursor)
|
||
|
return session.get(url, params=params)
|
||
|
cursor = ''
|
||
|
result = []
|
||
|
while True:
|
||
|
request = get_clips(cursor)
|
||
|
data = request.result().json()
|
||
|
result.extend(data.get('clips', []))
|
||
|
cursor = data.get('_cursor')
|
||
|
if not cursor:
|
||
|
break
|
||
|
return result
|