From 878599f59b8864295277b58cf26e8ef880d8571f Mon Sep 17 00:00:00 2001 From: Thilo Kogge Date: Mon, 2 Nov 2020 18:47:46 +0100 Subject: [PATCH 1/7] drafted python part of timer --- common/main.py | 22 ++++++++++++-- common/timermanager.py | 61 +++++++++++++++++++++++++++++++++++++++ test/timermanager-test.py | 14 +++++++++ 3 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 common/timermanager.py create mode 100644 test/timermanager-test.py diff --git a/common/main.py b/common/main.py index 9dc1420..e511717 100644 --- a/common/main.py +++ b/common/main.py @@ -37,6 +37,7 @@ import datetime import re from concurrent.futures import ThreadPoolExecutor +from timermanager import TimerManager logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) @@ -64,6 +65,7 @@ class gPotherSide: def __init__(self): self.core = None self._checking_for_new_episodes = False + self.timermanager = TimerManager() def initialize(self, progname): assert self.core is None, 'Already initialized' @@ -448,13 +450,13 @@ def provider_sort_key(p): return p.priority return [{ - 'label': provider.name, + 'label': provider.unit_name, 'can_search': provider.kind == provider.PROVIDER_SEARCH } for provider in sorted(registry.directory.select(select_provider), key=provider_sort_key, reverse=True)] def get_directory_entries(self, provider, query): def match_provider(p): - return p.name == provider + return p.unit_name == provider for provider in registry.directory.select(match_provider): return [{ @@ -467,6 +469,22 @@ def match_provider(p): return [] + def disable_scheduled_update(self): + if self.timermanager.timer_and_service_exist(): + self.timermanager.deactivate_timer() + + def set_scheduled_update(self, interval): + if not self.timermanager.timer_and_service_exist(): + self.timermanager.write_service() + self.timermanager.write_timer(interval) + self.timermanager.activate_timer() + self.set_config_value("scheduled_update_interval", interval) + + def get_scheduled_update(self): + return self.get_config_value("scheduled_update_interval") + + + PILL_TEMPLATE = """ Date: Mon, 2 Nov 2020 20:07:31 +0100 Subject: [PATCH 2/7] implemented timepicker + updateservice --- common/main.py | 9 ++--- common/service.py | 13 +++++++ gpodder-sailfish.pro | 2 +- qml/SettingsPage.qml | 38 +++++++++++++++++++ .../harbour-org.gpodder.sailfish-bg.ts | 22 ++++++++--- .../harbour-org.gpodder.sailfish-de.ts | 22 ++++++++--- .../harbour-org.gpodder.sailfish-es.ts | 22 ++++++++--- .../harbour-org.gpodder.sailfish-it.ts | 22 ++++++++--- .../harbour-org.gpodder.sailfish-pl.ts | 22 ++++++++--- .../harbour-org.gpodder.sailfish-ru.ts | 22 ++++++++--- .../harbour-org.gpodder.sailfish-sv.ts | 22 ++++++++--- .../harbour-org.gpodder.sailfish-zh_CN.ts | 22 ++++++++--- translations/harbour-org.gpodder.sailfish.ts | 22 ++++++++--- 13 files changed, 199 insertions(+), 61 deletions(-) create mode 100644 common/service.py diff --git a/common/main.py b/common/main.py index e511717..75553e6 100644 --- a/common/main.py +++ b/common/main.py @@ -478,12 +478,7 @@ def set_scheduled_update(self, interval): self.timermanager.write_service() self.timermanager.write_timer(interval) self.timermanager.activate_timer() - self.set_config_value("scheduled_update_interval", interval) - - def get_scheduled_update(self): - return self.get_config_value("scheduled_update_interval") - - + self.set_config_value("update.scheduled_interval", interval) PILL_TEMPLATE = """ @@ -625,3 +620,5 @@ def gpotherside_image_provider(image_id, requested_size): get_directory_providers = gpotherside.get_directory_providers get_directory_entries = gpotherside.get_directory_entries show_podcast = gpotherside.show_podcast +disable_scheduled_update = gpotherside.disable_scheduled_update +set_scheduled_update = gpotherside.set_scheduled_update diff --git a/common/service.py b/common/service.py new file mode 100644 index 0000000..19473a8 --- /dev/null +++ b/common/service.py @@ -0,0 +1,13 @@ +from gpodder.api import core +from concurrent.futures import ThreadPoolExecutor +import logging + +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) + +gp_core = core.Core(progname="harbour-org.gpodder.sailfish") +with ThreadPoolExecutor() as executor: + for p in gp_core.model.get_podcasts(): + executor.submit(lambda p: p.update(),p) + +gp_core.shutdown() \ No newline at end of file diff --git a/gpodder-sailfish.pro b/gpodder-sailfish.pro index e5173d3..22ae453 100644 --- a/gpodder-sailfish.pro +++ b/gpodder-sailfish.pro @@ -24,7 +24,7 @@ gpodder.files = gpodder-core/src/* gpodder.path = $${DEPLOY_PATH}/ minidb.files = minidb/minidb.py minidb.path = $${DEPLOY_PATH}/ -mainpy.files = common/main.py +mainpy.files = common/*.py mainpy.path = $${DEPLOY_PATH}/ podcastparser.files = podcastparser/podcastparser.py podcastparser.path = $${DEPLOY_PATH}/ diff --git a/qml/SettingsPage.qml b/qml/SettingsPage.qml index f5407cb..f2fbacd 100644 --- a/qml/SettingsPage.qml +++ b/qml/SettingsPage.qml @@ -35,13 +35,26 @@ Page { py.getConfig('limit.episodes', function (value) { limit_episodes.value = value; }); + py.getConfig('update.scheduled_interval', function (value) { + if(value) settingsPage.automaticUpdateTime = value; + }); } else if (status === PageStatus.Deactivating) { py.setConfig('plugins.youtube.api_key_v3', youtube_api_key_v3.text); py.setConfig('limit.episodes', parseInt(limit_episodes.value)); youtube_api_key_v3.focus = false; + if(settingsPage.automaticUpdateTime){ + py.call('main.set_scheduled_update',[settingsPage.automaticUpdateTime]) + console.info("setting scheduled updater to:",settingsPage.automaticUpdateTime) + } + else{ + py.call('main.disable_scheduled_update') + console.info("disabling scheduled updater") + } } } + property var automaticUpdateTime + SilicaFlickable { id: settingsList anchors.fill: parent @@ -92,6 +105,31 @@ Page { maximumValue: 1000 stepSize: 100 } + + SectionHeader { + text: qsTr("Automatic Updates") + horizontalAlignment: Text.AlignHCenter + } + + Label{ + text: settingsPage.automaticUpdateTime + } + + Button { + id: automatic_update_time + text: qsTr("Choose Time") + onClicked: { + var dialog = pageStack.push("Sailfish.Silica.TimePickerDialog", { + hour: 6, + minute: 0, + hourMode: DateTime.TwelveHours + }) + dialog.accepted.connect(function() { + settingsPage.automaticUpdateTime = "*-*-* "+dialog.hour+":"+dialog.minute+":*" + }) + } + + } } } } diff --git a/translations/harbour-org.gpodder.sailfish-bg.ts b/translations/harbour-org.gpodder.sailfish-bg.ts index d47bac0..2954c86 100644 --- a/translations/harbour-org.gpodder.sailfish-bg.ts +++ b/translations/harbour-org.gpodder.sailfish-bg.ts @@ -512,35 +512,45 @@ SettingsPage - + About Относно - + Settings Настройки - + YouTube YouTube - + API Key (v3) API ключ (v3) - + Limits Ограничения - + Maximum episodes per feed Максимален брой епизоди за RSS емисия + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog diff --git a/translations/harbour-org.gpodder.sailfish-de.ts b/translations/harbour-org.gpodder.sailfish-de.ts index 75df417..f2d9688 100644 --- a/translations/harbour-org.gpodder.sailfish-de.ts +++ b/translations/harbour-org.gpodder.sailfish-de.ts @@ -512,35 +512,45 @@ SettingsPage - + About Über - + Settings Einstellungen - + YouTube YouTube - + API Key (v3) API Schlüssel (v3) - + Limits Grenzen - + Maximum episodes per feed Maximale Anzahl Episoden pro Feed + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog diff --git a/translations/harbour-org.gpodder.sailfish-es.ts b/translations/harbour-org.gpodder.sailfish-es.ts index 859d315..b36e091 100644 --- a/translations/harbour-org.gpodder.sailfish-es.ts +++ b/translations/harbour-org.gpodder.sailfish-es.ts @@ -512,35 +512,45 @@ SettingsPage - + About Acerca de - + Settings Ajustes - + YouTube YouTube - + API Key (v3) Clave API (v3) - + Limits Límites - + Maximum episodes per feed Núm. máximo de episodios por canal + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog diff --git a/translations/harbour-org.gpodder.sailfish-it.ts b/translations/harbour-org.gpodder.sailfish-it.ts index e381673..2f0438d 100644 --- a/translations/harbour-org.gpodder.sailfish-it.ts +++ b/translations/harbour-org.gpodder.sailfish-it.ts @@ -512,35 +512,45 @@ SettingsPage - + About Info - + Settings Impostazioni - + YouTube YouTube - + API Key (v3) API Key (v3) - + Limits Limiti - + Maximum episodes per feed Massimo episodi per feed + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog diff --git a/translations/harbour-org.gpodder.sailfish-pl.ts b/translations/harbour-org.gpodder.sailfish-pl.ts index b0d0fca..08f96a7 100644 --- a/translations/harbour-org.gpodder.sailfish-pl.ts +++ b/translations/harbour-org.gpodder.sailfish-pl.ts @@ -512,35 +512,45 @@ SettingsPage - + About O gPodder - + Settings Ustawienia - + YouTube YouTube - + API Key (v3) Klucz API (v3) - + Limits Limity - + Maximum episodes per feed Maksymalna liczba odcinków na kanał + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog diff --git a/translations/harbour-org.gpodder.sailfish-ru.ts b/translations/harbour-org.gpodder.sailfish-ru.ts index 07beb1f..6c14af3 100644 --- a/translations/harbour-org.gpodder.sailfish-ru.ts +++ b/translations/harbour-org.gpodder.sailfish-ru.ts @@ -512,35 +512,45 @@ SettingsPage - + About О программе - + Settings Настройка - + YouTube YouTube - + API Key (v3) Ключ API (версия 3) - + Limits Ограничения - + Maximum episodes per feed Максимальное число выпусков + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog diff --git a/translations/harbour-org.gpodder.sailfish-sv.ts b/translations/harbour-org.gpodder.sailfish-sv.ts index 88179c8..ab414ea 100644 --- a/translations/harbour-org.gpodder.sailfish-sv.ts +++ b/translations/harbour-org.gpodder.sailfish-sv.ts @@ -512,35 +512,45 @@ SettingsPage - + About Om - + Settings Inställningar - + YouTube YouTube - + API Key (v3) API-nyckel (v3) - + Limits Begränsningar - + Maximum episodes per feed Max antal avsnitt per flöde + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog diff --git a/translations/harbour-org.gpodder.sailfish-zh_CN.ts b/translations/harbour-org.gpodder.sailfish-zh_CN.ts index 8a562de..11ecdd5 100644 --- a/translations/harbour-org.gpodder.sailfish-zh_CN.ts +++ b/translations/harbour-org.gpodder.sailfish-zh_CN.ts @@ -512,35 +512,45 @@ SettingsPage - + About 关于 - + Settings 设置 - + YouTube YouTube - + API Key (v3) API 密钥(v3) - + Limits 限制 - + Maximum episodes per feed 每个订阅流的最大剧集 + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog diff --git a/translations/harbour-org.gpodder.sailfish.ts b/translations/harbour-org.gpodder.sailfish.ts index 0cae0ee..97a4279 100644 --- a/translations/harbour-org.gpodder.sailfish.ts +++ b/translations/harbour-org.gpodder.sailfish.ts @@ -512,35 +512,45 @@ SettingsPage - + About - + Settings - + YouTube - + API Key (v3) - + Limits - + Maximum episodes per feed + + + Automatic Updates + + + + + Choose Time + + SleepTimerDialog From e9f52080e712ed508c77adc8e47905672daf8fa3 Mon Sep 17 00:00:00 2001 From: Thilo Kogge Date: Mon, 2 Nov 2020 22:04:02 +0100 Subject: [PATCH 3/7] changed missing service command --- common/timermanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/timermanager.py b/common/timermanager.py index 4c17f0b..22f1d9a 100644 --- a/common/timermanager.py +++ b/common/timermanager.py @@ -29,7 +29,7 @@ def write_service(self): [Unit] Description=%s service [Service] -ExecStart=/bin/bash -c "echo 'gpodder service started!' | systemd-cat " +ExecStart=/usr/share/harbour-org.gpodder.sailfish/service.py """ % self.unit_name) def write_timer(self, interval="*-*-* *:*:0"): From 76150cf8475a82896f98d0c1e214df37320627f8 Mon Sep 17 00:00:00 2001 From: Thilo Kogge Date: Fri, 6 Nov 2020 19:54:55 +0100 Subject: [PATCH 4/7] added dbus and i18n to service --- common/service.py | 33 +++++++++++++++--- translations/py_gettext/base.pot | 26 ++++++++++++++ .../py_gettext/de/LC_MESSAGES/base.mo | Bin 0 -> 205 bytes .../py_gettext/de/LC_MESSAGES/base.po | 7 ++++ .../py_gettext/en/LC_MESSAGES/base.mo | Bin 0 -> 199 bytes .../py_gettext/en/LC_MESSAGES/base.po | 7 ++++ 6 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 translations/py_gettext/base.pot create mode 100644 translations/py_gettext/de/LC_MESSAGES/base.mo create mode 100644 translations/py_gettext/de/LC_MESSAGES/base.po create mode 100644 translations/py_gettext/en/LC_MESSAGES/base.mo create mode 100644 translations/py_gettext/en/LC_MESSAGES/base.po diff --git a/common/service.py b/common/service.py index 19473a8..9c11bcf 100644 --- a/common/service.py +++ b/common/service.py @@ -1,13 +1,36 @@ from gpodder.api import core from concurrent.futures import ThreadPoolExecutor import logging +import dbus +import gettext + +appname = "harbour-org.gpodder.sailfish" +lang_translations = gettext.translation('base', + localedir='/usr/share/harbour-org.gpodder.sailfish/translations/py_gettext') +_ = lang_translations.gettext logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) -gp_core = core.Core(progname="harbour-org.gpodder.sailfish") -with ThreadPoolExecutor() as executor: - for p in gp_core.model.get_podcasts(): - executor.submit(lambda p: p.update(),p) +logger.info("starting scheduled gpodder refresh") + + +def run_update(): + gp_core = core.Core(progname=appname) + with ThreadPoolExecutor() as executor: + for p in gp_core.model.get_podcasts(): + executor.submit(lambda p: p.update(), p) + + gp_core.shutdown() + +run_update() + -gp_core.shutdown() \ No newline at end of file +bus = dbus.SessionBus(private=False) +notify = dbus.Interface(bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications"), + 'org.freedesktop.Notifications') +notify.Notify(appname, 200, "icon-s-filled-warning", _('gpodder.refresh_notification_title'), + _('gpodder.refresh_notification_body'), + ["", "default", "", "app"], + {'x-nemo-preview-summary': _('gpodder.refresh_notification_title'), + 'x-nemo-preview-body': _('gpodder.refresh_notification_body')}, -1) diff --git a/translations/py_gettext/base.pot b/translations/py_gettext/base.pot new file mode 100644 index 0000000..8ed0312 --- /dev/null +++ b/translations/py_gettext/base.pot @@ -0,0 +1,26 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-06 19:44+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: common/service.py:13 common/service.py:27 common/service.py:29 +msgid "gpodder.refresh_notification_title" +msgstr "" + +#: common/service.py:27 common/service.py:29 +msgid "gpodder.refresh_notification_body" +msgstr "" diff --git a/translations/py_gettext/de/LC_MESSAGES/base.mo b/translations/py_gettext/de/LC_MESSAGES/base.mo new file mode 100644 index 0000000000000000000000000000000000000000..925633d80fe8af1b1021e29799393a110a641440 GIT binary patch literal 205 zcmca7#4?ou2$+Ca28eZlm=%a^fLIZT1Atfwh>M^!NU;bI?*L*(Acg^ueh^46$WKX0 zEz&DWO)E+*&WO*;FUd^HOinDx%+HHY%1^1puc9QgBqx=@F()TgAs{~`IkC8;SfRYM fC?z#dAu+q8G%+W$I5V}VM3KQAC=Ij+MU(*mNP{%I literal 0 HcmV?d00001 diff --git a/translations/py_gettext/de/LC_MESSAGES/base.po b/translations/py_gettext/de/LC_MESSAGES/base.po new file mode 100644 index 0000000..0ea1fb2 --- /dev/null +++ b/translations/py_gettext/de/LC_MESSAGES/base.po @@ -0,0 +1,7 @@ +#: common/service.py:27 common/service.py:29 +msgid "gpodder.refresh_notification_title" +msgstr "GPodder aktualisiert" + +#: common/service.py:27 common/service.py:29 +msgid "gpodder.refresh_notification_body" +msgstr "Alle Podcasts wurden aktualisiert!" diff --git a/translations/py_gettext/en/LC_MESSAGES/base.mo b/translations/py_gettext/en/LC_MESSAGES/base.mo new file mode 100644 index 0000000000000000000000000000000000000000..55e619185671974ba599b8038a2760220d8834ca GIT binary patch literal 199 zcmaLQu?@m75Cu?!U;wC*xKJY|prNA829cAy5KERF*+--d!YHi6EPNwq`O@qD-G6OY z4}&aW2S-@L87ipZ015U`${TpX0)8p?CATp$OFAX#ljNZZQC;skt1gD7jXeKvs8cWI f;yvL{XR~G+>?G8R1iFuGRk$+O`ZGe`5n=NN{FpJa literal 0 HcmV?d00001 diff --git a/translations/py_gettext/en/LC_MESSAGES/base.po b/translations/py_gettext/en/LC_MESSAGES/base.po new file mode 100644 index 0000000..c4c7370 --- /dev/null +++ b/translations/py_gettext/en/LC_MESSAGES/base.po @@ -0,0 +1,7 @@ +#: common/service.py:27 common/service.py:29 +msgid "gpodder.refresh_notification_title" +msgstr "GPodder refreshed" + +#: common/service.py:27 common/service.py:29 +msgid "gpodder.refresh_notification_body" +msgstr "All podcasts have been updated!" From 8e09af561b197cb510f499b915c11beb7181c523 Mon Sep 17 00:00:00 2001 From: Thilo Kogge Date: Fri, 6 Nov 2020 19:59:02 +0100 Subject: [PATCH 5/7] made home path relative --- common/timermanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/timermanager.py b/common/timermanager.py index 22f1d9a..2ae5061 100644 --- a/common/timermanager.py +++ b/common/timermanager.py @@ -8,7 +8,7 @@ class TimerManager(): def __init__(self, unit_name="harbour-org.gpodder.sailfish", - unit_file_location="/home/defaultuser/.config/systemd/user/"): + unit_file_location=pathlib.Path.home().joinpath(".config/systemd/user/")): self.unit_name = unit_name self.prefix = unit_file_location self.prefixpath = pathlib.Path(self.prefix) From 8f61a4e24202a366688355f53c97824a3e625be9 Mon Sep 17 00:00:00 2001 From: Thilo Kogge Date: Sat, 7 Nov 2020 15:59:12 +0100 Subject: [PATCH 6/7] added icon to dbus notification, fixed service run command --- common/service.py | 15 +++++++++++---- common/timermanager.py | 3 ++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/common/service.py b/common/service.py index 9c11bcf..63dfe8e 100644 --- a/common/service.py +++ b/common/service.py @@ -3,10 +3,15 @@ import logging import dbus import gettext +import argparse + +parser = argparse.ArgumentParser(description='Background daemon/service for gpodder') +parser.add_argument('--dry-run', action="store_true", help='skip any actions') + +args = parser.parse_args() appname = "harbour-org.gpodder.sailfish" -lang_translations = gettext.translation('base', - localedir='/usr/share/harbour-org.gpodder.sailfish/translations/py_gettext') +lang_translations = gettext.translation('base', localedir='translations/py_gettext') _ = lang_translations.gettext logger = logging.getLogger(__name__) @@ -23,13 +28,15 @@ def run_update(): gp_core.shutdown() -run_update() +if not args.dry_run: + run_update() bus = dbus.SessionBus(private=False) notify = dbus.Interface(bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications"), 'org.freedesktop.Notifications') -notify.Notify(appname, 200, "icon-s-filled-warning", _('gpodder.refresh_notification_title'), +notify.Notify(appname, 200, "/usr/share/icons/hicolor/86x86/apps/%s.png" %appname, + _('gpodder.refresh_notification_title'), _('gpodder.refresh_notification_body'), ["", "default", "", "app"], {'x-nemo-preview-summary': _('gpodder.refresh_notification_title'), diff --git a/common/timermanager.py b/common/timermanager.py index 2ae5061..1d6e891 100644 --- a/common/timermanager.py +++ b/common/timermanager.py @@ -29,7 +29,8 @@ def write_service(self): [Unit] Description=%s service [Service] -ExecStart=/usr/share/harbour-org.gpodder.sailfish/service.py +WorkingDirectory=/usr/share/harbour-org.gpodder.sailfish/ +ExecStart=/usr/bin/python3 /usr/share/harbour-org.gpodder.sailfish/service.py """ % self.unit_name) def write_timer(self, interval="*-*-* *:*:0"): From 6b82ab085b0ebaf144729e078546332649703d25 Mon Sep 17 00:00:00 2001 From: Thilo Kogge Date: Sat, 7 Nov 2020 16:01:48 +0100 Subject: [PATCH 7/7] changed notification appname --- common/service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/service.py b/common/service.py index 63dfe8e..f8154f4 100644 --- a/common/service.py +++ b/common/service.py @@ -35,7 +35,7 @@ def run_update(): bus = dbus.SessionBus(private=False) notify = dbus.Interface(bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications"), 'org.freedesktop.Notifications') -notify.Notify(appname, 200, "/usr/share/icons/hicolor/86x86/apps/%s.png" %appname, +notify.Notify("GPodder", 200, "/usr/share/icons/hicolor/86x86/apps/%s.png" %appname, _('gpodder.refresh_notification_title'), _('gpodder.refresh_notification_body'), ["", "default", "", "app"],