1
0
Fork 0
mirror of https://github.com/fastogt/fastocloud_admin.git synced 2025-03-09 23:38:52 +00:00

Meta for streams

This commit is contained in:
topilski 2020-02-14 11:08:41 -05:00
parent 2389a5b098
commit d0d1660037
6 changed files with 241 additions and 0 deletions

View file

@ -96,6 +96,7 @@ from app.provider.view import ProviderView
from app.stream.view import StreamView
from app.service.view import ServiceView
from app.subscriber.view import SubscriberView
from app.autofill.view import M3uParseView
from app.epg.view import EpgView
HomeView.register(app)
@ -103,4 +104,5 @@ ProviderView.register(app)
StreamView.register(app)
ServiceView.register(app)
SubscriberView.register(app)
M3uParseView.register(app)
EpgView.register(app)

15
app/autofill/entry.py Normal file
View file

@ -0,0 +1,15 @@
from mongoengine import Document, StringField, ListField
import pyfastocloud_models.constants as constants
class M3uParse(Document):
NAME_FIELD = 'name'
meta = {'allow_inheritance': False, 'collection': 'm3uparse', 'auto_create_index': False}
name = StringField(unique=True, max_length=constants.MAX_STREAM_NAME_LENGTH,
min_length=constants.MIN_STREAM_NAME_LENGTH,
required=True)
tvg_id = ListField(StringField(unique=True), default=[])
tvg_logo = ListField(StringField(unique=True), default=[])
group = ListField(StringField(unique=True), default=[])

73
app/autofill/view.py Normal file
View file

@ -0,0 +1,73 @@
from flask_classy import FlaskView, route
from flask import request, jsonify, render_template, redirect, url_for
from flask_login import login_required
from pyfastocloud_models.utils.m3u_parser import M3uParser
from app.common.service.forms import UploadM3uForm
import pyfastocloud_models.constants as constants
from app.autofill.entry import M3uParse
from pyfastocloud_models.utils.utils import is_valid_http_url
# routes
class M3uParseView(FlaskView):
route_base = '/m3uparse/'
@login_required
def show(self):
m3u = M3uParse.objects()
return render_template('autofill/show.html', m3u=m3u)
@route('/search/<sid>', methods=['GET'])
@login_required
def search(self, sid):
lines = M3uParse.objects(id=sid)
line = lines.first()
if line:
return jsonify(status='ok', line=line), 200
return jsonify(status='failed', error='Not found'), 404
@route('/upload_files', methods=['POST'])
@login_required
def upload_files(self):
form = UploadM3uForm()
if form.validate_on_submit():
files = request.files.getlist("files")
for file in files:
m3u_parser = M3uParser()
data = file.read().decode('utf-8')
m3u_parser.load_content(data)
m3u_parser.parse()
for file in m3u_parser.files:
title = file['title']
if len(title) > constants.MAX_STREAM_NAME_LENGTH:
continue
line = M3uParse.objects(name=title).first()
if not line:
line = M3uParse(name=title)
tvg_id = file['tvg-id']
if len(tvg_id) < constants.MAX_STREAM_TVG_ID_LENGTH:
line.tvg_id.append(tvg_id)
tvg_group = file['tvg-group']
if len(tvg_group) < constants.MAX_STREAM_GROUP_TITLE_LENGTH:
line.group.append(tvg_group)
tvg_logo = file['tvg-logo']
if len(tvg_logo) < constants.MAX_URL_LENGTH:
if is_valid_http_url(tvg_logo, timeout=0.1):
line.tvg_logo.append(tvg_logo)
line.save()
return redirect(url_for('M3uParseView:show'))
@login_required
@route('/upload_m3u', methods=['POST', 'GET'])
def upload_m3u(self):
form = UploadM3uForm()
return render_template('autofill/upload_m3u.html', form=form)

View file

@ -0,0 +1,100 @@
{% extends 'layouts/layout_user.html' %}
{% from 'bootstrap/wtf.html' import form_field %}
{% block title %}
M3U | {{ config['PUBLIC_CONFIG'].site.title }}
{% endblock %}
{% block styles %}
<style>
table {
table-layout: fixed;
}
th.number {
width: 2%;
}
th.name {
width: 88%;
}
th.actions {
width: 10%;
}
</style>
{{super()}}
{% endblock %}
{% block content %}
<div class="panel panel-default">
<div class="panel-heading">
<h1 class="panel-title">
<div class="col-md-11">
<a href="{{ url_for('HomeView:index') }}">{{ config['PUBLIC_CONFIG'].site.title }}</a>
</div>
<div>Version: {{ config['PUBLIC_CONFIG'].project.version }}</div>
</h1>
</div>
<div class="panel-body">
<div class="container-fluid">
<div class="row well">
<div class="col-md-8">
<p>M3u</p>
</div>
<div class="col-md-2">
<a href="{{ url_for('ProviderView:dashboard') }}" role="button" class="btn btn-info">
Dashboard
</a>
</div>
<div class="col-md-2">
<a href="{{ url_for('ProviderView:logout') }}" class="btn btn-warning" role="button">
Logout
</a>
</div>
</div>
<div class="row well">
<div class="row">
<table id='m3u_table' class="table">
<thead>
<tr>
<th class="number">#</th>
<th class="name">Name</th>
<th class="actions">Actions</th>
</tr>
</thead>
<tbody>
{% for line in m3u %}
<tr id='{{ line.id }}'>
<td>{{ loop.index }}</td>
<td>{{ line.name }}</td>
<td>
<a href="{{ url_for('M3uParseView:search', sid=line.id) }}" role="button"
target="_blank" class="btn btn-success btn-xs">
Show
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-md-4">
<a href="{{ url_for('M3uParseView:upload_m3u') }}" role="button" class="btn btn-success">
Upload urls
</a>
</div>
</div>
</div>
</div>
</div>
<div id="epg_dialog" class="modal fade" tabindex=-1 role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
{{ super() }}
{% endblock %}

View file

@ -0,0 +1,45 @@
{% extends 'layouts/layout_home.html' %}
{% block title %}
Upload m3u | {{ config['PUBLIC_CONFIG'].site.title }}
{% endblock %}
{% block content %}
<div class="panel panel-default">
<div class="panel-heading">
<h1 class="panel-title">
<div class="col-md-11">
<a href="{{ url_for('HomeView:index') }}">{{ config['PUBLIC_CONFIG'].site.title }}</a>
</div>
<div>Version: {{ config['PUBLIC_CONFIG'].project.version }}</div>
</h1>
</div>
<div class="panel-body">
<div class="container-fluid">
<div class="row well">
<h3>Upload m3u files</h3>
<p>Note: Please upload m3u files for service.</p>
{{ util.flashed_messages(dismissible=True, container=False) }}
<form action="{{ url_for('M3uParseView:upload_files') }}" method="POST" class="form" role="form"
enctype="multipart/form-data">
{{ form.hidden_tag() }}
<div class="col-md-3">
{{ form.files }}
</div>
<div class="col-md-3">
Type: {{ form.type }}
</div>
<div class="col-md-3">
{{ form_field(form.upload, class="btn btn-success") }}
</div>
</form>
</div>
<div class="row">
<a href="{{ url_for('ProviderView:dashboard') }}" role="button" class="btn btn-info">
Dashboard
</a>
</div>
</div>
</div>
</div>
{%- endblock %}

View file

@ -86,6 +86,12 @@ Dashboard | {{ config['PUBLIC_CONFIG'].site.title }}
</a>
</div>
{% endif %}
<div class="col-md-1">
<a href="{{ url_for('M3uParseView:show') }}" class="btn btn-warning"
role="button">
Meta
</a>
</div>
<div class="col-md-1">
<a href="{{ url_for('ProviderView:logout') }}" class="btn btn-warning" role="button">
Logout