From f6a5f98104d4f96fc707a4199e4f22c8b7f06155 Mon Sep 17 00:00:00 2001 From: Georgios Atheridis Date: Sun, 22 Jan 2023 11:56:24 +0000 Subject: [PATCH] Save clip to back end --- core/core/urls.py | 2 + core/manager/admin.py | 3 + core/manager/forms.py | 5 ++ core/manager/migrations/0001_initial.py | 33 ++++++++ ...0002_alter_clip_broadcaster_id_and_more.py | 83 +++++++++++++++++++ core/manager/models.py | 28 +++---- core/manager/request_clip.py | 46 ++++++++++ core/manager/templates/manager/index.html | 6 +- core/manager/views.py | 31 ++++++- 9 files changed, 219 insertions(+), 18 deletions(-) create mode 100644 core/manager/forms.py create mode 100644 core/manager/migrations/0001_initial.py create mode 100644 core/manager/migrations/0002_alter_clip_broadcaster_id_and_more.py create mode 100644 core/manager/request_clip.py diff --git a/core/core/urls.py b/core/core/urls.py index 47a43e0..6798f63 100644 --- a/core/core/urls.py +++ b/core/core/urls.py @@ -16,9 +16,11 @@ Including another URLconf from django.contrib import admin from django.urls import path, include from django.views.generic import TemplateView +from manager.views import get_name urlpatterns = [ path("admin/", admin.site.urls), path('accounts/', include('allauth.urls')), path('', TemplateView.as_view(template_name="manager/index.html")), + path('input/', get_name, name="input"), ] diff --git a/core/manager/admin.py b/core/manager/admin.py index 8c38f3f..710fba1 100644 --- a/core/manager/admin.py +++ b/core/manager/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin # Register your models here. +from .models import Clip + +admin.site.register(Clip) diff --git a/core/manager/forms.py b/core/manager/forms.py new file mode 100644 index 0000000..5024575 --- /dev/null +++ b/core/manager/forms.py @@ -0,0 +1,5 @@ +from django import forms + + +class ClipForm(forms.Form): + clip = forms.CharField(label="clip", max_length=200) diff --git a/core/manager/migrations/0001_initial.py b/core/manager/migrations/0001_initial.py new file mode 100644 index 0000000..ba091df --- /dev/null +++ b/core/manager/migrations/0001_initial.py @@ -0,0 +1,33 @@ +# Generated by Django 4.1.5 on 2023-01-22 11:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Clip", + fields=[ + ("id", models.TextField(primary_key=True, serialize=False)), + ("url", models.URLField()), + ("embed_url", models.URLField()), + ("broadcaster_id", models.TextField()), + ("broadcaster_name", models.TextField()), + ("creator_id", models.TextField()), + ("creator_name", models.TextField()), + ("video_id", models.TextField()), + ("game_id", models.TextField()), + ("title", models.TextField()), + ("view_count", models.IntegerField()), + ("created_at", models.DateTimeField()), + ("thumbnail_url", models.TextField()), + ("duration", models.FloatField()), + ("vod_offset", models.IntegerField()), + ], + ), + ] diff --git a/core/manager/migrations/0002_alter_clip_broadcaster_id_and_more.py b/core/manager/migrations/0002_alter_clip_broadcaster_id_and_more.py new file mode 100644 index 0000000..b4d9959 --- /dev/null +++ b/core/manager/migrations/0002_alter_clip_broadcaster_id_and_more.py @@ -0,0 +1,83 @@ +# Generated by Django 4.1.5 on 2023-01-22 11:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("manager", "0001_initial"), + ] + + operations = [ + migrations.AlterField( + model_name="clip", + name="broadcaster_id", + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="broadcaster_name", + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="created_at", + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="creator_id", + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="creator_name", + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="duration", + field=models.FloatField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="embed_url", + field=models.URLField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="game_id", + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="thumbnail_url", + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="title", + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="url", + field=models.URLField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="video_id", + field=models.TextField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="view_count", + field=models.IntegerField(null=True), + ), + migrations.AlterField( + model_name="clip", + name="vod_offset", + field=models.IntegerField(null=True), + ), + ] diff --git a/core/manager/models.py b/core/manager/models.py index 55e1c0f..82bba2f 100644 --- a/core/manager/models.py +++ b/core/manager/models.py @@ -4,17 +4,17 @@ from django.db import models # Create your models here. class Clip(models.Model): id = models.TextField(primary_key=True) - url = models.URLField() - embed_url = models.URLField() - broadcaster_id = models.TextField() - broadcaster_name = models.TextField() - creator_id = models.TextField() - creator_name = models.TextField() - video_id = models.TextField() - game_id = models.TextField() - title = models.TextField() - view_count = models.IntegerField() - created_at = models.TextField() - thumbnail_url = models.TextField() - duration = models.FloatField() - vod_offset = models.IntegerField() + url = models.URLField(null=True) + embed_url = models.URLField(null=True) + broadcaster_id = models.TextField(null=True) + broadcaster_name = models.TextField(null=True) + creator_id = models.TextField(null=True) + creator_name = models.TextField(null=True) + video_id = models.TextField(null=True) + game_id = models.TextField(null=True) + title = models.TextField(null=True) + view_count = models.IntegerField(null=True) + created_at = models.DateTimeField(null=True) + thumbnail_url = models.TextField(null=True) + duration = models.FloatField(null=True) + vod_offset = models.IntegerField(null=True) diff --git a/core/manager/request_clip.py b/core/manager/request_clip.py new file mode 100644 index 0000000..7a8ba14 --- /dev/null +++ b/core/manager/request_clip.py @@ -0,0 +1,46 @@ +import requests +from .models import Clip +from urllib.parse import urlparse +from allauth.socialaccount.models import SocialApp, SocialToken + + +def request_clip(url: str): + id = urlparse(url).path.split("/")[-1] + + social_app: SocialApp = SocialApp.objects.first() + oauth = SocialToken.objects.first().token + client_id = social_app.client_id + + r = requests.get( + "https://api.twitch.tv/helix/clips", + headers={ + "Authorization": f"Bearer {oauth}", + "Client-Id": f"{client_id}", + }, + params={"id": id}, + ) + + if r.status_code != 200: + raise Exception + + data = r.json()["data"][0] + print(data) + Clip( + id=data["id"], + url=data["url"], + embed_url=data["embed_url"], + broadcaster_id=data["broadcaster_id"], + broadcaster_name=data["broadcaster_name"], + creator_id=data["creator_id"], + creator_name=data["creator_name"], + video_id=data["video_id"], + game_id=data["game_id"], + title=data["title"], + view_count=data["view_count"], + created_at=data["created_at"], + thumbnail_url=data["thumbnail_url"], + duration=data["duration"], + vod_offset=data["vod_offset"], + ).save() + + return diff --git a/core/manager/templates/manager/index.html b/core/manager/templates/manager/index.html index 2b13c49..6d51191 100644 --- a/core/manager/templates/manager/index.html +++ b/core/manager/templates/manager/index.html @@ -3,9 +3,9 @@
{% if user.is_authenticated %}

Please Input Clip Link

-
-
- + + {% csrf_token %} +
{% else %} diff --git a/core/manager/views.py b/core/manager/views.py index 91ea44a..27a9033 100644 --- a/core/manager/views.py +++ b/core/manager/views.py @@ -1,3 +1,32 @@ +import requests + +from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render -# Create your views here. +from .request_clip import request_clip +from .forms import ClipForm + + +def get_name(request): + # if this is a POST request we need to process the form data + if request.method == "POST": + # create a form instance and populate it with data from the request: + form = ClipForm(request.POST) + # check whether it's valid: + if form.is_valid(): + try: + request_clip(form.cleaned_data.get("clip")) + except Exception as e: + print(e) + return HttpResponse(b"

NOPE

") + # process the data in form.cleaned_data as required + # ... + # redirect to a new URL: + return HttpResponse(b"

THANKS

") + # return HttpResponseRedirect("/thanks/") + + # if a GET (or any other method) we'll create a blank form + else: + form = ClipForm() + + return render(request, "name.html", {"form": form}) -- 2.30.2