Skip to content

Commit 87c2c19

Browse files
committed
Add playlists and channels
1 parent 106c867 commit 87c2c19

File tree

1 file changed

+66
-2
lines changed

1 file changed

+66
-2
lines changed

lambda_function.py

+66-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from pytube import YouTube
55
import logging
66
from random import shuffle, randint
7+
from botocore.vendored import requests
8+
import json
79
logging.getLogger('googleapiclient.discovery_cache').setLevel(logging.ERROR)
810
DEVELOPER_KEY=environ['DEVELOPER_KEY']
911
YOUTUBE_API_SERVICE_NAME = 'youtube'
@@ -186,8 +188,16 @@ def on_intent(event):
186188
# Dispatch to your skill's intent handlers
187189
if intent_name == "SearchIntent":
188190
return search(intent, session)
191+
elif intent_name == "PlaylistIntent":
192+
return search(intent, session)
193+
elif intent_name == "ChannelIntent":
194+
return search(intent, session)
189195
elif intent_name == "ShuffleIntent":
190196
return search(intent, session, shuffle_mode=True)
197+
elif intent_name == "ShufflePlaylistIntent":
198+
return search(intent, session, shuffle_mode=True)
199+
elif intent_name == "ShuffleChannelIntent":
200+
return search(intent, session, shuffle_mode=True)
191201
elif intent_name == "AMAZON.HelpIntent":
192202
return get_help()
193203
elif intent_name == "AMAZON.CancelIntent":
@@ -250,7 +260,7 @@ def illegal_action():
250260
def do_nothing():
251261
return build_response({})
252262

253-
def youtube_search(query):
263+
def video_search(query):
254264
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY)
255265
search_response = youtube.search().list(
256266
q=query,
@@ -263,6 +273,48 @@ def youtube_search(query):
263273
videos.append(search_result['id']['videoId'])
264274
return videos
265275

276+
def playlist_search(query):
277+
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY)
278+
search_response = youtube.search().list(
279+
q=query,
280+
part='id,snippet',
281+
maxResults=25,
282+
type='playlist'
283+
).execute()
284+
playlist_id = search_response.get('items')[0]['id']['playlistId']
285+
videos = []
286+
data={'nextPageToken':''}
287+
while 'nextPageToken' in data and len(videos) < 25:
288+
next_page_token = data['nextPageToken']
289+
data = json.loads(requests.get('https://www.googleapis.com/youtube/v3/playlistItems?pageToken={}&part=snippet&playlistId={}&key={}'.format(next_page_token,playlist_id,DEVELOPER_KEY)).text)
290+
for item in data['items']:
291+
try:
292+
videos.append(item['snippet']['resourceId']['videoId'])
293+
except:
294+
pass
295+
return videos
296+
297+
def channel_search(query):
298+
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY)
299+
search_response = youtube.search().list(
300+
q=query,
301+
part='id,snippet',
302+
maxResults=25,
303+
type='channel'
304+
).execute()
305+
playlist_id = search_response.get('items')[0]['id']['channelId']
306+
data={'nextPageToken':''}
307+
videos = []
308+
while 'nextPageToken' in data and len(videos) < 25:
309+
next_page_token = data['nextPageToken']
310+
data = json.loads(requests.get('https://www.googleapis.com/youtube/v3/search?pageToken={}&part=snippet&channelId={}&key={}'.format(next_page_token,playlist_id,DEVELOPER_KEY)).text)
311+
for item in data['items']:
312+
try:
313+
videos.append(item['id']['videoId'])
314+
except:
315+
pass
316+
return videos
317+
266318
def get_url_and_title(id):
267319
print('Getting url for https://www.youtube.com/watch?v='+id)
268320
try:
@@ -278,7 +330,13 @@ def search(intent, session, shuffle_mode=False):
278330
query = intent['slots']['query']['value']
279331
should_end_session = True
280332
print('Looking for: ' + query)
281-
videos = youtube_search(query)
333+
intent_name = intent['name']
334+
if intent_name == "PlaylistIntent" or intent_name == "ShufflePlaylistIntent":
335+
videos = playlist_search(query)
336+
elif intent_name == "ChannelIntent" or intent_name == "ShuffleChannelIntent":
337+
videos = channel_search(query)
338+
else:
339+
videos = video_search(query)
282340
if shuffle_mode:
283341
shuffle(videos)
284342
next_url = None
@@ -375,13 +433,19 @@ def get_next_url_and_token(current_token, skip):
375433
next_url = None
376434
title = None
377435
shuffle_mode = int(playlist['s'])
436+
loop_mode = int(playlist['l'])
378437
next_playing = int(playlist['p'])
379438
number_of_videos = sum('v' in i for i in playlist.keys())
380439
while next_url is None:
381440
next_playing = next_playing + skip
382441
if shuffle_mode and skip != 0:
383442
next_playing = randint(1,number_of_videos)
384443
if next_playing < 0:
444+
if loop_mode:
445+
next_playing = number_of_videos - 1
446+
else:
447+
next_playing = 0
448+
if next_playing >= number_of_videos and loop_mode:
385449
next_playing = 0
386450
next_key = 'v'+str(next_playing)
387451
if next_key not in playlist:

0 commit comments

Comments
 (0)