mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2025-12-21 16:09:41 +01:00
added export to m3u
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
""" Module for IPTV and streams support """
|
""" Module for IPTV and streams support """
|
||||||
|
import re
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
@@ -53,5 +54,24 @@ def parse_m3u(path, profile):
|
|||||||
return services
|
return services
|
||||||
|
|
||||||
|
|
||||||
|
def export_to_m3u(path, bouquet):
|
||||||
|
pattern = re.compile(".*:(http.*):.*")
|
||||||
|
lines = ["#EXTM3U\n"]
|
||||||
|
|
||||||
|
for s in bouquet.services:
|
||||||
|
bq_type = s.type
|
||||||
|
if bq_type is BqServiceType.IPTV:
|
||||||
|
res = re.match(pattern, s.data)
|
||||||
|
if not res:
|
||||||
|
continue
|
||||||
|
data = res.group(1)
|
||||||
|
lines.append("#EXTINF:-1,{}\n{}\n".format(s.name, urllib.request.unquote(data.strip())))
|
||||||
|
elif bq_type is BqServiceType.MARKER:
|
||||||
|
pass
|
||||||
|
|
||||||
|
with open(path + "{}.m3u".format(bouquet.name), "w", encoding="utf-8") as file:
|
||||||
|
file.writelines(lines)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -11,8 +11,9 @@ from app.connections import http_request, HttpRequestType, download_data, Downlo
|
|||||||
TestException
|
TestException
|
||||||
from app.eparser import get_blacklist, write_blacklist, parse_m3u
|
from app.eparser import get_blacklist, write_blacklist, parse_m3u
|
||||||
from app.eparser import get_services, get_bouquets, write_bouquets, write_services, Bouquets, Bouquet, Service
|
from app.eparser import get_services, get_bouquets, write_bouquets, write_services, Bouquets, Bouquet, Service
|
||||||
from app.eparser.ecommons import CAS, Flag
|
from app.eparser.ecommons import CAS, Flag, BouquetService
|
||||||
from app.eparser.enigma.bouquets import BqServiceType
|
from app.eparser.enigma.bouquets import BqServiceType
|
||||||
|
from app.eparser.iptv import export_to_m3u
|
||||||
from app.eparser.neutrino.bouquets import BqType
|
from app.eparser.neutrino.bouquets import BqType
|
||||||
from app.properties import get_config, write_config, Profile
|
from app.properties import get_config, write_config, Profile
|
||||||
from app.tools.media import Player
|
from app.tools.media import Player
|
||||||
@@ -113,6 +114,7 @@ class Application(Gtk.Application):
|
|||||||
"on_locked": self.on_locked,
|
"on_locked": self.on_locked,
|
||||||
"on_model_changed": self.on_model_changed,
|
"on_model_changed": self.on_model_changed,
|
||||||
"on_import_m3u": self.on_import_m3u,
|
"on_import_m3u": self.on_import_m3u,
|
||||||
|
"on_export_to_m3u": self.on_export_to_m3u,
|
||||||
"on_import_bouquet": self.on_import_bouquet,
|
"on_import_bouquet": self.on_import_bouquet,
|
||||||
"on_import_bouquets": self.on_import_bouquets,
|
"on_import_bouquets": self.on_import_bouquets,
|
||||||
"on_backup_tool_show": self.on_backup_tool_show,
|
"on_backup_tool_show": self.on_backup_tool_show,
|
||||||
@@ -1362,6 +1364,25 @@ class Application(Gtk.Application):
|
|||||||
bq_services.append(ch.fav_id)
|
bq_services.append(ch.fav_id)
|
||||||
next(self.update_bouquet_services(self._fav_model, None, self._bq_selected), False)
|
next(self.update_bouquet_services(self._fav_model, None, self._bq_selected), False)
|
||||||
|
|
||||||
|
@run_idle
|
||||||
|
def on_export_to_m3u(self, item):
|
||||||
|
i_types = (BqServiceType.IPTV.value, BqServiceType.MARKER.value)
|
||||||
|
bq_services = [BouquetService(r[Column.FAV_SERVICE],
|
||||||
|
BqServiceType(r[Column.FAV_TYPE]),
|
||||||
|
r[Column.FAV_ID],
|
||||||
|
r[Column.FAV_NUM]) for r in self._fav_model if r[Column.FAV_TYPE] in i_types]
|
||||||
|
|
||||||
|
if not bq_services:
|
||||||
|
self.show_error_dialog("No data to save!")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not any(s.type is BqServiceType.IPTV for s in bq_services):
|
||||||
|
self.show_error_dialog("This list does not contains IPTV streams!")
|
||||||
|
return
|
||||||
|
|
||||||
|
path = self._options.get(self._profile).get("data_dir_path", "")
|
||||||
|
export_to_m3u(path, Bouquet(self._current_bq_name, None, bq_services, None, None))
|
||||||
|
|
||||||
def on_import_bouquet(self, item):
|
def on_import_bouquet(self, item):
|
||||||
profile = Profile(self._profile)
|
profile = Profile(self._profile)
|
||||||
model, paths = self._bouquets_view.get_selection().get_selected_rows()
|
model, paths = self._bouquets_view.get_selection().get_selected_rows()
|
||||||
|
|||||||
@@ -82,6 +82,11 @@ Author: Dmitriy Yefremov
|
|||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="stock">gtk-revert-to-saved</property>
|
<property name="stock">gtk-revert-to-saved</property>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkImage" id="export_to_m3u_image">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="stock">gtk-save-as</property>
|
||||||
|
</object>
|
||||||
<object class="GtkImage" id="extra_edit_image">
|
<object class="GtkImage" id="extra_edit_image">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
@@ -573,7 +578,7 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator">
|
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_3">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -626,7 +631,7 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_5">
|
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_2">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -643,7 +648,7 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_">
|
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_3">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -661,7 +666,7 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_2">
|
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_1">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -689,11 +694,21 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_6">
|
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_5">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="fav_add_iptv_popup_item">
|
||||||
|
<property name="label" translatable="yes">Add IPTV or stream service</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="image">network_transmit_receive_image</property>
|
||||||
|
<property name="use_stock">False</property>
|
||||||
|
<signal name="activate" handler="on_iptv" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImageMenuItem" id="fav_import_m3u_popup_item">
|
<object class="GtkImageMenuItem" id="fav_import_m3u_popup_item">
|
||||||
<property name="label" translatable="yes">Import m3u</property>
|
<property name="label" translatable="yes">Import m3u</property>
|
||||||
@@ -706,17 +721,17 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImageMenuItem" id="fav_add_iptv_popup_item">
|
<object class="GtkImageMenuItem" id="fav_export_m3u_popup_item">
|
||||||
<property name="label" translatable="yes">Add IPTV or stream service</property>
|
<property name="label" translatable="yes">Export to m3u</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="image">network_transmit_receive_image</property>
|
<property name="image">export_to_m3u_image</property>
|
||||||
<property name="use_stock">False</property>
|
<property name="use_stock">False</property>
|
||||||
<signal name="activate" handler="on_iptv" swapped="no"/>
|
<signal name="activate" handler="on_export_to_m3u" swapped="no"/>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_10">
|
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_6">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -752,7 +767,7 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_3">
|
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_8">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -790,7 +805,7 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_5">
|
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_9">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -806,7 +821,7 @@ Author: Dmitriy Yefremov
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_1">
|
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_10">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
Reference in New Issue
Block a user