mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-05-09 05:37:33 +02:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c58b9395b | ||
|
|
021b2b08cf | ||
|
|
0d68e43212 | ||
|
|
751e633a51 | ||
|
|
9ff96f2e1d | ||
|
|
3e85fa0149 | ||
|
|
ab5620f9d1 | ||
|
|
bceddc199b | ||
|
|
4f26855ec3 | ||
|
|
15b8483107 | ||
|
|
f4dac57d06 | ||
|
|
71f7b3a570 | ||
|
|
265fb59f0b | ||
|
|
5b090672d9 | ||
|
|
aa8f2a8df0 |
@@ -6,16 +6,16 @@ from threading import Thread, Timer
|
||||
from gi.repository import GLib
|
||||
|
||||
_LOG_FILE = "demon-editor.log"
|
||||
_DATE_FORMAT = "%d-%m-%y %H:%M:%S"
|
||||
|
||||
LOG_DATE_FORMAT = "%d-%m-%y %H:%M:%S"
|
||||
LOGGER_NAME = "main_logger"
|
||||
LOG_FORMAT = "%(asctime)s %(message)s"
|
||||
|
||||
|
||||
def init_logger():
|
||||
logging.Logger(LOGGER_NAME)
|
||||
logging.basicConfig(level=logging.INFO,
|
||||
format="%(asctime)s %(message)s",
|
||||
datefmt=_DATE_FORMAT,
|
||||
format=LOG_FORMAT,
|
||||
datefmt=LOG_DATE_FORMAT,
|
||||
handlers=[logging.FileHandler(_LOG_FILE), logging.StreamHandler()])
|
||||
log("Logging is enabled.", level=logging.INFO)
|
||||
|
||||
|
||||
@@ -113,19 +113,21 @@ class UtfFTP(FTP):
|
||||
def download_file(self, name, save_path, callback=None):
|
||||
with open(save_path + name, "wb") as f:
|
||||
msg = "Downloading file: {}. Status: {}"
|
||||
try:
|
||||
resp = str(self.retrbinary("RETR " + name, f.write))
|
||||
except all_errors as e:
|
||||
resp = str(e)
|
||||
msg = msg.format(name, e)
|
||||
log(msg.rstrip())
|
||||
else:
|
||||
msg = msg.format(name, resp)
|
||||
|
||||
resp = self.download_binary(name, f)
|
||||
msg = msg.format(name, resp)
|
||||
callback(msg) if callback else log(msg.rstrip())
|
||||
|
||||
return resp
|
||||
|
||||
def download_binary(self, src, fo):
|
||||
try:
|
||||
resp = str(self.retrbinary(f"RETR {src}", fo.write))
|
||||
except all_errors as e:
|
||||
resp = str(e)
|
||||
log(f"Error. {e}")
|
||||
|
||||
return resp
|
||||
|
||||
def download_dir(self, path, save_path, callback=None):
|
||||
""" Downloads directory from FTP with all contents.
|
||||
|
||||
|
||||
@@ -228,7 +228,7 @@ class XmlTvReader(Reader):
|
||||
|
||||
TIME_FORMAT_STR = "%Y%m%d%H%M%S %z"
|
||||
|
||||
Service = namedtuple("Service", ["id", "name", "logo", "events"])
|
||||
Service = namedtuple("Service", ["id", "names", "logo", "events"])
|
||||
Event = namedtuple("EpgEvent", ["start", "duration", "title", "desc"])
|
||||
|
||||
def __init__(self, path, url):
|
||||
@@ -297,14 +297,15 @@ class XmlTvReader(Reader):
|
||||
utc = dt.timestamp()
|
||||
offset = datetime.now() - dt
|
||||
|
||||
for srv in filter(lambda s: s.name in names, self._ids.values()):
|
||||
for srv in filter(lambda s: any(name in names for name in s.names), self._ids.values()):
|
||||
ev = list(filter(lambda s: s.start < utc, srv.events))
|
||||
if ev:
|
||||
ev = ev[-1]
|
||||
start = datetime.fromtimestamp(ev.start) + offset
|
||||
end_time = datetime.fromtimestamp(ev.duration) + offset
|
||||
tm = f"{start.strftime('%H:%M')} - {end_time.strftime('%H:%M')}"
|
||||
events[srv.name] = EpgEvent(srv.name, ev.title, tm, ev.desc, ev)
|
||||
for n in srv.names:
|
||||
events[n] = EpgEvent(n, ev.title, tm, ev.desc, ev)
|
||||
|
||||
return events
|
||||
|
||||
@@ -324,13 +325,9 @@ class XmlTvReader(Reader):
|
||||
event, element = node
|
||||
if element.tag == self.CH_TAG:
|
||||
ch_id = element.get("id", None)
|
||||
name, logo = None, None
|
||||
for c in element:
|
||||
if c.tag == self.DSP_NAME_TAG:
|
||||
name = c.text
|
||||
elif c.tag == self.ICON_TAG:
|
||||
logo = c.get("src", None)
|
||||
self._ids[ch_id] = self.Service(ch_id, name, logo, [])
|
||||
logo = None # Currently not in use.
|
||||
# Since a service can have several names, we will store a set of names in the "names" field!
|
||||
self._ids[ch_id] = self.Service(ch_id, {c.text for c in element if c.tag == self.DSP_NAME_TAG}, logo, [])
|
||||
elif element.tag == self.PR_TAG:
|
||||
channel = self._ids.get(element.get(self.CH_TAG, None), None)
|
||||
if channel:
|
||||
|
||||
@@ -32,7 +32,7 @@ from datetime import datetime
|
||||
|
||||
from gi.repository import Gdk, Gtk, GObject
|
||||
|
||||
from app.commons import run_task, log, _DATE_FORMAT, run_with_delay
|
||||
from app.commons import run_task, log, LOG_DATE_FORMAT, run_with_delay
|
||||
from app.settings import IS_DARWIN, IS_LINUX, IS_WIN
|
||||
|
||||
|
||||
@@ -528,7 +528,7 @@ class Recorder:
|
||||
|
||||
path = self._settings.records_path
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
d_now = datetime.now().strftime(_DATE_FORMAT)
|
||||
d_now = datetime.now().strftime(LOG_DATE_FORMAT)
|
||||
d_now = d_now.replace(" ", "_").replace(":", "-") if IS_WIN else d_now.replace(" ", "_")
|
||||
path = f"{path}{name.replace(' ', '_')}_{d_now}"
|
||||
cmd = self.get_transcoding_cmd(path) if self._settings.activate_transcoding else self._CMD.format(path)
|
||||
|
||||
@@ -250,7 +250,7 @@ def backup_data(path, backup_path, move=True):
|
||||
src, dst = os.path.join(path, file), backup_path + file
|
||||
shutil.move(src, dst) if move else shutil.copy(src, dst)
|
||||
# Compressing to zip and delete remaining files.
|
||||
zip_file = shutil.make_archive(backup_path, "zip", backup_path)
|
||||
zip_file = shutil.make_archive(backup_path.rstrip(SEP), "zip", backup_path)
|
||||
shutil.rmtree(backup_path)
|
||||
|
||||
return zip_file
|
||||
|
||||
@@ -40,7 +40,7 @@ Author: Dmitriy Yefremov
|
||||
<property name="icon_name">system-help</property>
|
||||
<property name="type_hint">normal</property>
|
||||
<property name="program_name">DemonEditor</property>
|
||||
<property name="version">3.0.0 Alpha</property>
|
||||
<property name="version">3.0.0 Beta</property>
|
||||
<property name="copyright">2018-2022 Dmitriy Yefremov
|
||||
</property>
|
||||
<property name="comments" translatable="yes">Enigma2 channel and satellite list editor.</property>
|
||||
|
||||
@@ -45,13 +45,14 @@ from app.connections import UtfFTP
|
||||
from app.settings import IS_LINUX, IS_DARWIN, IS_WIN, SEP
|
||||
from app.ui.dialogs import show_dialog, DialogType, get_builder, get_message
|
||||
from app.ui.main_helper import on_popup_menu
|
||||
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, KeyboardKey, MOD_MASK, IS_GNOME_SESSION
|
||||
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, KeyboardKey, MOD_MASK, IS_GNOME_SESSION, Page
|
||||
|
||||
File = namedtuple("File", ["icon", "name", "size", "date", "attr", "extra"])
|
||||
|
||||
|
||||
class BaseDialog(Gtk.Dialog):
|
||||
""" Base class for additional FTP dialogs. """
|
||||
|
||||
def __init__(self, title, use_header_bar=0, *args, **kwargs):
|
||||
super().__init__(title=title, use_header_bar=use_header_bar, *args, **kwargs)
|
||||
|
||||
@@ -231,6 +232,8 @@ class FtpClientBox(Gtk.HBox):
|
||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
||||
|
||||
self._app = app
|
||||
self._app.connect("data-receive", self.on_receive)
|
||||
self._app.connect("data-send", self.on_send)
|
||||
self._settings = settings
|
||||
self._ftp = None
|
||||
self._select_enabled = True
|
||||
@@ -305,6 +308,14 @@ class FtpClientBox(Gtk.HBox):
|
||||
self.init_file_data()
|
||||
self.show()
|
||||
|
||||
def on_receive(self, app, page):
|
||||
if page is Page.FTP:
|
||||
self.on_ftp_copy()
|
||||
|
||||
def on_send(self, app, page):
|
||||
if page is Page.FTP:
|
||||
self.on_file_copy()
|
||||
|
||||
@run_task
|
||||
def init_ftp(self):
|
||||
self.init_bookmarks()
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -30,7 +30,7 @@ import logging
|
||||
|
||||
from gi.repository import GLib
|
||||
|
||||
from app.commons import LOGGER_NAME
|
||||
from app.commons import LOGGER_NAME, LOG_FORMAT, LOG_DATE_FORMAT
|
||||
from app.ui.dialogs import get_builder
|
||||
from app.ui.main_helper import append_text_to_tview
|
||||
from app.ui.uicommons import Gtk, UI_RESOURCES_PATH
|
||||
@@ -43,9 +43,10 @@ class LogsClient(Gtk.Box):
|
||||
def __init__(self, view):
|
||||
logging.Handler.__init__(self)
|
||||
self._view = view
|
||||
self.setFormatter(logging.Formatter(fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT))
|
||||
|
||||
def handle(self, rec):
|
||||
GLib.idle_add(append_text_to_tview, f"{rec.msg}\n", self._view)
|
||||
def handle(self, rec: logging.LogRecord):
|
||||
GLib.idle_add(append_text_to_tview, f"{self.format(rec)}\n", self._view)
|
||||
|
||||
def __init__(self, app, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
@@ -67,3 +68,7 @@ class LogsClient(Gtk.Box):
|
||||
|
||||
def on_close(self, button):
|
||||
self._app.change_action_state("on_logs_show", GLib.Variant.new_boolean(False))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pass
|
||||
|
||||
@@ -1633,7 +1633,7 @@ Author: Dmitriy Yefremov
|
||||
<object class="GtkLabel" id="app_ver_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label">3.0.0 Alpha</property>
|
||||
<property name="label">3.0.0 Beta</property>
|
||||
<attributes>
|
||||
<attribute name="weight" value="bold"/>
|
||||
</attributes>
|
||||
|
||||
138
app/ui/main.py
138
app/ui/main.py
@@ -222,6 +222,8 @@ class Application(Gtk.Application):
|
||||
self._settings = Settings.get_instance()
|
||||
self._s_type = self._settings.setting_type
|
||||
self._is_enigma = self._s_type is SettingsType.ENIGMA_2
|
||||
self._is_send_data_enabled = True
|
||||
self._is_receive_data_enabled = True
|
||||
# Used for copy/paste. When adding the previous data will not be deleted.
|
||||
# Clearing only after the insertion!
|
||||
self._rows_buffer = []
|
||||
@@ -272,7 +274,7 @@ class Application(Gtk.Application):
|
||||
# Current page.
|
||||
self._page = Page.INFO
|
||||
self._fav_pages = {Page.SERVICES, Page.PICONS, Page.EPG, Page.TIMERS}
|
||||
self._download_pages = {Page.INFO, Page.SERVICES, Page.SATELLITE, Page.PICONS, Page.RECORDINGS}
|
||||
self._no_download_pages = {Page.TIMERS, Page.CONTROL}
|
||||
# Signals.
|
||||
GObject.signal_new("profile-changed", self, GObject.SIGNAL_RUN_LAST,
|
||||
GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,))
|
||||
@@ -323,6 +325,8 @@ class Application(Gtk.Application):
|
||||
GObject.signal_new("task-cancel", self, GObject.SIGNAL_RUN_LAST,
|
||||
GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,))
|
||||
GObject.signal_new("task-canceled", self, GObject.SIGNAL_RUN_LAST,
|
||||
GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,)),
|
||||
GObject.signal_new("list-font-changed", self, GObject.SIGNAL_RUN_LAST,
|
||||
GObject.TYPE_PYOBJECT, (GObject.TYPE_PYOBJECT,))
|
||||
|
||||
builder = get_builder(UI_RESOURCES_PATH + "main.glade", handlers)
|
||||
@@ -487,6 +491,8 @@ class Application(Gtk.Application):
|
||||
self.connect("add-background-task", self.on_bg_task_add)
|
||||
self.connect("task-done", self.on_task_done)
|
||||
self.connect("task-cancel", self.on_task_cancel)
|
||||
# Font.
|
||||
self.connect("list-font-changed", self.on_list_font_changed)
|
||||
# Header bar.
|
||||
profile_box = builder.get_object("profile_combo_box")
|
||||
toolbar_box = builder.get_object("toolbar_main_box")
|
||||
@@ -597,6 +603,11 @@ class Application(Gtk.Application):
|
||||
self.on_epg_list_configuration, self.on_iptv_list_configuration, self.on_remove_all_unavailable):
|
||||
iptv_elem.bind_property("sensitive", self.set_action(h.__name__, h, False), "enabled")
|
||||
|
||||
def do_activate(self):
|
||||
self._main_window.set_application(self)
|
||||
self._main_window.set_wmclass("DemonEditor", "DemonEditor")
|
||||
self._main_window.present()
|
||||
|
||||
self.init_actions()
|
||||
self.set_accels()
|
||||
self.init_layout()
|
||||
@@ -609,6 +620,45 @@ class Application(Gtk.Application):
|
||||
gen = self.init_http_api()
|
||||
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
|
||||
|
||||
def do_shutdown(self):
|
||||
""" Performs shutdown tasks """
|
||||
if self._settings.load_last_config:
|
||||
self._settings.add("last_config", {"last_profile": self._settings.current_profile,
|
||||
"last_bouquet": self._current_bq_name})
|
||||
self._settings.save() # storing current settings
|
||||
|
||||
if self._http_api:
|
||||
self._http_api.close()
|
||||
|
||||
Gtk.Application.do_shutdown(self)
|
||||
|
||||
def do_command_line(self, command_line):
|
||||
""" Processing command line parameters. """
|
||||
options = command_line.get_options_dict()
|
||||
options = options.end().unpack()
|
||||
|
||||
if "log" in options:
|
||||
init_logger()
|
||||
|
||||
if "record" in options:
|
||||
log("Starting record of current stream...")
|
||||
log("Not implemented yet!")
|
||||
|
||||
if "debug" in options:
|
||||
d_op = options.get("debug", "off")
|
||||
if d_op == "on":
|
||||
self._settings.debug_mode = True
|
||||
elif d_op == "off":
|
||||
self._settings.debug_mode = False
|
||||
else:
|
||||
log("No valid [on, off] arguments for -d found!")
|
||||
return 1
|
||||
log(f"Debug mode is {d_op}.")
|
||||
self._settings.save()
|
||||
|
||||
self.activate()
|
||||
return 0
|
||||
|
||||
def init_actions(self):
|
||||
self.set_action("on_import_bouquet", self.on_import_bouquet)
|
||||
self.set_action("on_import_bouquets", self.on_import_bouquets)
|
||||
@@ -635,8 +685,10 @@ class Application(Gtk.Application):
|
||||
self.set_action("upload_bouquets", lambda a, v: self.on_upload_data(DownloadType.BOUQUETS))
|
||||
self.set_action("on_data_save", lambda a, v: self.emit("data-save", self._page))
|
||||
self.set_action("on_data_save_as", lambda a, v: self.emit("data-save-as", self._page))
|
||||
self.set_action("on_receive", self.on_receive)
|
||||
self.set_action("on_send", self.on_send)
|
||||
sa = self.set_action("on_receive", self.on_receive)
|
||||
self.bind_property("is-receive-data-enabled", sa, "enabled")
|
||||
sa = self.set_action("on_send", self.on_send)
|
||||
self.bind_property("is-send-data-enabled", sa, "enabled")
|
||||
self.set_action("on_data_open", self.on_data_open)
|
||||
self.set_action("on_archive_open", self.on_archive_open)
|
||||
# Edit.
|
||||
@@ -667,7 +719,7 @@ class Application(Gtk.Application):
|
||||
# Display EPG.
|
||||
sa = self.set_state_action("display_epg", self.set_display_epg, self._settings.display_epg)
|
||||
self.change_action_state("display_epg", GLib.Variant.new_boolean(self._settings.display_epg))
|
||||
self.bind_property("is_enigma", sa, "enabled")
|
||||
self.bind_property("is-enigma", sa, "enabled")
|
||||
# Alternate layout.
|
||||
sa = self.set_state_action("set_alternate_layout", self.set_use_alt_layout, self._settings.alternate_layout)
|
||||
sa.connect("change-state", self.on_layout_change)
|
||||
@@ -713,50 +765,6 @@ class Application(Gtk.Application):
|
||||
self.set_accels_for_action("app.on_logs_show", ["<shift><primary>l"])
|
||||
self.set_accels_for_action("win.filter", ["<shift><primary>f"])
|
||||
|
||||
def do_activate(self):
|
||||
self._main_window.set_application(self)
|
||||
self._main_window.set_wmclass("DemonEditor", "DemonEditor")
|
||||
self._main_window.present()
|
||||
|
||||
def do_shutdown(self):
|
||||
""" Performs shutdown tasks """
|
||||
if self._settings.load_last_config:
|
||||
self._settings.add("last_config", {"last_profile": self._settings.current_profile,
|
||||
"last_bouquet": self._current_bq_name})
|
||||
self._settings.save() # storing current settings
|
||||
|
||||
if self._http_api:
|
||||
self._http_api.close()
|
||||
|
||||
Gtk.Application.do_shutdown(self)
|
||||
|
||||
def do_command_line(self, command_line):
|
||||
""" Processing command line parameters. """
|
||||
options = command_line.get_options_dict()
|
||||
options = options.end().unpack()
|
||||
|
||||
if "log" in options:
|
||||
init_logger()
|
||||
|
||||
if "record" in options:
|
||||
log("Starting record of current stream...")
|
||||
log("Not implemented yet!")
|
||||
|
||||
if "debug" in options:
|
||||
d_op = options.get("debug", "off")
|
||||
if d_op == "on":
|
||||
self._settings.debug_mode = True
|
||||
elif d_op == "off":
|
||||
self._settings.debug_mode = False
|
||||
else:
|
||||
log("No valid [on, off] arguments for -d found!")
|
||||
return 1
|
||||
log(f"Debug mode is {d_op}.")
|
||||
self._settings.save()
|
||||
|
||||
self.activate()
|
||||
return 0
|
||||
|
||||
def init_profiles(self):
|
||||
self.update_profiles()
|
||||
if self._settings.load_last_config:
|
||||
@@ -823,11 +831,8 @@ class Application(Gtk.Application):
|
||||
If update=False - first call on program start, else - after options changes!
|
||||
"""
|
||||
if self._current_font != self._settings.list_font:
|
||||
from gi.repository import Pango
|
||||
|
||||
font_desc = Pango.FontDescription.from_string(self._settings.list_font)
|
||||
list(map(lambda v: v.modify_font(font_desc), (self._services_view, self._fav_view, self._bouquets_view)))
|
||||
self._current_font = self._settings.list_font
|
||||
self.emit("list-font-changed", self._current_font)
|
||||
|
||||
if self._picons_size != self._settings.list_picon_size:
|
||||
self._picons_size = self._settings.list_picon_size
|
||||
@@ -924,6 +929,13 @@ class Application(Gtk.Application):
|
||||
self._EXTRA_COLOR = extra_color
|
||||
yield True
|
||||
|
||||
def on_list_font_changed(self, app, font):
|
||||
""" Modifies the font of the main views when changed in the settings. """
|
||||
from gi.repository import Pango
|
||||
font_desc = Pango.FontDescription.from_string(font)
|
||||
views = (self._services_view, self._iptv_services_view, self._fav_view, self._bouquets_view)
|
||||
list(map(lambda v: v.modify_font(font_desc), views))
|
||||
|
||||
@staticmethod
|
||||
def force_ctrl(view, event):
|
||||
""" Function for force ctrl press event for view """
|
||||
@@ -1026,6 +1038,8 @@ class Application(Gtk.Application):
|
||||
self._page = Page(stack.get_visible_child_name())
|
||||
self._fav_paned.set_visible(self._page in self._fav_pages)
|
||||
self._save_tool_button.set_visible(self._page in (Page.SERVICES, Page.SATELLITE))
|
||||
self.is_send_data_enabled = self._page not in (Page.EPG, Page.TIMERS, Page.RECORDINGS, Page.CONTROL)
|
||||
self.is_receive_data_enabled = self._page not in (Page.EPG, Page.TIMERS, Page.CONTROL)
|
||||
self.emit("page-changed", self._page)
|
||||
|
||||
def on_iptv_toggled(self, button):
|
||||
@@ -1959,14 +1973,14 @@ class Application(Gtk.Application):
|
||||
# ***************** Send/Receive data ********************* #
|
||||
|
||||
def on_receive(self, action=None, value=None):
|
||||
if self._page in self._download_pages:
|
||||
if self._page not in self._no_download_pages:
|
||||
self.change_action_state("on_logs_show", GLib.Variant.new_boolean(True))
|
||||
self.emit("data-receive", self._page)
|
||||
else:
|
||||
self.show_error_message("Not allowed in this context!")
|
||||
|
||||
def on_send(self, action=None, value=None):
|
||||
if self._page in self._download_pages:
|
||||
if self._page not in self._no_download_pages:
|
||||
self.change_action_state("on_logs_show", GLib.Variant.new_boolean(True))
|
||||
self.emit("data-send", self._page)
|
||||
else:
|
||||
@@ -4315,6 +4329,22 @@ class Application(Gtk.Application):
|
||||
def is_enigma(self, value):
|
||||
self._is_enigma = value
|
||||
|
||||
@GObject.Property(type=bool, default=True)
|
||||
def is_send_data_enabled(self):
|
||||
return self._is_send_data_enabled
|
||||
|
||||
@is_send_data_enabled.setter
|
||||
def is_send_data_enabled(self, value):
|
||||
self._is_send_data_enabled = value
|
||||
|
||||
@GObject.Property(type=bool, default=True)
|
||||
def is_receive_data_enabled(self):
|
||||
return self._is_receive_data_enabled
|
||||
|
||||
@is_receive_data_enabled.setter
|
||||
def is_receive_data_enabled(self, value):
|
||||
self._is_receive_data_enabled = value
|
||||
|
||||
@property
|
||||
def page(self):
|
||||
return self._page
|
||||
|
||||
@@ -31,7 +31,6 @@ import os
|
||||
from datetime import datetime
|
||||
from ftplib import all_errors
|
||||
from io import BytesIO, TextIOWrapper
|
||||
from pathlib import Path
|
||||
from urllib.parse import quote
|
||||
|
||||
from app.ui.tasks import BGTaskWidget
|
||||
@@ -123,13 +122,17 @@ class RecordingsTool(Gtk.Box):
|
||||
if response in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT):
|
||||
return
|
||||
|
||||
files = (Path(model[p][-1].get("e2filename", "")).name for p in paths)
|
||||
files = (model[p][5] for p in paths)
|
||||
bgw = BGTaskWidget(self._app, "Downloading recordings...", self.download_recordings, files, response)
|
||||
self._app.emit("add-background-task", bgw)
|
||||
|
||||
def download_recordings(self, files, dst):
|
||||
for f in files:
|
||||
self._ftp.download_file(f, dst)
|
||||
for file in files:
|
||||
try:
|
||||
with open(os.path.join(dst, os.path.basename(file)), "wb") as f:
|
||||
log(f"Downloading recording: {file}. Status: {self._ftp.download_binary(file, f)}".rstrip())
|
||||
except OSError as e:
|
||||
log(str(e))
|
||||
|
||||
@run_task
|
||||
def init(self, app=None, arg=None):
|
||||
|
||||
@@ -43,7 +43,7 @@ class BGTaskWidget(Gtk.Box):
|
||||
self._spinner = Gtk.Spinner(active=True)
|
||||
self.pack_start(self._spinner, False, False, 0)
|
||||
|
||||
close_button = Gtk.Button.new_from_icon_name("gtk-close", Gtk.IconSize.MENU)
|
||||
close_button = Gtk.Button.new_from_icon_name("window-close", Gtk.IconSize.MENU)
|
||||
close_button.set_relief(Gtk.ReliefStyle.NONE)
|
||||
close_button.set_valign(Gtk.Align.CENTER)
|
||||
close_button.set_tooltip_text(get_message("Cancel"))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
VER="3.0.0_Alpha"
|
||||
VER="3.0.0_Beta"
|
||||
B_PATH="dist/DemonEditor"
|
||||
DEB_PATH="$B_PATH/usr/share/demoneditor"
|
||||
|
||||
@@ -8,11 +8,7 @@ cp -TRv deb $B_PATH
|
||||
rsync --exclude=app/ui/lang --exclude=app/ui/icons --exclude=__pycache__ -arv ../../app $DEB_PATH
|
||||
|
||||
cd dist
|
||||
fakeroot dpkg-deb --build DemonEditor
|
||||
fakeroot dpkg-deb -Zxz --build DemonEditor
|
||||
mv DemonEditor.deb DemonEditor_$VER.deb
|
||||
|
||||
rm -R DemonEditor
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Package: demon-editor
|
||||
Version: 3.0.0-Alpha
|
||||
Version: 3.0.0-Beta
|
||||
Section: utils
|
||||
Priority: optional
|
||||
Architecture: all
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -80,7 +80,7 @@ app = BUNDLE(coll,
|
||||
'CFBundleGetInfoString': "Enigma2 channel and satellite editor",
|
||||
'LSApplicationCategoryType': 'public.app-category.utilities',
|
||||
'LSMinimumSystemVersion': '10.13',
|
||||
'CFBundleShortVersionString': f"3.0.0.{BUILD_DATE} Alpha",
|
||||
'CFBundleShortVersionString': f"3.0.0.{BUILD_DATE} Beta",
|
||||
'NSHumanReadableCopyright': u"Copyright © 2022, Dmitriy Yefremov",
|
||||
'NSRequiresAquaSystemAppearance': 'false',
|
||||
'NSHighResolutionCapable': 'true'
|
||||
|
||||
@@ -11,7 +11,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "translator-credits"
|
||||
msgstr "Massimo Pissarello\nNicola Fanghella"
|
||||
msgstr "Massimo Pissarello"
|
||||
|
||||
# Main
|
||||
msgid "Service"
|
||||
@@ -57,7 +57,7 @@ msgid "Bouquet details"
|
||||
msgstr "Dettagli bouquet"
|
||||
|
||||
msgid "Bouquets"
|
||||
msgstr "Bouquets"
|
||||
msgstr "Bouquet"
|
||||
|
||||
msgid "Copy"
|
||||
msgstr "Copia"
|
||||
@@ -72,7 +72,7 @@ msgid "Edit"
|
||||
msgstr "Modifica"
|
||||
|
||||
msgid "Edit mаrker text"
|
||||
msgstr "Modifica etichetta"
|
||||
msgstr "Modifica testo marcatore"
|
||||
|
||||
msgid "FTP-transfer"
|
||||
msgstr "Trasferimento FTP"
|
||||
@@ -84,7 +84,7 @@ msgid "Hide"
|
||||
msgstr "Nascondi"
|
||||
|
||||
msgid "Hide/Skip On/Off Ctrl + H"
|
||||
msgstr "Nascondi/Salta On/Off Ctrl + H"
|
||||
msgstr "Nascondi/Salta On/Off Ctrl + H"
|
||||
|
||||
msgid "Add IPTV or stream service"
|
||||
msgstr "Aggiungi IPTV o servizio stream"
|
||||
@@ -102,10 +102,10 @@ msgid "Rename for this bouquet"
|
||||
msgstr "Rinomina questo bouquet"
|
||||
|
||||
msgid "Set default name"
|
||||
msgstr "Imposta il nome predefinito"
|
||||
msgstr "Imposta nome predefinito"
|
||||
|
||||
msgid "Insert marker"
|
||||
msgstr "Inserisci etichetta"
|
||||
msgstr "Inserisci marcatore"
|
||||
|
||||
msgid "Insert space"
|
||||
msgstr "Inserisci spazio"
|
||||
@@ -153,10 +153,10 @@ msgid "Parent lock On/Off Ctrl + L"
|
||||
msgstr "Blocco Genitori On/Off Ctrl + L"
|
||||
|
||||
msgid "Picons"
|
||||
msgstr "Picons"
|
||||
msgstr "Picon"
|
||||
|
||||
msgid "Picons downloader"
|
||||
msgstr "Scarica picons"
|
||||
msgstr "Scarica picon"
|
||||
|
||||
msgid "Satellites downloader"
|
||||
msgstr "Scarica satelliti"
|
||||
@@ -168,7 +168,7 @@ msgid "Remove all unavailable"
|
||||
msgstr "Rimuovi tutti quelli non disponibili"
|
||||
|
||||
msgid "Satellites editor"
|
||||
msgstr "Editor dei satelliti"
|
||||
msgstr "Editor satelliti"
|
||||
|
||||
msgid "Save"
|
||||
msgstr "Salva"
|
||||
@@ -201,7 +201,7 @@ msgid "Are you sure?"
|
||||
msgstr "Sei sicuro?"
|
||||
|
||||
msgid "Current data path:"
|
||||
msgstr "Percorso attuale per i dati:"
|
||||
msgstr "Percorso dati corrente:"
|
||||
|
||||
msgid "Data:"
|
||||
msgstr "Dati:"
|
||||
@@ -213,7 +213,7 @@ msgid "Host:"
|
||||
msgstr "Host:"
|
||||
|
||||
msgid "Loading data..."
|
||||
msgstr "Sto caricando i dati..."
|
||||
msgstr "Caricamento dati..."
|
||||
|
||||
msgid "Receive"
|
||||
msgstr "Scarica"
|
||||
@@ -225,10 +225,10 @@ msgid "Receiver IP:"
|
||||
msgstr "IP/Host del ricevitore:"
|
||||
|
||||
msgid "Remove unused bouquets"
|
||||
msgstr "Elimina i bouquets non utilizzati"
|
||||
msgstr "Elimina bouquet non utilizzati"
|
||||
|
||||
msgid "Reset profile"
|
||||
msgstr "Resetta il profilo"
|
||||
msgstr "Reimposta profilo"
|
||||
|
||||
msgid "Satellites"
|
||||
msgstr "Satelliti"
|
||||
@@ -246,10 +246,10 @@ msgid "Send"
|
||||
msgstr "Invia"
|
||||
|
||||
msgid "Send files to receiver"
|
||||
msgstr "Invia i files al ricevitore"
|
||||
msgstr "Invia i file al ricevitore"
|
||||
|
||||
msgid "Services and Bouquets files:"
|
||||
msgstr "Files dei servizi e dei bouquets:"
|
||||
msgstr "File servizi e bouquet:"
|
||||
|
||||
msgid "User bouquet files:"
|
||||
msgstr "File bouquet utente:"
|
||||
@@ -281,7 +281,7 @@ msgid "Next stream in the list"
|
||||
msgstr "Stream successivo della lista"
|
||||
|
||||
msgid "Toggle in fullscreen"
|
||||
msgstr "Commuta a schermo intero"
|
||||
msgstr "Attiva schermo intero"
|
||||
|
||||
msgid "Close"
|
||||
msgstr "Chiudi"
|
||||
@@ -294,22 +294,22 @@ msgid "Providers"
|
||||
msgstr "Provider"
|
||||
|
||||
msgid "Receive picons"
|
||||
msgstr "Scarica picons"
|
||||
msgstr "Scarica picon"
|
||||
|
||||
msgid "Picons name format:"
|
||||
msgstr "Formato del nome:"
|
||||
msgstr "Formato nome picon:"
|
||||
|
||||
msgid "Resize:"
|
||||
msgstr "Ridimensiona:"
|
||||
|
||||
msgid "Current picons path:"
|
||||
msgstr "Percorso attuale picons:"
|
||||
msgstr "Percorso attuale picon:"
|
||||
|
||||
msgid "Receiver picons path:"
|
||||
msgstr "Percorso di ricezione picons:"
|
||||
msgstr "Percorso picon sul ricevitore:"
|
||||
|
||||
msgid "Picons download tool"
|
||||
msgstr "Strumento per scaricare picons"
|
||||
msgstr "Strumento per scaricare picon"
|
||||
|
||||
msgid "Transfer to receiver"
|
||||
msgstr "Trasferisci al ricevitore"
|
||||
@@ -327,22 +327,22 @@ msgid "Path to save:"
|
||||
msgstr "Percorso salvataggio:"
|
||||
|
||||
msgid "Path to Enigma2 picons:"
|
||||
msgstr "Persorso picons su Enigma2:"
|
||||
msgstr "Persorso picon su Enigma2:"
|
||||
|
||||
msgid "Specify the correct position value for the provider!"
|
||||
msgstr "Specifica il valore della posizione per il provider!"
|
||||
msgstr "Specifica ia posizione corretta del provider!"
|
||||
|
||||
msgid "Converter between name formats"
|
||||
msgstr "Convertitore per il formato dei nomi"
|
||||
msgstr "Convertitore tra formati di nome"
|
||||
|
||||
msgid "Receive picons for providers"
|
||||
msgstr "Scarica picons per providers"
|
||||
msgstr "Scarica picon per providers"
|
||||
|
||||
msgid "Load satellite providers."
|
||||
msgstr "Carica i providers satellitari"
|
||||
msgstr "Carica providers satellitari"
|
||||
|
||||
msgid "To automatically set the identifiers for picons,\nfirst load the required services list into the main application window."
|
||||
msgstr "Per impostare automaticamente gli identificatori dei picons,\ncarica prima la lista dei servizi nella finestra principale."
|
||||
msgstr "Per impostare automaticamente gli identificatori dei picon,\ncarica prima la lista dei servizi nella finestra principale."
|
||||
|
||||
# Satellites editor
|
||||
msgid "Satellites edit tool"
|
||||
@@ -427,7 +427,7 @@ msgstr "Cerca"
|
||||
|
||||
# IPTV dialog
|
||||
msgid "Stream data"
|
||||
msgstr "Dati dello stream"
|
||||
msgstr "Dati stream"
|
||||
|
||||
# IPTV list configuration dialog
|
||||
msgid "Starting values"
|
||||
@@ -437,7 +437,7 @@ msgid "Reset to default"
|
||||
msgstr "Torna alle impostazioni predefinite"
|
||||
|
||||
msgid "IPTV streams list configuration"
|
||||
msgstr "Lista di configurazione degli streams IPTV"
|
||||
msgstr "Lista configurazione streams IPTV"
|
||||
|
||||
#Settings dialog
|
||||
msgid "Preferences"
|
||||
@@ -462,7 +462,7 @@ msgid "Password:"
|
||||
msgstr "Password:"
|
||||
|
||||
msgid "Picons:"
|
||||
msgstr "Picons:"
|
||||
msgstr "Picon:"
|
||||
|
||||
msgid "Port:"
|
||||
msgstr "Porta:"
|
||||
@@ -471,20 +471,20 @@ msgid "Data path:"
|
||||
msgstr "Percorso dati:"
|
||||
|
||||
msgid "Picons path:"
|
||||
msgstr "Percorso picons:"
|
||||
msgstr "Percorso picon:"
|
||||
|
||||
msgid "Network settings:"
|
||||
msgstr "Impostazioni rete:"
|
||||
|
||||
msgid "STB file paths:"
|
||||
msgstr "Percorso dei files sul ricevitore:"
|
||||
msgstr "Percorso file sul ricevitore:"
|
||||
|
||||
msgid "Local file paths:"
|
||||
msgstr "Percorso files locali:"
|
||||
msgstr "Percorso file locali:"
|
||||
|
||||
# Dialogs messages
|
||||
msgid "Error. No bouquet is selected!"
|
||||
msgstr "Errore. Nessun bouquet selezionato!"
|
||||
msgstr "Errore. nessun bouquet selezionato!"
|
||||
|
||||
msgid "This item is not allowed to be removed!"
|
||||
msgstr "Questo elemento non può essere rimosso!"
|
||||
@@ -496,10 +496,10 @@ msgid "Not allowed in this context!"
|
||||
msgstr "Non è permesso in questo contesto!"
|
||||
|
||||
msgid "Please, download files from receiver or setup your path for read data!"
|
||||
msgstr "Per favore, scarica i files dal ricevitore o seleziona il percorso dei dati!"
|
||||
msgstr "Per favore, scarica i file dal ricevitore o seleziona il percorso dei dati!"
|
||||
|
||||
msgid "Reading data error!"
|
||||
msgstr "Errore nella lettura dei dati!"
|
||||
msgstr "Errore lettura dati!"
|
||||
|
||||
msgid "No m3u file is selected!"
|
||||
msgstr "Nessun file m3u selezionato!"
|
||||
@@ -508,13 +508,13 @@ msgid "Not implemented yet!"
|
||||
msgstr "Funzionalità non ancora sviluppata!"
|
||||
|
||||
msgid "The text of marker is empty, please try again!"
|
||||
msgstr "Il testo dell'etichetta é vuoto, riprova di nuovo!"
|
||||
msgstr "Il testo del marcatore é vuoto, riprova di nuovo!"
|
||||
|
||||
msgid "Please, select only one item!"
|
||||
msgstr "Seleziona un solo elemento!"
|
||||
|
||||
msgid "No png file is selected!"
|
||||
msgstr "Non é stato selezionato alcun file PNG!"
|
||||
msgstr "Nessun file png selezionato!"
|
||||
|
||||
msgid "No profile selected!"
|
||||
msgstr "Nessun profilo selezionato!"
|
||||
@@ -532,13 +532,13 @@ msgid "Done!"
|
||||
msgstr "Fatto!"
|
||||
|
||||
msgid "Please, wait..."
|
||||
msgstr "Attendere prego!..."
|
||||
msgstr "Attendere prego..."
|
||||
|
||||
msgid "Resizing..."
|
||||
msgstr "Sto ridimensionando..."
|
||||
msgstr "Ridimensionamento..."
|
||||
|
||||
msgid "Select paths!"
|
||||
msgstr "Seleziona i persorsi!"
|
||||
msgstr "Seleziona persorsi!"
|
||||
|
||||
msgid "No satellite is selected!"
|
||||
msgstr "Nessun satellite selezionato!"
|
||||
@@ -550,7 +550,7 @@ msgid "Please check your parameters and try again."
|
||||
msgstr "Per favore, controlla i parametri e riprova di nuovo!"
|
||||
|
||||
msgid "No satellites.xml file is selected!"
|
||||
msgstr "Non é stato selezionato alcun file satellites.xml!"
|
||||
msgstr "Nessun file satellites.xml è selezionato!"
|
||||
|
||||
msgid "Error. Verify the data!"
|
||||
msgstr "Errore. Verifica i dati!"
|
||||
@@ -563,19 +563,19 @@ msgstr "VLC non trovato! Controlla che sia installato!"
|
||||
|
||||
# Search unavailable streams dialog
|
||||
msgid "Please wait, streams testing in progress..."
|
||||
msgstr "Attendere prego, test degli streams in corso..."
|
||||
msgstr "Attendere prego, test degli stream in corso..."
|
||||
|
||||
msgid "Found"
|
||||
msgstr "Trovato"
|
||||
|
||||
msgid "unavailable streams."
|
||||
msgstr "streams non disponibili."
|
||||
msgstr "stream non disponibili."
|
||||
|
||||
msgid "No changes required!"
|
||||
msgstr "Non sono richiesti cambiamenti!"
|
||||
|
||||
msgid "This list does not contains IPTV streams!"
|
||||
msgstr "La lista non contiene streams IPTV!"
|
||||
msgstr "La lista non contiene stream IPTV!"
|
||||
|
||||
msgid "New empty configuration"
|
||||
msgstr "Nuova configurazione vuota"
|
||||
@@ -605,7 +605,7 @@ msgid "Backup path:"
|
||||
msgstr "Percorso copia di sicurezza:"
|
||||
|
||||
msgid "Restore bouquets"
|
||||
msgstr "Ripristina i bouquets"
|
||||
msgstr "Ripristina bouquet"
|
||||
|
||||
msgid "Restore all"
|
||||
msgstr "Ripristina tutto"
|
||||
@@ -617,7 +617,7 @@ msgid "Before downloading from the receiver"
|
||||
msgstr "Prima di scaricare dal ricevitore"
|
||||
|
||||
msgid "Set background color for the services"
|
||||
msgstr "Imposta i colori di sfondo per i servizi"
|
||||
msgstr "Imposta colori di sfondo per i servizi"
|
||||
|
||||
msgid "Marked as new:"
|
||||
msgstr "Contrassegnato come nuovo:"
|
||||
@@ -645,7 +645,7 @@ msgid "Bouquet"
|
||||
msgstr "Bouquet"
|
||||
|
||||
msgid "Bouquets and services"
|
||||
msgstr "Bouquets e servizi"
|
||||
msgstr "Bouquet e servizi"
|
||||
|
||||
msgid "The main list does not contain services for this bouquet!"
|
||||
msgstr "La lista principale non contiene servizi per questo bouquet!"
|
||||
@@ -654,7 +654,7 @@ msgid "No bouquet file is selected!"
|
||||
msgstr "Non è stato selezionato alcun file contenente bouquet"
|
||||
|
||||
msgid "Remove all unused"
|
||||
msgstr "Elimina tutti quelli non usati"
|
||||
msgstr "Rimuovi tutti quelli non usati"
|
||||
|
||||
msgid "Test"
|
||||
msgstr "Test"
|
||||
@@ -663,7 +663,7 @@ msgid "Test connection"
|
||||
msgstr "Test connessione"
|
||||
|
||||
msgid "Double click on the service in the bouquet list:"
|
||||
msgstr "Doppio click sul servizio nella lista dei bouquets:"
|
||||
msgstr "Doppio click sul servizio nella lista bouquet:"
|
||||
|
||||
msgid "Zap"
|
||||
msgstr "Zap"
|
||||
@@ -681,7 +681,7 @@ msgid "Enable HTTP API"
|
||||
msgstr "Abilita le API HTTP"
|
||||
|
||||
msgid "Switch(zap) the channel(Ctrl + Z)"
|
||||
msgstr "Cambia sul canale (Ctrl + Z)"
|
||||
msgstr "Cambia canale (Ctrl + Z)"
|
||||
|
||||
msgid "Switch the channel and watch in the program(Ctrl + W)"
|
||||
msgstr "Cambia canale e guarda il programma (Ctrl + W)."
|
||||
@@ -705,7 +705,7 @@ msgid "Service names source:"
|
||||
msgstr "Sorgente nomi dei servizi:"
|
||||
|
||||
msgid "Main service list"
|
||||
msgstr "Lista dei servizi principali:"
|
||||
msgstr "Lista servizi principali:"
|
||||
|
||||
msgid "XML file"
|
||||
msgstr "File XML"
|
||||
@@ -723,7 +723,7 @@ msgid "Filter by presence in the epg.dat file."
|
||||
msgstr "Filtra in base alla presenza su epg.dat."
|
||||
|
||||
msgid "Paths to the epg.dat file:"
|
||||
msgstr "Percorso dek file epg.dat:"
|
||||
msgstr "Percorso file epg.dat:"
|
||||
|
||||
msgid "Local path:"
|
||||
msgstr "Percorso locale:"
|
||||
@@ -738,22 +738,22 @@ msgid "Auto configuration by service names."
|
||||
msgstr "Configurazione automatica in base ai nomi dei servizi."
|
||||
|
||||
msgid "Save list to xml."
|
||||
msgstr "Salva la lista in XML"
|
||||
msgstr "Salva lista in XML"
|
||||
|
||||
msgid "Download XML file error."
|
||||
msgstr "Scarica il file XML degli errori."
|
||||
msgstr "Scarica file XML degli errori."
|
||||
|
||||
msgid "Unsupported file type:"
|
||||
msgstr "Tipo di file non supportato:"
|
||||
|
||||
msgid "Unpacking data error."
|
||||
msgstr "Errore di decompressione dei dati."
|
||||
msgstr "Errore decompressione dati."
|
||||
|
||||
msgid "XML parsing error:"
|
||||
msgstr "Errore di analisi XML:"
|
||||
msgstr "Errore analisi XML:"
|
||||
|
||||
msgid "Count of successfully configured services:"
|
||||
msgstr "Conteggio dei servizi configurato correttamente:"
|
||||
msgstr "Conteggio servizi configurato correttamente:"
|
||||
|
||||
msgid "Current epg.dat file does not contains references for the services of this bouquet!"
|
||||
msgstr "Il file epg.dat non contiene riferimenti per i servizi di questo bouquet!"
|
||||
@@ -780,7 +780,7 @@ msgid "Extra"
|
||||
msgstr "Extra"
|
||||
|
||||
msgid "Apply profile settings"
|
||||
msgstr "Applica le impostazioni al profilo"
|
||||
msgstr "Applica le impostazioni del profilo"
|
||||
|
||||
msgid "Settings type:"
|
||||
msgstr "Tipo di impostazioni:"
|
||||
@@ -795,13 +795,13 @@ msgid "Load the last open configuration at program startup"
|
||||
msgstr "Carica l'ultima configurazione utilizzata all'avvio"
|
||||
|
||||
msgid "Enable direct playback bar"
|
||||
msgstr "Abilita la barra di riproduzione diretta"
|
||||
msgstr "Abilita barra di riproduzione diretta"
|
||||
|
||||
msgid "Enables direct sending and playback of media links on the receiver"
|
||||
msgstr "Abilita l'invio e la riproduzione di links multimediali sul ricevitore"
|
||||
msgstr "Abilita invio e riproduzione di links multimediali sul ricevitore"
|
||||
|
||||
msgid "Watch the channel in the program"
|
||||
msgstr "Guarda il canale nel programma"
|
||||
msgstr "Guarda canale nel programma"
|
||||
|
||||
msgid "Zap and Play"
|
||||
msgstr "Zap e riproduci"
|
||||
@@ -810,10 +810,10 @@ msgid "Drag or paste the link here"
|
||||
msgstr "Trascina o incolla qui il link"
|
||||
|
||||
msgid "Remove added links in the playlist"
|
||||
msgstr "Elimina i link aggiunti nella playlist"
|
||||
msgstr "Rimuovi link aggiunti nella playlist"
|
||||
|
||||
msgid "A bouquet with that name exists!"
|
||||
msgstr "Nome del bouquet già esistente!"
|
||||
msgstr "Nome bouquet già esistente!"
|
||||
|
||||
msgid "Details"
|
||||
msgstr "Dettagli"
|
||||
@@ -828,7 +828,7 @@ msgid "File"
|
||||
msgstr "File"
|
||||
|
||||
msgid "Picons manager"
|
||||
msgstr "Gestione picons"
|
||||
msgstr "Gestione picon"
|
||||
|
||||
msgid "Explorer"
|
||||
msgstr "Esplora"
|
||||
@@ -849,7 +849,7 @@ msgid "To the end"
|
||||
msgstr "Alla fine"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Vista"
|
||||
msgstr "Visualizzazione"
|
||||
|
||||
msgid "Lock"
|
||||
msgstr "Blocca"
|
||||
@@ -870,7 +870,7 @@ msgid "Default data path:"
|
||||
msgstr "Percorso predefinito per i dati:"
|
||||
|
||||
msgid "Streams record path:"
|
||||
msgstr "Percorso per le registrazioni da stream:"
|
||||
msgstr "Percorso per registrazioni da stream:"
|
||||
|
||||
msgid "Record"
|
||||
msgstr "Registra"
|
||||
@@ -885,7 +885,7 @@ msgid "Streaming"
|
||||
msgstr "Streaming"
|
||||
|
||||
msgid "Activate transcoding"
|
||||
msgstr "Attiva la transcodifica"
|
||||
msgstr "Attiva transcodifica"
|
||||
|
||||
msgid "Presets:"
|
||||
msgstr "Preimpostazioni:"
|
||||
@@ -894,7 +894,7 @@ msgid "Video options:"
|
||||
msgstr "Opzioni video:"
|
||||
|
||||
msgid "Audio options:"
|
||||
msgstr "Opzioni Audio:"
|
||||
msgstr "Opzioni audio:"
|
||||
|
||||
msgid "Bitrate (kb/s):"
|
||||
msgstr "Bitrate (kb/s):"
|
||||
@@ -915,7 +915,7 @@ msgid "Sample rate (Hz):"
|
||||
msgstr "Frequenza di campionamento (Hz):"
|
||||
|
||||
msgid "Play streams mode:"
|
||||
msgstr "Modalità di riprodzione streams:"
|
||||
msgstr "Modalità riprodzione stream:"
|
||||
|
||||
msgid "Built-in player"
|
||||
msgstr "Riproduttore integrato"
|
||||
@@ -936,10 +936,10 @@ msgid "Operates in standby mode or current active transponder!"
|
||||
msgstr "Funziona in standby o con il transponder attualmente attivo!"
|
||||
|
||||
msgid "No connection to the receiver!"
|
||||
msgstr "Nessun connessione con il ricevitore!"
|
||||
msgstr "Nessuna connessione con il ricevitore!"
|
||||
|
||||
msgid "Signal level"
|
||||
msgstr "Livello del segnale"
|
||||
msgstr "Livello segnale"
|
||||
|
||||
msgid "Receiver info"
|
||||
msgstr "Informazioni ricevitore"
|
||||
@@ -951,37 +951,37 @@ msgid "Show short info as hints in the main services list"
|
||||
msgstr "Mostra suggerimenti nella lista principale dei servizi"
|
||||
|
||||
msgid "Show detailed info as hints in the bouquet list"
|
||||
msgstr "Mostra informazioni dettagliate come suggerimenti nell'elenco dei bouquets"
|
||||
msgstr "Mostra informazioni dettagliate come suggerimenti nell'elenco dei bouquet"
|
||||
|
||||
msgid "Enable alternate bouquet file naming"
|
||||
msgstr "Abilita nomi alternativi per i bouquets"
|
||||
msgstr "Abilita nomi alternativi bouquet"
|
||||
|
||||
msgid "Allows you to name bouquet files using their names."
|
||||
msgstr "Permetti di nominare i files dei bouquets usando i nomi dei bouquets."
|
||||
msgstr "Permetti di nominare i files dei bouquet usando i nomi dei bouquet."
|
||||
|
||||
msgid "Appearance"
|
||||
msgstr "Aspetto"
|
||||
|
||||
msgid "Enable Themes support"
|
||||
msgstr "Abilita il supporto per i temi"
|
||||
msgstr "Abilita supporto temi"
|
||||
|
||||
msgid "Gtk3 Theme:"
|
||||
msgstr "Tema Gtk3:"
|
||||
|
||||
msgid "Icon Theme:"
|
||||
msgstr "Tema delle icone:"
|
||||
msgstr "Tema icone:"
|
||||
|
||||
msgid "Gtk3 Themes and Icons:"
|
||||
msgstr "Temi e icone Gtk3:"
|
||||
|
||||
msgid "Deleting data..."
|
||||
msgstr "Sto eliminando i dati ..."
|
||||
msgstr "Sto eliminando i dati..."
|
||||
|
||||
msgid "Download from the receiver"
|
||||
msgstr "Scarica dal ricevitore"
|
||||
|
||||
msgid "Remove all picons from the receiver"
|
||||
msgstr "Elimina tutti i picons dal ricevitore"
|
||||
msgstr "Rimuovi tutti i picon dal ricevitore"
|
||||
|
||||
msgid "Service reference"
|
||||
msgstr "Servizio di riferimento"
|
||||
@@ -1005,7 +1005,7 @@ msgid "EXPERIMENTAL!"
|
||||
msgstr "SPERIMENTALE!"
|
||||
|
||||
msgid "Sorting data..."
|
||||
msgstr "Sto ordinando i dati..."
|
||||
msgstr "Ordinamento dati..."
|
||||
|
||||
msgid "There are unsaved changes.\n\n\t Save them now?"
|
||||
msgstr "Ci sono cambiamenti non salvati.\n\n\t Vuoi salvarli adesso?"
|
||||
@@ -1017,16 +1017,16 @@ msgid "Remove from the receiver"
|
||||
msgstr "Elimina dal ricevitore"
|
||||
|
||||
msgid "Screenshot"
|
||||
msgstr "Cattura schermata"
|
||||
msgstr "Screenshot"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "The Neutrino has only experimental support. Not all features are supported!"
|
||||
msgstr "Il Neutrino ha un supporto a livello sperimentale. Non tutte le caratteristiche sono supportate!"
|
||||
msgstr "Il Neutrino ha solo supporto sperimentale. Non tutte le funzionalità sono supportate!"
|
||||
|
||||
msgid "Enable experimental features"
|
||||
msgstr "Abilita le caratteristiche sperimentali"
|
||||
msgstr "Abilita caratteristiche sperimentali"
|
||||
|
||||
msgid "Can't Playback!"
|
||||
msgstr "Riproduzione impossibile!"
|
||||
@@ -1059,10 +1059,10 @@ msgid "Import from Web"
|
||||
msgstr "Importa dal Web"
|
||||
|
||||
msgid "Control"
|
||||
msgstr "Controllo"
|
||||
msgstr "Controlli"
|
||||
|
||||
msgid "Timers"
|
||||
msgstr "Timers"
|
||||
msgstr "Timer"
|
||||
|
||||
msgid "Timer"
|
||||
msgstr "Timer"
|
||||
@@ -1077,13 +1077,13 @@ msgid "Min."
|
||||
msgstr "Min."
|
||||
|
||||
msgid "Power"
|
||||
msgstr "Power"
|
||||
msgstr "Accendi"
|
||||
|
||||
msgid "Standby"
|
||||
msgstr "Standby"
|
||||
|
||||
msgid "Wake Up"
|
||||
msgstr "Accendi"
|
||||
msgstr "Risveglia"
|
||||
|
||||
msgid "Reboot"
|
||||
msgstr "Riavvia"
|
||||
@@ -1104,7 +1104,7 @@ msgid "Auto"
|
||||
msgstr "Аuto"
|
||||
|
||||
msgid "Grab screenshot"
|
||||
msgstr "Cattura schermata"
|
||||
msgstr "Cattura screenshot"
|
||||
|
||||
msgid "Enabled:"
|
||||
msgstr "Abilitato:"
|
||||
@@ -1140,7 +1140,7 @@ msgid "After event:"
|
||||
msgstr "Dopo l'evento:"
|
||||
|
||||
msgid "Location:"
|
||||
msgstr "Ubicazione:"
|
||||
msgstr "Posizione:"
|
||||
|
||||
msgid "Mo"
|
||||
msgstr "Lun"
|
||||
@@ -1173,7 +1173,7 @@ msgid "Create folder"
|
||||
msgstr "Crea cartella"
|
||||
|
||||
msgid "FTP client"
|
||||
msgstr "Cliente FTP"
|
||||
msgstr "Client FTP"
|
||||
|
||||
msgid "The file size is too large!"
|
||||
msgstr "Dimensione file eccessiva!"
|
||||
@@ -1191,7 +1191,7 @@ msgid "Date"
|
||||
msgstr "Data"
|
||||
|
||||
msgid "Toggle display position"
|
||||
msgstr "Commuta la posizione di visualizzazione"
|
||||
msgstr "Commuta posizione visualizzazione"
|
||||
|
||||
msgid "Alternatives"
|
||||
msgstr "Alternative"
|
||||
@@ -1208,26 +1208,26 @@ msgstr "Un servizio simile è già presente nella lista!"
|
||||
msgid "Play mode has been changed!\nRestart the program to apply the settings."
|
||||
msgstr "La modalitá di riproduzione è stata cambiata!\nRiavvia il programma per applicare i cambiamenti."
|
||||
|
||||
msgid "Set values for TID, NID and Namespace for correct naming of the picons!"
|
||||
msgstr "Stabilisci i valori TID, NID e Namespace per nominare correttamente i picons!"
|
||||
msgid "Set values for TID, NID and Namespace for correct naming of the picon!"
|
||||
msgstr "Stabilisci i valori TID, NID e Namespace per nominare correttamente i picon!"
|
||||
|
||||
msgid "Streams detected:"
|
||||
msgstr "Rilevati streams:"
|
||||
msgstr "Rilevati stream:"
|
||||
|
||||
msgid "Download picons"
|
||||
msgstr "Scarica picons"
|
||||
msgstr "Scarica picon"
|
||||
|
||||
msgid "Errors:"
|
||||
msgstr "Errori:"
|
||||
|
||||
msgid "Use to play streams:"
|
||||
msgstr "Per riprodurre gli streams usa:"
|
||||
msgstr "Riproduci gli stream con:"
|
||||
|
||||
msgid "Font in the lists:"
|
||||
msgstr "Carattere nelle liste:"
|
||||
|
||||
msgid "Picons size in the lists:"
|
||||
msgstr "Dimensione picons nelle liste:"
|
||||
msgstr "Dimensione picon nelle liste:"
|
||||
|
||||
msgid "Logo size in tooltips:"
|
||||
msgstr "Dimensione logo nei suggerimenti:"
|
||||
@@ -1252,6 +1252,7 @@ msgstr "Registrazioni"
|
||||
|
||||
msgid "Recordings:"
|
||||
msgstr "Registrazioni:"
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Aiuto"
|
||||
|
||||
@@ -1259,10 +1260,10 @@ msgid "HTTP API is not activated. Check your settings!"
|
||||
msgstr "Le API HTTP non sono attivate. Controlla le tue impostazioni!"
|
||||
|
||||
msgid "Add picons"
|
||||
msgstr "Aggiungi picons"
|
||||
msgstr "Aggiungi picon"
|
||||
|
||||
msgid "Logs"
|
||||
msgstr "Logs"
|
||||
msgstr "Log"
|
||||
|
||||
msgid "Title"
|
||||
msgstr "Titolo"
|
||||
@@ -1307,25 +1308,25 @@ msgid "Drag the services to the desired picon or picon to the list of selected s
|
||||
msgstr "Trascina i servizi sul picon desiderato o il picon sull'elenco dei servizi selezionati."
|
||||
|
||||
msgid "Sets the profile folder as default to store picons, backups, etc."
|
||||
msgstr "Imposta la cartella del profilo come predefinita per memorizzare picons, backups, etc."
|
||||
msgstr "Imposta la cartella del profilo come predefinita per memorizzare picon, backups, etc."
|
||||
|
||||
msgid "New sub-bouquet"
|
||||
msgstr "Nuovo sotto-bouquet"
|
||||
|
||||
msgid "Mark not presented in Bouquets"
|
||||
msgstr "Seleziona servizi non presenti nei bouquets"
|
||||
msgstr "Seleziona servizi non presenti nei bouquet"
|
||||
|
||||
msgid "Not in Bouquets"
|
||||
msgstr "No nei bouquets"
|
||||
msgstr "Non è nei bouquet"
|
||||
|
||||
msgid "Do not show services present in Bouquets."
|
||||
msgstr "Non mostrare i servizi presenti nei bouquets."
|
||||
msgstr "Non mostrare servizi presenti nei bouquet."
|
||||
|
||||
msgid "IPTV services only"
|
||||
msgstr "Solo servizi IPTV"
|
||||
|
||||
msgid "Display picons"
|
||||
msgstr "Visualizza picons"
|
||||
msgstr "Visualizza picon"
|
||||
|
||||
msgid "Alternate layout"
|
||||
msgstr "Disposizione alternativa"
|
||||
@@ -1349,10 +1350,37 @@ msgid "Add bookmark"
|
||||
msgstr "Aggiungi segnalibro"
|
||||
|
||||
msgid "All bouquets"
|
||||
msgstr "Tutti i bouquets"
|
||||
msgstr "Tutti i bouquet"
|
||||
|
||||
msgid "Playback from the main list"
|
||||
msgstr "Riproduzione dalla lista principale"
|
||||
msgstr "Riproduci dalla lista principale"
|
||||
|
||||
msgid "Enables URL parsing using youtube-dl to get direct links to media."
|
||||
msgstr "Abilita l'analisi degli URL utilizzando youtube-dl per ottenere collegamenti diretti ai media."
|
||||
|
||||
msgid "Permissions..."
|
||||
msgstr "Permessi..."
|
||||
|
||||
msgid "Display EPG in bouquet list"
|
||||
msgstr "Visualizza EPG nell'elenco bouquet"
|
||||
|
||||
msgid "EPG *.dat file:"
|
||||
msgstr "File EPG *.dat:"
|
||||
|
||||
msgid "Use HTTP to reload data in the receiver"
|
||||
msgstr "Utilizza HTTP per ricaricare i dati nel ricevitore"
|
||||
|
||||
msgid "Enable picons compression"
|
||||
msgstr "Abilita compressione picon"
|
||||
|
||||
msgid "Update interval (sec):"
|
||||
msgstr "Intervallo aggiornamento (sec):"
|
||||
|
||||
msgid "Update:"
|
||||
msgstr "Aggiornamento:"
|
||||
|
||||
msgid "Daily"
|
||||
msgstr "Quotidiano"
|
||||
|
||||
msgid "Assign reference"
|
||||
msgstr "Assegna riferimento"
|
||||
|
||||
@@ -3,7 +3,7 @@ msgstr ""
|
||||
"Project-Id-Version: DemonEditor\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-16 15:59+0300\n"
|
||||
"PO-Revision-Date: 2022-08-13 22:53+0300\n"
|
||||
"PO-Revision-Date: 2022-08-27 23:17+0300\n"
|
||||
"Last-Translator: audi06_19 <info@dreamosat-forum.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: tr\n"
|
||||
@@ -1389,3 +1389,30 @@ msgstr "Ana listeden oynatma"
|
||||
|
||||
msgid "Enables URL parsing using youtube-dl to get direct links to media."
|
||||
msgstr "Medyaya doğrudan bağlantılar almak için youtube-dl kullanarak URL ayrıştırmayı etkinleştirir."
|
||||
|
||||
msgid "Permissions..."
|
||||
msgstr "İzinler..."
|
||||
|
||||
msgid "Display EPG in bouquet list"
|
||||
msgstr "EPG'yi buket listesinde göster"
|
||||
|
||||
msgid "EPG *.dat file:"
|
||||
msgstr "EPG *.dat dosyası:"
|
||||
|
||||
msgid "Use HTTP to reload data in the receiver"
|
||||
msgstr "Alıcıdaki verileri yeniden yüklemek için HTTP kullanın"
|
||||
|
||||
msgid "Enable picons compression"
|
||||
msgstr "Picon sıkıştırmayı etkinleştir"
|
||||
|
||||
msgid "Update interval (sec):"
|
||||
msgstr "Güncelleme aralığı (sn):"
|
||||
|
||||
msgid "Update:"
|
||||
msgstr "Güncelleme:"
|
||||
|
||||
msgid "Daily"
|
||||
msgstr "Günlük"
|
||||
|
||||
msgid "Assign reference"
|
||||
msgstr "Referans ata"
|
||||
|
||||
Reference in New Issue
Block a user