amazing-ytdlp-archive/ayta/blueprints/admin.py

237 lines
8.3 KiB
Python

from flask import Blueprint, render_template, request, redirect, url_for, flash
from ..nosql import get_nosql
from ..dlp import checkChannelId, getChannelInfo
from ..decorators import login_required
from ..tasks import websub_subscribe_callback, websub_unsubscribe_callback
from datetime import datetime
from secrets import token_urlsafe
bp = Blueprint('admin', __name__, url_prefix='/admin')
@bp.route('')
@login_required
def base():
return render_template('admin/index.html')
@bp.route('/system', methods=['GET', 'POST'])
@login_required
def system():
if request.method == 'POST':
task = request.form.get('task', None)
if task == 'update-value':
pass
return render_template('admin/system.html')
@bp.route('/channel', methods=['GET', 'POST'])
@login_required
def channels():
channels = {}
generic = {}
if request.method == 'POST':
channelId = request.form.get('channel_id', None)
originalName = request.form.get('original_name', None)
addedDate = request.form.get('added_date', None)
### add some validation
addedDate = datetime.strptime(addedDate, '%Y-%m-%d')
if checkChannelId(channelId) is False:
channelId, originalName = getChannelInfo(channelId, ('channel_id', 'uploader'))
if not get_nosql().insert_new_channel(channelId, originalName, addedDate):
flash('Error inserting new channel, you probably made a mistake somewhere')
return redirect(url_for('admin.channels'))
return redirect(url_for('admin.channel', channelId=channelId))
generic['currentDate'] = datetime.utcnow()
channelIds = get_nosql().list_all_channels()
for channelId in channelIds:
channels[channelId] = get_nosql().get_channel_info(channelId)
channels[channelId]['video_count'] = get_nosql().get_channel_videos_count(channelId)
return render_template('admin/channels.html', channels=channels, generic=generic)
@bp.route('/channel/<channelId>', methods=['GET', 'POST'])
@login_required
def channel(channelId):
channelInfo = get_nosql().get_channel_info(channelId)
if not channelInfo:
flash('That channel ID does not exist in the system')
return redirect(url_for('admin.channels'))
if request.method == 'POST':
task = request.form.get('task', None)
key = request.form.get('key', None)
value = request.form.get('value', None)
if task == 'subscribe-websub':
task = websub_subscribe_callback.delay(channelId)
flash(f"Started task {task.id}")
return redirect(url_for('admin.channel', channelId=channelId))
if task == 'update-value':
if key in ['active', 'websub']:
value = True if value else False
if key in ['added_date']:
value = datetime.strptime(value, '%Y-%m-%d')
get_nosql().update_channel_key(channelId, key, value)
return redirect(url_for('admin.channel', channelId=channelId))
return render_template('admin/channel.html', channelInfo=channelInfo)
@bp.route('/run', methods=['GET', 'POST'])
@login_required
def runs():
if request.method == 'POST':
task = request.form.get('task', None)
if task == 'clean_runs':
get_nosql().clean_runs()
return redirect(url_for('admin.runs'))
runs = reversed(list(get_nosql().get_runs()))
return render_template('admin/runs.html', runs=runs)
@bp.route('/run/<runId>', methods=['GET', 'POST'])
@login_required
def run(runId):
run = get_nosql().get_run(runId)
return render_template('admin/run.html', run=run)
@bp.route('/websub', methods=['GET', 'POST'])
@login_required
def websub():
render = {}
if request.method == 'POST':
task = request.form.get('task', None)
value = request.form.get('value', None)
if task == 'unsubscribe':
task = websub_unsubscribe_callback.delay(value)
flash(f"Started task {task.id}")
return redirect(url_for('admin.websub'))
elif task == 'clean-retired':
get_nosql().websub_cleanRetired()
return redirect(url_for('admin.websub'))
elif task == 'unsubscribe-callbacks':
for callbackId in get_nosql().websub_getCallbacks():
websub_unsubscribe_callback.delay(callbackId)
flash(f"Started unsubscribe tasks for all callbacks")
return redirect(url_for('admin.websub'))
elif task == 'subscribe-channels':
for channelId in get_nosql().list_all_channels(websub=True):
websub_subscribe_callback.delay(channelId)
flash(f'Started subscribe tasks for activated channels')
return redirect(url_for('admin.websub'))
callbackIds = get_nosql().websub_getCallbacks()
callbacks = {}
render['stats'] = get_nosql().websub_statistics()
for callbackId in callbackIds:
callbacks[callbackId] = get_nosql().websub_getCallback(callbackId)
return render_template('admin/websub.html', callbacks=callbacks, render=render)
@bp.route('/reports', methods=['GET', 'POST'])
@login_required
def reports():
if request.method == 'POST':
task = request.form.get('task', None)
value = request.form.get('value', None)
if task == 'close':
get_nosql().close_report(value)
flash(f'Report closed {value}')
return redirect(url_for('admin.reports'))
reports = get_nosql().list_reports()
return render_template('admin/reports.html', reports=reports)
@bp.route('/queue', methods=['GET', 'POST'])
@login_required
def queue():
if request.method == 'POST':
task = request.form.get('task', None)
value = request.form.get('value', None)
if task == 'add-endpoint':
description = request.form.get('description', None)
if not description or len(description) <= 7:
flash('Description must be at least 8 characters long')
if value and len(value) >= 12:
get_nosql().queue_newEndpoint(value, description)
flash(f'Created endpoint ID: {value}')
else:
value = token_urlsafe(16)
get_nosql().queue_newEndpoint(value, description)
flash(f'Created endpoint ID: {value}')
elif task == 'retire':
get_nosql().queue_retireEndpoint(value)
flash(f'Endpoint retired: {value}')
elif task == 'clean-retired':
get_nosql().queue_cleanRetired()
flash(f'Cleaned retired endpoints')
elif task == 'manual-queue':
get_nosql().queue_insertQueue(value, 'webui')
flash(f'Added to queue: {value}')
elif task == 'delete-queue':
get_nosql().queue_deleteQueue(value)
flash(f'Deleted from queue: {value}')
elif task == 'empty-queue':
get_nosql().queue_emptyQueue()
flash(f'Queue has been emptied')
return redirect(url_for('admin.queue'))
endpoints = get_nosql().queue_getEndpoints()
queue = get_nosql().queue_getQueue()
return render_template('admin/queue.html', endpoints=endpoints, queue=queue)
@bp.route('/users', methods=['GET', 'POST'])
@login_required
def users():
if request.method == 'POST':
task = request.form.get('task', None)
value = request.form.get('value', None)
if task == 'add-user':
alias = request.form.get('alias', None)
description = request.form.get('description', None)
if value is None or alias is None:
flash('Missing fields')
return redirect(url_for('admin.users'))
doc_id = get_nosql().add_user(value, alias, description)
flash(f'User added: {doc_id}')
return redirect(url_for('admin.users'))
if task == 'delete-user':
get_nosql().delete_user(value)
flash(f'User deleted: {value}')
return redirect(url_for('admin.users'))
users = get_nosql().list_all_users()
return render_template('admin/users.html', users=users)