Skip to content

Commit

Permalink
Add youtube preview and store youtube api data in db (#39)
Browse files Browse the repository at this point in the history
* merged widget_tweak and added url preview and storage of data to db

* changes done
partially fix #8
  • Loading branch information
arpit3018 authored and mohitkh7 committed Dec 31, 2018
1 parent 8175328 commit 315a70f
Show file tree
Hide file tree
Showing 8 changed files with 164 additions and 2 deletions.
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,20 @@ python3 manage.py migrate
python manage.py createsuperuser
```

* Then generate a API Key:

1. Visit the url https://console.cloud.google.com/apis/
2. Sign in with your google account.
3. Search for **YouTube Data API v3** and enable it.
4. After enabling go to credentials present in the left navbar.
5. Select a project (if none project is present then create one and select). After selecting create a API Key for it.
6. Save the value of API Key in the environment variable. Below command can be used for linux user.
```
export YOUTUBE_API_KEY = "Your API Key"
```
7. For Windows **set** can be used to save the value in env variable.


* Finally, you’re ready to start the development server:
```
python manage.py runserver
Expand Down
2 changes: 1 addition & 1 deletion learn/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ class BookmarkAdmin(admin.ModelAdmin):
admin.site.register(Vote)
admin.site.register(LogEntry)
admin.site.register(Category,CategoryAdmin)

admin.site.register(YoutubeResource)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.15 on 2018-12-30 19:56
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

replaces = [('learn', '0033_youtuberesource'), ('learn', '0034_auto_20181227_1729'), ('learn', '0035_auto_20181227_1729')]

dependencies = [
('learn', '0032_auto_20181217_2102'),
]

operations = [
migrations.CreateModel(
name='YoutubeResource',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('published_at', models.CharField(max_length=100)),
('title', models.CharField(max_length=50)),
('description', models.TextField(max_length=10000)),
('thumbnail_url', models.CharField(max_length=100)),
('duration', models.CharField(max_length=10)),
('view_count', models.IntegerField()),
('like_count', models.IntegerField()),
('dislike_count', models.IntegerField()),
('comment_count', models.IntegerField()),
],
),
]
13 changes: 13 additions & 0 deletions learn/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,16 @@ def update_score_on_vote(sender, instance, **kwargs):
Youtube Video => Channel, Views, Upvotes, Downvotes,
MOOC => Instructor,
"""
class YoutubeResource(models.Model):
published_at = models.CharField(max_length=100)
title = models.CharField(max_length=50)
description = models.TextField(max_length=10000)
thumbnail_url = models.CharField(max_length=100)
duration = models.CharField(max_length=10)
view_count = models.IntegerField()
like_count = models.IntegerField()
dislike_count = models.IntegerField()
comment_count = models.IntegerField()

def __str__(self):
return self.title
23 changes: 23 additions & 0 deletions learn/templates/learn/youtube_resource.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{% extends 'base.html' %}
{% block content %}

<form method="post" action="{% url 'youtubeResourcePreview' %}">
{% csrf_token %}
<div class="form-group">
<label for="email">Url:</label>
<input type="text" class="form-control" name="url">
<input type="submit" value="Preview" class="btn btn-primary">
</div>
</form>

{% if flag %}
<h4>{{title}}</h4>
<img src={{thumbnail_url}} height="200px" width="200px">
<form method='post' action="{% url 'youtubeResource'%}">
{% csrf_token %}
<input type="submit" value="Yes" class="btn btn-success"name="next">
<input type="submit" class="btn btn-danger" value="No" name="no">
</form>
{% endif %}

{% endblock %}
3 changes: 2 additions & 1 deletion learn/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
url(r'^category/(?P<category_slug>[-\w]+)/$',SelectedTopicList.as_view(),name="SelectedTopicList"),

url(r'^ajaxcall/topicautocomplete/',autocompleteSuggestionTopic,name="AjaxTopicAutocomplete"),

url(r'^youtubeResource/$',youtubeResource,name="youtubeResource"),
url(r'^youtubeResourcePreview/$',youtubeResourcePreview,name="youtubeResourcePreview"),
]

urlpatterns+=[
Expand Down
78 changes: 78 additions & 0 deletions learn/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
from .models import *
from .forms import *

import urllib.request as urlreq
import json
import os
from startlearning.settings import YOUTUBE_API_KEY

# Create your views here.
class ImageUploadForm(forms.Form):
"""Image upload form."""
Expand Down Expand Up @@ -353,3 +358,76 @@ def autocompleteSuggestionTopic(request):
'list': filter_topic,
}
return JsonResponse(data)


url_entires = {}

'''
Below method is used to insert the data into model when url is apporved by the user.
'''
def youtubeResource(request):
if request.method == "POST":
if request.POST.get("next") == "Yes":
items = url_entires['session_variable']

contentDetails = items["contentDetails"]
snippet = items['snippet']
statistics = items['statistics']
m,s = contentDetails["duration"].replace("PT","").replace("S","").split("M")
dur = int(s) + int(m)*60
result = {
"published_at" : snippet["publishedAt"].replace("T"," ").replace("Z",""),
"title" : snippet['title'],
"description" : snippet['description'],
"thumbnail_url" : snippet['thumbnails']['high']['url'],
"duration" : dur,
"view_count" : int(statistics['viewCount']),
"like_count" : int(statistics['likeCount']),
"dislike_count" : int(statistics['dislikeCount']),
"comment_count" : int(statistics['commentCount'])
}
del url_entires['session_variable']
resource = YoutubeResource(**result)
resource.save()

elif request.POST.get("no") == "No":
pass
return HttpResponseRedirect(reverse('youtubeResourcePreview'))

'''
Below method stores the data returned by the Youtube v3 API in a global variable "url_entries"
according to the session of users as key and data as its value. This data is furthur used when
user approved the url.
'''
def youtubeResourcePreview(request):
flag = False
if request.method == "POST":
url = request.POST.get("url")
flag = True
if "watch" in url:
#Identifies that it is a video
_,slug = url.split("watch?v=")
try:
contents = urlreq.urlopen("https://www.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&id="+slug+"&key="+YOUTUBE_API_KEY).read()
contents = json.loads(contents.decode('utf-8'))
items = contents["items"][0]
snippet = items['snippet']

context = {
"title" : snippet['title'],
"thumbnail_url" : snippet['thumbnails']['standard']['url'],
"flag" : flag
}
url_entires['session_variable'] = items
return render(request,'learn/youtube_resource.html',context)
except Exception as e:
print(e)
return HttpResponse("Check console")

elif "playlist" in url:
#Identifies that it is a playlist
pass
elif "channel" in url:
#Identifies that it is a channel
pass
return render(request,'learn/youtube_resource.html',{"flag":flag})
1 change: 1 addition & 0 deletions startlearning/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'umaz=2g7x-_)1kf(9e0po(p-)su$_q(=9ayknt6m9v#ar&qzwm'
YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY")

ALLOWED_HOSTS = ['127.0.0.1','localhost',]

Expand Down

0 comments on commit 315a70f

Please sign in to comment.