diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 4429e29a..a492e6be 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -8,16 +8,52 @@ import rowers.teams as teams import numpy +from urllib.parse import urlparse, parse_qs + def default(o): if isinstance(o, numpy.int64): return int(o) raise TypeError +def get_video_id(url): + """Returns Video_ID extracting from the given url of Youtube + + Examples of URLs: + Valid: + 'http://youtu.be/_lOT2p_FCvA', + 'www.youtube.com/watch?v=_lOT2p_FCvA&feature=feedu', + 'http://www.youtube.com/embed/_lOT2p_FCvA', + 'http://www.youtube.com/v/_lOT2p_FCvA?version=3&hl=en_US', + 'https://www.youtube.com/watch?v=rTHlyTphWP0&index=6&list=PLjeDyYvG6-40qawYNR4juzvSOg-ezZ2a6', + 'youtube.com/watch?v=_lOT2p_FCvA', + + Invalid: + 'youtu.be/watch?v=_lOT2p_FCvA', + """ + + if url.startswith(('youtu', 'www')): + url = 'http://' + url + + query = urlparse(url) + + if 'youtube' in query.hostname: + if query.path == '/watch': + return parse_qs(query.query)['v'][0] + elif query.path.startswith(('/embed/', '/v/')): + return query.path.split('/')[2] + elif 'youtu.be' in query.hostname: + return query.path[1:] + else: + raise ValueError + # Show a video compared with data @user_passes_test(ispromember,login_url="/rowers/paidplans/", message="This functionality requires a Pro plan or higher", redirect_field_name=None) def workout_video_view(request,id=0): + # get workout w = get_workout_permitted(request.user,id) + + # get data df = getsmallrowdata_db(['time','velo'],ids=[w.id]) df['time'] = (df['time']-df['time'].min())/1000. df.sort_values(by='time',inplace=True) @@ -31,6 +67,10 @@ def workout_video_view(request,id=0): latitude = coordinates['latitude'] longitude = coordinates['longitude'] + # get video + url = "https://www.youtube.com/watch?time_continue=496&v=9dLFC2q9RWc" + video_id = get_video_id(url) + # create map mapscript, mapdiv = leaflet_chart_video(latitude,longitude, w.name) @@ -48,6 +88,7 @@ def workout_video_view(request,id=0): 'data': json.dumps(data,default=default), 'mapscript': mapscript, 'mapdiv': mapdiv, + 'video_id': video_id, }) # Show the EMpower Oarlock generated Stroke Profile