Reimagining the channel pages, #build
Changed: - Split the channel-id page into subpages - Channel videos, channel playlist, channel about - Disable es startup check to test ES8
This commit is contained in:
commit
1479516689
|
@ -1,7 +1,6 @@
|
||||||
"""handle custom startup functions"""
|
"""handle custom startup functions"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
|
|
||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
from home.src.es.connect import ElasticWrap
|
from home.src.es.connect import ElasticWrap
|
||||||
|
@ -105,7 +104,7 @@ class StartupCheck:
|
||||||
"required elasticsearch version: "
|
"required elasticsearch version: "
|
||||||
+ f"{self.MIN_MAJOR}.{self.MIN_MINOR}"
|
+ f"{self.MIN_MAJOR}.{self.MIN_MINOR}"
|
||||||
)
|
)
|
||||||
sys.exit(1)
|
# sys.exit(1)
|
||||||
|
|
||||||
print("elasticsearch version check passed")
|
print("elasticsearch version check passed")
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,13 @@
|
||||||
<div class="channel-banner">
|
<div class="channel-banner">
|
||||||
<a href="/channel/{{ channel_info.channel_id }}/"><img src="/cache/channels/{{ channel_info.channel_id }}_banner.jpg" alt="channel_banner"></a>
|
<a href="/channel/{{ channel_info.channel_id }}/"><img src="/cache/channels/{{ channel_info.channel_id }}_banner.jpg" alt="channel_banner"></a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="info-box-item channel-nav">
|
||||||
|
<a href="{% url 'channel_id' channel_info.channel_id %}"><h3>Videos</h3></a>
|
||||||
|
<a href="{% url 'channel_id_playlist' channel_info.channel_id %}"><h3>Playlists</h3></a>
|
||||||
|
<a href="{% url 'channel_id_about' channel_info.channel_id %}"><h3>About</h3></a>
|
||||||
|
</div>
|
||||||
<div id="notifications" data="channel_id"></div>
|
<div id="notifications" data="channel_id"></div>
|
||||||
<div class="info-box info-box-3">
|
<div class="info-box info-box-2">
|
||||||
<div class="info-box-item">
|
<div class="info-box-item">
|
||||||
<div class="round-img">
|
<div class="round-img">
|
||||||
<a href="{% url 'channel_id' channel_info.channel_id %}">
|
<a href="{% url 'channel_id' channel_info.channel_id %}">
|
||||||
|
@ -30,88 +35,13 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="info-box-item">
|
<div class="info-box-item">
|
||||||
<div>
|
<div>
|
||||||
<p>Last refreshed: {{ channel_info.channel_last_refresh }}</p>
|
|
||||||
{% if channel_info.channel_active %}
|
|
||||||
<p>Youtube: <a href="https://www.youtube.com/channel/{{ channel_info.channel_id }}" target="_blank">Active</a></p>
|
|
||||||
{% else %}
|
|
||||||
<p>Youtube: Deactivated</p>
|
|
||||||
{% endif %}
|
|
||||||
<button onclick="deleteConfirm()" id="delete-item">Delete Channel</button>
|
|
||||||
<div class="delete-confirm" id="delete-button">
|
|
||||||
<span>Delete {{ channel_info.channel_name }} including all videos? </span><button class="danger-button" onclick="deleteChannel(this)" data-id="{{ channel_info.channel_id }}">Delete</button> <button onclick="cancelDelete()">Cancel</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="info-box-item">
|
|
||||||
<div>
|
|
||||||
{% if channel_info.channel_views >= 1000000 %}
|
|
||||||
<p>Channel views: {{ channel_info.channel_views|intword }}</p>
|
|
||||||
{% elif channel_info.channel_views > 0 %}
|
|
||||||
<p>Channel views: {{ channel_info.channel_views|intcomma }}</p>
|
|
||||||
{% endif %}
|
|
||||||
{% if max_hits %}
|
{% if max_hits %}
|
||||||
<p>Total Videos archived: {{ max_hits }}</p>
|
<p>Total Videos: {{ max_hits }}</p>
|
||||||
<p>Watched: <button title="Mark all videos from {{ channel_info.channel_name }} as watched" type="button" id="watched-button" data-id="{{ channel_info.channel_id }}" onclick="isWatchedButton(this)">Mark as watched</button></p>
|
<button title="Mark all videos from {{ channel_info.channel_name }} as watched" type="button" id="watched-button" data-id="{{ channel_info.channel_id }}" onclick="isWatchedButton(this)">Mark as watched</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<button {% if channel_info.channel_overwrites %} class="danger-button"{% endif %} onclick="showOverwrite()" title="Overwrite settings for channel {{ channel_info.channel_name }}">Configure</button>
|
|
||||||
<a href="/playlist/?search={{ channel_info.channel_id }}" title="Show all playlists belonging to {{ channel_info.channel_name }}"><button>Show Playlists</button></a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="overwrite-form" class="info-box{% if not channel_info.channel_overwrites %} hidden-overwrite{% endif %}">
|
|
||||||
<div class="info-box-item">
|
|
||||||
<form class="overwrite-form" action="/channel/{{ channel_info.channel_id }}/" method="POST">
|
|
||||||
{% csrf_token %}
|
|
||||||
<div class="overwrite-form-item">
|
|
||||||
<p>Download format: <span class="settings-current">
|
|
||||||
{% if channel_info.channel_overwrites.download_format %}
|
|
||||||
{{ channel_info.channel_overwrites.download_format }}
|
|
||||||
{% else %}
|
|
||||||
False
|
|
||||||
{% endif %}</span></p>
|
|
||||||
{{ channel_overwrite_form.download_format }}<br>
|
|
||||||
</div>
|
|
||||||
<div class="overwrite-form-item">
|
|
||||||
<p>Auto delete watched videos after x days: <span class="settings-current">
|
|
||||||
{% if channel_info.channel_overwrites.autodelete_days %}
|
|
||||||
{{ channel_info.channel_overwrites.autodelete_days }}
|
|
||||||
{% else %}
|
|
||||||
False
|
|
||||||
{% endif %}</span></p>
|
|
||||||
{{ channel_overwrite_form.autodelete_days }}<br>
|
|
||||||
</div>
|
|
||||||
<div class="overwrite-form-item">
|
|
||||||
<p>Index playlists: <span class="settings-current">
|
|
||||||
{% if channel_info.channel_overwrites.index_playlists %}
|
|
||||||
{{ channel_info.channel_overwrites.index_playlists }}
|
|
||||||
{% else %}
|
|
||||||
False
|
|
||||||
{% endif %}</span></p>
|
|
||||||
{{ channel_overwrite_form.index_playlists }}<br>
|
|
||||||
</div>
|
|
||||||
<div class="overwrite-form-item">
|
|
||||||
<p>Enable <a href="https://sponsor.ajay.app/" target="_blank">SponsorBlock</a>: <span class="settings-current">
|
|
||||||
{% if channel_info.channel_overwrites.integrate_sponsorblock %}
|
|
||||||
{{ channel_info.channel_overwrites.integrate_sponsorblock }}
|
|
||||||
{% elif channel_info.channel_overwrites.integrate_sponsorblock == False %}
|
|
||||||
Disabled
|
|
||||||
{% else %}
|
|
||||||
False
|
|
||||||
{% endif %}</span></p>
|
|
||||||
{{ channel_overwrite_form.integrate_sponsorblock }}<br>
|
|
||||||
</div>
|
|
||||||
<button type="submit">Save Channel Overwrites</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% if channel_info.channel_description %}
|
|
||||||
<div class="info-box-item description-box">
|
|
||||||
<p>Description: <button onclick="textReveal()" id="text-reveal-button">Show</button></p>
|
|
||||||
<div id="text-reveal" class="description-text">
|
|
||||||
{{ channel_info.channel_description|linebreaks }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="boxed-content {% if view_style == "grid" %}boxed-{{ grid_items }}{% endif %}">
|
<div class="boxed-content {% if view_style == "grid" %}boxed-{{ grid_items }}{% endif %}">
|
||||||
<div class="view-controls">
|
<div class="view-controls">
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
{% extends "home/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
{% load static %}
|
||||||
|
{% load humanize %}
|
||||||
|
<div class="boxed-content">
|
||||||
|
<div class="channel-banner">
|
||||||
|
<a href="{% url 'channel_id' channel_info.channel_id %}"><img src="{{ channel_info.channel_banner_url }}" alt="channel_banner"></a>
|
||||||
|
</div>
|
||||||
|
<div class="info-box-item channel-nav">
|
||||||
|
<a href="{% url 'channel_id' channel_info.channel_id %}"><h3>Videos</h3></a>
|
||||||
|
<a href="{% url 'channel_id_playlist' channel_info.channel_id %}"><h3>Playlists</h3></a>
|
||||||
|
<a href="{% url 'channel_id_about' channel_info.channel_id %}"><h3>About</h3></a>
|
||||||
|
</div>
|
||||||
|
<div class="info-box info-box-3">
|
||||||
|
<div class="info-box-item">
|
||||||
|
<div class="round-img">
|
||||||
|
<a href="{% url 'channel_id' channel_info.channel_id %}">
|
||||||
|
<img src="{{ channel_info.channel_thumb_url }}" alt="channel-thumb">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3><a href="{% url 'channel_id' channel_info.channel_id %}">{{ channel_info.channel_name }}</a></h3>
|
||||||
|
{% if channel_info.channel_subs >= 1000000 %}
|
||||||
|
<p>Subscribers: {{ channel_info.channel_subs|intword }}</p>
|
||||||
|
{% else %}
|
||||||
|
<p>Subscribers: {{ channel_info.channel_subs|intcomma }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-box-item">
|
||||||
|
<div>
|
||||||
|
<p>Last refreshed: {{ channel_info.channel_last_refresh }}</p>
|
||||||
|
{% if channel_info.channel_active %}
|
||||||
|
<p>Youtube: <a href="https://www.youtube.com/channel/{{ channel_info.channel_id }}" target="_blank">Active</a></p>
|
||||||
|
{% else %}
|
||||||
|
<p>Youtube: Deactivated</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-box-item">
|
||||||
|
<div>
|
||||||
|
{% if channel_info.channel_views >= 1000000 %}
|
||||||
|
<p>Channel views: {{ channel_info.channel_views|intword }}</p>
|
||||||
|
{% elif channel_info.channel_views > 0 %}
|
||||||
|
<p>Channel views: {{ channel_info.channel_views|intcomma }}</p>
|
||||||
|
{% endif %}
|
||||||
|
<button onclick="deleteConfirm()" id="delete-item">Delete Channel</button>
|
||||||
|
<div class="delete-confirm" id="delete-button">
|
||||||
|
<span>Delete {{ channel_info.channel_name }} including all videos? </span><button class="danger-button" onclick="deleteChannel(this)" data-id="{{ channel_info.channel_id }}">Delete</button> <button onclick="cancelDelete()">Cancel</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if channel_info.channel_description %}
|
||||||
|
<div class="description-box">
|
||||||
|
<h2>Description</h2>
|
||||||
|
</div>
|
||||||
|
<div class="info-box-item description-box">
|
||||||
|
<div class="description-text">
|
||||||
|
{{ channel_info.channel_description|linebreaks }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="description-box">
|
||||||
|
<h2>Costomize {{ channel_info.channel_name }}</h2>
|
||||||
|
</div>
|
||||||
|
<div id="overwrite-form" class="info-box">
|
||||||
|
<div class="info-box-item">
|
||||||
|
<form class="overwrite-form" action="/channel/{{ channel_info.channel_id }}/about/" method="POST">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="overwrite-form-item">
|
||||||
|
<p>Download format: <span class="settings-current">
|
||||||
|
{% if channel_info.channel_overwrites.download_format %}
|
||||||
|
{{ channel_info.channel_overwrites.download_format }}
|
||||||
|
{% else %}
|
||||||
|
False
|
||||||
|
{% endif %}</span></p>
|
||||||
|
{{ channel_overwrite_form.download_format }}<br>
|
||||||
|
</div>
|
||||||
|
<div class="overwrite-form-item">
|
||||||
|
<p>Auto delete watched videos after x days: <span class="settings-current">
|
||||||
|
{% if channel_info.channel_overwrites.autodelete_days %}
|
||||||
|
{{ channel_info.channel_overwrites.autodelete_days }}
|
||||||
|
{% else %}
|
||||||
|
False
|
||||||
|
{% endif %}</span></p>
|
||||||
|
{{ channel_overwrite_form.autodelete_days }}<br>
|
||||||
|
</div>
|
||||||
|
<div class="overwrite-form-item">
|
||||||
|
<p>Index playlists: <span class="settings-current">
|
||||||
|
{% if channel_info.channel_overwrites.index_playlists %}
|
||||||
|
{{ channel_info.channel_overwrites.index_playlists }}
|
||||||
|
{% else %}
|
||||||
|
False
|
||||||
|
{% endif %}</span></p>
|
||||||
|
{{ channel_overwrite_form.index_playlists }}<br>
|
||||||
|
</div>
|
||||||
|
<div class="overwrite-form-item">
|
||||||
|
<p>Enable <a href="https://sponsor.ajay.app/" target="_blank">SponsorBlock</a>: <span class="settings-current">
|
||||||
|
{% if channel_info.channel_overwrites.integrate_sponsorblock %}
|
||||||
|
{{ channel_info.channel_overwrites.integrate_sponsorblock }}
|
||||||
|
{% elif channel_info.channel_overwrites.integrate_sponsorblock == False %}
|
||||||
|
Disabled
|
||||||
|
{% else %}
|
||||||
|
False
|
||||||
|
{% endif %}</span></p>
|
||||||
|
{{ channel_overwrite_form.integrate_sponsorblock }}<br>
|
||||||
|
</div>
|
||||||
|
<button type="submit">Save Channel Overwrites</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
|
@ -0,0 +1,57 @@
|
||||||
|
{% extends "home/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
{% load static %}
|
||||||
|
{% load humanize %}
|
||||||
|
<div class="boxed-content">
|
||||||
|
<div class="channel-banner">
|
||||||
|
<a href="{% url 'channel_id' channel_info.channel_id %}"><img src="{{ channel_info.channel_banner_url }}" alt="channel_banner"></a>
|
||||||
|
</div>
|
||||||
|
<div class="info-box-item channel-nav">
|
||||||
|
<a href="{% url 'channel_id' channel_info.channel_id %}"><h3>Videos</h3></a>
|
||||||
|
<a href="{% url 'channel_id_playlist' channel_info.channel_id %}"><h3>Playlists</h3></a>
|
||||||
|
<a href="{% url 'channel_id_about' channel_info.channel_id %}"><h3>About</h3></a>
|
||||||
|
</div>
|
||||||
|
<div class="view-controls">
|
||||||
|
<div class="toggle">
|
||||||
|
<span>Show subscribed only:</span>
|
||||||
|
<div class="toggleBox">
|
||||||
|
<input id="show_subed_only" onclick="toggleCheckbox(this)" type="checkbox" {% if show_subed_only %}checked{% endif %}>
|
||||||
|
{% if not show_subed_only %}
|
||||||
|
<label for="" class="ofbtn">Off</label>
|
||||||
|
{% else %}
|
||||||
|
<label for="" class="onbtn">On</label>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="view-icons">
|
||||||
|
<img src="{% static 'img/icon-gridview.svg' %}" onclick="changeView(this)" data-origin="playlist" data-value="grid" alt="grid view">
|
||||||
|
<img src="{% static 'img/icon-listview.svg' %}" onclick="changeView(this)" data-origin="playlist" data-value="list" alt="list view">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="playlist-list {{ view_style }}">
|
||||||
|
{% if results %}
|
||||||
|
{% for playlist in results %}
|
||||||
|
<div class="playlist-item {{ view_style }}">
|
||||||
|
<div class="playlist-thumbnail">
|
||||||
|
<a href="{% url 'playlist_id' playlist.source.playlist_id %}">
|
||||||
|
<img src="/cache/playlists/{{ playlist.source.playlist_id }}.jpg" alt="{{ playlist.source.playlist_id }}-thumbnail">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="playlist-desc {{ view_style }}">
|
||||||
|
<a href="{% url 'channel_id' playlist.source.playlist_channel_id %}"><h3>{{ playlist.source.playlist_channel }}</h3></a>
|
||||||
|
<a href="{% url 'playlist_id' playlist.source.playlist_id %}"><h2>{{ playlist.source.playlist_name }}</h2></a>
|
||||||
|
<p>Last refreshed: {{ playlist.source.playlist_last_refresh }}</p>
|
||||||
|
{% if playlist.source.playlist_subscribed %}
|
||||||
|
<button class="unsubscribe" type="button" id="{{ playlist.source.playlist_id }}" onclick="unsubscribe(this.id)" title="Unsubscribe from {{ playlist.source.playlist_name }}">Unsubscribe</button>
|
||||||
|
{% else %}
|
||||||
|
<button type="button" id="{{ playlist.source.playlist_id }}" onclick="subscribe(this.id)" title="Subscribe to {{ playlist.source.playlist_name }}">Subscribe</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<h2>No playlists found...</h2>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock content %}
|
|
@ -6,6 +6,8 @@ from django.contrib.auth.views import LogoutView
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from home.views import (
|
from home.views import (
|
||||||
AboutView,
|
AboutView,
|
||||||
|
ChannelIdAboutView,
|
||||||
|
ChannelIdPlaylistView,
|
||||||
ChannelIdView,
|
ChannelIdView,
|
||||||
ChannelView,
|
ChannelView,
|
||||||
DownloadView,
|
DownloadView,
|
||||||
|
@ -42,6 +44,16 @@ urlpatterns = [
|
||||||
login_required(ChannelIdView.as_view()),
|
login_required(ChannelIdView.as_view()),
|
||||||
name="channel_id",
|
name="channel_id",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"channel/<slug:channel_id>/about/",
|
||||||
|
login_required(ChannelIdAboutView.as_view()),
|
||||||
|
name="channel_id_about",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"channel/<slug:channel_id>/playlist/",
|
||||||
|
login_required(ChannelIdPlaylistView.as_view()),
|
||||||
|
name="channel_id_playlist",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"video/<slug:video_id>/",
|
"video/<slug:video_id>/",
|
||||||
login_required(VideoView.as_view()),
|
login_required(VideoView.as_view()),
|
||||||
|
|
|
@ -8,6 +8,7 @@ import json
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
|
from api.src.search_processor import SearchProcess
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth import login
|
from django.contrib.auth import login
|
||||||
from django.contrib.auth.forms import AuthenticationForm
|
from django.contrib.auth.forms import AuthenticationForm
|
||||||
|
@ -15,6 +16,7 @@ from django.http import JsonResponse
|
||||||
from django.shortcuts import redirect, render
|
from django.shortcuts import redirect, render
|
||||||
from django.views import View
|
from django.views import View
|
||||||
from home.src.download.yt_dlp_base import CookieHandler
|
from home.src.download.yt_dlp_base import CookieHandler
|
||||||
|
from home.src.es.connect import ElasticWrap
|
||||||
from home.src.es.index_setup import get_available_backups
|
from home.src.es.index_setup import get_available_backups
|
||||||
from home.src.frontend.api_calls import PostData
|
from home.src.frontend.api_calls import PostData
|
||||||
from home.src.frontend.forms import (
|
from home.src.frontend.forms import (
|
||||||
|
@ -440,7 +442,6 @@ class ChannelIdView(ArchivistResultsView):
|
||||||
{
|
{
|
||||||
"title": "Channel: " + channel_name,
|
"title": "Channel: " + channel_name,
|
||||||
"channel_info": channel_info,
|
"channel_info": channel_info,
|
||||||
"channel_overwrite_form": ChannelOverwriteForm,
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -477,6 +478,93 @@ class ChannelIdView(ArchivistResultsView):
|
||||||
return redirect("channel_id", channel_id, permanent=True)
|
return redirect("channel_id", channel_id, permanent=True)
|
||||||
|
|
||||||
|
|
||||||
|
class ChannelIdAboutView(ArchivistResultsView):
|
||||||
|
"""resolves to /channel/<channel-id>/about/
|
||||||
|
show metadata, handle per channel conf
|
||||||
|
"""
|
||||||
|
|
||||||
|
view_origin = "channel"
|
||||||
|
|
||||||
|
def get(self, request, channel_id):
|
||||||
|
"""handle get request"""
|
||||||
|
self.initiate_vars(request)
|
||||||
|
|
||||||
|
path = f"ta_channel/_doc/{channel_id}"
|
||||||
|
response, _ = ElasticWrap(path).get()
|
||||||
|
|
||||||
|
channel_info = SearchProcess(response).process()
|
||||||
|
channel_name = channel_info["channel_name"]
|
||||||
|
|
||||||
|
self.context.update(
|
||||||
|
{
|
||||||
|
"title": "Channel: About " + channel_name,
|
||||||
|
"channel_info": channel_info,
|
||||||
|
"channel_overwrite_form": ChannelOverwriteForm,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return render(request, "home/channel_id_about.html", self.context)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def post(request, channel_id):
|
||||||
|
"""handle post request"""
|
||||||
|
print(f"handle post from {channel_id}")
|
||||||
|
channel_overwrite_form = ChannelOverwriteForm(request.POST)
|
||||||
|
if channel_overwrite_form.is_valid():
|
||||||
|
overwrites = channel_overwrite_form.cleaned_data
|
||||||
|
print(f"{channel_id}: set overwrites {overwrites}")
|
||||||
|
channel_overwrites(channel_id, overwrites=overwrites)
|
||||||
|
if overwrites.get("index_playlists") == "1":
|
||||||
|
index_channel_playlists.delay(channel_id)
|
||||||
|
|
||||||
|
sleep(1)
|
||||||
|
return redirect("channel_id_about", channel_id, permanent=True)
|
||||||
|
|
||||||
|
|
||||||
|
class ChannelIdPlaylistView(ArchivistResultsView):
|
||||||
|
"""resolves to /channel/<channel-id>/playlist/
|
||||||
|
show all playlists of channel
|
||||||
|
"""
|
||||||
|
|
||||||
|
view_origin = "playlist"
|
||||||
|
es_search = "ta_playlist/_search"
|
||||||
|
|
||||||
|
def get(self, request, channel_id):
|
||||||
|
"""handle get request"""
|
||||||
|
self.initiate_vars(request)
|
||||||
|
self._update_view_data(channel_id)
|
||||||
|
self.find_results()
|
||||||
|
|
||||||
|
channel_info = self._get_channel_meta(channel_id)
|
||||||
|
channel_name = channel_info["channel_name"]
|
||||||
|
self.context.update(
|
||||||
|
{
|
||||||
|
"title": "Channel: Playlists " + channel_name,
|
||||||
|
"channel_info": channel_info,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return render(request, "home/channel_id_playlist.html", self.context)
|
||||||
|
|
||||||
|
def _update_view_data(self, channel_id):
|
||||||
|
"""update view specific data dict"""
|
||||||
|
self.data["sort"] = [{"playlist_name.keyword": {"order": "asc"}}]
|
||||||
|
must_list = [{"match": {"playlist_channel_id": channel_id}}]
|
||||||
|
|
||||||
|
if self.context["show_subed_only"]:
|
||||||
|
must_list.append({"match": {"playlist_subscribed": True}})
|
||||||
|
|
||||||
|
self.data["query"] = {"bool": {"must": must_list}}
|
||||||
|
|
||||||
|
def _get_channel_meta(self, channel_id):
|
||||||
|
"""get metadata for channel"""
|
||||||
|
path = f"ta_channel/_doc/{channel_id}"
|
||||||
|
response, _ = ElasticWrap(path).get()
|
||||||
|
channel_info = SearchProcess(response).process()
|
||||||
|
|
||||||
|
return channel_info
|
||||||
|
|
||||||
|
|
||||||
class ChannelView(ArchivistResultsView):
|
class ChannelView(ArchivistResultsView):
|
||||||
"""resolves to /channel/
|
"""resolves to /channel/
|
||||||
handle functionality for channel overview page, subscribe to channel,
|
handle functionality for channel overview page, subscribe to channel,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
beautifulsoup4==4.11.1
|
beautifulsoup4==4.11.1
|
||||||
celery==5.2.7
|
celery==5.2.7
|
||||||
Django==4.0.5
|
Django==4.0.6
|
||||||
django-cors-headers==3.13.0
|
django-cors-headers==3.13.0
|
||||||
djangorestframework==3.13.1
|
djangorestframework==3.13.1
|
||||||
Pillow==9.2.0
|
Pillow==9.2.0
|
||||||
|
|
|
@ -817,6 +817,18 @@ button:hover {
|
||||||
transform: translateX(-30%);
|
transform: translateX(-30%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.info-box-item.channel-nav {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-box-item.channel-nav a {
|
||||||
|
padding: 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-box-item.channel-nav a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
/* playlist overview page */
|
/* playlist overview page */
|
||||||
.playlist-list.list {
|
.playlist-list.list {
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|
Loading…
Reference in New Issue