mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-02-20 05:27:55 +01:00
added saving of bouquet file names
This commit is contained in:
@@ -17,7 +17,8 @@ class BqServiceType(Enum):
|
||||
ALT = "ALT" # Service with alternatives
|
||||
|
||||
|
||||
Bouquet = namedtuple("Bouquet", ["name", "type", "services", "locked", "hidden"])
|
||||
Bouquet = namedtuple("Bouquet", ["name", "type", "services", "locked", "hidden", "file"])
|
||||
Bouquet.__new__.__defaults__ = (None, BqServiceType.DEFAULT, [], None, None, None) # For Python3 < 3.7
|
||||
Bouquets = namedtuple("Bouquets", ["name", "type", "bouquets"])
|
||||
BouquetService = namedtuple("BouquetService", ["name", "type", "data", "num"])
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ class BouquetsWriter:
|
||||
self._force_bq_names = force_bq_names
|
||||
self._marker_index = 1
|
||||
self._space_index = 0
|
||||
self._alt_index = 0
|
||||
self._alt_names = set()
|
||||
|
||||
def write(self):
|
||||
line = []
|
||||
@@ -38,11 +38,21 @@ class BouquetsWriter:
|
||||
for bqs in self._bouquets:
|
||||
line.clear()
|
||||
line.append("#NAME {}\n".format(bqs.name))
|
||||
bq_file_names = {b.file for b in bqs.bouquets}
|
||||
count = 1
|
||||
|
||||
for bq in bqs.bouquets:
|
||||
bq_name = bq.file
|
||||
if not bq_name:
|
||||
if self._force_bq_names:
|
||||
bq_name = re.sub(pattern, "_", bq.name)
|
||||
else:
|
||||
bq_name = "de{0:02d}".format(count)
|
||||
while bq_name in bq_file_names:
|
||||
count += 1
|
||||
bq_name = "de{0:02d}".format(count)
|
||||
bq_file_names.add(bq_name)
|
||||
|
||||
for index, bq in enumerate(bqs.bouquets):
|
||||
bq_name = _DEFAULT_BOUQUET_NAME
|
||||
if index > 0:
|
||||
bq_name = re.sub(pattern, "_", bq.name) if self._force_bq_names else "de{0:02d}".format(index)
|
||||
line.append(self._SERVICE.format(2 if bq.type == BqType.RADIO.value else 1, bq_name, bq.type))
|
||||
self.write_bouquet(self._path + "userbouquet.{}.{}".format(bq_name, bq.type), bq.name, bq.services)
|
||||
|
||||
@@ -68,12 +78,13 @@ class BouquetsWriter:
|
||||
services = srv.transponder
|
||||
if services:
|
||||
p = Path(path)
|
||||
alt_name = srv.data_id
|
||||
f_name = "alternatives.{}{}".format(alt_name, p.suffix)
|
||||
|
||||
if self._force_bq_names:
|
||||
alt_name = re.sub(self._ALT_PAT, "_", srv.service).lower()
|
||||
f_name = "alternatives.{}{}".format(alt_name, p.suffix)
|
||||
else:
|
||||
f_name = "alternatives.de{:02d}{}".format(self._alt_index, p.suffix)
|
||||
self._alt_index += 1
|
||||
|
||||
alt_path = "{}/{}".format(p.parent, f_name)
|
||||
bouquet.append(self._ALT.format(f_name))
|
||||
self.write_bouquet(alt_path, srv.service, services)
|
||||
@@ -133,7 +144,7 @@ class BouquetsReader:
|
||||
else:
|
||||
real_b_names[rb_name] = 0
|
||||
|
||||
bouquets[2].append(Bouquet(rb_name, bq_type, services, None, None))
|
||||
bouquets[2].append(Bouquet(rb_name, bq_type, services, None, None, b_name))
|
||||
else:
|
||||
raise ValueError("No bouquet name found for: {}".format(line))
|
||||
|
||||
@@ -167,7 +178,7 @@ class BouquetsReader:
|
||||
if alt:
|
||||
alt_name, alt_type = alt.group(1), alt.group(2)
|
||||
alt_bq_name, alt_srvs = BouquetsReader.get_bouquet(path, alt_name, alt_type, "alternatives")
|
||||
services.append(BouquetService(alt_bq_name, BqServiceType.ALT, srv.lstrip(), tuple(alt_srvs)))
|
||||
services.append(BouquetService(alt_bq_name, BqServiceType.ALT, alt_name, tuple(alt_srvs)))
|
||||
elif srv_data[0].strip() in BouquetsReader._STREAM_TYPES or srv_data[10].startswith(("http", "rtsp")):
|
||||
stream_data, sep, desc = srv.partition("#DESCRIPTION")
|
||||
desc = desc.lstrip(":").strip() if desc else srv_data[-1].strip()
|
||||
|
||||
@@ -181,6 +181,9 @@ class Application(Gtk.Application):
|
||||
self._picons_buffer = []
|
||||
self._services = {}
|
||||
self._bouquets = {}
|
||||
self._bq_file = {}
|
||||
self._alt_file = set()
|
||||
self._alt_counter = 1
|
||||
self._data_hash = 0
|
||||
# For bouquets with different names of services in bouquet and main list
|
||||
self._extra_bouquets = {}
|
||||
@@ -1481,9 +1484,9 @@ class Application(Gtk.Application):
|
||||
self.append_bouquet(bq, row.iter)
|
||||
|
||||
def append_bouquet(self, bq, parent):
|
||||
name, bt_type, locked, hidden = bq.name, bq.type, bq.locked, bq.hidden
|
||||
self._bouquets_model.append(parent, [name, locked, hidden, bt_type])
|
||||
bq_id = "{}:{}".format(name, bt_type)
|
||||
name, bq_type, locked, hidden = bq.name, bq.type, bq.locked, bq.hidden
|
||||
self._bouquets_model.append(parent, [name, locked, hidden, bq_type])
|
||||
bq_id = "{}:{}".format(name, bq_type)
|
||||
services = []
|
||||
extra_services = {} # for services with different names in bouquet and main list
|
||||
agr = [None] * 7
|
||||
@@ -1508,14 +1511,16 @@ class Application(Gtk.Application):
|
||||
self._picons.get(picon_id, None), picon_id, *agr, data_id, fav_id, None)
|
||||
self._services[fav_id] = srv
|
||||
elif s_type is BqServiceType.ALT:
|
||||
self._alt_file.add("{}:{}".format(srv.data, bq_type))
|
||||
srv = Service(None, None, None, srv.name, locked, None, None, s_type.name,
|
||||
None, None, *agr, fav_id, fav_id, srv.num)
|
||||
None, None, *agr, srv.data, fav_id, srv.num)
|
||||
self._services[fav_id] = srv
|
||||
elif srv.name:
|
||||
extra_services[fav_id] = srv.name
|
||||
services.append(fav_id)
|
||||
|
||||
self._bouquets[bq_id] = services
|
||||
self._bq_file[bq_id] = bq.file
|
||||
if extra_services:
|
||||
self._extra_bouquets[bq_id] = extra_services
|
||||
|
||||
@@ -1574,7 +1579,10 @@ class Application(Gtk.Application):
|
||||
self._services.clear()
|
||||
self._rows_buffer.clear()
|
||||
self._picons.clear()
|
||||
self._alt_file.clear()
|
||||
self._alt_counter = 1
|
||||
self._bouquets.clear()
|
||||
self._bq_file.clear()
|
||||
self._extra_bouquets.clear()
|
||||
self._current_bq_name = None
|
||||
self._bq_name_label.set_text("")
|
||||
@@ -1625,7 +1633,7 @@ class Application(Gtk.Application):
|
||||
if profile is SettingsType.ENIGMA_2:
|
||||
bq_s = self.get_enigma_bq_services(bq_s, ex_s)
|
||||
|
||||
bq = Bouquet(bq_name, bq_type, bq_s, locked, hidden)
|
||||
bq = Bouquet(bq_name, bq_type, bq_s, locked, hidden, self._bq_file.get(bq_id, None))
|
||||
bqs.append(bq)
|
||||
if len(b_path) == 1:
|
||||
bouquets.append(Bouquets(*model.get(itr, Column.BQ_NAME, Column.BQ_TYPE), bqs if bqs else []))
|
||||
@@ -1682,9 +1690,9 @@ class Application(Gtk.Application):
|
||||
|
||||
if profile is SettingsType.ENIGMA_2:
|
||||
parent = self._bouquets_model.append(None, ["Bouquets (TV)", None, None, BqType.TV.value])
|
||||
self.append_bouquet(Bouquet("Favourites (TV)", BqType.TV.value, [], None, None), parent)
|
||||
self.append_bouquet(Bouquet("Favourites (TV)", BqType.TV.value, [], None, None, "favourites"), parent)
|
||||
parent = self._bouquets_model.append(None, ["Bouquets (Radio)", None, None, BqType.RADIO.value])
|
||||
self.append_bouquet(Bouquet("Favourites (Radio)", BqType.RADIO.value, [], None, None), parent)
|
||||
self.append_bouquet(Bouquet("Favourites (Radio)", BqType.RADIO.value, [], None, None, "favourites"), parent)
|
||||
elif profile is SettingsType.NEUTRINO_MP:
|
||||
self._bouquets_model.append(None, ["Providers", None, None, BqType.BOUQUET.value])
|
||||
self._bouquets_model.append(None, ["FAV", None, None, BqType.TV.value])
|
||||
@@ -2849,6 +2857,9 @@ class Application(Gtk.Application):
|
||||
model_name = get_base_model(model).get_name()
|
||||
if model_name == self.FAV_MODEL_NAME:
|
||||
srv_type = model.get_value(model.get_iter(paths), Column.FAV_TYPE)
|
||||
if srv_type == BqServiceType.ALT.name:
|
||||
return self.show_error_dialog("Operation not allowed in this context!")
|
||||
|
||||
if srv_type in self._marker_types:
|
||||
return self.on_rename(view)
|
||||
elif srv_type == BqServiceType.IPTV.name:
|
||||
@@ -2902,6 +2913,7 @@ class Application(Gtk.Application):
|
||||
model.set_value(itr, 0, response)
|
||||
old_bq_name = "{}:{}".format(bq_name, bq_type)
|
||||
self._bouquets[bq] = self._bouquets.pop(old_bq_name)
|
||||
self._bq_file[bq] = self._bq_file.pop(old_bq_name, None)
|
||||
self._current_bq_name = response
|
||||
self._bq_name_label.set_text(self._current_bq_name)
|
||||
self._bq_selected = bq
|
||||
@@ -3052,7 +3064,8 @@ class Application(Gtk.Application):
|
||||
return
|
||||
|
||||
row = model[paths][:]
|
||||
if row[Column.FAV_TYPE] in {BqServiceType.MARKER.name, BqServiceType.SPACE.name, BqServiceType.ALT.name}:
|
||||
s_types = {BqServiceType.MARKER.name, BqServiceType.SPACE.name, BqServiceType.ALT.name, BqServiceType.IPTV.name}
|
||||
if row[Column.FAV_TYPE] in s_types:
|
||||
self.show_error_dialog("Operation not allowed in this context!")
|
||||
return
|
||||
|
||||
@@ -3061,7 +3074,16 @@ class Application(Gtk.Application):
|
||||
if not srv or not bq:
|
||||
return
|
||||
|
||||
bq_name, sep, bq_type = self._bq_selected.partition(":")
|
||||
fav_id = srv.fav_id
|
||||
|
||||
key = "de{:02d}:{}".format(self._alt_counter, bq_type)
|
||||
# Generating file name for alternative
|
||||
while key in self._alt_file:
|
||||
self._alt_counter += 1
|
||||
key = "de{:02d}:{}".format(self._alt_counter, bq_type)
|
||||
|
||||
alt_name = "de{:02d}".format(self._alt_counter)
|
||||
alt_id = "alternatives_{}_{}".format(self._bq_selected, fav_id)
|
||||
if alt_id in bq:
|
||||
self.show_error_dialog("A similar service is already in this list!")
|
||||
@@ -3070,7 +3092,7 @@ class Application(Gtk.Application):
|
||||
dt, it = BqServiceType.DEFAULT, BqServiceType.IPTV
|
||||
bq_srv = BouquetService(None, dt if srv.service_type != it.name else it, fav_id, 0)
|
||||
s_type = BqServiceType.ALT.name
|
||||
a_srv = srv._replace(service_type=s_type, pos=None, fav_id=alt_id, data_id=alt_id, transponder=(bq_srv,))
|
||||
a_srv = srv._replace(service_type=s_type, pos=None, data_id=alt_name, fav_id=alt_id, transponder=(bq_srv,))
|
||||
try:
|
||||
index = bq.index(fav_id)
|
||||
except ValueError as e:
|
||||
@@ -3078,6 +3100,7 @@ class Application(Gtk.Application):
|
||||
else:
|
||||
bq[index] = alt_id
|
||||
self._services[alt_id] = a_srv
|
||||
self._alt_file.add(key)
|
||||
data = {Column.FAV_CODED: srv.coded, Column.FAV_SERVICE: srv.service, Column.FAV_LOCKED: srv.locked,
|
||||
Column.FAV_HIDE: srv.hide, Column.FAV_TYPE: s_type, Column.FAV_POS: None,
|
||||
Column.FAV_ID: alt_id, Column.FAV_PICON: self._picons.get(srv.picon_id, None)}
|
||||
|
||||
Reference in New Issue
Block a user