1
0
Fork 0
mirror of https://github.com/fastogt/fastocloud_admin.git synced 2025-03-09 23:38:52 +00:00
This commit is contained in:
topilski 2020-02-16 13:15:58 -05:00
parent 5dcf23f66a
commit ee48d273b6
18 changed files with 117 additions and 58 deletions

View file

@ -3,7 +3,7 @@ import os
from omdb import OMDBClient
from flask import Flask
from flask_mongoengine import MongoEngine
from flask_pymodm import PyModm
from flask_login import LoginManager
from flask_mail import Mail
from flask_bootstrap import Bootstrap
@ -48,7 +48,7 @@ def init_project(static_folder, *args):
app.wsgi_app = ProxyFix(app.wsgi_app)
bootstrap = Bootstrap(app)
db = MongoEngine(app)
db = PyModm(app)
mail = Mail(app)
socketio = SocketIO(app)
login_manager = LoginManager(app)

View file

@ -1,22 +1,26 @@
from mongoengine import Document, StringField, ListField
from pymodm import MongoModel, fields
import pyfastocloud_models.constants as constants
class M3uParseStreams(Document):
meta = {'allow_inheritance': False, 'collection': 'm3uparse_streams', 'auto_create_index': False}
name = StringField(unique=True, max_length=constants.MAX_STREAM_NAME_LENGTH,
class M3uParseStreams(MongoModel):
class Meta:
collection_name = 'm3uparse_streams'
name = fields.CharField(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=[])
tvg_id = fields.ListField(fields.CharField(), default=[])
tvg_logo = fields.ListField(fields.CharField(), default=[])
group = fields.ListField(fields.CharField(), default=[])
class M3uParseVods(Document):
meta = {'allow_inheritance': False, 'collection': 'm3uparse_vods', 'auto_create_index': False}
name = StringField(unique=True, max_length=constants.MAX_STREAM_NAME_LENGTH,
class M3uParseVods(MongoModel):
class Meta:
collection_name = 'm3uparse_vods'
name = fields.CharField(max_length=constants.MAX_STREAM_NAME_LENGTH,
min_length=constants.MIN_STREAM_NAME_LENGTH,
required=True)
tvg_logo = ListField(StringField(unique=True), default=[])
group = ListField(StringField(unique=True), default=[])
tvg_logo = fields.ListField(fields.CharField(), default=[])
group = fields.ListField(fields.CharField(), default=[])

@ -1 +1 @@
Subproject commit 1a9515a0e359ab708d966dee3a0fb8733c6ba4b9
Subproject commit a3f9a57eff6f2a502b19b86b181933168789521f

View file

@ -1,7 +1,3 @@
MONGO_DBNAME = 'iptv'
MONGO_URI = 'mongodb://localhost:27017/' + MONGO_DBNAME
MONGODB_SETTINGS = {
'db': MONGO_DBNAME,
'host': MONGO_URI
}
MONGODB_DB_NAME = 'iptv'
MONGODB_HOST = 'localhost'
MONGODB_PORT = '27017'

View file

@ -10,6 +10,24 @@ from app import app, mail, login_manager
from app.home.entry import ProviderAdminUser
from app.home.forms import ContactForm
from app.common.provider.forms import SignupForm, SigninForm
from bson.objectid import ObjectId
def _get_provider_by_email(email: str):
try:
provider = ProviderAdminUser.objects.get({'email': email})
except ProviderAdminUser.DoesNotExist:
return None
else:
return provider
def _get_provider_by_id(id: str):
try:
provider = ProviderAdminUser.objects.get({'_id': ObjectId(id)})
except ProviderAdminUser.DoesNotExist:
return None
else:
return provider
def flash_success(text: str):
@ -33,7 +51,7 @@ def post_login(form: SigninForm):
return render_template('home/login.html', form=form)
email = form.email.data.lower()
check_user = ProviderAdminUser.objects(email=email).first()
check_user = _get_provider_by_email(email)
if not check_user:
flash_error('User not found.')
return render_template('home/login.html', form=form)
@ -42,7 +60,7 @@ def post_login(form: SigninForm):
flash_error('User not active.')
return render_template('home/login.html', form=form)
if not ProviderAdminUser.check_password_hash(check_user['password'], form.password.data):
if not ProviderAdminUser.check_password_hash(check_user.password, form.password.data):
flash_error('Invalid password.')
return render_template('home/login.html', form=form)
@ -95,7 +113,7 @@ class HomeView(FlaskView):
try:
email = self._confirm_link_generator.loads(token, salt=HomeView.SALT_LINK,
max_age=HomeView.CONFIRM_LINK_TTL)
confirm_user = ProviderAdminUser.objects(email=email).first()
confirm_user = _get_provider_by_email(email)
if confirm_user:
confirm_user.status = ProviderAdminUser.Status.ACTIVE
confirm_user.save()
@ -140,7 +158,7 @@ class HomeView(FlaskView):
flash_error('Invalid email.')
return render_template('home/register.html', form=form)
existing_user = ProviderAdminUser.objects(email=email).first()
existing_user = _get_provider_by_email(email)
if existing_user:
return redirect(url_for('HomeView:signin'))
@ -165,7 +183,7 @@ class HomeView(FlaskView):
@login_manager.user_loader
def load_user(user_id):
return ProviderAdminUser.objects(pk=user_id).first()
return _get_provider_by_id(user_id)
def page_not_found(e):

View file

@ -65,7 +65,7 @@ class ProviderView(FlaskView):
@login_required
def remove(self):
servers = ServiceSettings.objects()
servers = ServiceSettings.objects.all()
for server in servers:
server.remove_provider(current_user)

View file

@ -3,6 +3,7 @@ import os
from flask_classy import FlaskView, route
from flask import render_template, redirect, url_for, request, jsonify, Response
from flask_login import login_required, current_user
from bson.objectid import ObjectId
from app import get_runtime_folder
from app.common.service.forms import ServiceSettingsForm, ActivateForm, UploadM3uForm, ServerProviderForm
@ -13,6 +14,15 @@ from app.home.entry import ProviderAdminUser
import pyfastocloud_models.constants as constants
def _get_server_by_id(sid: str):
try:
server = ServiceSettings.objects.get({'_id': ObjectId(sid)})
except ServiceSettings.DoesNotExist:
return None
else:
return server
# routes
class ServiceView(FlaskView):
route_base = "/service/"
@ -171,7 +181,7 @@ class ServiceView(FlaskView):
@login_required
@route('/playlist/<sid>/master.m3u', methods=['GET'])
def playlist(self, sid):
server = ServiceSettings.objects(id=sid).first()
server = _get_server_by_id(sid)
if server:
return Response(server.generate_playlist(), mimetype='application/x-mpequrl'), 200
@ -196,7 +206,7 @@ class ServiceView(FlaskView):
@login_required
def providers(self, sid):
server = ServiceSettings.objects(id=sid).first()
server = _get_server_by_id(sid)
if server:
return render_template('service/providers.html', server=server)
@ -209,7 +219,7 @@ class ServiceView(FlaskView):
if request.method == 'POST' and form.validate_on_submit():
email = form.email.data.lower()
provider = ProviderAdminUser.objects(email=email).first()
server = ServiceSettings.objects(id=sid).first()
server = _get_server_by_id(sid)
if server and provider:
admin = ProviderPair(provider.id, form.role.data)
server.add_provider(admin)
@ -224,7 +234,7 @@ class ServiceView(FlaskView):
data = request.get_json()
pid = data['pid']
provider = ProviderAdminUser.objects(id=pid).first()
server = ServiceSettings.objects(id=sid).first()
server = _get_server_by_id(sid)
if provider and server:
server.remove_provider(provider)
provider.remove_server(server)
@ -249,7 +259,7 @@ class ServiceView(FlaskView):
@route('/remove', methods=['POST'])
def remove(self):
sid = request.form['sid']
server = ServiceSettings.objects(id=sid).first()
server = _get_server_by_id(sid)
if server:
server.delete()
return jsonify(status='ok'), 200
@ -259,7 +269,7 @@ class ServiceView(FlaskView):
@login_required
@route('/edit/<sid>', methods=['GET', 'POST'])
def edit(self, sid):
server = ServiceSettings.objects(id=sid).first()
server = _get_server_by_id(sid)
form = ServiceSettingsForm(obj=server)
if request.method == 'POST' and form.validate_on_submit():

View file

@ -2,6 +2,7 @@ import os
import datetime
import re
from bson.objectid import ObjectId
from flask_classy import FlaskView, route
from flask import render_template, request, jsonify, Response
from flask_login import login_required, current_user
@ -15,6 +16,15 @@ from app.common.stream.forms import ProxyStreamForm, EncodeStreamForm, RelayStre
from app.common.series.forms import SerialForm
def _get_stream_by_id(sid: str):
try:
server = IStream.objects.get({'_id': ObjectId(sid)})
except IStream.DoesNotExist:
return None
else:
return server
# routes
class StreamView(FlaskView):
DEFAULT_PIPELINE_FILENAME_TEMPLATE_1S = '{0}_pipeline.html'
@ -64,7 +74,7 @@ class StreamView(FlaskView):
@login_required
@route('/play/<sid>/master.m3u', methods=['GET'])
def play(self, sid):
stream = IStream.objects(id=sid).first()
stream = _get_stream_by_id(sid)
if stream:
return Response(stream.generate_playlist(), mimetype='application/x-mpequrl'), 200

View file

@ -1,19 +1,29 @@
from flask_classy import FlaskView, route
from flask import render_template, request, jsonify
from flask_login import login_required
from bson.objectid import ObjectId
from app.common.subscriber.forms import SignupForm
from pyfastocloud_models.subscriber.login.entry import SubscriberUser
from pyfastocloud_models.service.entry import ServiceSettings
def _get_subscriber_by_id(sid: str):
try:
subscriber = SubscriberUser.objects.get({'_id': ObjectId(sid)})
except SubscriberUser.DoesNotExist:
return None
else:
return subscriber
# routes
class SubscriberView(FlaskView):
route_base = "/subscriber/"
@login_required
def show(self):
return render_template('subscriber/show.html', subscribers=SubscriberUser.objects())
return render_template('subscriber/show.html', subscribers=SubscriberUser.objects.all())
@login_required
@route('/add', methods=['GET', 'POST'])
@ -21,7 +31,7 @@ class SubscriberView(FlaskView):
form = SignupForm()
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.make_entry()
servers = ServiceSettings.objects()
servers = ServiceSettings.objects.all()
for server in servers:
new_entry.add_server(server)
new_entry.save()
@ -32,7 +42,7 @@ class SubscriberView(FlaskView):
@login_required
@route('/edit/<sid>', methods=['GET', 'POST'])
def edit(self, sid):
subscriber = SubscriberUser.objects(id=sid).first()
subscriber = _get_subscriber_by_id(sid)
form = SignupForm(obj=subscriber)
if request.method == 'POST' and form.validate_on_submit():
subscriber = form.update_entry(subscriber)
@ -46,7 +56,7 @@ class SubscriberView(FlaskView):
def remove(self):
data = request.get_json()
sid = data['sid']
subscriber = SubscriberUser.objects(id=sid).first()
subscriber = _get_subscriber_by_id(sid)
if subscriber:
subscriber.delete()
return jsonify(status='ok'), 200

View file

@ -1,6 +1,6 @@
flask>=1.0.0
flask_socketio>=1.0
flask_mongoengine>=0.8.2
flask_pymodm>=0.1.2
flask_login>=0.3.0
flask_mail>=0.7.1
flask_bootstrap>=3.3.7.1

View file

@ -2,7 +2,7 @@
import argparse
import os
import sys
from mongoengine import connect
from pymodm import connect
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
@ -22,7 +22,7 @@ if __name__ == '__main__':
email = argv.email
password = argv.password
mongo = connect(host=argv.mongo_uri)
mongo = connect(mongodb_uri=argv.mongo_uri)
if not mongo:
sys.exit(1)

View file

@ -2,7 +2,7 @@
import argparse
import os
import sys
from mongoengine import connect
from pymodm import connect
import mysql.connector
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

View file

@ -2,7 +2,7 @@
import argparse
import os
import sys
from mongoengine import connect
from pymodm import connect
import mysql.connector
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
@ -28,7 +28,7 @@ if __name__ == '__main__':
mysql_port = argv.mysql_port
server_id = argv.server_id
mongo = connect(host=argv.mongo_uri)
mongo = connect(uri=argv.mongo_uri)
if not mongo:
sys.exit(1)

View file

@ -2,7 +2,7 @@
import argparse
import os
import sys
from mongoengine import connect
from pymodm import connect
import mysql.connector
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

View file

@ -2,7 +2,7 @@
import argparse
import os
import sys
from mongoengine import connect
from pymodm import connect
import mysql.connector
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
@ -29,7 +29,7 @@ if __name__ == '__main__':
mysql_port = argv.mysql_port
server_id = argv.server_id
mongo = connect(host=argv.mongo_uri)
mongo = connect(uri=argv.mongo_uri)
if not mongo:
sys.exit(1)

View file

@ -11,8 +11,8 @@ if __name__ == '__main__':
name = p['name']
icon = p['icon']
group = p['group']
sid = p['input']['urls'][0]['id']
input = p['input']['urls'][0]['uri']
sid = p['input'][0]['id']
input = p['input'][0]['uri']
f.write('#EXTINF:{0} tvg-id="{1}" tvg-name="" tvg-logo="{3}" group-title="{4}",{2}\n{5}\n'.format(
idx,
sid,

View file

@ -2,7 +2,7 @@
import argparse
import os
import sys
from mongoengine import connect
from pymodm import connect
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
@ -16,7 +16,7 @@ if __name__ == '__main__':
argv = parser.parse_args()
mongo = connect(host=argv.mongo_uri)
mongo = connect(uri=argv.mongo_uri)
if mongo:
streams = IStream.objects()
f = open("out.m3u", "w")

View file

@ -2,7 +2,8 @@
import argparse
import os
import sys
from mongoengine import connect
from pymodm import connect
from bson.objectid import ObjectId
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
@ -12,6 +13,16 @@ from pyfastocloud_models.utils.m3u_parser import M3uParser
PROJECT_NAME = 'test_life'
def _get_server_by_id(sid: str):
try:
server = ServiceSettings.objects.get({'_id': ObjectId(sid)})
except ServiceSettings.DoesNotExist:
return None
else:
return server
if __name__ == '__main__':
parser = argparse.ArgumentParser(prog=PROJECT_NAME, usage='%(prog)s [options]')
parser.add_argument('uri', help='Uri to m3u8 list')
@ -21,7 +32,7 @@ if __name__ == '__main__':
mongo = connect(argv.mongo_uri)
if mongo:
service_settings = ServiceSettings.objects().first()
service_settings = ServiceSettings.objects.get({})
m3u_parser = M3uParser()
m3u_parser.read_m3u(argv.uri)
m3u_parser.parse()