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

* Up

* Review

* More logs

* Connect without check

* Alias

* Review

* Fixes
This commit is contained in:
Alexandr Topilski 2020-02-17 17:12:18 +03:00 committed by GitHub
parent 115483e7b5
commit d50b6634f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 142 additions and 84 deletions

View file

@ -3,7 +3,7 @@ import os
from omdb import OMDBClient from omdb import OMDBClient
from flask import Flask from flask import Flask
from flask_mongoengine import MongoEngine from flask_pymodm import PyModm
from flask_login import LoginManager from flask_login import LoginManager
from flask_mail import Mail from flask_mail import Mail
from flask_bootstrap import Bootstrap from flask_bootstrap import Bootstrap
@ -48,7 +48,7 @@ def init_project(static_folder, *args):
app.wsgi_app = ProxyFix(app.wsgi_app) app.wsgi_app = ProxyFix(app.wsgi_app)
bootstrap = Bootstrap(app) bootstrap = Bootstrap(app)
db = MongoEngine(app) db = PyModm(app)
mail = Mail(app) mail = Mail(app)
socketio = SocketIO(app) socketio = SocketIO(app)
login_manager = LoginManager(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 import pyfastocloud_models.constants as constants
class M3uParseStreams(Document): class M3uParseStreams(MongoModel):
meta = {'allow_inheritance': False, 'collection': 'm3uparse_streams', 'auto_create_index': False} class Meta:
name = StringField(unique=True, max_length=constants.MAX_STREAM_NAME_LENGTH, collection_name = 'm3uparse_streams'
min_length=constants.MIN_STREAM_NAME_LENGTH,
required=True) name = fields.CharField(max_length=constants.MAX_STREAM_NAME_LENGTH,
tvg_id = ListField(StringField(unique=True), default=[]) min_length=constants.MIN_STREAM_NAME_LENGTH,
tvg_logo = ListField(StringField(unique=True), default=[]) required=True)
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): class M3uParseVods(MongoModel):
meta = {'allow_inheritance': False, 'collection': 'm3uparse_vods', 'auto_create_index': False} class Meta:
name = StringField(unique=True, max_length=constants.MAX_STREAM_NAME_LENGTH, collection_name = 'm3uparse_vods'
min_length=constants.MIN_STREAM_NAME_LENGTH,
required=True) name = fields.CharField(max_length=constants.MAX_STREAM_NAME_LENGTH,
tvg_logo = ListField(StringField(unique=True), default=[]) min_length=constants.MIN_STREAM_NAME_LENGTH,
group = ListField(StringField(unique=True), default=[]) required=True)
tvg_logo = fields.ListField(fields.CharField(), default=[])
group = fields.ListField(fields.CharField(), default=[])

View file

@ -15,11 +15,11 @@ class M3uParseStreamsView(FlaskView):
@login_required @login_required
def show(self): def show(self):
m3u = M3uParseStreams.objects() m3u = M3uParseStreams.objects.all()
return render_template('autofill/show_streams.html', m3u=m3u) return render_template('autofill/show_streams.html', m3u=m3u)
def show_anonim(self): def show_anonim(self):
m3u = M3uParseStreams.objects() m3u = M3uParseStreams.objects.all()
return render_template('autofill/show_streams_anonim.html', m3u=m3u) return render_template('autofill/show_streams_anonim.html', m3u=m3u)
@route('/search/<sid>', methods=['GET']) @route('/search/<sid>', methods=['GET'])
@ -82,11 +82,11 @@ class M3uParseVodsView(FlaskView):
@login_required @login_required
def show(self): def show(self):
m3u = M3uParseVods.objects() m3u = M3uParseVods.objects.all()
return render_template('autofill/show_vods.html', m3u=m3u) return render_template('autofill/show_vods.html', m3u=m3u)
def show_anonim(self): def show_anonim(self):
m3u = M3uParseVods.objects() m3u = M3uParseVods.objects.all()
return render_template('autofill/show_vods_anonim.html', m3u=m3u) return render_template('autofill/show_vods_anonim.html', m3u=m3u)
@route('/search/<sid>', methods=['GET']) @route('/search/<sid>', methods=['GET'])

@ -1 +1 @@
Subproject commit 1a9515a0e359ab708d966dee3a0fb8733c6ba4b9 Subproject commit 1dfd85657becb2506e9b6ef5ce822c61b9588076

View file

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

View file

@ -23,13 +23,13 @@ class EpgView(FlaskView):
@login_required @login_required
def show(self): def show(self):
epgs = Epg.objects() epgs = Epg.objects.all()
return render_template('epg/show.html', epgs=epgs) return render_template('epg/show.html', epgs=epgs)
@route('/update_urls', methods=['GET']) @route('/update_urls', methods=['GET'])
@login_required @login_required
def update_urls(self): def update_urls(self):
epgs = Epg.objects() epgs = Epg.objects.all()
epg_service_in_directory = app.config.get('EPG_IN_DIRECTORY') epg_service_in_directory = app.config.get('EPG_IN_DIRECTORY')
result = [] result = []

View file

@ -10,6 +10,25 @@ from app import app, mail, login_manager
from app.home.entry import ProviderAdminUser from app.home.entry import ProviderAdminUser
from app.home.forms import ContactForm from app.home.forms import ContactForm
from app.common.provider.forms import SignupForm, SigninForm 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): def flash_success(text: str):
@ -33,7 +52,7 @@ def post_login(form: SigninForm):
return render_template('home/login.html', form=form) return render_template('home/login.html', form=form)
email = form.email.data.lower() email = form.email.data.lower()
check_user = ProviderAdminUser.objects(email=email).first() check_user = _get_provider_by_email(email)
if not check_user: if not check_user:
flash_error('User not found.') flash_error('User not found.')
return render_template('home/login.html', form=form) return render_template('home/login.html', form=form)
@ -42,7 +61,7 @@ def post_login(form: SigninForm):
flash_error('User not active.') flash_error('User not active.')
return render_template('home/login.html', form=form) 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.') flash_error('Invalid password.')
return render_template('home/login.html', form=form) return render_template('home/login.html', form=form)
@ -95,7 +114,7 @@ class HomeView(FlaskView):
try: try:
email = self._confirm_link_generator.loads(token, salt=HomeView.SALT_LINK, email = self._confirm_link_generator.loads(token, salt=HomeView.SALT_LINK,
max_age=HomeView.CONFIRM_LINK_TTL) max_age=HomeView.CONFIRM_LINK_TTL)
confirm_user = ProviderAdminUser.objects(email=email).first() confirm_user = _get_provider_by_email(email)
if confirm_user: if confirm_user:
confirm_user.status = ProviderAdminUser.Status.ACTIVE confirm_user.status = ProviderAdminUser.Status.ACTIVE
confirm_user.save() confirm_user.save()
@ -140,7 +159,7 @@ class HomeView(FlaskView):
flash_error('Invalid email.') flash_error('Invalid email.')
return render_template('home/register.html', form=form) 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: if existing_user:
return redirect(url_for('HomeView:signin')) return redirect(url_for('HomeView:signin'))
@ -165,7 +184,7 @@ class HomeView(FlaskView):
@login_manager.user_loader @login_manager.user_loader
def load_user(user_id): def load_user(user_id):
return ProviderAdminUser.objects(pk=user_id).first() return _get_provider_by_id(user_id)
def page_not_found(e): def page_not_found(e):

View file

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

View file

@ -3,6 +3,7 @@ import os
from flask_classy import FlaskView, route from flask_classy import FlaskView, route
from flask import render_template, redirect, url_for, request, jsonify, Response from flask import render_template, redirect, url_for, request, jsonify, Response
from flask_login import login_required, current_user from flask_login import login_required, current_user
from bson.objectid import ObjectId
from app import get_runtime_folder from app import get_runtime_folder
from app.common.service.forms import ServiceSettingsForm, ActivateForm, UploadM3uForm, ServerProviderForm 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 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 # routes
class ServiceView(FlaskView): class ServiceView(FlaskView):
route_base = "/service/" route_base = "/service/"
@ -49,28 +59,28 @@ class ServiceView(FlaskView):
stream = server.make_proxy_vod() stream = server.make_proxy_vod()
elif stream_type == constants.StreamType.RELAY: elif stream_type == constants.StreamType.RELAY:
stream = server.make_relay_stream() stream = server.make_relay_stream()
stream.output.urls[0] = stream.generate_http_link(constants.HlsType.HLS_PULL, stream.output = [stream.generate_http_link(constants.HlsType.HLS_PULL,
oid=stream.output.urls[0].id) oid=stream.output[0].id)]
elif stream_type == constants.StreamType.ENCODE: elif stream_type == constants.StreamType.ENCODE:
stream = server.make_encode_stream() stream = server.make_encode_stream()
stream.output.urls[0] = stream.generate_http_link(constants.HlsType.HLS_PULL, stream.output = [stream.generate_http_link(constants.HlsType.HLS_PULL,
oid=stream.output.urls[0].id) oid=stream.output[0].id)]
elif stream_type == constants.StreamType.VOD_RELAY: elif stream_type == constants.StreamType.VOD_RELAY:
stream = server.make_vod_relay_stream() stream = server.make_vod_relay_stream()
stream.output.urls[0] = stream.generate_vod_link(constants.HlsType.HLS_PULL, stream.output = [stream.generate_vod_link(constants.HlsType.HLS_PULL,
oid=stream.output.urls[0].id) oid=stream.output[0].id)]
elif stream_type == constants.StreamType.VOD_ENCODE: elif stream_type == constants.StreamType.VOD_ENCODE:
stream = server.make_vod_encode_stream() stream = server.make_vod_encode_stream()
stream.output.urls[0] = stream.generate_vod_link(constants.HlsType.HLS_PULL, stream.output = [stream.generate_vod_link(constants.HlsType.HLS_PULL,
oid=stream.output.urls[0].id) oid=stream.output[0].id)]
elif stream_type == constants.StreamType.COD_RELAY: elif stream_type == constants.StreamType.COD_RELAY:
stream = server.make_cod_relay_stream() stream = server.make_cod_relay_stream()
stream.output.urls[0] = stream.generate_cod_link(constants.HlsType.HLS_PULL, stream.output = [stream.generate_cod_link(constants.HlsType.HLS_PULL,
oid=stream.output.urls[0].id) oid=stream.output[0].id)]
elif stream_type == constants.StreamType.COD_ENCODE: elif stream_type == constants.StreamType.COD_ENCODE:
stream = server.make_cod_encode_stream() stream = server.make_cod_encode_stream()
stream.output.urls[0] = stream.generate_cod_link(constants.HlsType.HLS_PULL, stream.output = [stream.generate_cod_link(constants.HlsType.HLS_PULL,
oid=stream.output.urls[0].id) oid=stream.output[0].id)]
elif stream_type == constants.StreamType.CATCHUP: elif stream_type == constants.StreamType.CATCHUP:
stream = server.make_catchup_stream() stream = server.make_catchup_stream()
else: else:
@ -78,9 +88,9 @@ class ServiceView(FlaskView):
input_url = file['link'] input_url = file['link']
if stream_type == constants.StreamType.PROXY or stream_type == constants.StreamType.VOD_PROXY: if stream_type == constants.StreamType.PROXY or stream_type == constants.StreamType.VOD_PROXY:
stream.output.urls[0].uri = input_url stream.output[0].uri = input_url
else: else:
stream.input.urls[0].uri = input_url stream.input[0].uri = input_url
stream.tvg_logo = default_logo_path stream.tvg_logo = default_logo_path
@ -171,7 +181,7 @@ class ServiceView(FlaskView):
@login_required @login_required
@route('/playlist/<sid>/master.m3u', methods=['GET']) @route('/playlist/<sid>/master.m3u', methods=['GET'])
def playlist(self, sid): def playlist(self, sid):
server = ServiceSettings.objects(id=sid).first() server = _get_server_by_id(sid)
if server: if server:
return Response(server.generate_playlist(), mimetype='application/x-mpequrl'), 200 return Response(server.generate_playlist(), mimetype='application/x-mpequrl'), 200
@ -196,7 +206,7 @@ class ServiceView(FlaskView):
@login_required @login_required
def providers(self, sid): def providers(self, sid):
server = ServiceSettings.objects(id=sid).first() server = _get_server_by_id(sid)
if server: if server:
return render_template('service/providers.html', server=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(): if request.method == 'POST' and form.validate_on_submit():
email = form.email.data.lower() email = form.email.data.lower()
provider = ProviderAdminUser.objects(email=email).first() provider = ProviderAdminUser.objects(email=email).first()
server = ServiceSettings.objects(id=sid).first() server = _get_server_by_id(sid)
if server and provider: if server and provider:
admin = ProviderPair(provider.id, form.role.data) admin = ProviderPair(provider.id, form.role.data)
server.add_provider(admin) server.add_provider(admin)
@ -224,7 +234,7 @@ class ServiceView(FlaskView):
data = request.get_json() data = request.get_json()
pid = data['pid'] pid = data['pid']
provider = ProviderAdminUser.objects(id=pid).first() provider = ProviderAdminUser.objects(id=pid).first()
server = ServiceSettings.objects(id=sid).first() server = _get_server_by_id(sid)
if provider and server: if provider and server:
server.remove_provider(provider) server.remove_provider(provider)
provider.remove_server(server) provider.remove_server(server)
@ -249,7 +259,7 @@ class ServiceView(FlaskView):
@route('/remove', methods=['POST']) @route('/remove', methods=['POST'])
def remove(self): def remove(self):
sid = request.form['sid'] sid = request.form['sid']
server = ServiceSettings.objects(id=sid).first() server = _get_server_by_id(sid)
if server: if server:
server.delete() server.delete()
return jsonify(status='ok'), 200 return jsonify(status='ok'), 200
@ -259,7 +269,7 @@ class ServiceView(FlaskView):
@login_required @login_required
@route('/edit/<sid>', methods=['GET', 'POST']) @route('/edit/<sid>', methods=['GET', 'POST'])
def edit(self, sid): def edit(self, sid):
server = ServiceSettings.objects(id=sid).first() server = _get_server_by_id(sid)
form = ServiceSettingsForm(obj=server) form = ServiceSettingsForm(obj=server)
if request.method == 'POST' and form.validate_on_submit(): if request.method == 'POST' and form.validate_on_submit():

View file

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

View file

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

View file

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

View file

@ -2,7 +2,7 @@
import argparse import argparse
import os import os
import sys import sys
from mongoengine import connect from pymodm import connect
sys.path.append(os.path.join(os.path.dirname(__file__), '..')) sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
@ -22,10 +22,7 @@ if __name__ == '__main__':
email = argv.email email = argv.email
password = argv.password password = argv.password
mongo = connect(host=argv.mongo_uri) connect(mongodb_uri=argv.mongo_uri)
if not mongo:
sys.exit(1)
new_user = ProviderAdminUser.make_provider(email=email.lower(), password=password, country=argv.country, new_user = ProviderAdminUser.make_provider(email=email.lower(), password=password, country=argv.country,
language=argv.language) language=argv.language)
new_user.status = ProviderAdminUser.Status.ACTIVE new_user.status = ProviderAdminUser.Status.ACTIVE

View file

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

View file

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

View file

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

View file

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

View file

@ -18,7 +18,7 @@ def import_streams_to_server(db, server: ServiceSettings):
if not len(urls): if not len(urls):
continue continue
stream.output.urls[0].uri = urls[0] stream.output[0].uri = urls[0]
stream.name = sql_entry['stream_display_name'] stream.name = sql_entry['stream_display_name']
tvg_logo = sql_entry['stream_icon'] tvg_logo = sql_entry['stream_icon']
if len(tvg_logo) < constants.MAX_URL_LENGTH: if len(tvg_logo) < constants.MAX_URL_LENGTH:

View file

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

View file

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

View file

@ -2,7 +2,8 @@
import argparse import argparse
import os import os
import sys 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__), '..')) 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' 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__': if __name__ == '__main__':
parser = argparse.ArgumentParser(prog=PROJECT_NAME, usage='%(prog)s [options]') parser = argparse.ArgumentParser(prog=PROJECT_NAME, usage='%(prog)s [options]')
parser.add_argument('uri', help='Uri to m3u8 list') parser.add_argument('uri', help='Uri to m3u8 list')
@ -21,13 +32,13 @@ if __name__ == '__main__':
mongo = connect(argv.mongo_uri) mongo = connect(argv.mongo_uri)
if mongo: if mongo:
service_settings = ServiceSettings.objects().first() service_settings = ServiceSettings.objects.get({})
m3u_parser = M3uParser() m3u_parser = M3uParser()
m3u_parser.read_m3u(argv.uri) m3u_parser.read_m3u(argv.uri)
m3u_parser.parse() m3u_parser.parse()
for file in m3u_parser.files: for file in m3u_parser.files:
stream = TestLifeStream.make_stream(service_settings) stream = TestLifeStream.make_stream(service_settings)
stream.input.urls[0].uri = file['link'] stream.input[0].uri = file['link']
stream.name = '{0}({1})'.format(file['tvg-group'], file['title']) stream.name = '{0}({1})'.format(file['tvg-group'], file['title'])
service_settings.streams.append(stream) service_settings.streams.append(stream)