Projects
Multimedia
gpodder3
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 27
View file
gpodder3.changes
Changed
@@ -1,4 +1,129 @@ ------------------------------------------------------------------- +Tue Dec 13 10:40:24 UTC 2022 - Fridrich Strba <fridrich.strba@bluewin.ch> + +- Update to 3.11.0 + * Major changes: + + Warning there is a database schema update + + numerous bug fixes + + performance improvements + + a new preferences dialog + + support again syncing to mtp:// and iPod devices on Linux + * New features + + #1054, #1112, #1115, #1149, #1152, #1155, #1160, #1191, #1213 + use Gio for file system based device sync (allows mtp:// URLs + for Linux only) + + #1083 add option to rename_download extension to put the + sortdate after the podcast title + + #1108 add --close-after-startup option for benchmarking + startup time + + #1121 add option to require control click to sort episodes + + #1127 double-click or press Enter to open channel settings + + #1132 allow distributions to disable the update check + + #1289, #1334, #1335 iPod support restored using ctypes and + libgpod (needs libgpod installed on the system) + * Improvements + + #1093 reset shownotes scrolling to top when changing episodes + + #1094 create an html description when none provided by feed to + highlight links in shownotes + + #1096 restore window maximize state + + #1098 make the text shownotes title a clickable and copyable + link + + #1105 fix loading of cached thumbnails to reduce startup time + + #1107 refactor resize_pixbuf_keep_ratio to speed up thumbnail + scaling + + #1108 add logging and advanced cli option groups + + #1120 support PEP 440 local version label + + #1130 query duration for youtube episodes when not using + youtube-dl + + #1135 use a TextView for dialogs with multiple text lines + + #1154, #1156, #1172, #1188 remove deprecated Gtk features + + #1158 remove unused variables from play_or_download + + #1159 show paused tasks in progress tab + + #1161 set a paused icon in episode list when an episode is + paused + + #1174 improve youtube initial player response regular + expression + + #1182, #1259 use youtube-dl or yt-dlp for the youtube-dl + extension + + #1201 open error dialog if user tries to use not-installed + program + + #1201 open error dialog if xdg-open is not found when opening + a folder + + #1233 reduce number of network queries per youtube feed + + #1233 catch youtube coverart and description query errors and + show better error messages + + #1235 make error message more verbose on NotFound gpodder.net + sync error + + #1242 allow pausing and resuming downloads from Episodes and + context menus, and toolbar + + #1244 undelete deleted episodes when a download is attempted + so failure leaves it undeleted + + #1246 add episode art URL and chapters to database + + #1248 allow failed downloads to be cancelled from episodes + list + + #1249, #1252, #1255, #1269 refactor episode/task actions for + consistency between toolbar and context/Episodes menus + + #1261 use GtkStack instead of GtkNotebook in preferences + + #1268 add youtube-dl extension to preferences dialog + + #1272 show episodes without downloadable content + + #1274 narrower preferences dialog + + #1285 open episode download folder from context and Episodes + menus + + #1300 retry failed episode downloads, without authentication, + if feed uses authentication + + #1313 remove border around extensions list in preferences + + #1330 add/remove extension preferences buttons when + loaded/unloaded + + optimize youtube code + + support youtube 'user' feed URLs + + change order of progress button status counts + + make the About dialog text selectable to copy version + + use all lowercase letters in youtube-dl name + + use proper capitalization for YouTube name + * Bug fixes + + #1106 properly scale cover/pill on hires displays + + #1110 fix missing extension when downloading youtube-dl + format=worstaudio (audio/webm mimetype) + + #1124 fix #1099 folder not escaped when renaming podcast from + dialog + + #1126, #1211 fix Windows taskbar progress extension + + #1141 delay episode treeview column reordering to prevent gtk + warnings on console + + #1145 restore window position before and after window is shown + to fix issues with some window managers + + #1171 actually delete partial file when cancelling + + #1171 cancel failed task before streaming + + #1193 do not try to rename the outtmpl file in the youtube-dl + extension + + #1206 fix shownotes for episodes that contain HTML comments + + #1219 youtube-dl extension should always rename partial files + with extensions + + #1219 clean up parial files created by cancelled YoutubeDL + downloads + + #1221 perform chosen "after sync" action in gpo + + #1222 fix warning when exporting to local folder on systems + with buttons in dialog headerbar + + #1222 fix typo in "file exists" message when saving episodes + + #1228 create partial file when reusing cancelled tasks + + #1262 prevent youtube-dl failure for some RSS feeds + + #1265, #1286 MPRIS extension fixes + + #1276 trim leading/trailing whitespace in user-clipboard + auto-inputted URLs + + #1280 open links in HTML shownotes + + #1287 close extension files after reading metadata + + #1287 change deprecated logger.warn() to logger.warning() + + #1287 close config file after loading it + + #1320 prevent links from opening browser twice + + #1335 don't print traceback on missing eyed3.mp3 + + fix #1227 pixbuf could be None in some cases + + fix #1254 prevent crash when gpo sync removes episodes from + gpodder + + remove erroneous logger parameter when failing to get Youtube + GDPR URL + + prevent normalize extension from placing files in the + directory gpodder was started in + +------------------------------------------------------------------- Thu Aug 19 06:14:17 UTC 2021 - Fridrich Strba <fridrich.strba@bluewin.ch> - Update to 3.10.21
View file
gpodder3.spec
Changed
@@ -1,7 +1,7 @@ # # spec file for package gpodder3 # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2022 SUSE LLC # Copyright (c) 2012 Pascal Bleser <pascal.bleser@opensuse.org> # # All modifications and additions to the file contributed by third parties @@ -18,7 +18,7 @@ Name: gpodder3 -Version: 3.10.21 +Version: 3.11.0 Release: 0 Summary: A free podcast aggregator for Linux License: GPL-3.0-or-later
View file
3.10.21.tar.gz/.travis.yml
Deleted
@@ -1,13 +0,0 @@ -language: python -dist: focal -sudo: required -python: - - "3.8" -install: - - sudo apt-get update -q - - sudo apt-get install intltool desktop-file-utils - - pip3 install pytest-cov minimock pycodestyle isort requests pytest pytest-httpserver - - python3 tools/localdepends.py -script: - - make lint - - make releasetest
View file
3.10.21.tar.gz/.circleci/config.yml -> 3.11.0.tar.gz/.circleci/config.yml
Changed
@@ -3,10 +3,10 @@ jobs: release-from-macos: macos: - xcode: "11.1.0" + xcode: "13.2.1" shell: /bin/bash --login -o pipefail environment: - - BUNDLE_TAG: 21.4.27 + - BUNDLE_TAG: 22.7.28 steps: - checkout - run: >
View file
3.11.0.tar.gz/.github/workflows
Added
+(directory)
View file
3.11.0.tar.gz/.github/workflows/linttest.yml
Added
@@ -0,0 +1,32 @@ +name: lint and test + +on: push, pull_request + +jobs: + linttest: + name: lint and unit tests + if: >- + github.event_name == 'push' || + github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: 3.9 + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + sudo apt-get update -q + sudo apt-get install intltool desktop-file-utils + pip3 install pytest-cov minimock pycodestyle isort requests pytest pytest-httpserver + python3 tools/localdepends.py + - name: Lint + run: make lint + - name: Test + run: make releasetest
View file
3.10.21.tar.gz/.gitignore -> 3.11.0.tar.gz/.gitignore
Changed
@@ -12,3 +12,4 @@ share/applications/gpodder.desktop share/dbus-1/services/org.gpodder.service share/locale/ +venv/*
View file
3.11.0.tar.gz/CONTRIBUTING.md
Added
@@ -0,0 +1,30 @@ +# Contributing to this repository <!-- omit in toc --> + +## Getting started <!-- omit in toc --> + +Before you begin: +- Ensure you are using Python 3.5+ +- Check out the existing issues(https://github.com/gpodder/gpodder/issues) + +Contributions are made to this repo via Issues and Pull Requests (PRs). Make sure to search for existing Issues and PRs before creating your own. + + +## Getting the code and setting up the project +1. Fork this project +2. Clone the repository to your machine +3. Create a separate branch to get started, e.g. for feature `feat/branch-name-here` or fix `fix/fix-name-goes-here` +4. Make sure to create a new virtual environment and activate it: +```shell +python3 -m venv venv +source activate venv/bin/activate +``` +5. Install dependencies: `python3 tools/localdepends.py` +6. Start the program with debug mode: `./bin/gpodder -v` +7. Make the changes, commit in a branch and push the branch to your fork and then submit a Pull Request. + +## Linting +To ensure code quality, we recommend you to run the linter before pushing the changes to your repo. In order to do so ensure the necessary packages are installed by executing: +```shell +pip3 install pytest-cov minimock pycodestyle isort requests pytest pytest-httpserver +``` +Execute the linter in the root directory (Linux only): `make lint unittest`. On Windows execute: `pycodestyle share src/gpodder tools bin/* *.py` \ No newline at end of file
View file
3.10.21.tar.gz/README.md -> 3.11.0.tar.gz/README.md
Changed
@@ -6,7 +6,7 @@ Media aggregator and podcast client ___ -Copyright 2005-2018 The gPodder Team +Copyright 2005-2022 The gPodder Team ## License @@ -43,6 +43,7 @@ ### GTK3 UI - Additional Dependencies - PyGObject(https://wiki.gnome.org/PyGObject) 3.22.0 or newer +- GTK+3(https://www.gtk.org/) 3.16 or newer ### Optional Dependencies @@ -51,11 +52,11 @@ - Size detection on Windows: PyWin32 - Native OS X support: ige-mac-integration - MP3 Player Sync Support: python-eyed3 (0.7 or newer) -- iPod Sync Support: python-gpod +- iPod Sync Support: libgpod (tested with 0.8.3) - Clickable links in GTK UI show notes: html5lib - HTML show notes: WebKit2 gobject bindings (webkit2gtk, webkitgtk4 or gir1.2-webkit2-4.0 packages). -- Better Youtube support (> 15 entries in feeds, download audio-only): youtube_dl +- Better Youtube support (> 15 entries in feeds, download audio-only): youtube_dl or yt-dlp ### Build Dependencies
View file
3.10.21.tar.gz/bin/gpo -> 3.11.0.tar.gz/bin/gpo
Changed
@@ -216,8 +216,8 @@ self._extensions_episode_download_cb) @contextlib.contextmanager - def _action(self, msg, *args): - self._start_action(msg, *args) + def _action(self, msg): + self._start_action(msg) try: yield self._finish_action() @@ -271,8 +271,8 @@ self._info(_('Episode download requested by extensions.')) self._download_episode(episode) - def _start_action(self, msg, *args): - line = util.convert_bytes(msg % args) + def _start_action(self, msg): + line = util.convert_bytes(msg) if len(line) > self.COLUMNS - 7: line = line:self.COLUMNS - 7 - 3 + '...' else: @@ -379,7 +379,7 @@ podcast.rename(title) podcast.save() except Exception as e: - logger.warn('Cannot subscribe: %s', e, exc_info=True) + logger.warning('Cannot subscribe: %s', e, exc_info=True) if hasattr(e, 'strerror'): self._error(e.strerror) else: @@ -543,7 +543,7 @@ return True def _update_podcast(self, podcast): - with self._action(' %s', podcast.title): + with self._action(' %s' % podcast.title): podcast.update() def _pending_message(self, count): @@ -618,11 +618,12 @@ return True def _download_episode(self, episode): - with self._action('Downloading %s', episode.title): + with self._action('Downloading %s' % episode.title): task = download.DownloadTask(episode, self._config) task.add_progress_callback(self._update_action) task.status = download.DownloadTask.DOWNLOADING task.run() + task.recycle() def _download_episodes(self, episodes): if self._config.downloads.chronological_order: @@ -935,6 +936,13 @@ def _not_applicable(*args, **kwargs): pass + def _mount_volume_for_file(file): + result, message = util.mount_volume_for_file(file, None) + if not result: + self._error(_('mounting volume for file %(file)s failed with: %(error)s' + % dict(file=file.get_uri(), error=message))) + return result + class DownloadStatusModel(object): def register_task(self, ask): pass @@ -943,11 +951,22 @@ def queue_task(x, task): def progress_updated(progress): self._update_action(progress) - with self._action(_('Syncing %s'), ep_repr(task.episode)): + with self._action(_('Syncing %s') % ep_repr(task.episode)): task.status = sync.SyncTask.DOWNLOADING task.add_progress_callback(progress_updated) task.run() + if task.notify_as_finished(): + if self._config.device_sync.after_sync.mark_episodes_played: + logger.info('Marking as played on transfer: %s', task.episode.url) + task.episode.mark(is_played=True) + + if self._config.device_sync.after_sync.delete_episodes: + logger.info('Removing episode after transfer: %s', task.episode.url) + task.episode.delete_from_disk() + + task.recycle() + done_lock = threading.Lock() self.mygpo_client = my.MygPoClient(self._config) sync_ui = gPodderSyncUI(self._config, @@ -961,7 +980,8 @@ _not_applicable, self._db.commit, _delete_episode_list, - _episode_selector) + _episode_selector, + _mount_volume_for_file) done_lock.acquire() sync_ui.on_synchronize_episodes(self._model.get_podcasts(), episodes=None, force_played=True, done_callback=done_lock.release) done_lock.acquire() # block until done
View file
3.10.21.tar.gz/bin/gpodder -> 3.11.0.tar.gz/bin/gpodder
Changed
@@ -33,7 +33,7 @@ import platform import subprocess import sys -from optparse import OptionParser +from optparse import OptionGroup, OptionParser logger = logging.getLogger(__name__) @@ -82,6 +82,9 @@ gpodder.prefix = prefix + # Package managers can install the empty file {prefix}/share/gpodder/no-update-check to disable update checks + gpodder.no_update_check_file = os.path.join(prefix, 'share', 'gpodder', 'no-update-check') + # Enable i18n for gPodder translations _ = gpodder.gettext @@ -95,21 +98,34 @@ parser = OptionParser(usage=s_usage, version=s_version) - parser.add_option("-v", "--verbose", - action="store_true", dest="verbose", default=False, - help=_("print logging output on the console")) + grp_subscriptions = OptionGroup(parser, "Subscriptions") + parser.add_option_group(grp_subscriptions) + + grp_subscriptions.add_option('-s', '--subscribe', dest='subscribe', + metavar='URL', + help=_('subscribe to the feed at URL')) + + grp_logging = OptionGroup(parser, "Logging") + parser.add_option_group(grp_logging) + + grp_logging.add_option("-v", "--verbose", + action="store_true", dest="verbose", default=False, + help=_("print logging output on the console")) + + grp_logging.add_option("-q", "--quiet", + action="store_true", dest="quiet", default=False, + help=_("reduce warnings on the console")) - parser.add_option("-q", "--quiet", - action="store_true", dest="quiet", default=False, - help=_("reduce warnings on the console")) + grp_advanced = OptionGroup(parser, "Advanced") + parser.add_option_group(grp_advanced) - parser.add_option('-s', '--subscribe', dest='subscribe', metavar='URL', - help=_('subscribe to the feed at URL')) + grp_advanced.add_option("--close-after-startup", action="store_true", + help=_("exit once started up (for profiling)")) # On Mac OS X, support the "psn" parameter for compatibility (bug 939) if gpodder.ui.osx: - parser.add_option('-p', '--psn', dest='macpsn', metavar='PSN', - help=_('Mac OS X application process number')) + grp_advanced.add_option('-p', '--psn', dest='macpsn', metavar='PSN', + help=_('Mac OS X application process number')) options, args = parser.parse_args(sys.argv)
View file
3.10.21.tar.gz/po/ca.po -> 3.11.0.tar.gz/po/ca.po
Changed
@@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Catalan (http://www.transifex.com/projects/p/gpodder/language/" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "" @@ -64,63 +64,68 @@ msgid "Imported OPML file" msgstr "" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "" @@ -137,8 +142,8 @@ msgid "Post download" msgstr "" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "" @@ -156,46 +161,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -209,212 +212,206 @@ msgid "Remove %s" msgstr "" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311 msgid "Opening iPod database" msgstr "" -#: src/gpodder/sync.py:364 +#: src/gpodder/sync.py:317 msgid "iPod opened"
View file
3.10.21.tar.gz/po/cs.po -> 3.11.0.tar.gz/po/cs.po
Changed
@@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Czech (http://www.transifex.com/projects/p/gpodder/language/" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "gPodder nalezl %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Chyba spouštění přehrávače: %s" @@ -72,68 +72,74 @@ msgid "Imported OPML file" msgstr "Export do OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -#, fuzzy -msgid "Added" -msgstr "Pokročilé" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Zařazeno do fronty" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 #, fuzzy msgid "Downloading" msgstr "stahování" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 #, fuzzy msgid "Failed" msgstr "Filtr:" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +msgid "Cancelling" +msgstr "Zrušit" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 #, fuzzy msgid "Cancelled" msgstr "Zrušit" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +msgid "Pausing" +msgstr "Hodnota" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy msgid "Episode has no URL to download" msgstr "Označte epizody ke stažení." -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, fuzzy, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Chyba otevírání %s: %s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, fuzzy, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Chyba otevírání %s: %s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, fuzzy, python-format msgid "Error: %s" msgstr "Chyba otevírání %s: %s" @@ -152,8 +158,8 @@ msgid "Post download" msgstr "_Zrušit stahování" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "" @@ -172,47 +178,45 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Popis není dostupný" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 #, fuzzy msgid "unknown" msgstr "(neznámý)" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -226,159 +230,124 @@ msgid "Remove %s" msgstr "Odstranit %s?" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Zrušeno uživatelem" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Zápis dat na disk"
View file
3.10.21.tar.gz/po/cs_CZ.po -> 3.11.0.tar.gz/po/cs_CZ.po
Changed
@@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" @@ -28,12 +28,12 @@ msgid "gPodder on %s" msgstr "gPodder na %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Zdroj na %(url)s se nepodařilo aktualizovat." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Chyba při otevírání přehrávače" @@ -77,66 +77,75 @@ msgid "Imported OPML file" msgstr "Importovat z OPML souboru" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Přidáno" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Zařazeno do fronty" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Stahování" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Dokončeno" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Selhalo" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Zrušení..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Zrušeno" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Pozastavit" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pozastaveno" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Vyberte episody, které chcete stáhnout:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Poznámky" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Chyba syntaxe: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Chyba vstupu/výstupu: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Chyba HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Chyba: %s" @@ -153,8 +162,8 @@ msgid "Post download" msgstr "Příspěvek ke stažení" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Jiný" @@ -172,46 +181,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Python modul %(module)s nebyl nalezen" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Popis není k dispozici" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "neznámý" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Výchozí" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Zachovat pouze poslední" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -225,119 +232,89 @@ msgid "Remove %s" msgstr "Odebrat %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Zrušeno uživatelem" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Zapisování dat na disk" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/da.po -> 3.11.0.tar.gz/po/da.po
Changed
@@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Danish (http://www.transifex.com/projects/p/gpodder/language/" @@ -26,12 +26,12 @@ msgid "gPodder on %s" msgstr "gPodder på %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Feedet %(url)s kunne ikke opdateres." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Fejl ved åbning af afspiller" @@ -76,65 +76,74 @@ msgid "Imported OPML file" msgstr "Importér fra OPML-fil" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Tilføjet" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Sat i kø" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Downloader" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Afsluttet" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Fejlet" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Annullerer..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Annulleret" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Sæt på pause" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Sat på pause" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Vælg de episoder, du ønsker at downloade:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Manglende data fra server" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O-fejl: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-fejl: %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Fejl: %s" @@ -153,8 +162,8 @@ msgid "Post download" msgstr "Sæt download på pause" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Andet" @@ -173,46 +182,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python-modulet \"%s\" er ikke installeret" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Ingen tilgængelig beskrivelse" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "ukendt" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Lyd" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -226,120 +233,89 @@ msgid "Remove %s" msgstr "Fjern %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Afbrudt af bruger" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Skriver data til disk" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311
View file
3.10.21.tar.gz/po/de.po -> 3.11.0.tar.gz/po/de.po
Changed
@@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" -"PO-Revision-Date: 2021-01-02 02:30+0100\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" +"PO-Revision-Date: 2022-07-08 18:06+0200\n" "Last-Translator: TZocker\n" "Language-Team: German (http://www.transifex.com/projects/p/gpodder/language/" "de/)\n" @@ -18,19 +18,19 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.3\n" +"X-Generator: Poedit 2.4.2\n" #: src/gpodder/config.py:53 #, python-format msgid "gPodder on %s" msgstr "gPodder auf %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "Der Ordner %s konnte nicht erstellt werden." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Fehler beim Schreiben der Wiedergabeliste" @@ -66,67 +66,70 @@ msgid "Imported OPML file" msgstr "Importierte OPML-Datei" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Hinzugefügt" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Eingereiht" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Herunterladen" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Fertig" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Fehlgeschlagen" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "Abbrechen" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Abgebrochen" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "Pausieren" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pause" -#: src/gpodder/download.py:864 -#, fuzzy -#| msgid "Select the episodes you want to download:" +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" -msgstr "Wählen Sie die Episoden, die Sie herunterladen möchten:" +msgstr "Episode hat keine URL zum Herunterladen" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Fehlender Inhalt vom Server" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" "Es konnte keine Verbindung mit dem Server %(host)s:%(port)s hergestellt " "werden" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "Anforderungsfehler: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O Fehler: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-Fehler %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Fehler: %s" @@ -143,8 +146,8 @@ msgid "Post download" msgstr "Nach dem Download" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Andere" @@ -162,39 +165,37 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Brauche zumindest eines der folgenden Kommandos: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Python-Modul nicht gefunden: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Keine Beschreibung verfügbar" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "unbekannt" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Standard" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Nur aktuellste behalten" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " @@ -203,7 +204,7 @@ "Warnung: Der Pfad zum gPodder Homeverzeichnis (%(root)s) ist sehr lang und " "kann dazu führen, dass Dateien nicht heruntergeladen werden können.\n" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "Es wird empfohlen, einen kürzeren Pfad festzulegen." @@ -217,56 +218,52 @@ msgid "Remove %s" msgstr "Entferne %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206
View file
3.10.21.tar.gz/po/el.po -> 3.11.0.tar.gz/po/el.po
Changed
@@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Teo <anapospastos@hotmail.com>\n" "Language-Team: Greek (http://www.transifex.com/projects/p/gpodder/language/" @@ -26,12 +26,12 @@ msgid "gPodder on %s" msgstr "Το gPodder στο %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Η ροή στο %(url)s δεν ήταν δυνατό να ενημερωθεί." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Σφάλμα κατά το άνοιγμα του αναπαραγωγέα" @@ -75,66 +75,75 @@ msgid "Imported OPML file" msgstr "Εισαγωγή από αρχείο OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Προστέθηκε" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Σε αναμονή" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Λήψη" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Τελείωσε" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Απέτυχε" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Ακύρωση..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Ακυρώθηκε" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Παύση" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Παύση" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Επίλεξε τα επεισόδια που θέλεις να κατεβάσεις:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Λείπει περιεχόμενο από τον διακομιστή" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Συντακτικό λάθος: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Σφάλμα I/O: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Σφάλμα HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Σφάλμα: %s" @@ -153,8 +162,8 @@ msgid "Post download" msgstr "Παύση λήψης" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Άλλο" @@ -172,46 +181,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Το python module \"%s\" δεν είναι εγκατεστημένο" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Δεν υπάρχει διαθέσιμη περιγραφή" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "άγνωστο" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Βίντεο" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Ήχος" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -225,122 +232,92 @@ msgid "Remove %s" msgstr "Αφαίρεση %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Ακυρώθηκε από το χρήστη" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Εγγραφή δεδομένων στο δίσκο" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/es.po -> 3.11.0.tar.gz/po/es.po
Changed
@@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/gpodder/language/" @@ -25,12 +25,12 @@ msgid "gPodder on %s" msgstr "gPodder en %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "El RSS en %(url)s no pudo ser actualizado." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Error al abrir reproductor" @@ -75,66 +75,75 @@ msgid "Imported OPML file" msgstr "Importar de OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Agregado" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Puesto en cola" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Descargando" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Terminado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Fallado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Cancelando..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Cancelado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Pausa" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pausado" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Seleccione los capítulos que desea descargar:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Falta contenido en el servidor" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Error de sintaxis: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Error de Entrada/Salida: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Error HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Error: %s" @@ -154,8 +163,8 @@ msgid "Post download" msgstr "Cancelar descarga" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Otro" @@ -173,47 +182,45 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Módulo python \"%s\" no instalado" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "No hay una descripción disponible" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "desconocido" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 #, fuzzy msgid "Default" msgstr "Color predeterminado" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Vídeo" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -227,121 +234,90 @@ msgid "Remove %s" msgstr "Eliminar %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Cancelado por el usuario" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Escribiendo datos al disco"
View file
3.10.21.tar.gz/po/es_ES.po -> 3.11.0.tar.gz/po/es_ES.po
Changed
@@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/gpodder/" @@ -26,12 +26,12 @@ msgid "gPodder on %s" msgstr "gPodder en %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "La fuente en %(url)s no se pudo actualizar." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Error al abrir el reproductor" @@ -75,66 +75,75 @@ msgid "Imported OPML file" msgstr "Importar desde archivo OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Añadido" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "En cola" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Descargando" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Finalizado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Fallido" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Cancelando..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Cancelado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Pausar" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "En pausa" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Seleccione los episodios que quiere descargar:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Falta el contenido del servidor" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Error de sintaxis: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Error de E/S: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Error HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Error: %s" @@ -151,8 +160,8 @@ msgid "Post download" msgstr "Después de la descarga" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Otros" @@ -170,46 +179,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Módulo Python no encontrado: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Sin descripción disponible" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "desconocido" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Predeterminado" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Solo mantener los últimos" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Vídeo" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -223,217 +230,214 @@ msgid "Remove %s" msgstr "Quitar %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Cancelado por el usuario" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Escribiendo datos al disco" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/es_MX.po -> 3.11.0.tar.gz/po/es_MX.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-04-14 13:46-0600\n" "Last-Translator: Rigoberto Calleja <rigobertoc@alumni.cmu.edu>\n" "Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/gpodder/" @@ -24,12 +24,12 @@ msgid "gPodder on %s" msgstr "gPodder en %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "No se pudo crear la carpeta %s." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Error al escribir la lista de reproducción" @@ -72,66 +72,75 @@ msgid "Imported OPML file" msgstr "Importar desde archivo OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Agregado" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "En espera" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Descargando" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Terminado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Falló" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Cancelando..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Cancelado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Poner en pausa" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "En pausa" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Seleccione los episodios que desea descargar:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Falta el contenido del servidor" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Error de sintaxis: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Error de E/S: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Error HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Error: %s" @@ -148,8 +157,8 @@ msgid "Post download" msgstr "Post-descarga" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Otro" @@ -168,46 +177,44 @@ msgstr "" "Se requiere al menos uno de los siguientes comandos: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "El siguiente módulo de Python no fue encontrado: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "No hay descripción disponible" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "desconocido" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Por defecto" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Conservar únicamente el más reciente" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -221,121 +228,91 @@ msgid "Remove %s" msgstr "Eliminar %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Cancelado por el usuario" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Escribiendo datos al disco" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/eu.po -> 3.11.0.tar.gz/po/eu.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-23 00:23+0000\n" "Last-Translator: Asier Iturralde Sarasola <asier.iturralde@gmail.com>\n" "Language-Team: Basque (http://www.transifex.com/projects/p/gpodder/language/" @@ -24,12 +24,12 @@ msgid "gPodder on %s" msgstr "gPodder %s-n" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "%(url)s-eko jarioa ezin izan da eguneratu." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Errorea erreproduzitzailea irekitzean" @@ -73,66 +73,75 @@ msgid "Imported OPML file" msgstr "Inportatu OPML fitxategitik" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Gehituta" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Ilaran" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Deskargatzen" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Amaituta" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Huts egin du" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Bertan behera uzten..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Bertan behera utzita" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Pausarazi" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pausarazita" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Hautatu deskargatu nahi dituzun atalak:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Edukia ez dago zerbitzarian" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Sintaxi errorea: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O Errorea: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP Errorea %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Errorea: %s" @@ -151,8 +160,8 @@ msgid "Post download" msgstr "Hautatu erreproduzitutakoak" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Bestelakoak" @@ -170,46 +179,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Ez da Python modulua aurkitu: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Ez dago deskribapenik eskuragarri" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "ezezaguna" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Lehenetsia" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Mantendu azkena soilik" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Bideoa" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audioa" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -223,121 +230,91 @@ msgid "Remove %s" msgstr "Ezabatu %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Erabiltzaileak ezeztatua" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Datuak diskora idazten" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/fa_IR.po -> 3.11.0.tar.gz/po/fa_IR.po
Changed
@@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Mohammad Dashtizadeh <mohammad@dashtizadeh.net>\n" "Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/gpodder/" @@ -25,12 +25,12 @@ msgid "gPodder on %s" msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "خطا در بارگذاری" @@ -67,63 +67,72 @@ msgid "Imported OPML file" msgstr "" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "اضافه شد" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "در صف قرار گرفت" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "در حال دانلود" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "اتمام یافته" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "نا موفق" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancel" +msgid "Cancelling" +msgstr "لغو" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "لغو شده" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "وقفه" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "متوقف شده" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "خطا: %s" @@ -141,8 +150,8 @@ msgid "Post download" msgstr "" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "دیگر" @@ -160,46 +169,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "هیچ توضیحی مهیا نیست" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "ناشناخه" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "ویدئو" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "صوت" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -213,210 +220,204 @@ msgid "Remove %s" msgstr "حذف %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311 msgid "Opening iPod database" msgstr ""
View file
3.10.21.tar.gz/po/fi.po -> 3.11.0.tar.gz/po/fi.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "gPodder koneella %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Osoitteessa %(url)s olevaa syötettä ei voitu päivittää." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Virhe soittimen avaamisessa" @@ -73,65 +73,74 @@ msgid "Imported OPML file" msgstr "Tuo OPML-tiedostosta" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Lisätty" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Jonossa" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Ladataan" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Valmis" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Epäonnistui" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Perutaan..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Peruttu" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Tauko" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Tauolla" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Valitse ladattavat jaksot:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Palvelimelta puuttuu sisältöä" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Siirräntävirhe: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-virhe: %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Virhe: %s" @@ -150,8 +159,8 @@ msgid "Post download" msgstr "Pysäytä lataus" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Muu" @@ -170,46 +179,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python-moduulia ”%s” ei ole asennettu" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Kuvausta ei ole saatavilla" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "tuntematon" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -223,122 +230,91 @@ msgid "Remove %s" msgstr "Poista %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Käyttäjän peruma" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Kirjoitetaan tietoja levylle" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311
View file
3.10.21.tar.gz/po/fr.po -> 3.11.0.tar.gz/po/fr.po
Changed
@@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2021-06-10 10:33+0200\n" "Last-Translator: Eric Le Lay <elelay@macports.org>\n" "Language-Team: French (http://www.transifex.com/projects/p/gpodder/language/" @@ -26,12 +26,12 @@ msgid "gPodder on %s" msgstr "gPodder sur %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "Le répertoire %s n'a pas pu être créé." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Erreur lors de l'écriture de la liste de lecture" @@ -67,63 +67,72 @@ msgid "Imported OPML file" msgstr "Importer depuis un fichier OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Ajouté" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Mis en file d'attente" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "En train de télécharger" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Terminé" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Echoué" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Annulation..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Annulé" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Mettre en pause" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "En pause" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "Cet épisode ne contient pas de fichier à télécharger" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Contenu manquant sur le serveur" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "Impossible de se connecter au serveur %(host)s:%(port)s" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "Erreur HTTP : %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Erreur E/S : %(error)s :%(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Erreur HTTP %(code)s :%(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Erreur : %s" @@ -140,8 +149,8 @@ msgid "Post download" msgstr "Suite au téléchargement" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Autre" @@ -159,39 +168,37 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Nécessite au moins une des commandes suivantes : %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Module python indisponible : %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Aucune description disponible" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "inconnu" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Par défaut" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Ne conserver que le dernier" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Vidéo" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " @@ -200,7 +207,7 @@ "Attention : le chemin vers le répertoire de stockage de gPodder (%(root)s) " "est très long et peut provoquer des erreurs au téléchargement d'épisodes.\n" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "Nous vous recommandons d'utiliser un chemin plus court." @@ -214,56 +221,52 @@ msgid "Remove %s" msgstr "Supprimer %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Annulé" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Ecriture des données sur le disque" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311 msgid "Opening iPod database"
View file
3.10.21.tar.gz/po/gl.po -> 3.11.0.tar.gz/po/gl.po
Changed
@@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Gonçalo Cordeiro <gzcordeiro@gmail.com>\n" "Language-Team: Galician (http://www.transifex.com/projects/p/gpodder/" @@ -25,12 +25,12 @@ msgid "gPodder on %s" msgstr "gPodder en %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "O fío de %(url)s non se puido actualizar." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Erro ao abrir o reprodutor" @@ -74,66 +74,75 @@ msgid "Imported OPML file" msgstr "Importar dun ficheiro OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Engadido" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Na fila" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Descargando" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Finalizada" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Fallou" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Cancelando..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Cancelado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Deter" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Detida" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Seleccione os episodios que quere descargar:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Faltan contidos do servidor" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Erro de sintaxe: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Erro de E/S: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Erro de HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Erro: %s" @@ -153,8 +162,8 @@ msgid "Post download" msgstr "Seleccionar os descargados" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Outro" @@ -172,46 +181,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Non se encontrou o módulo de Python: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Sen descrición dispoñíbel" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "descoñecido" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Vídeo" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -225,121 +232,91 @@ msgid "Remove %s" msgstr "Eliminar %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Cancelado polo usuario" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Escribindo datos no disco" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/he.po -> 3.11.0.tar.gz/po/he.po
Changed
@@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/gpodder/language/" @@ -26,12 +26,12 @@ msgid "gPodder on %s" msgstr "gPodder על %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "ההזנה בכתובת %(url)s לא יכולה להתעדכן." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "שגיאה בפתיחת נגן" @@ -75,66 +75,75 @@ msgid "Imported OPML file" msgstr "ייבא מקובץ OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "נוסף" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "ממתין" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "מוריד" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "הסתיים" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "נכשל" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "מבטל..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "בוטל" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "השהה" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "הושהה" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "בחר את הפרקים שברצונך להוריד:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "חסר תוכן מהשרת" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "שגיאת תחביר: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "שגיאת I/O: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "שגיאת HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "שגיאה: %s" @@ -154,8 +163,8 @@ msgid "Post download" msgstr "השהה הורדה" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "אחר" @@ -173,46 +182,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "מודול פייתון לא נמצא: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "אין תיאור זמין" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "לא ידוע" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "ברירת מחדל" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "שמור רק את האחרון" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "וידאו" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "שמע" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -226,119 +233,89 @@ msgid "Remove %s" msgstr "הסר את %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "בוטל בידי משתמש" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "כותב מידע לכונן" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/hu.po -> 3.11.0.tar.gz/po/hu.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2018-02-25 20:35+0100\n" "Last-Translator: Balázs Meskó <mesko.balazs@fsf.hu>\n" "Language-Team: Hungarian\n" @@ -24,12 +24,12 @@ msgid "gPodder on %s" msgstr "gPodder itt: %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "A(z) %s mappa nem hozható létre." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Hiba a lejátszólista írásakor" @@ -65,66 +65,75 @@ msgid "Imported OPML file" msgstr "Importált OMPL fájl" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Hozzáadva" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Sorbaállítva" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Letöltés" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Elkészült" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Sikertelen" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Megszakítás…" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Megszakítva" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Szüneteltetés" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Szüneteltetve" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Válassza ki a letöltendő epizódokat:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Hiányzik a tartalom a kiszolgálón" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Szintaktikai hiba: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O hiba: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP %(code)s hiba: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Hiba: %s" @@ -141,8 +150,8 @@ msgid "Post download" msgstr "Letöltés után" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Egyéb" @@ -160,46 +169,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Legalább a következő parancsok egyike szükséges: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "A Python modul nem található: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Nem áll rendelkezésre leírás" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "ismeretlen" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Alapértelmezés" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Csak a legfrissebb megtartása" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Videó" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Hang" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -213,55 +220,51 @@ msgid "Remove %s" msgstr "%s eltávolítása" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "A felhasználó megszakította" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Adatok lemezre írása" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/id_ID.po -> 3.11.0.tar.gz/po/id_ID.po
Changed
@@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "" @@ -64,63 +64,68 @@ msgid "Imported OPML file" msgstr "" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "" @@ -137,8 +142,8 @@ msgid "Post download" msgstr "" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "" @@ -156,46 +161,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -209,208 +212,202 @@ msgid "Remove %s" msgstr "" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311 msgid "Opening iPod database" msgstr "" -#: src/gpodder/sync.py:364 +#: src/gpodder/sync.py:317 msgid "iPod opened"
View file
3.10.21.tar.gz/po/it.po -> 3.11.0.tar.gz/po/it.po
Changed
@@ -3,7 +3,7 @@ # This file is distributed under the same license as the GPODDER package. # # Translators: -# Marco Ciampa <ciampix@posteo.net>, 2019, 2020. +# Marco Ciampa <ciampix@posteo.net>, 2019-2022. # Alessandro Campidori <alessandrocampidori@gmail.com>, 2012. # Andrea Scarpino <andrea@archlinux.org>, 2011. # Thomas Perl <thp@perli.net>, 2006. @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" -"PO-Revision-Date: 2020-11-11 10:31+0100\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" +"PO-Revision-Date: 2022-07-05 10:25+0200\n" "Last-Translator: Maurizio Ballo <xmaurizio.13@hotmail.com>\n" "Language-Team: Italian (http://www.transifex.com/projects/p/gpodder/language/" "it/)\n" @@ -27,12 +27,12 @@ msgid "gPodder on %s" msgstr "gPodder su %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "La cartella %s non può essere creata." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Errore scrittura playlist" @@ -68,66 +68,68 @@ msgid "Imported OPML file" msgstr "Importato file OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Aggiunto" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "In coda" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Download in corso" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Completato" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Fallito" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "Annullamento" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Annullato" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "In pausa" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "In pausa" -#: src/gpodder/download.py:864 -#, fuzzy -#| msgid "Select the episodes you want to download:" +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" -msgstr "Seleziona gli episodi che vuoi scaricare:" +msgstr "L'episodio senza URL da scaricare" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Contenuti mancanti dal server" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" -msgstr "" +msgstr "Impossibile connettersi al server %(host)s:%(port)s" -#: src/gpodder/download.py:882 -#, fuzzy, python-format -#| msgid "Syntax error: %(error)s" +#: src/gpodder/download.py:962 +#, python-format msgid "Request Error: %(error)s" -msgstr "Errore di Sintassi: %(error)s" +msgstr "Errore di richiesta: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Errore I/O: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Errore HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Errore: %s" @@ -144,8 +146,8 @@ msgid "Post download" msgstr "Dopo il download" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Altro" @@ -163,39 +165,37 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Necessita almeno uno dei seguenti commandi: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Modulo Python non installato: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Nessuna descrizione disponibile" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "sconosciuto" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Predefinito" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Tieni solo i più recenti" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " @@ -204,7 +204,7 @@ "Attenzione: il percorso verso la home di gPodder (%(root)s) è molto lungo è " "può provocare il fallimento dello scaricamento di file.\n" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "Si consiglia di accorciare il percorso." @@ -218,56 +218,52 @@ msgid "Remove %s" msgstr "Elimina %s"
View file
3.10.21.tar.gz/po/kk.po -> 3.11.0.tar.gz/po/kk.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n" "Language-Team: Kazakh (http://www.transifex.com/projects/p/gpodder/language/" @@ -24,12 +24,12 @@ msgid "gPodder on %s" msgstr "gPodder, %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "%(url)s адресіндегі таспаларды жаңарту мүмкін емес." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Плеерді ашу сәтсіз" @@ -73,66 +73,75 @@ msgid "Imported OPML file" msgstr "OPML файлынан импорттау" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Қосылған" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Кезекте" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Жүктелуде" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Аяқталған" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Сәтсіз аяқталды" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Бас тарту..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Бас тартылған" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Аялдату" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Аялдатылған" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Жүктегіңіз келетін эпизодтарды таңдаңыз:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Серверден құрама жоқ" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Синтаксис қатесі: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Е/Ш қатесі: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP қатесі %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Қате: %s" @@ -152,8 +161,8 @@ msgid "Post download" msgstr "Жүктемені аялдату" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Басқа" @@ -171,46 +180,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Python модулі табылмады: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Анықтамасы жоқ" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "белгісіз" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Видео" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Аудио" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -224,119 +231,89 @@ msgid "Remove %s" msgstr "Өшіру %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Пайдаланушы болдырмаған" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Мәліметті дискіге жазу" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/ko_KR.po -> 3.11.0.tar.gz/po/ko_KR.po
Changed
@@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2016-01-01 21:09+0900\n" "Last-Translator: \n" "Language-Team: \n" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "gPodder on %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "%s 폴더를 만들 수 없습니다" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "플레이 리스트 저장 에러" @@ -64,66 +64,75 @@ msgid "Imported OPML file" msgstr "가져온 파일" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "추가" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "대기중" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "다운로드중" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "완료" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "실패" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "취소중" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "취소됨" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "잠시멈춤" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "잠시멈춤" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "다운로드 하려는 에피소드를 선택하세요" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "서버에서 컨텐츠를 찾을 수 없음" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Syntax 에러: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O 에러: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP 에러 %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "에러: %s" @@ -141,8 +150,8 @@ msgid "Post download" msgstr "Post download" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "다른" @@ -161,46 +170,44 @@ msgstr "" "아래 명령어중에서 최소한 하나의 명령어가 픽요합니다: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "파이썬 모듈을 찾지 못했습니다: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "사용가능한 설명이 없습니다" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "알수없는" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "기본" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "최신으로 유지" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "비디오" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "오디오" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -214,119 +221,89 @@ msgid "Remove %s" msgstr "%s 삭제" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "사용자 취소" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "디스크에 기록중입니다" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/messages.pot -> 3.11.0.tar.gz/po/messages.pot
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "" @@ -64,63 +64,68 @@ msgid "Imported OPML file" msgstr "" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "" @@ -137,8 +142,8 @@ msgid "Post download" msgstr "" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "" @@ -156,46 +161,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -209,212 +212,206 @@ msgid "Remove %s" msgstr "" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311 msgid "Opening iPod database" msgstr "" -#: src/gpodder/sync.py:364 +#: src/gpodder/sync.py:317 msgid "iPod opened"
View file
3.10.21.tar.gz/po/nb.po -> 3.11.0.tar.gz/po/nb.po
Changed
@@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Allan Nordhøy <epost@anotheragency.no>, 2021 # Jim Nygård <jim@nygard.priv.no>, 2009, 2011, 2012. # Thomas Perl <thp@perli.net>, 2006. # Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010. @@ -11,11 +12,10 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" -"PO-Revision-Date: 2013-01-19 12:30+0000\n" -"Last-Translator: Thomas Perl <m@thp.io>\n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/gpodder/" -"language/nb/)\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" +"PO-Revision-Date: 2021-10-16 12:30+0000\n" +"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n" +"Language-Team: Liberium\n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,195 +27,189 @@ msgid "gPodder on %s" msgstr "gPodder på %s" -#: src/gpodder/deviceplaylist.py:98 -#, fuzzy, python-format +#: src/gpodder/deviceplaylist.py:114 +#, python-format msgid "Folder %s could not be created." -msgstr "Kilden på %(url)s kunne ikke oppdateres." +msgstr "Kunne ikke lage mappen «%s»." -#: src/gpodder/deviceplaylist.py:98 -#, fuzzy +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" -msgstr "Klarte ikke å åpne avspiller" +msgstr "Kunne ikke skrive spilleliste" #: src/gpodder/directory.py:97 -#, fuzzy msgid "gpodder.net search" -msgstr "gpodder.net" +msgstr "gpodder.net-søk" #: src/gpodder/directory.py:107 -#, fuzzy msgid "OPML from web" -msgstr "OPML-filer" +msgstr "OPML fra nettet" #: src/gpodder/directory.py:117 -#, fuzzy msgid "OPML file" -msgstr "OPML-filer" +msgstr "OPML-fil" #: src/gpodder/directory.py:127 share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" -msgstr "Innstillinger" +msgstr "Henter startede" #: src/gpodder/directory.py:137 -#, fuzzy msgid "gpodder.net Top 50" -msgstr "gpodder.net" +msgstr "gpodder.net Topp 50" #: src/gpodder/directory.py:147 -#, fuzzy msgid "gpodder.net Tags" -msgstr "gpodder.net" +msgstr "gpodder.net-etiketter" #: src/gpodder/directory.py:160 -#, fuzzy msgid "Soundcloud search" -msgstr "%s på Soundcloud" +msgstr "Soundcloud-søk" #: src/gpodder/directory.py:174 #, fuzzy msgid "Imported OPML file" -msgstr "Importer fra OPML-fil" +msgstr "Importert OPML-fil" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Lagt til" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "I kø" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" -msgstr "Laster ned" +msgstr "Lastes ned" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Ferdig" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" -msgstr "Feilet" +msgstr "Mislykket" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "Avbryter …" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Avbrutt" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "Setter på pause" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pauset" -#: src/gpodder/download.py:864 -#, fuzzy -#| msgid "Select the episodes you want to download:" +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" -msgstr "Velg de episodene du vil laste ned:" +msgstr "Episoden har ingen nettadresse å laste ned" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Manglende innhold fra tjener" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" -msgstr "" +msgstr "Kunne ikke koble til tjeneren %(host)s:%(port)s" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" -msgstr "" +msgstr "Forespørselsfeil: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" -msgstr "I/O feil: %(error)s: %(filename)s" +msgstr "I/O-feil: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" -msgstr "HTTP feil %(code)s: %(message)s" +msgstr "HTTP-feil %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Feil: %s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" -msgstr "" +msgstr "Skrivebordsintegrasjon" #: src/gpodder/extensions.py:56 -#, fuzzy msgid "Interface" -msgstr "Heltall" +msgstr "Grensesnitt" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" -msgstr "Pause nedlasting" +msgstr "Etter nedlasting"
View file
3.10.21.tar.gz/po/nl.po -> 3.11.0.tar.gz/po/nl.po
Changed
@@ -1,4 +1,3 @@ -# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # @@ -7,33 +6,33 @@ # Michiel Pater <michiel@wateennaam.nl>, 2012. # Pieter De Decker <pdedecker@gmail.com>, 2007. # Thomas Perl <thp@perli.net>, 2006. +# Heimen Stoffels <vistausss@fastmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" -"PO-Revision-Date: 2021-06-01 13:27+0200\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" +"PO-Revision-Date: 2022-07-06 14:30+0200\n" "Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/gpodder/language/" -"nl/)\n" +"Language-Team: Dutch\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: Poedit 3.1\n" #: src/gpodder/config.py:53 #, python-format msgid "gPodder on %s" msgstr "gPodder op %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "De map %s kan niet worden aangemaakt." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Fout bij wegschrijven van afspeellijst" @@ -69,63 +68,68 @@ msgid "Imported OPML file" msgstr "OPML-bestand geïmporteerd" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Toegevoegd" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "In wachtrij" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Bezig met downloaden" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Afgerond" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Mislukt" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "Bezig met annuleren…" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Geannuleerd" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "Bezig met pauzeren…" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Gepauzeerd" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "De aflevering bevat geen url" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Ontbrekende serverinhoud" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "Kan niet verbinden met server %(host)s:%(port)s" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "Verzoekfout: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "In-/Uitvoerfout: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-fout %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Fout: %s" @@ -142,8 +146,8 @@ msgid "Post download" msgstr "Vóór het downloaden" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Overig" @@ -161,50 +165,48 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Minimaal één van de volgende opdrachten vereist: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Python-module niet aangetroffen: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Geen omschrijving beschikbaar" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "onbekend" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Standaard" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Alleen nieuwste behouden" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -"Waarschuwing: het pad naar de gPodder-locatie (%(root)s) is erg lang en kan " +"Waarschuwing: de opgegeven gPodder-locatie (%(root)s) is erg lang en kan " "leiden tot mislukte downloads.\n" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530
View file
3.10.21.tar.gz/po/nn.po -> 3.11.0.tar.gz/po/nn.po
Changed
@@ -4,13 +4,13 @@ # Translators: # Thomas Perl <thp@perli.net>, 2006. # Torstein Adolf Winterseth <kvikende@fsfe.org>, 2009, 2010. -# Karl Ove Hufthammer <karl@huftis.org>, 2019, 2020, 2021. +# Karl Ove Hufthammer <karl@huftis.org>, 2019, 2020, 2021, 2022. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" -"PO-Revision-Date: 2021-06-02 17:31+0200\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" +"PO-Revision-Date: 2022-07-06 20:54+0200\n" "Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n" "Language-Team: Norwegian Nynorsk <l10n-no@lister.huftis.org>\n" "Language: nn\n" @@ -18,19 +18,19 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Lokalize 21.04.1\n" +"X-Generator: Lokalize 22.04.2\n" #: src/gpodder/config.py:53 #, python-format msgid "gPodder on %s" msgstr "gPodder på %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "Klarte ikkje oppretta mappa %s." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Feil ved lagring av speleliste" @@ -66,63 +66,68 @@ msgid "Imported OPML file" msgstr "Importert OPML-fil" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Lagd til" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Lagd i kø" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Lastar ned" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Fullført" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Mislukka" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "Avbryt" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Avbroten" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "Set på pause" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Sett på pause" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "Episoden manglar nedlastingslenkje" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Manglar innhald frå tenaren" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "Klarte ikkje kopla til tenaren %(host)s:%(port)s" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "Feil ved førespurnad: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/U-feil: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-feil %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Feil: %s" @@ -141,8 +146,8 @@ msgstr "Etter nedlasting" # Noko anna enn video eller lyd. -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Anna" @@ -153,46 +158,44 @@ #: src/gpodder/extensions.py:220 #, python-format msgid "Command not found: %(command)s" -msgstr "Fann ikkje kommandoen: %(command)s" +msgstr "Fann ikkje denne kommandoen: %(command)s" #: src/gpodder/extensions.py:236 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Treng minst éin av desse kommandoane: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" -msgstr "Fann ikkje Python-modul: %(module)s" +msgstr "Fann ikkje denne Python-modulen: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Inga skildring tilgjengeleg" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "ukjend" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Standard" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Behald berre nyaste episodar" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Lyd" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " @@ -201,7 +204,7 @@ "Åtvaring: Adressa til gPodder-mappa (%(root)s) er veldig lang, noko som kan " "føra til feil ved nedlasting av filer.\n" -#: src/gpodder/model.py:1427
View file
3.10.21.tar.gz/po/pl.po -> 3.11.0.tar.gz/po/pl.po
Changed
@@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2019-09-11 14:42+0200\n" "Last-Translator: Karol Bieńkowski <karolbienkowski@protonmail.com>\n" "Language-Team: Polish <>\n" @@ -26,12 +26,12 @@ msgid "gPodder on %s" msgstr "gPodder na %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "Folder %s nie mógł zostać stworzony." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Błąd podczas zapisywania playlisty" @@ -67,66 +67,75 @@ msgid "Imported OPML file" msgstr "Zaimportowano plik OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Dodane" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "W kolejce" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Pobieranie" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Ukończone" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Nieudane" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Anulowanie..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Anulowane" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Wstrzymaj" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Wstrzymane" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Zaznacz odcinki do pobrania:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Brak zawartości na serwerze" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Błąd składni: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Błąd we/wy: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Błąd HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Błąd: %s" @@ -143,8 +152,8 @@ msgid "Post download" msgstr "Po ściągnięciu" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Inne" @@ -162,39 +171,37 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Wymaga co najmniej jednego z poniższych poleceń: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Nie znaleziono modułu Pythona: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Opis niedostępny" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "nieznany" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Domyślnie" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Zachowaj tylko najnowsze" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Wideo" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " @@ -203,7 +210,7 @@ "Uwaga: ścieżka domowa gPoddera (%(root)s) jest bardzo długa, co może " "skutkować niepowodzeniem przy pobieraniu plików.\n" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "Radzimy ustawić ją na krótszą ścieżkę." @@ -217,54 +224,50 @@ msgid "Remove %s" msgstr "Usuń %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Anulowane przez użytkownika" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Zapisywanie danych na dysku"
View file
3.10.21.tar.gz/po/pt.po -> 3.11.0.tar.gz/po/pt.po
Changed
@@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Portuguese (http://www.transifex.com/projects/p/gpodder/" @@ -26,12 +26,12 @@ msgid "gPodder on %s" msgstr "gPodder em %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "A fonte %(url)s não foi atualizada." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Erro ao abrir o leitor" @@ -75,66 +75,75 @@ msgid "Imported OPML file" msgstr "Importar de ficheiro OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Adicionado" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Na fila" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "A transferir" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Concluído" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Falhou" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "A cancelar..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Cancelado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Pausar" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pausado" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Selecione os episódios que pretende transferir:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "O conteúdo não existe no servidor" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Erro de sintaxe: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Erro E/S: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Erro HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Erro: %s" @@ -151,8 +160,8 @@ msgid "Post download" msgstr "Enviar transferência" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Outros" @@ -170,46 +179,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Módulo python não encontrado: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Sem descrição" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "desconhecido" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Padrão" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Manter última" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Vídeo" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Áudio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -223,120 +230,90 @@ msgid "Remove %s" msgstr "Remover %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Cancelado pelo utilizador" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "A escrever dados no disco" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/pt_BR.po -> 3.11.0.tar.gz/po/pt_BR.po
Changed
@@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" @@ -29,12 +29,12 @@ msgid "gPodder on %s" msgstr "gPodder em %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "A fonte em %(url)s não pôde ser atualizada." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Erro ao abrir o player" @@ -78,66 +78,75 @@ msgid "Imported OPML file" msgstr "Importar de um arquivo OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Adicionado" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Em espera" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Downloading" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Terminados" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Falhou" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Cancelando..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Cancelado" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Pausar" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pausado" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Selecione o episódio que você deseja baixar" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Conteúdo do servidor esta faltando" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Erro de sintáxe: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Erro de I/O: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Erro de HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Erro: %s" @@ -154,8 +163,8 @@ msgid "Post download" msgstr "Pós-Download" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Outro" @@ -173,46 +182,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Módulo python não foi encontrado: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Descrição não disponível" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "desconhecido" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Padrão" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Apenas manter as últimas" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Vídeo" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Áudio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -226,119 +233,89 @@ msgid "Remove %s" msgstr "Remove %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Cancelado pelo usuário" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Gravando dados no disco" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/ro.po -> 3.11.0.tar.gz/po/ro.po
Changed
@@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "gPodder pe %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Catalogul %(url)s nu a putut fi actualizat" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Eroare la deschiderea player-ului" @@ -73,65 +73,74 @@ msgid "Imported OPML file" msgstr "Importă din fișier OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Adăugat" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Adăugat în coada de așteptare" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Se descarcă" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Gata" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Eșuat" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Renunțare..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Sa renunțat" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Întrerupt temporar" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Întrerupt temporar" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Selectează episoadele ce trebuie descărcate:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Conținutul lipseste de pe server" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Eroare I/O: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Eroare HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Eroare: %s" @@ -150,8 +159,8 @@ msgid "Post download" msgstr "Întrerupe descărcarea" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Altele" @@ -170,46 +179,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Modulul Python \"%s\" nu este instalat" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Nu există descriere" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "necunoscut" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -223,122 +230,91 @@ msgid "Remove %s" msgstr "Îndepărtează %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Utilizatorul a renunțat" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Datele sunt scrise pe disc" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311
View file
3.10.21.tar.gz/po/ru.po -> 3.11.0.tar.gz/po/ru.po
Changed
@@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: gPodder 2.10+git\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2021-07-13 21:51+0700\n" "Last-Translator: adasiko <adasiko256@yandex.ru>\n" "Language-Team: \n" @@ -24,12 +24,12 @@ msgid "gPodder on %s" msgstr "gPodder на %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "Каталог %s не может быть создан." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Ошибка записи плейлиста" @@ -65,64 +65,73 @@ msgid "Imported OPML file" msgstr "Импорт из OPML" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Добавлено" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "В очереди" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Загрузка" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Завершено" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Ошибка" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Отменяется..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Отменено" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Пауза" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Остановлено" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "Эпизоды не содержат URL для загрузки" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Отсутствуют данные с сервера" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Синтаксическая ошибка %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Ошибка ввода/вывода: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Ошибка HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Ошибка: %s" @@ -139,8 +148,8 @@ msgid "Post download" msgstr "После загрузки" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Другое" @@ -158,39 +167,37 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Требуется одна из следующих команд: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Модуль Python не найден: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Описание недоступно" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "неизвестно" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "По умолчанию" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Сохранять только последний" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Видео" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Аудио" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " @@ -199,7 +206,7 @@ "Предупреждение: путь к папке gPodder (%(root)s) слишком длинный и может " "привести ксбою загрузки файлов.\n" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "Рекомендуем выбрать более короткий путь." @@ -213,56 +220,52 @@ msgid "Remove %s" msgstr "Удалить %s?" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Отменено пользователем" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Запись на диск" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311
View file
3.10.21.tar.gz/po/sk.po -> 3.11.0.tar.gz/po/sk.po
Changed
@@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" -"PO-Revision-Date: 2021-07-09 13:37+0200\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" +"PO-Revision-Date: 2022-07-06 13:37+0200\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Slovak (http://www.transifex.com/projects/p/gpodder/language/" "sk/)\n" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "gPodder na %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "Priečinok %s nebolo možné vytvoriť." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Chyba pri zapisovaní zoznamu" @@ -62,65 +62,70 @@ #: src/gpodder/directory.py:174 msgid "Imported OPML file" -msgstr "Importovať OPML súbor" +msgstr "Importovaný OPML súbor" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Pridané" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Zaradené do poradia" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Sťahovanie" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Dokončené" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Zlyhalo" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "Rušenie" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Zrušené" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "Pozastavenie" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pozastavené" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "Epizóda nemá URL adresu na stiahnutie" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Chýbajuci obsah zo servera" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "Nepodarilo sa pripojiť k serveru %(host)s:%(port)s" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "Chyba požiadavky: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Chyba vstupu/výstupu: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Chyba HTTP %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Chyba: %s" @@ -137,8 +142,8 @@ msgid "Post download" msgstr "Po stiahnutí" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Iné" @@ -156,39 +161,37 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Je potrebný aspoň jeden z nasledujúcich príkazov: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Pythonový modul %(module)s nebol nájdený" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Popis nie je k dispozícii" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "neznáme" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Predvolené" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Zachovať iba najnovšie" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Audio" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " @@ -197,7 +200,7 @@ "Upozornenie: cesta k domovskému priečinku gPodderu (%(root)s) je veľmi dlhá " "a môže spôsobiť zlyhanie stiahnutia súborov.\n" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "Odporúča sa nastaviť kratšiu cestu." @@ -211,55 +214,51 @@ msgid "Remove %s" msgstr "Odstrániť %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Zrušené používateľom" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Zápis dát na disk" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311
View file
3.10.21.tar.gz/po/sv.po -> 3.11.0.tar.gz/po/sv.po
Changed
@@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Swedish (http://www.transifex.com/projects/p/gpodder/language/" @@ -27,12 +27,12 @@ msgid "gPodder on %s" msgstr "gPodder på %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Kanalen på %(url)s kunde inte uppdateras." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Fel vid öppnande av spelare" @@ -77,66 +77,75 @@ msgid "Imported OPML file" msgstr "Importera från OPML fil" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Tillagt" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Köad" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Laddar ner" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Klar" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Misslyckad" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Avbryter..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Avbruten" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Pausa" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Pausad" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Välj de avsnitt du önskar ladda ned:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Innehåll från server saknas" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "Syntax error: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O Fel: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP Fel: %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Fel: %s" @@ -156,8 +165,8 @@ msgid "Post download" msgstr "Pausa nedladdning" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Annan" @@ -175,46 +184,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python modul \"%s\" ej installerad" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Ingen beskrivning tillgänglig" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "okänt" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Ljud" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -228,122 +235,91 @@ msgid "Remove %s" msgstr "Radera %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Avbruten av användare" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Skriver data till hårddisk" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/po/tr.po -> 3.11.0.tar.gz/po/tr.po
Changed
@@ -1,14 +1,14 @@ -# 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 <EMAIL@ADDRESS>, YEAR. +# BAZI AÇIKLAYICI BAŞLIK. +# Telif Hakkı (C) 2021 PAKETİN TELİF HAKKI SAHİBİ gPodder +# Bu dosya, gPodder paketi ile aynı lisans altında dağıtılmaktadır. +# Serkan ÖNDER <serkanonder@outlook.com>, 2021-2022. # msgid "" msgstr "" -"Project-Id-Version: gPodder 3.10.15\n" +"Project-Id-Version: gPodder 3.10.21\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" -"PO-Revision-Date: 2021-03-12 18:39+0300\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" +"PO-Revision-Date: 2022-04-11 10:00+0300\n" "Last-Translator: Serkan ÖNDER <serkanonder@outlook.com>\n" "Language-Team: \n" "Language: tr\n" @@ -23,12 +23,12 @@ msgid "gPodder on %s" msgstr "%s üzerinde gPodder" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "%s klasörü oluşturulamadı." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "Oynatma listesi yazılırken hata oluştu" @@ -64,63 +64,68 @@ msgid "Imported OPML file" msgstr "İçe aktarılan OPML dosyası" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Eklendi" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "Kuyrukta" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "İndiriliyor" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Tamamlandı" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Başarısız" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Cancelling" +msgstr "İptal ediliyor" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Vazgeçildi" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +msgid "Pausing" +msgstr "Duraklatma" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Duraklatıldı" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 msgid "Episode has no URL to download" msgstr "Bölümün indirilecek URL'si yok" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "Sunucudan eksik içerik" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "Sunucuya bağlanılamadı %(host)s:%(port)s" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "Hata İste: %(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "G/Ç Hatası: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP Hatası %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Hata: %s" @@ -137,8 +142,8 @@ msgid "Post download" msgstr "İndirme sonrası" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Diğer" @@ -157,39 +162,37 @@ msgstr "" "Aşağıdaki komutlardan en az birine ihtiyacınız var: %(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Python modülü bulunamadı: %(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Açıklama yok" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "bilinmeyen" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "Öntanımlı" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "Sadece en yeniyi sakla" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "Video" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "Ses" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " @@ -198,7 +201,7 @@ "Uyarı: gPodder ana sayfasına (%(root)s) giden yol çok uzun ve dosyaların " "indirilememesine neden olabilir.\n" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "Daha kısa bir yola ayarlamanız tavsiye edilir." @@ -212,56 +215,52 @@ msgid "Remove %s" msgstr "%s kaldır" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Kullanıcı tarafından iptal edildi"
View file
3.10.21.tar.gz/po/uk.po -> 3.11.0.tar.gz/po/uk.po
Changed
@@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -24,12 +24,12 @@ msgid "gPodder on %s" msgstr "gPodder на %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Не вдалося оновити потік %(url)s." -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, fuzzy msgid "Error writing playlist" msgstr "Помилка при відкритті плеєра" @@ -74,65 +74,74 @@ msgid "Imported OPML file" msgstr "Імпортувати з OPML-файлу" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "Додано" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "В черзі" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "Завантажую" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "Завершено" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "Помилка" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "Скасовую..." + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "Скасовано" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "Пауза" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "Призупинено" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "Оберіть епізоди, які ви хочете завантажити." -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "На сервері немає контенту" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, python-format msgid "Request Error: %(error)s" msgstr "" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Помилка вводу/виводу: %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP помилка %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "Помилка: %s" @@ -151,8 +160,8 @@ msgid "Post download" msgstr "Призупинити завантаження" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "Інше" @@ -171,46 +180,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Модуль Python \"%s\" не встановлено" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "Опис відсутній" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "невідомий" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "" @@ -224,121 +231,90 @@ msgid "Remove %s" msgstr "Видалити %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "Відхилено користувачем" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "Збереження даних на диск" -#: src/gpodder/sync.py:354 +#: src/gpodder/sync.py:311
View file
3.10.21.tar.gz/po/zh_CN.po -> 3.11.0.tar.gz/po/zh_CN.po
Changed
@@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-19 22:46-0600\n" +"POT-Creation-Date: 2022-07-30 22:32-0600\n" "PO-Revision-Date: 2020-09-20 15:54+0800\n" "Last-Translator: Thomas Perl <m@thp.io>\n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/gpodder/" @@ -26,12 +26,12 @@ msgid "gPodder on %s" msgstr "gPodder 在 %s" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 #, python-format msgid "Folder %s could not be created." msgstr "文件夹 %s 不会被创建。" -#: src/gpodder/deviceplaylist.py:98 +#: src/gpodder/deviceplaylist.py:114 msgid "Error writing playlist" msgstr "写入播放列表错误" @@ -67,66 +67,75 @@ msgid "Imported OPML file" msgstr "导入 OPML 文件" -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 -msgid "Added" -msgstr "已添加" - -#: src/gpodder/download.py:541 src/gpodder/sync.py:974 +#: src/gpodder/download.py:553 src/gpodder/sync.py:634 msgid "Queued" msgstr "已排序" -#: src/gpodder/download.py:541 src/gpodder/gtkui/model.py:382 +#: src/gpodder/download.py:553 src/gpodder/gtkui/model.py:393 msgid "Downloading" msgstr "下载中" -#: src/gpodder/download.py:542 src/gpodder/model.py:772 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/model.py:871 src/gpodder/sync.py:635 msgid "Finished" msgstr "已完成" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Failed" msgstr "失败" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Cancelling..." +msgid "Cancelling" +msgstr "取消……" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 msgid "Cancelled" msgstr "取消" -#: src/gpodder/download.py:542 src/gpodder/sync.py:975 +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#, fuzzy +#| msgid "Pause" +msgid "Pausing" +msgstr "暂停" + +#: src/gpodder/download.py:554 src/gpodder/sync.py:635 +#: src/gpodder/gtkui/model.py:385 msgid "Paused" msgstr "暂停" -#: src/gpodder/download.py:864 +#: src/gpodder/download.py:944 #, fuzzy #| msgid "Select the episodes you want to download:" msgid "Episode has no URL to download" msgstr "选择想要下载的单集:" -#: src/gpodder/download.py:867 +#: src/gpodder/download.py:947 msgid "Missing content from server" msgstr "服务端缺失内容" -#: src/gpodder/download.py:873 +#: src/gpodder/download.py:953 #, python-format msgid "Couldn't connect to server %(host)s:%(port)s" msgstr "" -#: src/gpodder/download.py:882 +#: src/gpodder/download.py:962 #, fuzzy, python-format #| msgid "Syntax error: %(error)s" msgid "Request Error: %(error)s" msgstr "格式错误:%(error)s" -#: src/gpodder/download.py:888 +#: src/gpodder/download.py:968 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O错误 %(error)s: %(filename)s" -#: src/gpodder/download.py:895 +#: src/gpodder/download.py:975 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP错误 %(code)s: %(message)s" -#: src/gpodder/download.py:899 src/gpodder/sync.py:1130 +#: src/gpodder/download.py:979 src/gpodder/sync.py:834 #, python-format msgid "Error: %s" msgstr "错误 %s" @@ -143,8 +152,8 @@ msgid "Post download" msgstr "Post 下载" -#: src/gpodder/extensions.py:59 src/gpodder/model.py:836 -#: src/gpodder/model.py:1250 +#: src/gpodder/extensions.py:59 src/gpodder/model.py:936 +#: src/gpodder/model.py:1352 msgid "Other" msgstr "其他" @@ -162,46 +171,44 @@ msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "至少需要以下命令之一:%(list_of_commands)s" -#: src/gpodder/extensions.py:273 +#: src/gpodder/extensions.py:274 #, python-format msgid "Python module not found: %(module)s" msgstr "Python 模块未找到:%(module)s" -#: src/gpodder/model.py:496 src/gpodder/youtube.py:512 -#: src/gpodder/plugins/soundcloud.py:170 -#: share/gpodder/extensions/youtube-dl.py:215 +#: src/gpodder/model.py:588 src/gpodder/model.py:595 src/gpodder/youtube.py:570 msgid "No description available" msgstr "没有可用介绍" -#: src/gpodder/model.py:730 +#: src/gpodder/model.py:829 msgid "unknown" msgstr "未知" -#: src/gpodder/model.py:801 +#: src/gpodder/model.py:901 msgid "Default" msgstr "默认" -#: src/gpodder/model.py:802 +#: src/gpodder/model.py:902 msgid "Only keep latest" msgstr "保持最新" -#: src/gpodder/model.py:1233 src/gpodder/model.py:1248 -#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 +#: src/gpodder/model.py:1335 src/gpodder/model.py:1350 +#: share/gpodder/ui/gtk/gpodderpreferences.ui.h:38 msgid "Video" msgstr "视频" -#: src/gpodder/model.py:1246 +#: src/gpodder/model.py:1348 msgid "Audio" msgstr "音频" -#: src/gpodder/model.py:1425 +#: src/gpodder/model.py:1528 #, python-format msgid "" "Warning: path to gPodder home (%(root)s) is very long and can result in " "failure to download files.\n" msgstr "" -#: src/gpodder/model.py:1427 +#: src/gpodder/model.py:1530 msgid "You're advised to set it to a shorter path." msgstr "建议设置短路径。" @@ -215,117 +222,88 @@ msgid "Remove %s" msgstr "移除 %s" -#: src/gpodder/sync.py:251 +#: src/gpodder/sync.py:206 msgid "Cancelled by user" msgstr "用户取消" -#: src/gpodder/sync.py:254 +#: src/gpodder/sync.py:209 msgid "Writing data to disk" msgstr "写入数据到磁盘" -#: src/gpodder/sync.py:354
View file
3.10.21.tar.gz/share/gpodder/extensions/audio_converter.py -> 3.11.0.tar.gz/share/gpodder/extensions/audio_converter.py
Changed
@@ -133,7 +133,7 @@ logger.info('Converted audio file to %(format)s.' % {'format': new_extension}) gpodder.user_extensions.on_notification_show(_('File converted'), episode.title) else: - logger.warn('Error converting audio file: %s / %s', stdout, stderr) + logger.warning('Error converting audio file: %s / %s', stdout, stderr) gpodder.user_extensions.on_notification_show(_('Conversion failed'), episode.title) def _convert_episodes(self, episodes):
View file
3.10.21.tar.gz/share/gpodder/extensions/command_on_download.py -> 3.11.0.tar.gz/share/gpodder/extensions/command_on_download.py
Changed
@@ -45,7 +45,7 @@ def read_episode_info(self, episode): filename = episode.local_filename(create=False, check_only=True) if filename is None: - logger.warn("%s: missing episode filename", __title__) + logger.warning("%s: missing episode filename", __title__) return None info = { 'filename': filename, @@ -74,4 +74,4 @@ if proc.returncode == 0: logger.info("%s succeeded", command) else: - logger.warn("%s run with exit code %i", command, proc.returncode) + logger.warning("%s run with exit code %i", command, proc.returncode)
View file
3.10.21.tar.gz/share/gpodder/extensions/concatenate_videos.py -> 3.11.0.tar.gz/share/gpodder/extensions/concatenate_videos.py
Changed
@@ -38,8 +38,8 @@ dlg = Gtk.FileChooserDialog(title=_('Save video'), parent=self.gpodder.get_dialog_parent(), action=Gtk.FileChooserAction.SAVE) - dlg.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) - dlg.add_button(Gtk.STOCK_SAVE, Gtk.ResponseType.OK) + dlg.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL) + dlg.add_button(_('_Save'), Gtk.ResponseType.OK) if dlg.run() == Gtk.ResponseType.OK: filename = dlg.get_filename()
View file
3.10.21.tar.gz/share/gpodder/extensions/enqueue_in_mediaplayer.py -> 3.11.0.tar.gz/share/gpodder/extensions/enqueue_in_mediaplayer.py
Changed
@@ -72,7 +72,7 @@ self.command = win32_read_registry_key(self.command) return True except Exception as e: - logger.warn('Win32 player not found: %s (%s)', self.command, e) + logger.warning('Win32 player not found: %s (%s)', self.command, e) return False
View file
3.10.21.tar.gz/share/gpodder/extensions/mpris-listener.py -> 3.11.0.tar.gz/share/gpodder/extensions/mpris-listener.py
Changed
@@ -125,10 +125,10 @@ ('status' not in kwargs or kwargs'status' == 'Playing') and not subsecond_difference(cur'pos', kwargs'pos')): logger.debug('notify Stopped: playback discontinuity:' + - 'calc: %f observed: %f', cur'pos', kwargs'pos') + 'calc: %r observed: %r', cur'pos', kwargs'pos') self.notify_stop() - if ((kwargs'pos') == 0 and + if ((kwargs'pos') <= 0 and self.pos is not None and self.length is not None and (self.length - USECS_IN_SEC) < self.pos and @@ -144,7 +144,8 @@ logger.debug('pos=0 not end of stream (calculated pos: %f/%f %f)', self.pos / USECS_IN_SEC, self.length / USECS_IN_SEC, (self.pos / USECS_IN_SEC) - (self.length / USECS_IN_SEC)) - self.pos = kwargs.pop('pos') + newpos = kwargs.pop('pos') + self.pos = newpos if newpos >= 0 else 0 if 'status' in kwargs: self.status = kwargs.pop('status') @@ -159,7 +160,7 @@ if self.status == 'Playing': self.notify_playing() else: - logger.debug('notify Stopped: status %s', self.status) + logger.debug('notify Stopped: status %r', self.status) self.notify_stop() def getinfo(self): @@ -254,10 +255,10 @@ invalidated_properties, path=None, sender=None): if interface_name != self.INTERFACE_MPRIS: if interface_name not in self.OTHER_MPRIS_INTERFACES: - logger.warn('unexpected interface: %s, props=%r', interface_name, list(changed_properties.keys())) + logger.warning('unexpected interface: %s, props=%r', interface_name, list(changed_properties.keys())) return if sender is None: - logger.warn('No sender associated to D-Bus signal, please report a bug') + logger.warning('No sender associated to D-Bus signal, please report a bug') return collected_info = {} @@ -274,27 +275,28 @@ collected_info'rate' = changed_properties'Rate' # Fix #788 pos=0 when Stopped resulting in not saving position on VLC quit if changed_properties.get('PlaybackStatus') != 'Stopped': - collected_info'pos' = self.query_position(sender) - + try: + collected_info'pos' = self.query_property(sender, 'Position') + except dbus.exceptions.DBusException: + pass if 'status' not in collected_info: - collected_info'status' = str(self.query_status(sender)) - logger.debug('collected info: %r', collected_info) + try: + collected_info'status' = str(self.query_property( + sender, 'PlaybackStatus')) + except dbus.exceptions.DBusException: + pass + logger.debug('collected info: %r', collected_info) self.cur.update(**collected_info) def on_seeked(self, position): logger.debug('seeked to pos: %f', position) self.cur.update(pos=position) - def query_position(self, sender): - proxy = self.bus.get_object(sender, self.PATH_MPRIS) - props = dbus.Interface(proxy, self.INTERFACE_PROPS) - return props.Get(self.INTERFACE_MPRIS, 'Position') - - def query_status(self, sender): + def query_property(self, sender, prop): proxy = self.bus.get_object(sender, self.PATH_MPRIS) props = dbus.Interface(proxy, self.INTERFACE_PROPS) - return props.Get(self.INTERFACE_MPRIS, 'PlaybackStatus') + return props.Get(self.INTERFACE_MPRIS, prop) class gPodderNotifier(dbus.service.Object):
View file
3.10.21.tar.gz/share/gpodder/extensions/normalize_audio.py -> 3.11.0.tar.gz/share/gpodder/extensions/normalize_audio.py
Changed
@@ -91,13 +91,14 @@ cmd = CONVERT_COMMANDS.get(extension, 'normalize-audio'), filename + # Set cwd to prevent normalize from placing files in the directory gpodder was started from. if gpodder.ui.win32: - p = util.Popen(cmd) + p = util.Popen(cmd, cwd=episode.channel.save_dir) p.wait() stdout, stderr = ("<unavailable>",) * 2 else: - p = util.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + p = util.Popen(cmd, cwd=episode.channel.save_dir, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = p.communicate() if p.returncode == 0: @@ -105,7 +106,7 @@ gpodder.user_extensions.on_notification_show(_('File normalized'), episode.title) else: - logger.warn('normalize-audio failed: %s / %s', stdout, stderr) + logger.warning('normalize-audio failed: %s / %s', stdout, stderr) def convert_episodes(self, episodes): for episode in episodes:
View file
3.10.21.tar.gz/share/gpodder/extensions/rename_download.py -> 3.11.0.tar.gz/share/gpodder/extensions/rename_download.py
Changed
@@ -24,6 +24,7 @@ DefaultConfig = { 'add_sortdate': False, # Add the sortdate as prefix 'add_podcast_title': False, # Add the podcast title as prefix + 'sortdate_after_podcast_title': False, # put the sortdate after podcast title } @@ -50,10 +51,16 @@ new_basename = new_basename.append(title) - if self.config.add_podcast_title: - new_basename.insert(0, podcast_title) - if self.config.add_sortdate: - new_basename.insert(0, sortdate) + if self.config.sortdate_after_podcast_title: + if self.config.add_sortdate: + new_basename.insert(0, sortdate) + if self.config.add_podcast_title: + new_basename.insert(0, podcast_title) + else: + if self.config.add_podcast_title: + new_basename.insert(0, podcast_title) + if self.config.add_sortdate: + new_basename.insert(0, sortdate) new_basename = ' - '.join(new_basename) # Remove unwanted characters and shorten filename (#494)
View file
3.10.21.tar.gz/share/gpodder/extensions/rm_ogg_cover.py -> 3.11.0.tar.gz/share/gpodder/extensions/rm_ogg_cover.py
Changed
@@ -97,4 +97,4 @@ logger.info('Removed cover art from OGG file: %s', filename) ogg.save() except Exception as e: - logger.warn('Failed to remove OGG cover: %s', e, exc_info=True) + logger.warning('Failed to remove OGG cover: %s', e, exc_info=True)
View file
3.10.21.tar.gz/share/gpodder/extensions/tagging.py -> 3.11.0.tar.gz/share/gpodder/extensions/tagging.py
Changed
@@ -261,7 +261,7 @@ else: info'title' = title - info'subtitle' = episode.description + info'subtitle' = episode._text_description if self.container.config.genre_tag is not None: info'genre' = self.container.config.genre_tag
View file
3.10.21.tar.gz/share/gpodder/extensions/taskbar_progress.py -> 3.11.0.tar.gz/share/gpodder/extensions/taskbar_progress.py
Changed
@@ -20,6 +20,7 @@ # Windows 7 taskbar progress # Sean Munkel; 2013-01-05 +import ctypes import functools import logging from ctypes import (HRESULT, POINTER, Structure, alignment, c_int, c_uint, @@ -30,6 +31,10 @@ import gpodder +import gi # isort:skip +from gi.repository import Gtk # isort:skip + + _ = gpodder.gettext @@ -53,6 +58,8 @@ TBATF_USEMDITHUMBNAIL = 1 TBATF_USEMDILIVEPREVIEW = 2 TBATFLAG = c_int # enum +# return code +S_OK = HRESULT(0).value class tagTHUMBBUTTON(Structure): @@ -138,8 +145,14 @@ ('in', POINTER(tagRECT), 'prcClip')) -assert sizeof(tagTHUMBBUTTON) == 540, sizeof(tagTHUMBBUTTON) -assert alignment(tagTHUMBBUTTON) == 4, alignment(tagTHUMBBUTTON) +assert sizeof(tagTHUMBBUTTON) in 540, 552, sizeof(tagTHUMBBUTTON) +assert alignment(tagTHUMBBUTTON) in 4, 8, alignment(tagTHUMBBUTTON) + + +def consume_events(): + """ consume pending events """ + while Gtk.events_pending(): + Gtk.main_iteration() # based on http://stackoverflow.com/a/1744503/905256 @@ -153,25 +166,44 @@ self.taskbar = client.CreateObject( '{56FDF344-FD6D-11d0-958A-006097C9A090}', interface=ITaskbarList3) - self.taskbar.HrInit() + ret = self.taskbar.HrInit() + if ret != S_OK: + logger.warning("taskbar.HrInit failed: %r", ret) + del self.taskbar def on_unload(self): + # let the window change state? otherwise gpodder is stuck on exit + # (tested on windows 7 pro) + consume_events() if self.taskbar is not None: self.taskbar.SetProgressState(self.window_handle, TBPF_NOPROGRESS) + # let the taskbar change state otherwise gpodder is stuck on exit + # (tested on windows 7 pro) + consume_events() def on_ui_object_available(self, name, ui_object): def callback(self, window, *args): - self.window_handle = window.window.handle + ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.c_void_p + ctypes.pythonapi.PyCapsule_GetPointer.argtypes = ctypes.py_object + win_gpointer = ctypes.pythonapi.PyCapsule_GetPointer(window.get_window().__gpointer__, None) + gdkdll = ctypes.CDLL("libgdk-3-0.dll") + self.window_handle = gdkdll.gdk_win32_window_get_handle(win_gpointer) + ret = self.taskbar.ActivateTab(self.window_handle) + if ret != S_OK: + logger.warning("taskbar.ActivateTab failed: %r", ret) + del self.taskbar if name == 'gpodder-gtk': ui_object.main_window.connect('realize', functools.partial(callback, self)) def on_download_progress(self, progress): + if not self.taskbar: + return if self.window_handle is None: if not self.restart_warning: return - logger.warn("No window handle available, a restart max fix this") + logger.warning("No window handle available, a restart max fix this") self.restart_warning = False return if 0 < progress < 1:
View file
3.10.21.tar.gz/share/gpodder/extensions/ted_subtitles.py -> 3.11.0.tar.gz/share/gpodder/extensions/ted_subtitles.py
Changed
@@ -60,7 +60,7 @@ try: response = util.urlopen(url).read() except Exception as e: - logger.warn("subtitle url returned error %s", e) + logger.warning("subtitle url returned error %s", e) return '' return response @@ -105,7 +105,7 @@ with open(srt_filename, 'w+') as srtFile: srtFile.write(sub.encode("utf-8")) except Exception as e: - logger.warn("Can't write srt file: %s", e) + logger.warning("Can't write srt file: %s", e) def on_episode_delete(self, episode, filename): srt_filename = self.get_srt_filename(filename)
View file
3.10.21.tar.gz/share/gpodder/extensions/ubuntu_unity.py -> 3.11.0.tar.gz/share/gpodder/extensions/ubuntu_unity.py
Changed
@@ -59,4 +59,4 @@ self.launcher_entry = None def on_download_progress(self, progress): - GObject.idle_add(self.launcher_entry.set_progress, float(value)) + GObject.idle_add(self.launcher_entry.set_progress, float(progress))
View file
3.10.21.tar.gz/share/gpodder/extensions/video_converter.py -> 3.11.0.tar.gz/share/gpodder/extensions/video_converter.py
Changed
@@ -114,7 +114,7 @@ logger.info('Converted video file to %(format)s.' % {'format': self.config.output_format}) gpodder.user_extensions.on_notification_show(_('File converted'), episode.title) else: - logger.warn('Error converting video file: %s / %s', stdout, stderr) + logger.warning('Error converting video file: %s / %s', stdout, stderr) gpodder.user_extensions.on_notification_show(_('Conversion failed'), episode.title) def _convert_episodes(self, episodes):
View file
3.10.21.tar.gz/share/gpodder/extensions/youtube-dl.py -> 3.11.0.tar.gz/share/gpodder/extensions/youtube-dl.py
Changed
@@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Manage Youtube subscriptions using youtube-dl (https://github.com/ytdl-org/youtube-dl) +# Manage YouTube subscriptions using youtube-dl (https://github.com/ytdl-org/youtube-dl) # Requirements: youtube-dl module (pip install youtube_dl) # (c) 2019-08-17 Eric Le Lay <elelay.fr:contact> # Released under the same license terms as gPodder itself. @@ -10,12 +10,17 @@ import sys import time -import youtube_dl -from youtube_dl.utils import DownloadError, ExtractorError, sanitize_url +try: + import yt_dlp as youtube_dl +except: + import youtube_dl import gpodder -from gpodder import download, feedcore, model, registry, youtube -from gpodder.util import mimetype_from_extension, remove_html_tags +from gpodder import download, feedcore, model, registry, util, youtube + +import gi # isort:skip +gi.require_version('Gtk', '3.0') # isort:skip +from gi.repository import Gtk # isort:skip _ = gpodder.gettext @@ -23,14 +28,14 @@ logger = logging.getLogger(__name__) -__title__ = 'Youtube-dl' -__description__ = _('Manage Youtube subscriptions using youtube-dl (pip install youtube_dl)') +__title__ = 'youtube-dl' +__description__ = _('Manage YouTube subscriptions using youtube-dl (pip install youtube_dl) or yt-dlp (pip install yt-dlp)') __only_for__ = 'gtk, cli' __authors__ = 'Eric Le Lay <elelay.fr:contact>' __doc__ = 'https://gpodder.github.io/docs/extensions/youtubedl.html' want_ytdl_version = '2021.02.04' -want_ytdl_version_msg = _('Your version of youtube-dl %(have_version)s has known issues, please upgrade to %(want_version)s or newer.') +want_ytdl_version_msg = _('Your version of youtube-dl/yt-dlp %(have_version)s has known issues, please upgrade to %(want_version)s or newer.') DefaultConfig = { # youtube-dl downloads and parses each video page to get informations about it, which is very slow. @@ -51,7 +56,7 @@ def youtube_parsedate(s): """Parse a string into a unix timestamp - Only strings provided by Youtube-dl API are + Only strings provided by youtube-dl API are parsed with this function (20170920). """ if s: @@ -85,14 +90,10 @@ """ self._reporthook = reporthook # outtmpl: use given tempname by DownloadTask - # (escape % and $ because outtmpl used as a string template by youtube-dl) - outtmpl = tempname.replace('%', '%%').replace('$', '$$') + # (escape % because outtmpl used as a string template by youtube-dl) + outtmpl = tempname.replace('%', '%%') res = self._ytdl.fetch_video(self._url, outtmpl, self._my_hook) - if outtmpl != tempname: - if 'ext' in res and os.path.isfile(outtmpl + '.{}'.format(res'ext')): - os.rename(outtmpl + '.{}'.format(res'ext'), tempname) - else: - os.rename(outtmpl, tempname) + # Renaming is not required because the escaped percent is not escaped in the output file. if 'duration' in res and res'duration': self._episode.total_time = res'duration' headers = {} @@ -100,23 +101,21 @@ if 'ext' in res: dot_ext = '.{}'.format(res'ext') # See #673 when merging multiple formats, the extension is appended to the tempname - # by YoutubeDL resulting in empty .partial file + .partial.mp4 exists + # by youtube-dl resulting in empty .partial file + .partial.mp4 exists # and #796 .mkv is chosen by ytdl sometimes - tempstat = os.stat(tempname) - if not tempstat.st_size: - for try_ext in (dot_ext, ".mp4", ".m4a", ".webm", ".mkv"): - tempname_with_ext = tempname + try_ext - if os.path.isfile(tempname_with_ext): - logger.debug('Youtubedl downloaded to "%s" instead of "%s", moving', - os.path.basename(tempname_with_ext), - os.path.basename(tempname)) - os.remove(tempname) - os.rename(tempname_with_ext, tempname) - dot_ext = try_ext - break - ext_filetype = mimetype_from_extension(dot_ext) + for try_ext in (dot_ext, ".mp4", ".m4a", ".webm", ".mkv"): + tempname_with_ext = tempname + try_ext + if os.path.isfile(tempname_with_ext): + logger.debug('youtube-dl downloaded to "%s" instead of "%s", moving', + os.path.basename(tempname_with_ext), + os.path.basename(tempname)) + os.remove(tempname) + os.rename(tempname_with_ext, tempname) + dot_ext = try_ext + break + ext_filetype = util.mimetype_from_extension(dot_ext) if ext_filetype: - # Youtube weba formats have a webm extension and get a video/webm mime-type + # YouTube weba formats have a webm extension and get a video/webm mime-type # but audio content has no width or height, so change it to audio/webm for correct icon and player if ext_filetype.startswith('video/') and ('height' not in res or res'height' is None): ext_filetype = ext_filetype.replace('video/', 'audio/') @@ -176,7 +175,7 @@ return filtered_entries def get_title(self): - return '{} (Youtube)'.format(self._ie_result.get('title') or self._ie_result.get('id') or self._url) + return '{} (YouTube)'.format(self._ie_result.get('title') or self._ie_result.get('id') or self._url) def get_link(self): return self._ie_result.get('webpage_url') @@ -212,10 +211,8 @@ episodes = for en in self._ie_result'entries': guid = video_guid(en'id') - description = remove_html_tags(en.get('description') or _('No description available')) - html_description = self.nice_html_description(en, description) if en.get('ext'): - mime_type = mimetype_from_extension('.{}'.format(en'ext')) + mime_type = util.mimetype_from_extension('.{}'.format(en'ext')) else: mime_type = 'application/octet-stream' if en.get('filesize'): @@ -226,8 +223,9 @@ ep = { 'title': en.get('title', guid), 'link': en.get('webpage_url'), - 'description': description, - 'description_html': html_description, + 'episode_art_url': en.get('thumbnail'), + 'description': util.remove_html_tags(en.get('description') or ''), + 'description_html': '', 'url': en.get('webpage_url'), 'file_size': filesize, 'mime_type': mime_type, @@ -250,25 +248,6 @@ """ return None - @staticmethod - def nice_html_description(en, description): - """ - basic html formating + hyperlink highlighting + video thumbnail - """ - description = re.sub(r'''https?://^\s+''', - r'''<a href="\g<0>">\g<0></a>''', - description) - description = description.replace('\n', '<br>') - html = """<style type="text/css"> - body > img { float: left; max-width: 30vw; margin: 0 1em 1em 0; } - </style> - """ - img = en.get('thumbnail') - if img: - html += '<img src="{}">'.format(img) - html += '<p>{}</p>'.format(description) - return html - class gPodderYoutubeDL(download.CustomDownloader): def __init__(self, gpodder_config, my_config, force=False): @@ -284,6 +263,7 @@ self._ydl_opts = { 'cachedir': cachedir, 'no_color': True, # prevent escape codes in desktop notifications on errors + 'noprogress': True, # prevent progress bar from appearing in console } if gpodder.verbose: self._ydl_opts'verbose' = True @@ -297,7 +277,7 @@ # when adding podcasts. # See https://docs.python.org/3/library/sys.html#sys.__stderr__ Note if not sys.stdout: - logger.debug('no stdout, setting YoutubeDL logger') + logger.debug('no stdout, setting youtube-dl logger') self._ydl_opts'logger' = logger def add_format(self, gpodder_config, opts, fallback=None): @@ -346,8 +326,8 @@ with youtube_dl.YoutubeDL(opts) as ydl: ydl.process_ie_result(tmp, download=False) new_entries.extend(tmp.get('entries')) - except DownloadError as ex: - if ex.exc_info0 == ExtractorError: + except youtube_dl.utils.DownloadError as ex: + if ex.exc_info0 == youtube_dl.utils.ExtractorError: # for instance "This video contains content from xyz, who has blocked it on copyright grounds" logger.warning('Skipping %s: %s', e.get('title', ''), ex.exc_info1) continue @@ -380,7 +360,7 @@ result_type, has_playlist = extract_type(ie_result)
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodder.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodder.ui
Changed
@@ -1,54 +1,58 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> <!--*- mode: xml -*--> <interface> - <!-- interface-requires gtk+ 3.10 --> + <requires lib="gtk+" version="3.16"/> <object class="GtkAdjustment" id="adjustment1"> - <property name="upper">10240</property> <property name="lower">0.5</property> - <property name="page_increment">0</property> - <property name="step_increment">0.5</property> - <property name="page_size">0</property> + <property name="upper">10240</property> + <property name="step-increment">0.5</property> </object> <object class="GtkAdjustment" id="adjustment2"> - <property name="upper">16</property> <property name="lower">1</property> - <property name="page_increment">0</property> - <property name="step_increment">1</property> - <property name="page_size">0</property> + <property name="upper">16</property> + <property name="step-increment">1</property> </object> <object class="GtkApplicationWindow" id="gPodder"> <property name="name">gPodder</property> - <property name="application">app</property> - <property name="visible">False</property> + <property name="can-focus">False</property> <property name="title">gPodder</property> - <property name="window_position">GTK_WIN_POS_CENTER</property> - <property name="modal">False</property> - <property name="destroy_with_parent">False</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> - <property name="focus_on_map">True</property> - <property name="urgency_hint">False</property> - <signal handler="on_gPodder_delete_event" name="delete-event"/> + <property name="window-position">center</property> + <signal name="delete-event" handler="on_gPodder_delete_event" swapped="no"/> <child> + <!-- n-columns=1 n-rows=2 --> <object class="GtkGrid" id="vMain"> <property name="visible">True</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child> <object class="GtkToolbar" id="toolbar"> <property name="visible">True</property> - <property name="show_arrow">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkToolButton" id="toolPlay"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">False</property> + <property name="is-important">True</property> + <property name="label" translatable="yes">Play</property> + <property name="icon-name">media-playback-start</property> + <signal name="clicked" handler="on_playback_selected_episodes" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> <child> <object class="GtkToolButton" id="toolDownload"> <property name="visible">True</property> - <property name="label" translatable="yes">Download</property> - <property name="use_underline">True</property> - <property name="stock_id">gtk-go-down</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> - <property name="is_important">True</property> <property name="sensitive">False</property> - <signal handler="on_download_selected_episodes" name="clicked"/> + <property name="can-focus">False</property> + <property name="is-important">True</property> + <property name="label" translatable="yes">Download</property> + <property name="icon-name">go-down</property> + <signal name="clicked" handler="on_download_selected_episodes" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -56,14 +60,14 @@ </packing> </child> <child> - <object class="GtkToolButton" id="toolPlay"> + <object class="GtkToolButton" id="toolPause"> <property name="visible">True</property> - <property name="stock_id">gtk-media-play</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> - <property name="is_important">True</property> <property name="sensitive">False</property> - <signal handler="on_playback_selected_episodes" name="clicked"/> + <property name="can-focus">False</property> + <property name="is-important">True</property> + <property name="label" translatable="yes">Pause</property> + <property name="icon-name">media-playback-pause</property> + <signal name="clicked" handler="on_pause_selected_episodes" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -73,14 +77,12 @@ <child> <object class="GtkToolButton" id="toolCancel"> <property name="visible">True</property> - <property name="label" translatable="yes">Cancel</property> - <property name="use_underline">True</property> - <property name="stock_id">gtk-cancel</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> - <property name="is_important">True</property> <property name="sensitive">False</property> - <signal handler="on_item_cancel_download_activate" name="clicked"/> + <property name="can-focus">False</property> + <property name="is-important">True</property> + <property name="label" translatable="yes">Cancel</property> + <property name="icon-name">process-stop</property> + <signal name="clicked" handler="on_item_cancel_download_activate" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -90,8 +92,7 @@ <child> <object class="GtkSeparatorToolItem" id="toolbutton3"> <property name="visible">True</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> + <property name="can-focus">False</property> </object> <packing> <property name="expand">False</property> @@ -101,12 +102,10 @@ <child> <object class="GtkToolButton" id="toolPreferences"> <property name="visible">True</property> - <property name="stock_id">gtk-preferences</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> - <property name="is_important">False</property> + <property name="can-focus">False</property> <property name="action-name">app.preferences</property> <property name="label" translatable="yes">Preferences</property> + <property name="icon-name">preferences-desktop</property> </object> <packing> <property name="expand">False</property> @@ -116,8 +115,7 @@ <child> <object class="GtkSeparatorToolItem" id="toolbutton2"> <property name="visible">True</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> + <property name="can-focus">False</property> </object> <packing> <property name="expand">False</property> @@ -127,12 +125,10 @@ <child> <object class="GtkToolButton" id="toolQuit"> <property name="visible">True</property> - <property name="stock_id">gtk-quit</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> - <property name="is_important">False</property> - <signal handler="on_gPodder_delete_event" name="clicked"/> + <property name="can-focus">False</property> <property name="label" translatable="yes">Quit</property> + <property name="icon-name">application-exit</property> + <signal name="clicked" handler="on_gPodder_delete_event" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -140,348 +136,430 @@ </packing> </child> </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> </child> <child> + <!-- n-columns=1 n-rows=1 --> <object class="GtkGrid" id="hboxContainer"> - <property name="border_width">5</property> <property name="visible">True</property> - <property name="orientation">horizontal</property> + <property name="can-focus">False</property> <property name="hexpand">True</property> <property name="vexpand">True</property> + <property name="border-width">5</property> <child>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodderaddpodcast.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodderaddpodcast.ui
Changed
@@ -1,92 +1,113 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> <!--*- mode: xml -*--> <interface> + <requires lib="gtk+" version="3.16"/> <object class="GtkDialog" id="gPodderAddPodcast"> + <property name="can-focus">False</property> <property name="title" translatable="yes">Add a new podcast</property> - <property name="type_hint">dialog</property> <property name="modal">True</property> - <property name="transient-for">parent_widget</property> - <property name="default_width">400</property> + <property name="default-width">400</property> + <property name="type-hint">dialog</property> <child internal-child="vbox"> <object class="GtkBox" id="vboxmain"> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <child internal-child="action_area"> - <object class="GtkHButtonBox" id="hbuttonbox"> - <property name="layout_style">GTK_BUTTONBOX_END</property> + <object class="GtkButtonBox" id="hbuttonbox"> + <property name="can-focus">False</property> + <property name="layout-style">end</property> <child> <object class="GtkButton" id="btn_close"> + <property name="label" translatable="yes">_Cancel</property> <property name="visible">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <signal handler="on_btn_close_clicked" name="clicked"/> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="on_btn_close_clicked" swapped="no"/> </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> <child> <object class="GtkButton" id="btn_add"> + <property name="label" translatable="yes">_Add</property> <property name="visible">True</property> - <property name="label">gtk-add</property> - <property name="sensitive">false</property> - <property name="use_stock">True</property> - <signal handler="on_btn_add_clicked" name="clicked"/> + <property name="sensitive">False</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="on_btn_add_clicked" swapped="no"/> </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> - <property name="padding">0</property> <property name="expand">False</property> <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> + <property name="pack-type">end</property> + <property name="position">0</property> </packing> </child> <child> <object class="GtkBox" id="hboxurlentry"> - <property name="border_width">10</property> <property name="visible">True</property> - <property name="homogeneous">False</property> + <property name="can-focus">False</property> + <property name="border-width">10</property> <property name="spacing">5</property> - <property name="orientation">horizontal</property> <child> <object class="GtkLabel" id="label_add"> <property name="visible">True</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">URL:</property> </object> <packing> - <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">0</property> </packing> </child> <child> <object class="GtkEntry" id="entry_url"> <property name="visible">True</property> - <property name="has_focus">True</property> - <property name="activates_default">True</property> - <signal handler="on_entry_url_changed" name="changed"/> + <property name="can-focus">True</property> + <property name="has-focus">True</property> + <property name="activates-default">True</property> + <signal name="changed" handler="on_entry_url_changed" swapped="no"/> </object> <packing> - <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> + <property name="position">1</property> </packing> </child> <child> <object class="GtkButton" id="btn_paste"> - <property name="label">gtk-paste</property> - <property name="use_stock">True</property> + <property name="label" translatable="yes">_Paste</property> <property name="visible">True</property> - <signal handler="on_btn_paste_clicked" name="clicked"/> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="on_btn_paste_clicked" swapped="no"/> </object> <packing> - <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">2</property> </packing> </child> </object> <packing> - <property name="padding">0</property> <property name="expand">False</property> <property name="fill">True</property> + <property name="position">1</property> </packing> </child> </object>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodderchannel.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodderchannel.ui
Changed
@@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.38.2 --> <interface> - <requires lib="gtk+" version="3.20"/> + <requires lib="gtk+" version="3.16"/> <object class="GtkDialog" id="gPodderChannel"> <property name="can-focus">False</property> <property name="title" translatable="yes">Channel Editor</property> @@ -27,13 +27,14 @@ <property name="layout-style">end</property> <child> <object class="GtkButton" id="btnCancel"> - <property name="label" translatable="yes">Cancel</property> + <property name="label" translatable="yes">_Cancel</property> <property name="use-action-appearance">False</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="can-default">True</property> <property name="has-default">True</property> <property name="receives-default">False</property> + <property name="use-underline">True</property> <signal name="clicked" handler="on_btnCancel_clicked" swapped="no"/> </object> <packing> @@ -44,7 +45,7 @@ </child> <child> <object class="GtkButton" id="btnOK"> - <property name="label" translatable="yes">OK</property> + <property name="label" translatable="yes">_OK</property> <property name="use-action-appearance">False</property> <property name="visible">True</property> <property name="can-focus">True</property> @@ -52,6 +53,7 @@ <property name="can-default">True</property> <property name="has-default">True</property> <property name="receives-default">False</property> + <property name="use-underline">True</property> <signal name="clicked" handler="on_btnOK_clicked" swapped="no"/> </object> <packing> @@ -117,7 +119,6 @@ <property name="margin-start">16</property> <property name="margin-end">16</property> <property name="pixel-size">80</property> - <property name="icon-name">face-smile-big-symbolic</property> <property name="icon_size">6</property> </object> </child> @@ -180,7 +181,6 @@ </object> <packing> <property name="name">page0</property> - <property name="title" translatable="yes">page0</property> </packing> </child> <child> @@ -208,10 +208,11 @@ </child> <child> <object class="GtkButton" id="title_save_button"> - <property name="label" translatable="yes">Save</property> + <property name="label" translatable="yes">_Save</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="receives-default">True</property> + <property name="use-underline">True</property> <property name="valign">center</property> <signal name="clicked" handler="on_title_save_button_clicked" swapped="no"/> </object> @@ -224,7 +225,6 @@ </object> <packing> <property name="name">page1</property> - <property name="title" translatable="yes">page1</property> <property name="position">1</property> </packing> </child>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodderconfigeditor.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodderconfigeditor.ui
Changed
@@ -1,153 +1,136 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> <!--*- mode: xml -*--> <interface> + <requires lib="gtk+" version="3.16"/> <object class="GtkDialog" id="gPodderConfigEditor"> <property name="visible">True</property> + <property name="can-focus">False</property> <property name="title" translatable="yes">gPodder Configuration Editor</property> - <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property> <property name="modal">True</property> - <property name="transient-for">parent_widget</property> - <property name="default_width">750</property> - <property name="default_height">450</property> - <property name="destroy_with_parent">False</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> - <property name="focus_on_map">True</property> - <property name="urgency_hint">False</property> - <signal handler="on_gPodderConfigEditor_destroy" name="destroy"/> + <property name="window-position">center-on-parent</property> + <property name="default-width">750</property> + <property name="default-height">450</property> + <property name="type-hint">dialog</property> + <signal name="destroy" handler="on_gPodderConfigEditor_destroy" swapped="no"/> <child internal-child="vbox"> <object class="GtkBox" id="vbox13"> <property name="visible">True</property> - <property name="homogeneous">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> + <child internal-child="action_area"> + <object class="GtkButtonBox"> + <property name="can-focus">False</property> + <child> + <object class="GtkButton" id="btnClose"> + <property name="label" translatable="yes">_Close</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="on_btnClose_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkBox" id="vbox_for_episode_selector"> - <property name="border_width">5</property> <property name="visible">True</property> - <property name="spacing">5</property> + <property name="can-focus">False</property> + <property name="border-width">5</property> <property name="orientation">vertical</property> + <property name="spacing">5</property> <child> <object class="GtkBox" id="hbox38"> <property name="visible">True</property> - <property name="homogeneous">False</property> + <property name="can-focus">False</property> <property name="spacing">6</property> - <property name="orientation">horizontal</property> <child> <object class="GtkLabel" id="label121"> <property name="visible">True</property> + <property name="can-focus">False</property> <property name="label" translatable="yes">Search for:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> </object> <packing> - <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">0</property> </packing> </child> <child> <object class="GtkEntry" id="entryFilter"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="max_length">0</property> - <property name="has_frame">True</property> - <property name="invisible_char">●</property> - <property name="activates_default">False</property> - <signal handler="on_entryFilter_changed" name="changed"/> + <property name="can-focus">True</property> + <property name="has-focus">True</property> + <property name="invisible-char">●</property> + <signal name="changed" handler="on_entryFilter_changed" swapped="no"/> </object> <packing> - <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> + <property name="position">1</property> </packing> </child> <child> <object class="GtkButton" id="btnShowAll"> + <property name="label" translatable="yes">_Show All</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Show All</property> - <property name="use_underline">True</property> - <property name="focus_on_click">True</property> - <signal handler="on_btnShowAll_clicked" name="clicked"/> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="on_btnShowAll_clicked" swapped="no"/> </object> <packing> - <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">2</property> </packing> </child> </object> <packing> - <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">0</property> </packing> </child> <child> <object class="GtkScrolledWindow" id="scrolledwindow8"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + <property name="can-focus">True</property> + <property name="shadow-type">in</property> <child> <object class="GtkTreeView" id="configeditor"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="headers_visible">True</property> - <property name="rules_hint">False</property> - <property name="reorderable">False</property> - <property name="enable_search">True</property> - <property name="fixed_height_mode">False</property> - <property name="hover_selection">False</property> - <property name="hover_expand">False</property> + <property name="can-focus">True</property> + <child internal-child="selection"> + <object class="GtkTreeSelection"/> + </child> </object> </child> </object> <packing> - <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> + <property name="position">1</property> </packing> </child> </object> <packing> - <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> - </packing> - </child> - <child> - <object class="GtkHButtonBox" id="hbuttonbox2"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - <child> - <object class="GtkButton" id="btnClose"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-close</property>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodderepisodeselector.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodderepisodeselector.ui
Changed
@@ -1,294 +1,241 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> <!--*- mode: xml -*--> <interface> + <requires lib="gtk+" version="3.16"/> <object class="GtkDialog" id="gPodderEpisodeSelector"> - <property name="visible">False</property> + <property name="can-focus">False</property> <property name="title" translatable="yes">Select episodes</property> - <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property> <property name="modal">True</property> - <property name="transient-for">parent_widget</property> - <property name="destroy_with_parent">False</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> - <property name="focus_on_map">True</property> - <property name="urgency_hint">False</property> + <property name="window-position">center-on-parent</property> + <property name="type-hint">dialog</property> <child internal-child="vbox"> <object class="GtkBox" id="vbox10"> <property name="visible">True</property> - <property name="homogeneous">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="hbox35"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkButton" id="btnRemoveAction"> + <property name="label" translatable="yes">_Remove</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="on_remove_action_activate" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="btnCancel"> + <property name="label" translatable="yes">_Cancel</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="on_btnCancel_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="btnOK"> + <property name="label" translatable="yes">_OK</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="has-default">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="always-show-image">True</property> + <signal name="clicked" handler="on_btnOK_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkBox" id="vbox_for_episode_selector"> - <property name="border_width">5</property> <property name="visible">True</property> - <property name="spacing">5</property> + <property name="can-focus">False</property> + <property name="border-width">5</property> <property name="orientation">vertical</property> + <property name="spacing">5</property> <child> <object class="GtkLabel" id="labelInstructions"> + <property name="can-focus">False</property> <property name="label">additional text</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="wrap">False</property> - <property name="selectable">False</property> <property name="xalign">0</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> </object> <packing> - <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> + <property name="position">0</property> </packing> </child> <child> <object class="GtkScrolledWindow" id="scrolledwindow7"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + <property name="can-focus">True</property> + <property name="shadow-type">in</property> <child> <object class="GtkTreeView" id="treeviewEpisodes"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="headers_visible">False</property> - <property name="rules_hint">False</property> - <property name="reorderable">False</property> - <property name="enable_search">False</property> - <property name="fixed_height_mode">False</property> - <property name="hover_selection">False</property> - <property name="hover_expand">False</property> - <signal name="row_activated" handler="on_row_activated"/> + <property name="can-focus">True</property> + <property name="has-focus">True</property> + <property name="headers-visible">False</property> + <property name="enable-search">False</property> + <signal name="row-activated" handler="on_row_activated" swapped="no"/> + <child internal-child="selection"> + <object class="GtkTreeSelection"/> + </child> </object> </child> </object> <packing> - <property name="padding">0</property> <property name="expand">True</property> <property name="fill">True</property> + <property name="position">1</property> </packing> </child> <child> <object class="GtkBox" id="hboxButtons"> <property name="visible">True</property> - <property name="homogeneous">False</property> + <property name="can-focus">False</property> <property name="spacing">5</property> - <property name="orientation">horizontal</property> <child> <object class="GtkButton" id="btnCheckAll"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="focus_on_click">True</property> - <signal handler="on_btnCheckAll_clicked" name="clicked"/> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <signal name="clicked" handler="on_btnCheckAll_clicked" swapped="no"/> <child> - <object class="GtkAlignment" id="alignment22"> + <object class="GtkBox" id="hbox34"> <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="top_padding">0</property> - <property name="bottom_padding">0</property> - <property name="left_padding">0</property> - <property name="right_padding">0</property> + <property name="can-focus">False</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image2636"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">object-select</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> <child> - <object class="GtkBox" id="hbox34"> + <object class="GtkLabel" id="label107"> <property name="visible">True</property> - <property name="homogeneous">False</property>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodderexporttolocalfolder.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodderexporttolocalfolder.ui
Changed
@@ -1,57 +1,38 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> <interface> - <requires lib="gtk+" version="3.0"/> + <requires lib="gtk+" version="3.16"/> + <object class="GtkCheckButton" id="allsamefolder"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="draw-indicator">True</property> + </object> <object class="GtkFileChooserDialog" id="gPodderExportToLocalFolder"> - <property name="can_focus">False</property> + <property name="can-focus">True</property> <property name="title" translatable="yes">Select destination</property> <property name="modal">True</property> - <property name="window_position">center-on-parent</property> - <property name="type_hint">dialog</property> + <property name="window-position">center-on-parent</property> + <property name="type-hint">dialog</property> <property name="action">save</property> - <property name="do_overwrite_confirmation">True</property> - <property name="preview_widget_active">False</property> - <property name="use_preview_label">False</property> - <property name="extra_widget">allsamefolder</property> + <property name="do-overwrite-confirmation">False</property> + <property name="extra-widget">allsamefolder</property> + <property name="preview-widget-active">False</property> + <property name="use-preview-label">False</property> <child internal-child="vbox"> <object class="GtkBox"> - <property name="can_focus">False</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> <child internal-child="action_area"> <object class="GtkButtonBox"> - <property name="can_focus">False</property> - <property name="layout_style">end</property> + <property name="can-focus">False</property> + <property name="layout-style">end</property> <child> - <object class="GtkButton" id="btnOK"> - <property name="label">gtk-save</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_btnOK_clicked" swapped="no"/> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> + <placeholder/> </child> <child> - <object class="GtkButton" id="btnCancel"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_btnCancel_clicked" swapped="no"/> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> + <placeholder/> </child> </object> <packing> @@ -62,16 +43,5 @@ </child> </object> </child> - <!-- to be recognized by the embedded GtkFileChooser --> - <action-widgets> - <action-widget response="-3">btnOK</action-widget> - <action-widget response="-6">btnCancel</action-widget> - </action-widgets> - </object> - <object class="GtkCheckButton" id="allsamefolder"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> </object> </interface>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodderpodcastdirectory.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodderpodcastdirectory.ui
Changed
@@ -172,7 +172,7 @@ <property name="layout-style">start</property> <child> <object class="GtkButton" id="btnSelectAll"> - <property name="label" translatable="yes">Select All</property> + <property name="label" translatable="yes">Select _all</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="receives-default">False</property> @@ -187,7 +187,7 @@ </child> <child> <object class="GtkButton" id="btnSelectNone"> - <property name="label" translatable="yes">Select None</property> + <property name="label" translatable="yes">Select _none</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="receives-default">False</property> @@ -215,12 +215,13 @@ <property name="layout-style">end</property> <child> <object class="GtkButton" id="btnCancel"> - <property name="label" translatable="yes">Cancel</property> + <property name="label" translatable="yes">_Cancel</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="can-default">True</property> <property name="has-default">True</property> <property name="receives-default">False</property> + <property name="use-underline">True</property> <signal name="clicked" handler="on_btnCancel_clicked" swapped="no"/> </object> <packing>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodderpreferences.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodderpreferences.ui
Changed
@@ -1,849 +1,1187 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> <!--*- mode: xml -*--> <interface> + <requires lib="gtk+" version="3.16"/> <object class="GtkAdjustment" id="adjustment_episode_limit"> - <property name="upper">1000</property> <property name="lower">100</property> - <property name="page_increment">10</property> - <property name="step_increment">10</property> - <property name="page_size">0</property> + <property name="upper">1000</property> <property name="value">200</property> - </object> - <object class="GtkAdjustment" id="adjustment_update_interval"> - <property name="upper">360</property> - <property name="lower">0</property> - <property name="page_increment">1</property> - <property name="step_increment">1</property> - <property name="page_size">0</property> - <property name="value">0</property> + <property name="step-increment">10</property> + <property name="page-increment">10</property> </object> <object class="GtkAdjustment" id="adjustment_expiration"> <property name="upper">30</property> - <property name="lower">0</property> - <property name="page_increment">10</property> - <property name="step_increment">1</property> - <property name="page_size">0</property> <property name="value">7</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment_update_interval"> + <property name="upper">360</property> + <property name="step-increment">1</property> + <property name="page-increment">1</property> </object> <object class="GtkDialog" id="gPodderPreferences"> - <property name="visible">False</property> - <property name="modal">True</property> - <property name="transient-for">parent_widget</property> - <property name="window-position">GTK_WIN_POS_CENTER_ON_PARENT</property> - <property name="default_height">260</property> - <property name="default_width">320</property> + <property name="can-focus">False</property> <property name="title" translatable="yes">Preferences</property> - <property name="type_hint">dialog</property> - <signal name="destroy" handler="on_dialog_destroy"/> + <property name="modal">True</property> + <property name="window-position">center-on-parent</property> + <property name="default-width">480</property> + <property name="default-height">340</property> + <property name="type-hint">dialog</property> + <signal name="destroy" handler="on_dialog_destroy" swapped="no"/> <child internal-child="vbox"> <object class="GtkBox" id="vbox"> - <property name="border_width">2</property> <property name="visible">True</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> - <child> - <object class="GtkNotebook" id="notebook"> - <property name="border_width">6</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="action_area"> <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">5</property> + <property name="margin-end">5</property> + <property name="margin-top">5</property> + <property name="margin-bottom">5</property> + <property name="layout-style">end</property> <child> - <object class="GtkBox" id="vbox_general"> - <property name="border_width">12</property> - <property name="spacing">6</property> + <object class="GtkButton" id="button_advanced"> + <property name="label" translatable="yes">_Edit config</property> <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <!-- n-columns=3 n-rows=2 --> - <object class="GtkGrid"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="column-spacing">12</property> - <property name="row-spacing">6</property> - <child> - <object class="GtkLabel" id="label_video_player"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="label" translatable="yes">Video player:</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="left-attach">0</property> - <property name="top-attach">0</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="combo_video_player_app"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="hexpand">True</property> - <signal name="changed" handler="on_combo_video_player_app_changed" swapped="no"/> - </object> - <packing> - <property name="left-attach">1</property> - <property name="top-attach">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button_video_player"> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">False</property> - <signal name="clicked" handler="on_button_video_player_clicked" swapped="no"/> - <child> - <object class="GtkImage" id="image4"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="stock">gtk-edit</property> - </object> - </child> - </object> - <packing> - <property name="left-attach">2</property> - <property name="top-attach">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label_audio_player"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="label" translatable="yes">Audio player:</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="left-attach">0</property> - <property name="top-attach">1</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="combo_audio_player_app"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="hexpand">True</property> - <signal name="changed" handler="on_combo_audio_player_app_changed" swapped="no"/> - </object> - <packing> - <property name="left-attach">1</property> - <property name="top-attach">1</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button_audio_player"> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">False</property> - <signal name="clicked" handler="on_button_audio_player_clicked" swapped="no"/> - <child> - <object class="GtkImage" id="image3"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="stock">gtk-edit</property> - </object> - </child> - </object> - <packing> - <property name="left-attach">2</property> - <property name="top-attach">1</property> - </packing> - </child> - </object> - </child> - <child> - <object class="GtkSeparator" id="hseparator_general"> - <property name="orientation">horizontal</property> - <property name="visible">True</property> - </object> - </child> - <child> - <object class="GtkCheckButton" id="checkbutton_show_all_episodes"> - <property name="label" translatable="yes">"All episodes" in podcast list</property> - <property name="visible">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="checkbutton_podcast_sections"> - <property name="label" translatable="yes">Use sections for podcast list</property> - <property name="visible">True</property> - </object>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/gpodderwelcome.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/gpodderwelcome.ui
Changed
@@ -1,93 +1,189 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> <!--*- mode: xml -*--> <interface> + <requires lib="gtk+" version="3.16"/> <object class="GtkDialog" id="gPodderWelcome"> - <property name="default_height">230</property> - <property name="default_width">340</property> - <property name="modal">True</property> - <property name="transient-for">parent_widget</property> + <property name="can-focus">False</property> <property name="title" translatable="yes">Getting started</property> + <property name="modal">True</property> + <property name="default-width">340</property> + <property name="default-height">230</property> + <property name="type-hint">dialog</property> <child internal-child="vbox"> <object class="GtkBox" id="dialog1-vbox"> - <property name="border_width">2</property> <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">2</property> + <property name="margin-end">2</property> + <property name="margin-top">2</property> + <property name="margin-bottom">2</property> <property name="orientation">vertical</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog1-action_area"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">5</property> + <property name="margin-end">5</property> + <property name="margin-top">5</property> + <property name="margin-bottom">5</property> + <property name="layout-style">end</property> + <child> + <object class="GtkButton" id="btnCancel"> + <property name="label" translatable="yes">_Cancel</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="on_btnCancel_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack-type">end</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkBox" id="vbox1"> - <property name="border_width">12</property> - <property name="spacing">12</property> <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-end">12</property> + <property name="margin-top">12</property> + <property name="margin-bottom">12</property> <property name="orientation">vertical</property> + <property name="spacing">12</property> <child> <object class="GtkLabel" id="label1"> - <property name="label" translatable="yes"><big>Welcome to gPodder</big></property> - <property name="use_markup">True</property> <property name="visible">True</property> - <property name="xalign">0.0</property> - <property name="yalign">1.0</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes"><big>Welcome to gPodder</big></property> + <property name="use-markup">True</property> + <property name="xalign">0</property> + <property name="yalign">1</property> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> <child> <object class="GtkLabel" id="label2"> - <property name="label" translatable="yes">Your podcast list is empty.</property> <property name="visible">True</property> - <property name="xalign">0.0</property> - <property name="yalign">0.0</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">Your podcast list is empty.</property> + <property name="xalign">0</property> + <property name="yalign">0</property> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> <child> <object class="GtkBox" id="vbox_buttons"> - <property name="spacing">6</property> <property name="visible">True</property> + <property name="can-focus">False</property> <property name="orientation">vertical</property> + <property name="spacing">6</property> <child> <object class="GtkButton" id="btnOPML"> - <property name="is_focus">True</property> - <property name="label" translatable="yes">Choose from a list of example podcasts</property> <property name="visible">True</property> - <signal handler="on_show_example_podcasts" name="clicked"/> + <property name="can-focus">True</property> + <property name="has-focus">True</property> + <property name="is-focus">True</property> + <property name="receives-default">False</property> + <signal name="clicked" handler="on_show_example_podcasts" swapped="no"/> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">10</property> + <property name="margin-end">10</property> + <property name="margin-top">10</property> + <property name="margin-bottom">10</property> + <property name="label" translatable="yes">Choose from a list of example podcasts</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> <child> <object class="GtkButton" id="btnAddURL"> - <property name="is_focus">True</property> - <property name="label" translatable="yes">Add a podcast by entering its URL</property> <property name="visible">True</property> - <signal handler="on_add_podcast_via_url" name="clicked"/> + <property name="can-focus">True</property> + <property name="is-focus">True</property> + <property name="receives-default">False</property> + <signal name="clicked" handler="on_add_podcast_via_url" swapped="no"/> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">10</property> + <property name="margin-end">10</property> + <property name="margin-top">10</property> + <property name="margin-bottom">10</property> + <property name="label" translatable="yes">Add a podcast by entering its URL</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> <child> <object class="GtkButton" id="btnMygPodder"> - <property name="label" translatable="yes">Restore my subscriptions from gpodder.net</property> <property name="visible">True</property> - <signal handler="on_setup_my_gpodder" name="clicked"/> + <property name="can-focus">True</property> + <property name="is-focus">True</property> + <property name="receives-default">False</property> + <signal name="clicked" handler="on_setup_my_gpodder" swapped="no"/> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">10</property> + <property name="margin-end">10</property> + <property name="margin-top">10</property> + <property name="margin-bottom">10</property> + <property name="label" translatable="yes">Restore my subscriptions from gpodder.net</property> + </object> + </child> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> </child> </object>
View file
3.10.21.tar.gz/share/gpodder/ui/gtk/menus.ui -> 3.11.0.tar.gz/share/gpodder/ui/gtk/menus.ui
Changed
@@ -100,7 +100,7 @@ </item> </section> </submenu> - <submenu id="menuChannels"> + <submenu id="menuEpisodes"> <attribute name="label" translatable="yes">_Episodes</attribute> <section> <item> @@ -117,6 +117,10 @@ <attribute name="label" translatable="yes">Download</attribute> </item> <item> + <attribute name="action">win.pause</attribute> + <attribute name="label" translatable="yes">Pause</attribute> + </item> + <item> <attribute name="action">win.cancel</attribute> <attribute name="label" translatable="yes">Cancel</attribute> </item> @@ -138,6 +142,12 @@ </section> <section> <item> + <attribute name="action">win.openEpisodeDownloadFolder</attribute> + <attribute name="label" translatable="yes">Open download folder</attribute> + </item> + </section> + <section> + <item> <attribute name="action">win.findEpisode</attribute> <attribute name="label" translatable="yes">Find Episode</attribute> <attribute name="accel"><Primary>f</attribute> @@ -209,6 +219,10 @@ <attribute name="action">win.viewAlwaysShowNewEpisodes</attribute> <attribute name="label" translatable="yes">Always show New Episodes</attribute> </item> + <item> + <attribute name="action">win.viewCtrlClickToSortEpisodes</attribute> + <attribute name="label" translatable="yes">Require control click to sort episodes</attribute> + </item> </section> <submenu id="menuViewColumns"> <attribute name="label" translatable="yes">Visible columns</attribute>
View file
3.10.21.tar.gz/share/man/man1/gpo.1 -> 3.11.0.tar.gz/share/man/man1/gpo.1
Changed
@@ -1,4 +1,4 @@ -.TH GPO "1" "July 2021" "gpodder 3.10.21" "User Commands" +.TH GPO "1" "July 2022" "gpodder 3.11.0" "User Commands" .SH NAME gpo \- Text mode interface of gPodder .SH SYNOPSIS
View file
3.10.21.tar.gz/share/man/man1/gpodder.1 -> 3.11.0.tar.gz/share/man/man1/gpodder.1
Changed
@@ -1,5 +1,5 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. -.TH GPODDER "1" "July 2021" "gpodder 3.10.21" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.5. +.TH GPODDER "1" "July 2022" "gpodder 3.11.0" "User Commands" .SH NAME gpodder \- Media aggregator and podcast client .SH SYNOPSIS @@ -17,12 +17,21 @@ .TP \fB\-h\fR, \fB\-\-help\fR show this help message and exit +.IP +Subscriptions: +.TP +\fB\-s\fR URL, \fB\-\-subscribe\fR=\fI\,URL\/\fR +subscribe to the feed at URL +.IP +Logging: .TP \fB\-v\fR, \fB\-\-verbose\fR print logging output on the console .TP \fB\-q\fR, \fB\-\-quiet\fR reduce warnings on the console +.IP +Advanced: .TP -\fB\-s\fR URL, \fB\-\-subscribe\fR=\fI\,URL\/\fR -subscribe to the feed at URL +\fB\-\-close\-after\-startup\fR +exit once started up (for profiling)
View file
3.10.21.tar.gz/src/gpodder/__init__.py -> 3.11.0.tar.gz/src/gpodder/__init__.py
Changed
@@ -20,13 +20,16 @@ # This metadata block gets parsed by setup.py - use single quotes only __tagline__ = 'Media aggregator and podcast client' __author__ = 'Thomas Perl <thp@gpodder.org>' -__version__ = '3.10.21' -__date__ = '2021-07-19' -__copyright__ = '© 2005-2021 The gPodder Team' +__version__ = '3.11.0' +__date__ = '2022-07-30' +__copyright__ = '© 2005-2022 The gPodder Team' __license__ = 'GNU General Public License, version 3 or later' __url__ = 'http://gpodder.org/' -__version_info__ = tuple(int(x) for x in __version__.split('.')) +# Use public version part for __version_info__, see PEP 440 +__public_version__, __local_version__ = next( + (v0, v1 if len(v) > 1 else '') for v in (__version__.split('+'),)) +__version_info__ = tuple(int(x) for x in __public_version__.split('.')) import gettext import locale @@ -163,6 +166,8 @@ ENV_HOME, ENV_DOWNLOADS = 'GPODDER_HOME', 'GPODDER_DOWNLOAD_DIR' +no_update_check_file = None + # Function to set a new gPodder home folder def set_home(new_home):
View file
3.10.21.tar.gz/src/gpodder/common.py -> 3.11.0.tar.gz/src/gpodder/common.py
Changed
@@ -40,6 +40,8 @@ if delete_partial: temporary_files += glob.glob('%s/*/*.partial' % gpodder.downloads) + # youtube-dl creates .partial.* files for adaptive formats + temporary_files += glob.glob('%s/*/*.partial.*' % gpodder.downloads) for tempfile in temporary_files: util.delete_file(tempfile) @@ -53,7 +55,7 @@ progress_callback - A callback(title, progress) when an episode was found finish_progress_callback - A callback(resumable_episodes) when finished """ - # Look for partial file downloads + # Look for partial file downloads, ignoring .partial.* files created by youtube-dl partial_files = glob.glob(os.path.join(gpodder.downloads, '*', '*.partial')) count = len(partial_files) resumable_episodes = @@ -85,7 +87,7 @@ break for f in partial_files: - logger.warn('Partial file without episode: %s', f) + logger.warning('Partial file without episode: %s', f) util.delete_file(f) # never delete partial: either we can't clean them up because we offer to
View file
3.10.21.tar.gz/src/gpodder/config.py -> 3.11.0.tar.gz/src/gpodder/config.py
Changed
@@ -169,6 +169,7 @@ 'view_mode': 1, 'columns': int('110', 2), # bitfield of visible columns 'always_show_new': True, + 'ctrl_click_to_sort': False, }, 'download_list': { @@ -187,6 +188,7 @@ 'one_folder_per_podcast': True, 'skip_played_episodes': True, 'delete_played_episodes': False, + 'delete_deleted_episodes': False, 'max_filename_length': 120, @@ -317,7 +319,7 @@ if callback not in self.__observers: self.__observers.append(callback) else: - logger.warn('Observer already added: %s', repr(callback)) + logger.warning('Observer already added: %s', repr(callback)) def remove_observer(self, callback): """ @@ -326,7 +328,7 @@ if callback in self.__observers: self.__observers.remove(callback) else: - logger.warn('Observer not added: %s', repr(callback)) + logger.warning('Observer not added: %s', repr(callback)) def all_keys(self): return self.__json_config._keys_iter() @@ -371,10 +373,11 @@ if os.path.exists(self.__filename): try: - data = open(self.__filename, 'rt').read() + with open(self.__filename, 'rt') as f: + data = f.read() new_keys_added = self.__json_config._restore(data) except: - logger.warn('Cannot parse config file: %s', + logger.warning('Cannot parse config file: %s', self.__filename, exc_info=True) new_keys_added = False
View file
3.10.21.tar.gz/src/gpodder/coverart.py -> 3.11.0.tar.gz/src/gpodder/coverart.py
Changed
@@ -91,7 +91,7 @@ raise ValueError(msg) data = response.content except Exception as e: - logger.warn('Cover art download failed: %s', e) + logger.warning('Cover art download failed: %s', e) return self._fallback_filename(title) try: @@ -113,7 +113,7 @@ return filename + extension except Exception as e: - logger.warn('Cannot save cover art', exc_info=True) + logger.warning('Cannot save cover art', exc_info=True) # Fallback to cover art based on the podcast title return self._fallback_filename(title)
View file
3.10.21.tar.gz/src/gpodder/dbusproxy.py -> 3.11.0.tar.gz/src/gpodder/dbusproxy.py
Changed
@@ -113,7 +113,7 @@ def episode_to_tuple(episode): title = safe_str(episode.title) url = safe_str(episode.url) - description = safe_first_line(episode.description) + description = safe_first_line(episode._text_description) filename = safe_str(episode.download_filename) file_type = safe_str(episode.file_type()) is_new = (episode.state == gpodder.STATE_NORMAL and episode.is_new)
View file
3.10.21.tar.gz/src/gpodder/deviceplaylist.py -> 3.11.0.tar.gz/src/gpodder/deviceplaylist.py
Changed
@@ -25,6 +25,10 @@ from gpodder.sync import (episode_filename_on_device, episode_foldername_on_device) +import gi # isort:skip +gi.require_version('Gio', '2.0') # isort:skip +from gi.repository import Gio, GLib # isort:skip + _ = gpodder.gettext @@ -36,12 +40,19 @@ self._config = config self.linebreak = '\r\n' self.playlist_file = util.sanitize_filename(playlist_name, self._config.device_sync.max_filename_length) + '.m3u' - self.playlist_folder = os.path.join(self._config.device_sync.device_folder, self._config.device_sync.playlists.folder) - self.mountpoint = util.find_mount_point(self.playlist_folder) - if self.mountpoint == '/': + device_folder = util.new_gio_file(self._config.device_sync.device_folder) + self.playlist_folder = device_folder.resolve_relative_path(self._config.device_sync.playlists.folder) + + self.mountpoint = None + try: + self.mountpoint = self.playlist_folder.find_enclosing_mount().get_root() + except GLib.Error as err: + logger.error('find_enclosing_mount folder %s failed: %s', self.playlist_folder.get_uri(), err.message) + + if not self.mountpoint: self.mountpoint = self.playlist_folder - logger.warning('MP3 player resides on / - using %s as MP3 player root', self.mountpoint) - self.playlist_absolute_filename = os.path.join(self.playlist_folder, self.playlist_file) + logger.warning('could not find mount point for MP3 player - using %s as MP3 player root', self.mountpoint.get_uri()) + self.playlist_absolute_filename = self.playlist_folder.resolve_relative_path(self.playlist_file) def build_extinf(self, filename): # TODO: Windows playlists @@ -64,11 +75,16 @@ read all files from the existing playlist """ tracks = - logger.info("Read data from the playlistfile %s" % self.playlist_absolute_filename) - if os.path.exists(self.playlist_absolute_filename): - for line in open(self.playlist_absolute_filename, 'r'): + logger.info("Read data from the playlistfile %s" % self.playlist_absolute_filename.get_uri()) + if self.playlist_absolute_filename.query_exists(): + stream = Gio.DataInputStream.new(self.playlist_absolute_filename.read()) + while True: + line = stream.read_line_utf8()0 + if not line: + break if not line.startswith('#EXT'): tracks.append(line.rstrip('\r\n')) + stream.close() return tracks def get_filename_for_playlist(self, episode): @@ -86,7 +102,7 @@ if foldername: filename = os.path.join(foldername, filename) if self._config.device_sync.playlist.absolute_path: - filename = os.path.join(util.relpath(self.mountpoint, self._config.device_sync.device_folder), filename) + filename = os.path.join(util.relpath(self._config.device_sync.device_folder, self.mountpoint.get_uri()), filename) return filename def write_m3u(self, episodes): @@ -97,12 +113,29 @@ if not util.make_directory(self.playlist_folder): raise IOError(_('Folder %s could not be created.') % self.playlist_folder, _('Error writing playlist')) else: - fp = open(os.path.join(self.playlist_folder, self.playlist_file), 'w') - fp.write('#EXTM3U%s' % self.linebreak) + # work around libmtp devices potentially having limited capabilities for partial writes + is_mtp = self.playlist_folder.get_uri().startswith("mtp://") + tempfile = None + if is_mtp: + tempfile = Gio.File.new_tmp() + fs = tempfile1.get_output_stream() + else: + fs = self.playlist_absolute_filename.replace(None, False, Gio.FileCreateFlags.NONE) + + os = Gio.DataOutputStream.new(fs) + os.put_string('#EXTM3U%s' % self.linebreak) for current_episode in episodes: filename = self.get_filename_for_playlist(current_episode) - fp.write(self.build_extinf(filename)) + os.put_string(self.build_extinf(filename)) filename = self.get_absolute_filename_for_playlist(current_episode) - fp.write(filename) - fp.write(self.linebreak) - fp.close() + os.put_string(filename) + os.put_string(self.linebreak) + os.close() + + if is_mtp: + try: + tempfile0.copy(self.playlist_absolute_filename, Gio.FileCopyFlags.OVERWRITE) + except GLib.Error as err: + logger.error('copying playlist to mtp device file %s failed: %s', + self.playlist_absolute_filename.get_uri(), err.message) + tempfile0.delete()
View file
3.10.21.tar.gz/src/gpodder/download.py -> 3.11.0.tar.gz/src/gpodder/download.py
Changed
@@ -27,6 +27,7 @@ import collections import email +import glob import logging import mimetypes import os @@ -230,7 +231,7 @@ # The following is based on Python's urllib.py "URLopener.retrieve" # Also based on http://mail.python.org/pipermail/python-list/2001-October/110069.html - def retrieve_resume(self, url, filename, reporthook=None, data=None): + def retrieve_resume(self, url, filename, reporthook=None, data=None, disable_auth=False): """Download files from an URL; return (headers, real_url) Resumes a download if the local filename exists and @@ -243,7 +244,7 @@ 'User-agent': gpodder.user_agent } - if self.channel.auth_username or self.channel.auth_password: + if (self.channel.auth_username or self.channel.auth_password) and not disable_auth: logger.debug('Authenticating as "%s"', self.channel.auth_username) auth = (self.channel.auth_username, self.channel.auth_password) else: @@ -257,7 +258,7 @@ if current_size > 0: headers'Range' = 'bytes=%s-' % (current_size) except: - logger.warn('Cannot resume download: %s', filename, exc_info=True) + logger.warning('Cannot resume download: %s', filename, exc_info=True) tfp = None current_size = 0 @@ -276,7 +277,11 @@ try: resp.raise_for_status() except HTTPError as e: - raise gPodderDownloadHTTPError(url, resp.status_code, str(e)) + if auth is not None: + # Try again without authentication (bug 1296) + return self.retrieve_resume(url, filename, reporthook, data, True) + else: + raise gPodderDownloadHTTPError(url, resp.status_code, str(e)) headers = resp.headers @@ -291,7 +296,7 @@ tfp.close() tfp = open(filename, 'wb') current_size = 0 - logger.warn('Cannot resume: Invalid Content-Range (RFC2616).') + logger.warning('Cannot resume: Invalid Content-Range (RFC2616).') result = headers, resp.url bs = 1024 * 8 @@ -383,14 +388,14 @@ if not self.continue_check_callback(self): return - try: - task = self.queue.get_next() - logger.info('%s is processing: %s', self, task) - task.run() - task.recycle() - except StopIteration as e: + task = self.queue.get_next() + if not task: logger.info('No more tasks for %s to carry out.', self) break + logger.info('%s is processing: %s', self, task) + task.run() + task.recycle() + self.exit_callback(self) @@ -405,6 +410,7 @@ logger.info('Starting new thread: %s', self) logger.info('%s is processing: %s', self, self.task) self.task.run() + self.task.recycle() class DownloadQueueManager(object): @@ -435,12 +441,12 @@ work_count = self.tasks.available_work_count() if self._config.max_downloads_enabled: # always allow at least 1 download - max_downloads = max(int(self._config.max_downloads), 1) - spawn_limit = max_downloads - len(self.worker_threads) + spawn_limit = max(int(self._config.max_downloads), 1) else: spawn_limit = self._config.limit.downloads.concurrent_max - logger.info('%r tasks to do, can start at most %r threads', work_count, spawn_limit) - for i in range(0, min(work_count, spawn_limit)): + running = len(self.worker_threads) + logger.info('%r tasks to do, can start at most %r threads, %r threads currently running', work_count, spawn_limit, running) + for i in range(0, min(work_count, spawn_limit - running)): # We have to create a new thread here, there's work to do logger.info('Starting new worker thread.') @@ -453,16 +459,21 @@ self.__spawn_threads() def force_start_task(self, task): - if self.tasks.set_downloading(task): - worker = ForceDownloadWorker(task) - util.run_in_background(worker.run) + with task: + if task.status in (task.QUEUED, task.PAUSED, task.CANCELLED, task.FAILED): + task.status = task.DOWNLOADING + worker = ForceDownloadWorker(task) + util.run_in_background(worker.run) def queue_task(self, task): """Marks a task as queued """ - task.status = DownloadTask.QUEUED + self.tasks.queue_task(task) self.__spawn_threads() + def has_workers(self): + return len(self.worker_threads) > 0 + class DownloadTask(object): """An object representing the download task of an episode @@ -470,7 +481,7 @@ You can create a new download task like this: task = DownloadTask(episode, gpodder.config.Config(CONFIGFILE)) - task.status = DownloadTask.DOWNLOADING + task.status = DownloadTask.QUEUED task.run() While the download is in progress, you can access its properties: @@ -487,7 +498,8 @@ You can cancel a running download task by setting its status: - task.status = DownloadTask.CANCELLED + with task: + task.status = DownloadTask.CANCELLING The task will then abort as soon as possible (due to the nature of downloading data, this can take a while when the Internet is @@ -538,9 +550,9 @@ The same thing works for failed downloads ("notify_as_failed()"). """ # Possible states this download task can be in - STATUS_MESSAGE = (_('Added'), _('Queued'), _('Downloading'), - _('Finished'), _('Failed'), _('Cancelled'), _('Paused')) - (INIT, QUEUED, DOWNLOADING, DONE, FAILED, CANCELLED, PAUSED) = list(range(7)) + STATUS_MESSAGE = (_('Queued'), _('Queued'), _('Downloading'), + _('Finished'), _('Failed'), _('Cancelling'), _('Cancelled'), _('Pausing'), _('Paused')) + (NEW, QUEUED, DOWNLOADING, DONE, FAILED, CANCELLING, CANCELLED, PAUSING, PAUSED) = list(range(9)) # Wheter this task represents a file download or a device sync operation ACTIVITY_DOWNLOAD, ACTIVITY_SYNCHRONIZE = list(range(2)) @@ -551,6 +563,12 @@ def __str__(self): return self.__episode.title + def __enter__(self): + return self.__lock.acquire() + + def __exit__(self, type, value, traceback): + self.__lock.release() + def __get_status(self): return self.__status @@ -602,17 +620,61 @@ downloader = property(fget=__get_downloader, fset=__set_downloader) + def can_queue(self): + return self.status in (self.CANCELLED, self.PAUSED, self.FAILED) + + def unpause(self): + with self: + # Resume a downloading task that was transitioning to paused + if self.status == self.PAUSING: + self.status = self.DOWNLOADING + + def can_pause(self): + return self.status in (self.DOWNLOADING, self.QUEUED) + + def pause(self): + with self: + # Pause a queued download + if self.status == self.QUEUED: + self.status = self.PAUSED + # Request pause of a running download + elif self.status == self.DOWNLOADING: + self.status = self.PAUSING + # download rate limited tasks sleep and take longer to transition from the PAUSING state to the PAUSED state +
View file
3.10.21.tar.gz/src/gpodder/extensions.py -> 3.11.0.tar.gz/src/gpodder/extensions.py
Changed
@@ -242,7 +242,8 @@ return {} encoding = util.guess_encoding(filename) - extension_py = open(filename, "r", encoding=encoding).read() + with open(filename, "r", encoding=encoding) as f: + extension_py = f.read() metadata = dict(re.findall(r"__(a-z_+)__ = '(^'+)'", extension_py)) # Support for using gpodder.gettext() as _ to localize text @@ -366,7 +367,7 @@ 'enabled' if new_enabled else 'disabled') container.set_enabled(new_enabled) if new_enabled and not container.enabled: - logger.warn('Could not enable extension: %s', + logger.warning('Could not enable extension: %s', container.error) self.core.config.extensions.enabled = x for x in self.core.config.extensions.enabled
View file
3.10.21.tar.gz/src/gpodder/feedcore.py -> 3.11.0.tar.gz/src/gpodder/feedcore.py
Changed
@@ -110,6 +110,12 @@ self._resolved_url = url +class FetcherFeedData: + def __init__(self, text, content): + self.text = text + self.content = content + + class Fetcher(object): # Supported types, see http://feedvalidator.org/docs/warning/EncodingMismatch.html FEED_TYPES = ('application/rss+xml', @@ -152,7 +158,7 @@ else: raise UnknownStatusCode(status) - def parse_feed(self, url, data_stream, headers, status, **kwargs): + def parse_feed(self, url, feed_data, data_stream, headers, status, **kwargs): """ kwargs are passed from Fetcher.fetch :param str url: real url @@ -169,7 +175,7 @@ if url.startswith('file://'): url = urllen('file://'): stream = open(url) - return self.parse_feed(url, stream, {}, UPDATED_FEED, **kwargs) + return self.parse_feed(url, None, stream, {}, UPDATED_FEED, **kwargs) # remote feed headers = {} @@ -200,7 +206,7 @@ self.fetch(ad._resolved_url, etag=None, modified=None, autodiscovery=False, **kwargs) return Result(NEW_LOCATION, ad._resolved_url) except Exception as e: - logger.warn('Feed autodiscovery failed', exc_info=True) + logger.warning('Feed autodiscovery failed', exc_info=True) # Second, try to resolve the URL new_url = self._resolve_url(url) @@ -210,4 +216,5 @@ # xml documents specify the encoding inline so better pass encoded body. # Especially since requests will use ISO-8859-1 for content-type 'text/xml' # if the server doesn't specify a charset. - return self.parse_feed(url, BytesIO(stream.content), stream.headers, UPDATED_FEED, **kwargs) + return self.parse_feed(url, FetcherFeedData(stream.text, stream.content), BytesIO(stream.content), stream.headers, + UPDATED_FEED, **kwargs)
View file
3.10.21.tar.gz/src/gpodder/gtkui/app.py -> 3.11.0.tar.gz/src/gpodder/gtkui/app.py
Changed
@@ -132,6 +132,7 @@ logger.error('Cannot find gtk/menus.ui in %r, exiting' % gpodder.ui_folders) sys.exit(1) + self.menu_extras = builder.get_object('menuExtras') self.menu_view_columns = builder.get_object('menuViewColumns') self.set_menubar(menubar) @@ -171,7 +172,7 @@ self.bus_name = dbus.service.BusName(gpodder.dbus_bus_name, bus=gpodder.dbus_session_bus) except dbus.exceptions.DBusException as dbe: - logger.warn('Cannot get "on the bus".', exc_info=True) + logger.warning('Cannot get "on the bus".', exc_info=True) dlg = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, _('Cannot start gPodder')) dlg.format_secondary_markup(_('D-Bus error: %s') % (str(dbe),)) @@ -202,13 +203,14 @@ def on_about(self, action, param): dlg = Gtk.Dialog(_('About gPodder'), self.window.gPodder, Gtk.DialogFlags.MODAL) - dlg.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.OK).show() + dlg.add_button(_('_Close'), Gtk.ResponseType.OK).show() dlg.set_resizable(True) bg = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6, margin=16) pb = GdkPixbuf.Pixbuf.new_from_file_at_size(gpodder.icon_file, 160, 160) bg.pack_start(Gtk.Image.new_from_pixbuf(pb), False, False, 0) label = Gtk.Label(justify=Gtk.Justification.CENTER) + label.set_selectable(True) label.set_markup('\n'.join(x.strip() for x in """ <b>gPodder {version} ({date})</b> @@ -261,7 +263,10 @@ self.window.mygpo_client.open_website() def on_check_for_updates_activate(self, action, param): - self.window.check_for_updates(silent=False) + if os.path.exists(gpodder.no_update_check_file): + self.window.check_for_distro_updates() + else: + self.window.check_for_updates(silent=False) def on_extension_enabled(self, extension): self.window.on_extension_enabled(extension)
View file
3.10.21.tar.gz/src/gpodder/gtkui/base.py -> 3.11.0.tar.gz/src/gpodder/gtkui/base.py
Changed
@@ -50,9 +50,6 @@ if parent is not None: self.builder.expose_object('parent_widget', parent) self.builder.set_translation_domain(textdomain) - if hasattr(self, '_builder_expose'): - for (key, value) in list(self._builder_expose.items()): - self.builder.expose_object(key, value) # print >>sys.stderr, 'Creating new from file', self.__class__.__name__ @@ -67,6 +64,9 @@ self.builder.connect_signals(self) self.set_attributes() + if hasattr(self, '_gtk_properties'): + for ((gobj, prop), val) in self._gtk_properties.items(): + getattr(self, gobj).set_property(prop, val) self.new()
View file
3.10.21.tar.gz/src/gpodder/gtkui/config.py -> 3.11.0.tar.gz/src/gpodder/gtkui/config.py
Changed
@@ -165,6 +165,12 @@ window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) else: window.move(cfg.x, cfg.y) + # From Gtk docs: most window managers ignore requests for initial window + # positions (instead using a user-defined placement algorithm) and honor + # requests after the window has already been shown. + # Move it a second time after the window has been shown. + # The first move reduces chance of window jumping. + util.idle_add(window.move, cfg.x, cfg.y) # Ignore events while we're connecting to the window self.__ignore_window_events = True @@ -184,10 +190,8 @@ window.connect('configure-event', _receive_configure_event) def _receive_window_state(widget, event): - # ELL: why is it commented out? - # new_value = bool(event.new_window_state & Gdk.WindowState.MAXIMIZED) - # cfg.maximized = new_value - pass + new_value = bool(event.new_window_state & Gdk.WindowState.MAXIMIZED) + cfg.maximized = new_value window.connect('window-state-event', _receive_window_state)
View file
3.10.21.tar.gz/src/gpodder/gtkui/desktop/channel.py -> 3.11.0.tar.gz/src/gpodder/gtkui/desktop/channel.py
Changed
@@ -112,7 +112,7 @@ def on_button_add_section_clicked(self, widget): text = self.show_text_edit_dialog(_('Add section'), _('New section:'), - affirmative_text=Gtk.STOCK_ADD) + affirmative_text=_('_Add')) if text is not None: for index, (section,) in enumerate(self.section_list): @@ -146,8 +146,8 @@ title=_('Select new podcast cover artwork'), parent=self.gPodderChannel, action=Gtk.FileChooserAction.OPEN) - dlg.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) - dlg.add_button(Gtk.STOCK_OPEN, Gtk.ResponseType.OK) + dlg.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL) + dlg.add_button(_('_Open'), Gtk.ResponseType.OK) if dlg.run() == Gtk.ResponseType.OK: url = dlg.get_uri() @@ -164,7 +164,7 @@ def set_cover(channel, pixbuf): if self.channel == channel: if pixbuf is not None: - self.imgCover.set_from_pixbuf(self.scale_pixbuf(pixbuf)) + self.imgCover.set_from_pixbuf(util.scale_pixbuf(pixbuf, self.MAX_SIZE)) if self.show_on_cover_load: self.main_window.show() self.show_on_cover_load = False @@ -193,26 +193,10 @@ def on_gPodderChannel_destroy(self, widget, *args): self.cover_downloader.unregister('cover-available', self.cover_download_finished) - def scale_pixbuf(self, pixbuf): - - # Resize if width is too large - if pixbuf.get_width() > self.MAX_SIZE: - f = float(self.MAX_SIZE) / pixbuf.get_width() - (width, height) = (int(pixbuf.get_width() * f), int(pixbuf.get_height() * f)) - pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR) - - # Resize if height is too large - if pixbuf.get_height() > self.MAX_SIZE: - f = float(self.MAX_SIZE) / pixbuf.get_height() - (width, height) = (int(pixbuf.get_width() * f), int(pixbuf.get_height() * f)) - pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR) - - return pixbuf - # Title editing callbacks def on_title_edit_button_clicked(self, button): self.title_save_button_saves = True - self.title_save_button.set_label(_("Save")) + self.title_save_button.set_label(_("_Save")) self.title_stack.set_visible_child(self.title_edit_box) self.title_entry.set_text(self.title_label.get_text()) self.title_entry.grab_focus() @@ -220,7 +204,7 @@ def on_title_entry_changed(self, entry): if len(entry.get_text()) > 0: self.title_save_button_saves = True - self.title_save_button.set_label(_("Save")) + self.title_save_button.set_label(_("_Save")) else: self.title_save_button_saves = False self.title_save_button.set_label(_("Cancel"))
View file
3.10.21.tar.gz/src/gpodder/gtkui/desktop/episodeselector.py -> 3.11.0.tar.gz/src/gpodder/gtkui/desktop/episodeselector.py
Changed
@@ -59,12 +59,9 @@ - title: (optional) The title of the window + heading - instructions: (optional) A one-line text describing what the user should select / what the selection is for - - stock_ok_button: (optional) Will replace the "OK" button with - another GTK+ stock item to be used for the - affirmative button of the dialog (e.g. can - be Gtk.STOCK_DELETE when the episodes to be - selected will be deleted after closing the - dialog) + - ok_button: (optional) Will replace the "OK" button label with this + string (e.g. can be '_Delete' when the episodes to be + selected will be deleted after closing the dialog) - selection_buttons: (optional) A dictionary with labels as keys and callbacks as values; for each key a button will be generated, and when @@ -89,6 +86,7 @@ COLUMN_ADDITIONAL = 3 def new(self): + self.gPodderEpisodeSelector.set_transient_for(self.parent_widget) if hasattr(self, 'title'): self.gPodderEpisodeSelector.set_title(self.title) @@ -134,13 +132,13 @@ self.labelInstructions.set_text(self.instructions) self.labelInstructions.show_all() - if hasattr(self, 'stock_ok_button'): - if self.stock_ok_button == 'gpodder-download': + if hasattr(self, 'ok_button'): + if self.ok_button == 'gpodder-download': self.btnOK.set_image(Gtk.Image.new_from_icon_name('go-down', Gtk.IconSize.BUTTON)) - self.btnOK.set_label(_('Download')) + self.btnOK.set_label(_('_Download')) else: - self.btnOK.set_label(self.stock_ok_button) - self.btnOK.set_use_stock(True) + self.btnOK.set_image(None) + self.btnOK.set_label(self.ok_button) # check/uncheck column toggle_cell = Gtk.CellRendererToggle() @@ -281,11 +279,11 @@ menu.append(item) menu.append(Gtk.SeparatorMenuItem()) - item = Gtk.MenuItem(_('Select all')) + item = Gtk.MenuItem(_('Select _all')) item.connect('activate', self.on_btnCheckAll_clicked) menu.append(item) - item = Gtk.MenuItem(_('Select none')) + item = Gtk.MenuItem(_('Select _none')) item.connect('activate', self.on_btnCheckNone_clicked) menu.append(item) @@ -326,9 +324,9 @@ self.btnOK.set_sensitive(count > 0) self.btnRemoveAction.set_sensitive(count > 0) if count > 0: - self.btnCancel.set_label(Gtk.STOCK_CANCEL) + self.btnCancel.set_label(_('_Cancel')) else: - self.btnCancel.set_label(Gtk.STOCK_CLOSE) + self.btnCancel.set_label(_('_Close')) else: self.btnOK.set_sensitive(False) self.btnRemoveAction.set_sensitive(False)
View file
3.10.21.tar.gz/src/gpodder/gtkui/desktop/exportlocal.py -> 3.11.0.tar.gz/src/gpodder/gtkui/desktop/exportlocal.py
Changed
@@ -31,17 +31,13 @@ class gPodderExportToLocalFolder(BuilderWidget): """ Export to Local Folder UI: file dialog + checkbox to save all to same folder """ def new(self): + self.gPodderExportToLocalFolder.set_transient_for(self.parent_widget) + self.RES_CANCEL = -6 + self.RES_SAVE = -3 + self.gPodderExportToLocalFolder.add_buttons("_Cancel", self.RES_CANCEL, + "_Save", self.RES_SAVE) self._config.connect_gtk_window(self.gPodderExportToLocalFolder, 'export_to_local_folder', True) - self._ok = False - self.gPodderExportToLocalFolder.hide() - - def on_btnOK_clicked(self, widget): - self._ok = True - self.gPodderExportToLocalFolder.hide() - - def on_btnCancel_clicked(self, widget): - self.gPodderExportToLocalFolder.hide() def save_as(self, initial_directory, filename, remaining=0): """ @@ -63,9 +59,9 @@ initial_directory = os.path.expanduser('~') self.gPodderExportToLocalFolder.set_current_folder(initial_directory) self.gPodderExportToLocalFolder.set_current_name(filename) - self._ok = False - self.gPodderExportToLocalFolder.run() - notCancelled = self._ok + res = self.gPodderExportToLocalFolder.run() + self.gPodderExportToLocalFolder.hide() + notCancelled = (res == self.RES_SAVE) allRemainingDefault = self.allsamefolder.get_active() if notCancelled: folder = self.gPodderExportToLocalFolder.get_current_folder()
View file
3.10.21.tar.gz/src/gpodder/gtkui/desktop/podcastdirectory.py -> 3.11.0.tar.gz/src/gpodder/gtkui/desktop/podcastdirectory.py
Changed
@@ -89,7 +89,7 @@ try: pixbuf = GdkPixbuf.Pixbuf.new_from_file(os.path.join(gpodder.images_folder, provider.icon)) if provider.icon else None except Exception as e: - logger.warn('Could not load icon: %s (%s)', provider.icon or '-', e) + logger.warning('Could not load icon: %s (%s)', provider.icon or '-', e) pixbuf = None self.append((Pango.Weight.NORMAL, provider.name, pixbuf, provider)) @@ -99,6 +99,7 @@ class gPodderPodcastDirectory(BuilderWidget): def new(self): + self.gPodderPodcastDirectory.set_transient_for(self.parent_widget) if hasattr(self, 'custom_title'): self.main_window.set_title(self.custom_title) @@ -202,7 +203,7 @@ try: tags = (t.tag, t.weight) for t in provider.get_tags() except Exception as e: - logger.warn('Got exception while loading tags: %s', e) + logger.warning('Got exception while loading tags: %s', e) tags = @util.idle_add @@ -250,7 +251,7 @@ try: podcasts = callback() except Exception as e: - logger.warn('Got exception while loading podcasts: %s', e) + logger.warning('Got exception while loading podcasts: %s', e) podcasts = @util.idle_add @@ -262,7 +263,7 @@ if original_provider == self.current_provider: self.podcasts_model.load(podcasts or ) else: - logger.warn('Ignoring update from old thread') + logger.warning('Ignoring update from old thread') self.en_query.set_sensitive(True) self.bt_search.set_sensitive(True)
View file
3.10.21.tar.gz/src/gpodder/gtkui/desktop/preferences.py -> 3.11.0.tar.gz/src/gpodder/gtkui/desktop/preferences.py
Changed
@@ -26,7 +26,8 @@ import gpodder from gpodder import util, vimeo, youtube from gpodder.gtkui.desktopfile import PlayerListModel -from gpodder.gtkui.interface.common import BuilderWidget, TreeViewHelper +from gpodder.gtkui.interface.common import (BuilderWidget, TreeViewHelper, + show_message_dialog) from gpodder.gtkui.interface.configeditor import gPodderConfigEditor logger = logging.getLogger(__name__) @@ -184,6 +185,7 @@ C_TOGGLE, C_LABEL, C_EXTENSION, C_SHOW_TOGGLE = list(range(4)) def new(self): + self.gPodderPreferences.set_transient_for(self.parent_widget) for cb in (self.combo_audio_player_app, self.combo_video_player_app): cellrenderer = Gtk.CellRendererPixbuf() cb.pack_start(cellrenderer, False) @@ -207,6 +209,7 @@ self.preferred_youtube_format_model = YouTubeVideoFormatListModel(self._config) self.combobox_preferred_youtube_format.set_model(self.preferred_youtube_format_model) cellrenderer = Gtk.CellRendererText() + cellrenderer.set_property('ellipsize', Pango.EllipsizeMode.END) self.combobox_preferred_youtube_format.pack_start(cellrenderer, True) self.combobox_preferred_youtube_format.add_attribute(cellrenderer, 'text', self.preferred_youtube_format_model.C_CAPTION) self.combobox_preferred_youtube_format.set_active(self.preferred_youtube_format_model.get_index()) @@ -214,6 +217,7 @@ self.preferred_youtube_hls_format_model = YouTubeVideoHLSFormatListModel(self._config) self.combobox_preferred_youtube_hls_format.set_model(self.preferred_youtube_hls_format_model) cellrenderer = Gtk.CellRendererText() + cellrenderer.set_property('ellipsize', Pango.EllipsizeMode.END) self.combobox_preferred_youtube_hls_format.pack_start(cellrenderer, True) self.combobox_preferred_youtube_hls_format.add_attribute(cellrenderer, 'text', self.preferred_youtube_hls_format_model.C_CAPTION) self.combobox_preferred_youtube_hls_format.set_active(self.preferred_youtube_hls_format_model.get_index()) @@ -221,6 +225,7 @@ self.preferred_vimeo_format_model = VimeoVideoFormatListModel(self._config) self.combobox_preferred_vimeo_format.set_model(self.preferred_vimeo_format_model) cellrenderer = Gtk.CellRendererText() + cellrenderer.set_property('ellipsize', Pango.EllipsizeMode.END) self.combobox_preferred_vimeo_format.pack_start(cellrenderer, True) self.combobox_preferred_vimeo_format.add_attribute(cellrenderer, 'text', self.preferred_vimeo_format_model.C_CAPTION) self.combobox_preferred_vimeo_format.set_active(self.preferred_vimeo_format_model.get_index()) @@ -293,6 +298,8 @@ self.checkbutton_create_playlists) self._config.connect_gtk_togglebutton('device_sync.playlists.two_way_sync', self.checkbutton_delete_using_playlists) + self._config.connect_gtk_togglebutton('device_sync.delete_deleted_episodes', + self.checkbutton_delete_deleted_episodes) # Have to do this before calling set_active on checkbutton_enable self._enable_mygpo = self._config.mygpo.enabled @@ -314,10 +321,35 @@ gpodder.user_extensions.on_ui_object_available('preferences-gtk', self) + self.inject_extensions_preferences(init=True) + + self.prefs_stack.foreach(self._wrap_checkbox_labels) + + def _wrap_checkbox_labels(self, w, *args): + if w.get_name().startswith("no_label_wrap"): + return + elif isinstance(w, Gtk.CheckButton): + label = w.get_child() + label.set_line_wrap(True) + elif isinstance(w, Gtk.Container): + w.foreach(self._wrap_checkbox_labels) + + def inject_extensions_preferences(self, init=False): + if not init: + # remove preferences buttons for all extensions + for child in self.prefs_stack.get_children(): + if child.get_name().startswith("extension."): + self.prefs_stack.remove(child) + + # add preferences buttons for all extensions result = gpodder.user_extensions.on_preferences() if result: for label, callback in result: - self.notebook.append_page(callback(), Gtk.Label(label)) + page = callback() + name = "extension." + label + page.set_name(name) + page.foreach(self._wrap_checkbox_labels) + self.prefs_stack.add_titled(page, name, label) def _extensions_select_function(self, selection, model, path, path_currently_selected): return model.get_value(model.get_iter(path), self.C_SHOW_TOGGLE) @@ -446,6 +478,7 @@ self.on_extension_enabled(container.module) else: self.on_extension_disabled(container.module) + self.inject_extensions_preferences() elif container.error is not None: if hasattr(container.error, 'message'): error_msg = container.error.message @@ -459,13 +492,11 @@ if not container or not model: return - # This is one ugly hack, but it displays the attributes of - # the metadata object of the container.. - info = '\n'.join('<b>%s:</b> %s' % - tuple(map(html.escape, list(map(str, (key, value))))) - for key, value in container.metadata.get_sorted()) + info = '\n'.join('<b>{}:</b> {}'.format(html.escape(key), html.escape(value)) + for key, value in container.metadata.get_sorted() + if key not in ('title', 'description')) - self.show_message(info, _('Extension module info'), important=True) + self.show_message_details(container.metadata.title, container.metadata.description, info) def open_weblink(self, w, url): util.open_website(url) @@ -621,7 +652,8 @@ children = self.btn_playlistfolder.get_children() if children: label = children.pop() - label.set_alignment(0., .5) + label.set_ellipsize(Pango.EllipsizeMode.START) + label.set_xalign(0.0) else: self.btn_playlistfolder.set_sensitive(False) self.btn_playlistfolder.set_label('') @@ -640,16 +672,13 @@ self.combobox_on_sync.set_sensitive(False) self.checkbutton_skip_played_episodes.set_sensitive(False) elif device_type == 'filesystem': - self.btn_filesystemMountpoint.set_label(self._config.device_sync.device_folder) + self.btn_filesystemMountpoint.set_label(self._config.device_sync.device_folder or "") self.btn_filesystemMountpoint.set_sensitive(True) self.checkbutton_create_playlists.set_sensitive(True) - children = self.btn_filesystemMountpoint.get_children() - if children: - label = children.pop() - label.set_alignment(0., .5) self.toggle_playlist_interface(self._config.device_sync.playlists.create) self.combobox_on_sync.set_sensitive(True) self.checkbutton_skip_played_episodes.set_sensitive(True) + self.checkbutton_delete_deleted_episodes.set_sensitive(True) elif device_type == 'ipod': self.btn_filesystemMountpoint.set_label(self._config.device_sync.device_folder) self.btn_filesystemMountpoint.set_sensitive(True) @@ -657,29 +686,28 @@ self.toggle_playlist_interface(False) self.checkbutton_delete_using_playlists.set_sensitive(False) self.combobox_on_sync.set_sensitive(False) - self.checkbutton_skip_played_episodes.set_sensitive(False) - - children = self.btn_filesystemMountpoint.get_children() - if children: - label = children.pop() - label.set_alignment(0., .5) + self.checkbutton_skip_played_episodes.set_sensitive(True) + self.checkbutton_delete_deleted_episodes.set_sensitive(True) - else: - # TODO: Add support for iPod and MTP devices - pass + children = self.btn_filesystemMountpoint.get_children() + if children: + label = children.pop() + label.set_ellipsize(Pango.EllipsizeMode.START) + label.set_xalign(0.0) def on_btn_device_mountpoint_clicked(self, widget): fs = Gtk.FileChooserDialog(title=_('Select folder for mount point'), action=Gtk.FileChooserAction.SELECT_FOLDER) - fs.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) - fs.add_button(Gtk.STOCK_OPEN, Gtk.ResponseType.OK) - fs.set_current_folder(self.btn_filesystemMountpoint.get_label()) + fs.set_local_only(False) + fs.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL) + fs.add_button(_('_Open'), Gtk.ResponseType.OK) + + fs.set_uri(self.btn_filesystemMountpoint.get_label() or "") if fs.run() == Gtk.ResponseType.OK: - filename = fs.get_filename() if self._config.device_sync.device_type == 'filesystem': - self._config.device_sync.device_folder = filename + self._config.device_sync.device_folder = fs.get_uri() elif self._config.device_sync.device_type == 'ipod': - self._config.device_sync.device_folder = filename + self._config.device_sync.device_folder = fs.get_filename() # Request an update of the mountpoint button self.on_combobox_device_type_changed(None) @@ -688,18 +716,29 @@ def on_btn_playlist_folder_clicked(self, widget): fs = Gtk.FileChooserDialog(title=_('Select folder for playlists'), action=Gtk.FileChooserAction.SELECT_FOLDER) - fs.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) - fs.add_button(Gtk.STOCK_OPEN, Gtk.ResponseType.OK) - fs.set_current_folder(self.btn_playlistfolder.get_label()) - if fs.run() == Gtk.ResponseType.OK: - filename = util.relpath(self._config.device_sync.device_folder, - fs.get_filename()) + fs.set_local_only(False) + fs.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL) + fs.add_button(_('_Open'), Gtk.ResponseType.OK)
View file
3.10.21.tar.gz/src/gpodder/gtkui/desktop/welcome.py -> 3.11.0.tar.gz/src/gpodder/gtkui/desktop/welcome.py
Changed
@@ -26,16 +26,9 @@ class gPodderWelcome(BuilderWidget): - PADDING = 10 def new(self): - for widget in self.vbox_buttons.get_children(): - for child in widget.get_children(): - if isinstance(child, Gtk.Alignment): - child.set_padding(self.PADDING, self.PADDING, - self.PADDING, self.PADDING) - else: - child.set_padding(self.PADDING, self.PADDING) + self.gPodderWelcome.set_transient_for(self.parent_widget) def on_btnCancel_clicked(self, button): self.main_window.response(Gtk.ResponseType.CANCEL)
View file
3.10.21.tar.gz/src/gpodder/gtkui/desktopfile.py -> 3.11.0.tar.gz/src/gpodder/gtkui/desktopfile.py
Changed
@@ -155,7 +155,7 @@ self.apps.append(UserApplication( _('Default application'), 'default', ';'.join((mime + '/*' for mime in self.mimetypes)), - Gtk.STOCK_OPEN)) + 'document-open')) def add_separator(self): self.apps.append(UserApplication( @@ -177,7 +177,7 @@ caption, cmdline, ';'.join(typ + '/*' for typ in types), None)) except Exception as e: - logger.warn('Parse HKEY error: %s (%s)', hkey, e) + logger.warning('Parse HKEY error: %s (%s)', hkey, e) for dir in userappsdirs: if os.path.exists(dir):
View file
3.10.21.tar.gz/src/gpodder/gtkui/download.py -> 3.11.0.tar.gz/src/gpodder/gtkui/download.py
Changed
@@ -35,6 +35,24 @@ _ = gpodder.gettext +class DequeueRequest: + def __init__(self): + self.cv = threading.Condition() + self.value = None + self.resolved = False + + def dequeue(self): + with self.cv: + self.cv.wait_for(lambda: self.resolved) + return self.value + + def resolve(self, value): + self.value = value + self.resolved = True + with self.cv: + self.cv.notify() + + class DownloadStatusModel(Gtk.ListStore): # Symbolic names for our columns, so we know what we're up to C_TASK, C_NAME, C_URL, C_PROGRESS, C_PROGRESS_TEXT, C_ICON_NAME = list(range(6)) @@ -44,14 +62,14 @@ def __init__(self): Gtk.ListStore.__init__(self, object, str, str, int, str, str) - self.set_downloading_access = threading.RLock() - # Set up stock icon IDs for tasks self._status_ids = collections.defaultdict(lambda: None) self._status_idsdownload.DownloadTask.DOWNLOADING = 'go-down' - self._status_idsdownload.DownloadTask.DONE = Gtk.STOCK_APPLY + self._status_idsdownload.DownloadTask.DONE = 'object-select-symbolic' self._status_idsdownload.DownloadTask.FAILED = 'dialog-error' + self._status_idsdownload.DownloadTask.CANCELLING = 'media-playback-stop' self._status_idsdownload.DownloadTask.CANCELLED = 'media-playback-stop' + self._status_idsdownload.DownloadTask.PAUSING = 'media-playback-pause' self._status_idsdownload.DownloadTask.PAUSED = 'media-playback-pause' def _format_message(self, episode, message, podcast): @@ -111,20 +129,34 @@ iter = self.append() self.request_update(iter, task) - def register_task(self, task): - util.idle_add(self.__add_new_task, task) + def register_task(self, task, background=True): + if background: + util.idle_add(self.__add_new_task, task) + else: + self.__add_new_task(task) + + def queue_task(self, task): + with task: + if task.status in (task.NEW, task.FAILED, task.CANCELLED, task.PAUSED): + task.status = task.QUEUED + task.set_episode_download_task() def tell_all_tasks_to_quit(self): for row in self: task = rowDownloadStatusModel.C_TASK if task is not None: - # Pause currently-running (and queued) downloads - if task.status in (task.QUEUED, task.DOWNLOADING): - task.status = task.PAUSED + with task: + # Pause currently queued downloads + if task.status == task.QUEUED: + task.status = task.PAUSED + + # Request pause of currently running downloads + elif task.status == task.DOWNLOADING: + task.status = task.PAUSING - # Delete cancelled and failed downloads - if task.status in (task.CANCELLED, task.FAILED): - task.removed_from_list() + # Delete cancelled and failed downloads + elif task.status in (task.CANCELLED, task.FAILED): + task.removed_from_list() def are_downloads_in_progress(self): """ @@ -146,25 +178,29 @@ def available_work_count(self): return len(list(self._work_gen())) + def __get_next(self, dqr): + try: + task = next(self._work_gen()) + # this is the only thread accessing the list store, so it's safe + # to assume a) the task is still queued and b) we can transition to downloading + task.status = task.DOWNLOADING + except StopIteration as e: + task = None + # hand the task off to the worker thread + dqr.resolve(task) + + # get the next task to download. this proxies the request to the main thread, + # as only the main thread is allowed to manipulate the list store. def get_next(self): - with self.set_downloading_access: - result = next(self._work_gen()) - self.set_downloading(result) - return result + dqr = DequeueRequest() + util.idle_add(self.__get_next, dqr) + return dqr.dequeue() def _work_gen(self): return (task for task in (rowDownloadStatusModel.C_TASK for row in self) if task.status == task.QUEUED) - def set_downloading(self, task): - with self.set_downloading_access: - if task.status is task.DOWNLOADING: - # Task was already set as DOWNLOADING by get_next - return False - task.status = task.DOWNLOADING - return True - class DownloadTaskMonitor(object): """A helper class that abstracts download events"""
View file
3.10.21.tar.gz/src/gpodder/gtkui/draw.py -> 3.11.0.tar.gz/src/gpodder/gtkui/draw.py
Changed
@@ -169,7 +169,8 @@ return surface -def draw_text_pill(left_text, right_text, x=0, y=0, border=2, radius=14, widget=None): +def draw_text_pill(left_text, right_text, x=0, y=0, border=2, radius=14, + widget=None, scale=1): # Padding (in px) at the right edge of the image (for Ubuntu; bug 1533) padding_right = 7 @@ -200,10 +201,13 @@ left_side_width = width_left + x_border * 2 right_side_width = width_right + x_border * 2 - image_height = int(y + text_height + border * 2) - image_width = int(x + left_side_width + right_side_width + padding_right) + image_height = int(scale * (y + text_height + border * 2)) + image_width = int(scale * (x + left_side_width + right_side_width + + padding_right)) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, image_width, image_height) + surface.set_device_scale(scale, scale) + ctx = cairo.Context(surface) # Clip so as to not draw on the right padding (for Ubuntu; bug 1533) @@ -288,8 +292,9 @@ return cairo_surface_to_pixbuf(draw_cake(percentage, text, emblem, size=size)) -def draw_pill_pixbuf(left_text, right_text, widget=None): - return cairo_surface_to_pixbuf(draw_text_pill(left_text, right_text, widget=widget)) +def draw_pill_pixbuf(left_text, right_text, widget=None, scale=1): + return cairo_surface_to_pixbuf(draw_text_pill(left_text, right_text, + widget=widget, scale=scale)) def cake_size_from_widget(widget=None): @@ -398,8 +403,6 @@ """ p = widget color = Gdk.RGBA(0, 0, 0, 0) - style_context = widget.get_style_context() - foreground = style_context.get_color(state) while p is not None and color.alpha == 0: style_context = p.get_style_context() color = style_context.get_color(state) @@ -479,3 +482,33 @@ f.write("</dl></td></tr>\n") f.write("</table></html>\n") + + +def draw_iconcell_scale(column, cell, model, iter, scale): + """ + Draw cell's pixbuf to a surface with proper scaling for high resolution + displays. To be used as gtk.TreeViewColumn.set_cell_data_func. + + :param column: gtk.TreeViewColumn (ignored) + :param cell: gtk.CellRenderer + :param model: gtk.TreeModel (ignored) + :param iter: gtk.TreeIter (ignored) + :param scale: factor of the target display (e.g. 1 or 2) + """ + pixbuf = cell.props.pixbuf + if not pixbuf: + return + + width = pixbuf.get_width() + height = pixbuf.get_height() + scale_inv = 1 / scale + + surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) + surface.set_device_scale(scale, scale) + + cr = cairo.Context(surface) + cr.scale(scale_inv, scale_inv) + Gdk.cairo_set_source_pixbuf(cr, cell.props.pixbuf, 0, 0) + cr.paint() + + cell.props.surface = surface
View file
3.10.21.tar.gz/src/gpodder/gtkui/interface/addpodcast.py -> 3.11.0.tar.gz/src/gpodder/gtkui/interface/addpodcast.py
Changed
@@ -28,6 +28,7 @@ class gPodderAddPodcast(BuilderWidget): def new(self): + self.gPodderAddPodcast.set_transient_for(self.parent_widget) if not hasattr(self, 'add_podcast_list'): self.add_podcast_list = None if hasattr(self, 'custom_label'): @@ -48,9 +49,10 @@ clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) def receive_clipboard_text(clipboard, text, second_try): - # Heuristic: If there is a space in the clipboard - # text, assume it's some arbitrary text, and no URL - if text is not None and ' ' not in text: + # Heuristic: If space is present in clipboard text + # normalize_feed_url will either fix to valid url or + # return None if URL cannot be validated + if text is not None: url = util.normalize_feed_url(text) if url is not None: self.entry_url.set_text(url) @@ -71,7 +73,7 @@ def receive_clipboard_text(self, clipboard, text, data=None): if text is not None: - self.entry_url.set_text(text) + self.entry_url.set_text(text).strip() else: self.show_message(_('Nothing to paste.'), _('Clipboard is empty'))
View file
3.10.21.tar.gz/src/gpodder/gtkui/interface/common.py -> 3.11.0.tar.gz/src/gpodder/gtkui/interface/common.py
Changed
@@ -29,6 +29,22 @@ _ = gpodder.gettext +def show_message_dialog(parent, message, title=None): + dlg = Gtk.MessageDialog(parent, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK) + if title: + dlg.set_title(title) + dlg.set_property('text', title) + dlg.format_secondary_text(message) + else: + dlg.set_property('text', message) + # make message copy/pastable + for lbl in dlg.get_message_area(): + if isinstance(lbl, Gtk.Label): + lbl.set_selectable(True) + dlg.run() + dlg.destroy() + + class BuilderWidget(GtkBuilderWidget): def __init__(self, parent, **kwargs): self._window_iconified = False @@ -62,20 +78,40 @@ """Return a Gtk.Window that should be the parent of dialogs""" return self.main_window + def show_message_details(self, title, message, details): + dlg = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK) + dlg.set_title(title) + dlg.set_property('text', title) + dlg.format_secondary_text(message) + + # make message copy/pastable + for lbl in dlg.get_message_area(): + if isinstance(lbl, Gtk.Label): + lbl.set_halign(Gtk.Align.START) + lbl.set_selectable(True) + + tv = Gtk.TextView() + tv.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) + tv.set_border_width(10) + tv.set_editable(False) + tb = Gtk.TextBuffer() + tb.insert_markup(tb.get_start_iter(), details, -1) + tv.set_buffer(tb) + tv.set_property('expand', True) + sw = Gtk.ScrolledWindow() + sw.set_size_request(400, 200) + sw.set_property('shadow-type', Gtk.ShadowType.IN) + sw.add(tv) + sw.show_all() + + dlg.get_message_area().add(sw) + dlg.get_widget_for_response(Gtk.ResponseType.OK).grab_focus() + dlg.run() + dlg.destroy() + def show_message(self, message, title=None, important=False, widget=None): if important: - dlg = Gtk.MessageDialog(self.main_window, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.OK) - if title: - dlg.set_title(str(title)) - dlg.set_markup('<span weight="bold" size="larger">%s</span>\n\n%s' % (title, message)) - else: - dlg.set_markup('<span weight="bold" size="larger">%s</span>' % (message)) - # make message copy/pastable - for lbl in dlg.get_message_area(): - if isinstance(lbl, Gtk.Label): - lbl.set_selectable(True) - dlg.run() - dlg.destroy() + show_message_dialog(self.main_window, message, title) else: gpodder.user_extensions.on_notification_show(title, message) @@ -91,11 +127,11 @@ return response == Gtk.ResponseType.YES def show_text_edit_dialog(self, title, prompt, text=None, empty=False, - is_url=False, affirmative_text=Gtk.STOCK_OK): + is_url=False, affirmative_text=_('_OK')): dialog = Gtk.Dialog(title, self.get_dialog_parent(), Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT) - dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) + dialog.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL) dialog.add_button(affirmative_text, Gtk.ResponseType.OK) dialog.set_default_size(300, -1) @@ -231,8 +267,8 @@ initial_directory = os.path.expanduser('~') dlg = Gtk.FileChooserDialog(title=title, parent=self.main_window, action=Gtk.FileChooserAction.SELECT_FOLDER) - dlg.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) - dlg.add_button(Gtk.STOCK_SAVE, Gtk.ResponseType.OK) + dlg.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL) + dlg.add_button(_('_Save'), Gtk.ResponseType.OK) dlg.set_do_overwrite_confirmation(True) dlg.set_current_folder(initial_directory)
View file
3.10.21.tar.gz/src/gpodder/gtkui/interface/configeditor.py -> 3.11.0.tar.gz/src/gpodder/gtkui/interface/configeditor.py
Changed
@@ -30,6 +30,7 @@ class gPodderConfigEditor(BuilderWidget): def new(self): + self.gPodderConfigEditor.set_transient_for(self.parent_widget) name_column = Gtk.TreeViewColumn(_('Setting')) name_renderer = Gtk.CellRendererText() name_column.pack_start(name_renderer, True)
View file
3.10.21.tar.gz/src/gpodder/gtkui/main.py -> 3.11.0.tar.gz/src/gpodder/gtkui/main.py
Changed
@@ -23,6 +23,7 @@ import os import re import shutil +import sys import tempfile import threading import time @@ -48,7 +49,7 @@ from .desktopfile import UserAppsReader from .download import DownloadStatusModel from .draw import (cake_size_from_widget, draw_cake_pixbuf, - draw_text_box_centered) + draw_iconcell_scale, draw_text_box_centered) from .interface.addpodcast import gPodderAddPodcast from .interface.common import BuilderWidget, TreeViewHelper from .interface.progress import ProgressIndicator @@ -88,7 +89,8 @@ self.extensions_actions = self._search_podcasts = None self._search_episodes = None - BuilderWidget.__init__(self, None, _builder_expose={'app': app}) + BuilderWidget.__init__(self, None, + _gtk_properties={('gPodder', 'application'): app}) self.last_episode_date_refresh = None self.refresh_episode_dates() @@ -196,6 +198,7 @@ self.download_tasks_seen = set() self.download_list_update_enabled = False + self.things_adding_tasks = 0 self.download_task_monitors = set() # Set up the first instance of MygPoClient @@ -250,7 +253,13 @@ diff = time.time() - self.config.software_update.last_check if diff > (60 * 60 * 24) * self.config.software_update.interval: self.config.software_update.last_check = int(time.time()) - self.check_for_updates(silent=True) + if not os.path.exists(gpodder.no_update_check_file): + self.check_for_updates(silent=True) + + if self.options.close_after_startup: + logger.warning("Startup done, closing (--close-after-startup)") + self.core.db.close() + sys.exit() def create_actions(self): g = self.gPodder @@ -271,6 +280,11 @@ g.add_action(action) action = Gio.SimpleAction.new_stateful( + 'viewCtrlClickToSortEpisodes', None, GLib.Variant.new_boolean(self.config.ui.gtk.episode_list.ctrl_click_to_sort)) + action.connect('activate', self.on_item_view_ctrl_click_to_sort_episodes_toggled) + g.add_action(action) + + action = Gio.SimpleAction.new_stateful( 'searchAlwaysVisible', None, GLib.Variant.new_boolean(self.config.ui.gtk.search_always_visible)) action.connect('activate', self.on_item_view_search_always_visible_toggled) g.add_action(action) @@ -297,10 +311,12 @@ ('play', self.on_playback_selected_episodes), ('open', self.on_playback_selected_episodes), ('download', self.on_download_selected_episodes), + ('pause', self.on_pause_selected_episodes), ('cancel', self.on_item_cancel_download_activate), ('delete', self.on_btnDownloadedDelete_clicked), ('toggleEpisodeNew', self.on_item_toggle_played_activate), ('toggleEpisodeLock', self.on_item_toggle_lock_activate), + ('openEpisodeDownloadFolder', self.on_open_episode_download_folder), ('toggleShownotes', self.on_shownotes_selected_episodes), ('sync', self.on_sync_to_device_activate), ('findPodcast', self.on_find_podcast_activate), @@ -318,10 +334,12 @@ self.play_action = g.lookup_action('play') self.open_action = g.lookup_action('open') self.download_action = g.lookup_action('download') + self.pause_action = g.lookup_action('pause') self.cancel_action = g.lookup_action('cancel') self.delete_action = g.lookup_action('delete') self.toggle_episode_new_action = g.lookup_action('toggleEpisodeNew') self.toggle_episode_lock_action = g.lookup_action('toggleEpisodeLock') + self.open_episode_download_folder_action = g.lookup_action('openEpisodeDownloadFolder') action = Gio.SimpleAction.new_stateful( 'showToolbar', None, GLib.Variant.new_boolean(self.config.show_toolbar)) @@ -343,12 +361,7 @@ if self.extensions_menu is None: # insert menu section at startup (hides when empty) self.extensions_menu = Gio.Menu.new() - menubar = self.application.get_menubar() - for i in range(0, menubar.get_n_items()): - menu = menubar.do_get_item_link(menubar, i, Gio.MENU_LINK_SUBMENU) - menuname = menubar.get_item_attribute_value(i, Gio.MENU_ATTRIBUTE_LABEL, None) - if menuname is not None and menuname.get_string() == _('E_xtras'): - menu.append_section(_('Extensions'), self.extensions_menu) + self.application.menu_extras.append_section(_('Extensions'), self.extensions_menu) else: self.extensions_menu.remove_all() @@ -385,7 +398,6 @@ def offer_resuming(): if resumable_episodes: self.download_episode_list_paused(resumable_episodes) - resume_all = Gtk.Button(_('Resume all')) def on_resume_all(button): selection = self.treeDownloads.get_selection() @@ -394,6 +406,8 @@ selection.unselect_all() self._for_each_task_set_status(selected_tasks, download.DownloadTask.QUEUED) self.message_area.hide() + + resume_all = Gtk.Button(_('Resume all')) resume_all.connect('clicked', on_resume_all) self.message_area = SimpleMessageArea( @@ -559,7 +573,7 @@ episodes=changes, columns=columns, size_attribute=None, - stock_ok_button=Gtk.STOCK_APPLY, + ok_button=_('A_pply'), callback=execute_podcast_actions, _config=self.config) @@ -607,6 +621,13 @@ message = str(e) if not message: message = e.__class__.__name__ + if message == 'NotFound': + message = _( + 'Could not find your device.\n' + '\n' + 'Check login is a username (not an email)\n' + 'and that the device name matches one in your account.' + ) self.show_message(html.escape(message), _('Error while uploading'), important=True) @@ -677,7 +698,8 @@ def init_podcast_list_treeview(self): size = cake_size_from_widget(self.treeChannels) * 2 - self.podcast_list_model.set_max_image_size(size) + scale = self.treeChannels.get_scale_factor() + self.podcast_list_model.set_max_image_size(size, scale) # Set up podcast channel tree view widget column = Gtk.TreeViewColumn('') iconcell = Gtk.CellRendererPixbuf() @@ -685,6 +707,8 @@ column.pack_start(iconcell, False) column.add_attribute(iconcell, 'pixbuf', PodcastListModel.C_COVER) column.add_attribute(iconcell, 'visible', PodcastListModel.C_COVER_VISIBLE) + if scale != 1: + column.set_cell_data_func(iconcell, draw_iconcell_scale, scale) namecell = Gtk.CellRendererText() namecell.set_property('ellipsize', Pango.EllipsizeMode.END) @@ -696,6 +720,8 @@ column.pack_start(iconcell, False) column.add_attribute(iconcell, 'pixbuf', PodcastListModel.C_PILL) column.add_attribute(iconcell, 'visible', PodcastListModel.C_PILL_VISIBLE) + if scale != 1: + column.set_cell_data_func(iconcell, draw_iconcell_scale, scale) self.treeChannels.append_column(column) @@ -802,11 +828,13 @@ (column.get_sort_order() is Gtk.SortType.ASCENDING) def on_episode_list_header_clicked(self, button, event): - if event.button != 3: - return False - - if self.episode_columns_menu is not None: - self.episode_columns_menu.popup(None, None, None, None, event.button, event.time) + if event.button == 1: + # Require control click to sort episodes, when enabled + if self.config.ui.gtk.episode_list.ctrl_click_to_sort and (event.state & Gdk.ModifierType.CONTROL_MASK) == 0: + return True + elif event.button == 3: + if self.episode_columns_menu is not None: + self.episode_columns_menu.popup(None, None, None, None, event.button, event.time) return False @@ -915,20 +943,22 @@ # Save column sorting when user clicks column headers column.connect('clicked', self.on_episode_list_header_sorted) - # Restore column ordering - prev_column = None - for col in self.config.ui.gtk.state.main_window.episode_column_order: - for column in self.treeAvailable.get_columns(): - if col is column.get_sort_column_id(): + def restore_column_ordering(): + prev_column = None
View file
3.10.21.tar.gz/src/gpodder/gtkui/model.py -> 3.11.0.tar.gz/src/gpodder/gtkui/model.py
Changed
@@ -192,11 +192,12 @@ # Are we currently showing "all episodes"/section or a single channel? self._section_view = False + self.ICON_WEB_BROWSER = 'web-browser' self.ICON_AUDIO_FILE = 'audio-x-generic' self.ICON_VIDEO_FILE = 'video-x-generic' self.ICON_IMAGE_FILE = 'image-x-generic' self.ICON_GENERIC_FILE = 'text-x-generic' - self.ICON_DOWNLOADING = Gtk.STOCK_GO_DOWN + self.ICON_DOWNLOADING = 'go-down' self.ICON_DELETED = 'edit-delete' self.ICON_ERROR = 'dialog-error' @@ -378,11 +379,21 @@ view_show_unplayed = False icon_theme = Gtk.IconTheme.get_default() - if episode.downloading: + task = episode.download_task + + if task is not None and task.status in (task.PAUSING, task.PAUSED): + tooltip.append('%s %d%%' % (_('Paused'), + int(task.progress * 100))) + + status_icon = 'media-playback-pause' + + view_show_downloaded = True + view_show_unplayed = True + elif episode.downloading: tooltip.append('%s %d%%' % (_('Downloading'), - int(episode.download_task.progress * 100))) + int(task.progress * 100))) - index = int(self.PROGRESS_STEPS * episode.download_task.progress) + index = int(self.PROGRESS_STEPS * task.progress) status_icon = 'gpodder-progress-%d' % index view_show_downloaded = True @@ -456,6 +467,12 @@ if episode.state == gpodder.STATE_NORMAL and episode.is_new: view_show_downloaded = self._config.ui.gtk.episode_list.always_show_new view_show_unplayed = True + elif not episode.url: + tooltip.append(_('No downloadable content')) + status_icon = self.ICON_WEB_BROWSER + if episode.state == gpodder.STATE_NORMAL and episode.is_new: + view_show_downloaded = self._config.ui.gtk.episode_list.always_show_new + view_show_unplayed = True elif episode.state == gpodder.STATE_NORMAL and episode.is_new: tooltip.append(_('New episode')) view_show_downloaded = self._config.ui.gtk.episode_list.always_show_new @@ -585,6 +602,7 @@ self._cover_cache = {} self._max_image_side = 40 + self._scale = 1 self._cover_downloader = cover_downloader self.ICON_DISABLED = 'media-playback-pause' @@ -653,8 +671,9 @@ def get_search_term(self): return self._search_term - def set_max_image_size(self, size): - self._max_image_side = size + def set_max_image_size(self, size, scale): + self._max_image_side = size * scale + self._scale = scale self._cover_cache = {} def _resize_pixbuf_keep_ratio(self, url, pixbuf): @@ -663,31 +682,27 @@ Returns None if the pixbuf does not need to be resized or the newly resized pixbuf if it does. """ - changed = False - result = None - if url in self._cover_cache: return self._cover_cacheurl - # Resize if too wide - if pixbuf.get_width() > self._max_image_side: - f = float(self._max_image_side) / pixbuf.get_width() - (width, height) = (int(pixbuf.get_width() * f), int(pixbuf.get_height() * f)) - pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR) - changed = True + max_side = self._max_image_side + w_cur = pixbuf.get_width() + h_cur = pixbuf.get_height() + + if w_cur <= max_side and h_cur <= max_side: + return None - # Resize if too high - if pixbuf.get_height() > self._max_image_side: - f = float(self._max_image_side) / pixbuf.get_height() - (width, height) = (int(pixbuf.get_width() * f), int(pixbuf.get_height() * f)) - pixbuf = pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR) - changed = True + f = max_side / (w_cur if w_cur >= h_cur else h_cur) + w_new = int(w_cur * f) + h_new = int(h_cur * f) - if changed: - self._cover_cacheurl = pixbuf - result = pixbuf + logger.debug("Scaling cover image: url=%s from %ix%i to %ix%i", + url, w_cur, h_cur, w_new, h_new) + pixbuf = pixbuf.scale_simple(w_new, h_new, + GdkPixbuf.InterpType.BILINEAR) - return result + self._cover_cacheurl = pixbuf + return pixbuf def _resize_pixbuf(self, url, pixbuf): if pixbuf is None: @@ -726,8 +741,9 @@ if self._max_image_side not in (pixbuf.get_width(), pixbuf.get_height()): logger.debug("cached thumb wrong size: %r != %i", (pixbuf.get_width(), pixbuf.get_height()), self._max_image_side) return None + return pixbuf except Exception as e: - logger.warn('Could not load cached cover art for %s', channel.url, exc_info=True) + logger.warning('Could not load cached cover art for %s', channel.url, exc_info=True) channel.cover_thumb = None channel.save() return None @@ -758,6 +774,8 @@ if pixbuf_overlay is None: # load cover if it's not in cache pixbuf = self._cover_downloader.get_cover(channel, avoid_downloading=True) + if pixbuf is None: + return None pixbuf_overlay = self._resize_pixbuf(channel.url, pixbuf) self._save_cached_thumb(channel, pixbuf_overlay) @@ -772,7 +790,10 @@ def _get_pill_image(self, channel, count_downloaded, count_unplayed): if count_unplayed > 0 or count_downloaded > 0: - return draw.draw_pill_pixbuf('{:n}'.format(count_unplayed), '{:n}'.format(count_downloaded), widget=self.widget) + return draw.draw_pill_pixbuf('{:n}'.format(count_unplayed), + '{:n}'.format(count_downloaded), + widget=self.widget, + scale=self._scale) else: return None
View file
3.10.21.tar.gz/src/gpodder/gtkui/services.py -> 3.11.0.tar.gz/src/gpodder/gtkui/services.py
Changed
@@ -118,7 +118,7 @@ try: pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) except Exception as e: - logger.warn('Cannot load cover art', exc_info=True) + logger.warning('Cannot load cover art', exc_info=True) if pixbuf is None and filename.startswith(channel.cover_file): logger.info('Deleting broken cover: %s', filename) util.delete_file(filename) @@ -126,7 +126,7 @@ try: pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) except Exception as e: - logger.warn('Corrupt cover art on server, deleting', exc_info=True) + logger.warning('Corrupt cover art on server, deleting', exc_info=True) util.delete_file(filename) if async_mode:
View file
3.10.21.tar.gz/src/gpodder/gtkui/shownotes.py -> 3.11.0.tar.gz/src/gpodder/gtkui/shownotes.py
Changed
@@ -31,7 +31,7 @@ import gi # isort:skip gi.require_version('Gdk', '3.0') # isort:skip gi.require_version('Gtk', '3.0') # isort:skip -from gi.repository import Gdk, Gtk, Pango # isort:skip +from gi.repository import Gdk, Gio, GLib, Gtk, Pango # isort:skip _ = gpodder.gettext @@ -193,9 +193,12 @@ self.text_view.connect('button-release-event', self.on_button_release) self.text_view.connect('key-press-event', self.on_key_press) self.text_view.connect('motion-notify-event', self.on_hover_hyperlink) + self.populate_popup_id = None return self.text_view def update(self, episode): + self.scrolled_window.get_vadjustment().set_value(0) + heading = episode.title subheading = _('from %s') % (episode.channel.title) details = self.details_fmt % { @@ -206,13 +209,17 @@ self.define_colors() hyperlinks = (0, None) self.text_buffer.set_text('') + if episode.link: + hyperlinks.append((self.text_buffer.get_char_count(), episode.link)) self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(), heading, 'heading') + if episode.link: + hyperlinks.append((self.text_buffer.get_char_count(), None)) self.text_buffer.insert_at_cursor('\n') self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(), subheading, 'subheading') self.text_buffer.insert_at_cursor('\n') self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(), details, 'details') self.text_buffer.insert_at_cursor('\n\n') - for target, text in util.extract_hyperlinked_text(episode.description_html or episode.description): + for target, text in util.extract_hyperlinked_text(episode.html_description()): hyperlinks.append((self.text_buffer.get_char_count(), target)) if target: self.text_buffer.insert_with_tags_by_name( @@ -224,6 +231,34 @@ self.hyperlinks = (start, end, url) for (start, url), (end, _) in zip(hyperlinks, hyperlinks1:) if url self.text_buffer.place_cursor(self.text_buffer.get_start_iter()) + if self.populate_popup_id is not None: + self.text_view.disconnect(self.populate_popup_id) + self.populate_popup_id = self.text_view.connect('populate-popup', self.on_populate_popup) + self.episode = episode + + def on_populate_popup(self, textview, context_menu): + # TODO: Remove items from context menu that are always insensitive in a read-only buffer + + if self.episode.link: + # TODO: It is currently not possible to copy links in description. + # Detect if context menu was opened on a hyperlink and add + # "Open Link" and "Copy Link Address" menu items. + # See https://github.com/gpodder/gpodder/issues/1097 + + item = Gtk.SeparatorMenuItem() + item.show() + context_menu.append(item) + # label links can be opened from context menu or by clicking them, do the same here + item = Gtk.MenuItem(label=_('Open Episode Title Link')) + item.connect('activate', lambda i: util.open_website(self.episode.link)) + item.show() + context_menu.append(item) + # hack to allow copying episode.link + item = Gtk.MenuItem(label=_('Copy Episode Title Link Address')) + item.connect('activate', lambda i: util.copy_text_to_clipboard(self.episode.link)) + item.show() + context_menu.append(item) + def on_button_release(self, widget, event): if event.button == 1: self.activate_links() @@ -287,6 +322,8 @@ return self.html_view def update(self, episode): + self.scrolled_window.get_vadjustment().set_value(0) + self.define_colors() if episode.has_website_link(): @@ -312,13 +349,10 @@ 'duration': episode.get_play_info_string()}) header_html = _('<div id="gpodder-title">\n%(heading)s\n<p>%(subheading)s</p>\n<p>%(details)s</p></div>\n') \ % dict(heading=heading, subheading=subheading, details=details) - description_html = episode.description_html - if not description_html: - description_html = re.sub(r'\n', '<br>\n', episode.description) # uncomment to prevent background override in html shownotes # self.manager.remove_all_style_sheets () logger.debug("base uri: %s (chan:%s)", self._base_uri, episode.channel.url) - self.html_view.load_html(header_html + description_html, self._base_uri) + self.html_view.load_html(header_html + episode.html_description(), self._base_uri) # uncomment to show web inspector # self.html_view.get_inspector().show() self.episode = episode @@ -374,15 +408,16 @@ if req.get_uri() in (self._base_uri, 'about:blank'): decision.use() else: - logger.debug("refusing to go to %s (base URI=%s)", req.get_uri(), self._base_uri) + # Avoid opening the page inside the WebView and open in the browser instead decision.ignore() + util.open_website(req.get_uri()) return False else: decision.use() return False - def on_open_in_browser(self, action): - util.open_website(action.url) + def on_open_in_browser(self, action, var): + util.open_website(var.get_string()) def on_authenticate(self, view, request): if request.is_retry(): @@ -412,10 +447,10 @@ return False def create_open_item(self, name, label, url): - action = Gtk.Action.new(name, label, None, Gtk.STOCK_OPEN) - action.url = url + action = Gio.SimpleAction.new(name, GLib.VariantType.new('s')) action.connect('activate', self.on_open_in_browser) - return WebKit2.ContextMenuItem.new(action) + var = GLib.Variant.new_string(url) + return WebKit2.ContextMenuItem.new_from_gaction(action, label, var) def get_stylesheet(self): if self.stylesheet is None:
View file
3.11.0.tar.gz/src/gpodder/libgpod_ctypes.py
Added
@@ -0,0 +1,441 @@ +# +# -*- coding: utf-8 -*- +# +# gPodder - A media aggregator and podcast client +# Copyright (c) 2005-2022 The gPodder Team +# +# gPodder is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# gPodder is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# +# libgpod_ctypes: Minimalistic ctypes-based bindings for libgpod +# (Just enough coverage to get podcast syncing working again...) +# Thomas Perl <m@thp.io>, May 2022 +# + + +import ctypes +import logging +import os +import struct + +logger = logging.getLogger(__name__) + + +# libgpod, for iTunesDB access +libgpod = ctypes.CDLL('libgpod.so.4') + +# glib, for g_strdup() and g_free() +libglib = ctypes.CDLL('libglib-2.0.so.0') + + +# glib/gtypes.h: typedef gint gboolean; +gboolean = ctypes.c_int + +# glib/gstrfuncs.h: gchar *g_strdup(const gchar *str); +libglib.g_strdup.argtypes = (ctypes.c_char_p,) +# Note: This MUST be c_void_p, so that the glib-allocated buffer will +# be preserved when assigning to track member variables. The reason +# for this is that Python ctypes tries to be helpful and converts a +# c_char_p restype to a Python bytes object, which will be different +# from the memory returned by g_strdup(). For track properties, the +# values will be free'd indirectly by itdb_free() later. +libglib.g_strdup.restype = ctypes.c_void_p + +# glib/gmem.h: void g_free(gpointer mem); +libglib.g_free.argtypes = (ctypes.c_void_p,) +libglib.g_free.restype = None + +# ctypes.c_time_t will be available in Python 3.12 onwards +# See also: https://github.com/python/cpython/pull/92870 +if hasattr(ctypes, 'c_time_t'): + time_t = ctypes.c_time_t +else: + # See also: https://github.com/python/cpython/issues/92869 + if ctypes.sizeof(ctypes.c_void_p) == ctypes.sizeof(ctypes.c_int64): + time_t = ctypes.c_int64 + else: + # On 32-bit systems, time_t is historically 32-bit, but due to Y2K38 + # there have been efforts to establish 64-bit time_t on 32-bit Linux: + # https://linux.slashdot.org/story/20/02/15/0247201/linux-is-ready-for-the-end-of-time + # https://www.gnu.org/software/libc/manual/html_node/64_002dbit-time-symbol-handling.html + logger.info('libgpod may cause issues if time_t is 64-bit on your 32-bit system.') + time_t = ctypes.c_int32 + + +# glib/glist.h: struct _GList +class GList(ctypes.Structure): + ... + + +GList._fields_ = + ('data', ctypes.c_void_p), + ('next', ctypes.POINTER(GList)), + ('prev', ctypes.POINTER(GList)), + + + +# gpod/itdb.h +class Itdb_iTunesDB(ctypes.Structure): + _fields_ = + ('tracks', ctypes.POINTER(GList)), + # ... + + + +# gpod/itdb.h: struct _Itdb_Playlist +class Itdb_Playlist(ctypes.Structure): + _fields_ = + ('itdb', ctypes.POINTER(Itdb_iTunesDB)), + ('name', ctypes.c_char_p), + ('type', ctypes.c_uint8), + ('flag1', ctypes.c_uint8), + ('flag2', ctypes.c_uint8), + ('flag3', ctypes.c_uint8), + ('num', ctypes.c_int), + ('members', ctypes.POINTER(GList)), + # ... + + + +# gpod/itdb.h +class Itdb_Chapterdata(ctypes.Structure): + ... + + +# gpod/itdb.h +class Itdb_Track(ctypes.Structure): + _fields_ = + ('itdb', ctypes.POINTER(Itdb_iTunesDB)), + ('title', ctypes.c_char_p), + ('ipod_path', ctypes.c_char_p), + ('album', ctypes.c_char_p), + ('artist', ctypes.c_char_p), + ('genre', ctypes.c_char_p), + ('filetype', ctypes.c_char_p), + ('comment', ctypes.c_char_p), + ('category', ctypes.c_char_p), + ('composer', ctypes.c_char_p), + ('grouping', ctypes.c_char_p), + ('description', ctypes.c_char_p), + ('podcasturl', ctypes.c_char_p), + ('podcastrss', ctypes.c_char_p), + ('chapterdata', ctypes.POINTER(Itdb_Chapterdata)), + ('subtitle', ctypes.c_char_p), + ('tvshow', ctypes.c_char_p), + ('tvepisode', ctypes.c_char_p), + ('tvnetwork', ctypes.c_char_p), + ('albumartist', ctypes.c_char_p), + ('keywords', ctypes.c_char_p), + ('sort_artist', ctypes.c_char_p), + ('sort_title', ctypes.c_char_p), + ('sort_album', ctypes.c_char_p), + ('sort_albumartist', ctypes.c_char_p), + ('sort_composer', ctypes.c_char_p), + ('sort_tvshow', ctypes.c_char_p), + ('id', ctypes.c_uint32), + ('size', ctypes.c_uint32), + ('tracklen', ctypes.c_int32), + ('cd_nr', ctypes.c_int32), + ('cds', ctypes.c_int32), + ('track_nr', ctypes.c_int32), + ('bitrate', ctypes.c_int32), + ('samplerate', ctypes.c_uint16), + ('samplerate_low', ctypes.c_uint16), + ('year', ctypes.c_int32), + ('volume', ctypes.c_int32), + ('soundcheck', ctypes.c_uint32), + ('soundcheck', ctypes.c_uint32), + ('time_added', time_t), + ('time_modified', time_t), + ('time_played', time_t), + ('bookmark_time', ctypes.c_uint32), + ('rating', ctypes.c_uint32), + ('playcount', ctypes.c_uint32), + ('playcount2', ctypes.c_uint32), + ('recent_playcount', ctypes.c_uint32), + ('transferred', gboolean), + ('BPM', ctypes.c_int16), + ('app_rating', ctypes.c_uint8), + ('type1', ctypes.c_uint8), + ('type2', ctypes.c_uint8), + ('compilation', ctypes.c_uint8), + ('starttime', ctypes.c_uint32), + ('stoptime', ctypes.c_uint32), + ('checked', ctypes.c_uint8), + ('dbid', ctypes.c_uint64), + ('drm_userid', ctypes.c_uint32), + ('visible', ctypes.c_uint32), + ('filetype_marker', ctypes.c_uint32), + ('artwork_count', ctypes.c_uint16), + ('artwork_size', ctypes.c_uint32), + ('samplerate2', ctypes.c_float), + ('unk126', ctypes.c_uint16), + ('unk132', ctypes.c_uint32), + ('time_released', time_t), + ('unk144', ctypes.c_uint16), + ('explicit_flag', ctypes.c_uint16), + ('unk148', ctypes.c_uint32), + ('unk152', ctypes.c_uint32), + ('skipcount', ctypes.c_uint32), + ('recent_skipcount', ctypes.c_uint32), + ('last_skipped', ctypes.c_uint32), + ('has_artwork', ctypes.c_uint8), + ('skip_when_shuffling', ctypes.c_uint8), + ('remember_playback_position', ctypes.c_uint8), + ('flag4', ctypes.c_uint8), + ('dbid2', ctypes.c_uint64), + ('lyrics_flag', ctypes.c_uint8),
View file
3.10.21.tar.gz/src/gpodder/log.py -> 3.11.0.tar.gz/src/gpodder/log.py
Changed
@@ -61,7 +61,7 @@ try: os.makedirs(logging_directory) except: - logger.warn('Cannot create output directory: %s', + logger.warning('Cannot create output directory: %s', logging_directory) return False @@ -77,7 +77,7 @@ try: os.remove(old_logfile) except: - logger.warn('Cannot purge logfile: %s', exc_info=True) + logger.warning('Cannot purge logfile: %s', exc_info=True) root = logging.getLogger() logfile = os.path.join(logging_directory, logging_basename)
View file
3.10.21.tar.gz/src/gpodder/model.py -> 3.11.0.tar.gz/src/gpodder/model.py
Changed
@@ -28,6 +28,7 @@ import datetime import glob import hashlib +import json import logging import os import re @@ -110,13 +111,13 @@ def get_link(self): vid = youtube.get_youtube_id(self.feed'url') if vid is not None: - self.feed'link' = youtube.get_channel_id_url(self.feed'url') + self.feed'link' = youtube.get_channel_id_url(self.feed'url', self.fetcher.feed_data) return self.feed.get('link') def get_description(self): vid = youtube.get_youtube_id(self.feed'url') if vid is not None: - self.feed'description' = youtube.get_channel_desc(self.feed'url') + self.feed'description' = youtube.get_channel_desc(self.feed'url', self.fetcher.feed_data) return self.feed.get('description') def get_cover_url(self): @@ -161,7 +162,7 @@ num_duplicate_guids += 1 channel._update_error = ('Discarded {} episode(s) with non-unique GUID, contact the podcast publisher to fix this issue.' .format(num_duplicate_guids)) - logger.warn('Discarded episode with non-unique GUID, contact the podcast publisher to fix this issue. %s %s', + logger.warning('Discarded episode with non-unique GUID, contact the podcast publisher to fix this issue. %s %s', channel.title, episode.title) continue @@ -169,10 +170,20 @@ # Detect (and update) existing episode based on GUIDs existing_episode = existing_guids.get(episode.guid, None) if existing_episode: + if existing_episode.total_time == 0 and 'youtube' in episode.url: + # query duration for existing youtube episodes that haven't been downloaded or queried + # such as live streams after they have ended + existing_episode.total_time = youtube.get_total_time(episode) + existing_episode.update_from(episode) + existing_episode.cache_text_description() existing_episode.save() continue + elif episode.total_time == 0 and 'youtube' in episode.url: + # query duration for new youtube episodes + episode.total_time = youtube.get_total_time(episode) + episode.cache_text_description() episode.save() new_episodes.append(episode) return new_episodes, seen_guids @@ -207,7 +218,8 @@ url = vimeo.get_real_channel_url(url) return url - def parse_feed(self, url, data_stream, headers, status, max_episodes=0, **kwargs): + def parse_feed(self, url, feed_data, data_stream, headers, status, max_episodes=0, **kwargs): + self.feed_data = feed_data try: feed = podcastparser.parse(url, data_stream) feed'url' = url @@ -262,7 +274,7 @@ MAX_FILENAME_LENGTH = 120 # without extension MAX_FILENAME_WITH_EXT_LENGTH = 140 - len(".partial.webm") # with extension - __slots__ = schema.EpisodeColumns + ('_download_error',) + __slots__ = schema.EpisodeColumns + ('_download_error', '_text_description',) def _deprecated(self): raise Exception('Property is deprecated!') @@ -280,13 +292,20 @@ episode.guid = entry'guid' episode.title = entry'title' episode.link = entry'link' - episode.description = entry'description' + episode.episode_art_url = entry.get('episode_art_url') if entry.get('description_html'): + episode.description = '' episode.description_html = entry'description_html' + else: + episode.description = util.remove_html_tags(entry'description' or '') + episode.description_html = '' episode.total_time = entry'total_time' episode.published = entry'published' episode.payment_url = entry'payment_url' + episode.chapters = None + if entry.get("chapters"): + episode.chapters = json.dumps(entry"chapters") audio_available = any(enclosure'mime_type'.startswith('audio/') for enclosure in entry'enclosures') video_available = any(enclosure'mime_type'.startswith('video/') for enclosure in entry'enclosures') @@ -338,7 +357,11 @@ if link_has_media: return episode - return None + # The episode has no downloadable content. + # It is either a blog post or it links to a webpage with content accessible from shownotes title. + # Remove the URL so downloading will fail. + episode.url = '' + return episode def __init__(self, channel): self.parent = channel @@ -351,8 +374,10 @@ self.file_size = 0 self.mime_type = 'application/octet-stream' self.guid = '' + self.episode_art_url = None self.description = '' self.description_html = '' + self.chapters = None self.link = '' self.published = 0 self.download_filename = None @@ -371,6 +396,7 @@ self.last_playback = 0 self._download_error = None + self._text_description = '' @property def channel(self): @@ -438,7 +464,68 @@ if task is None: return False - return task.status in (task.DOWNLOADING, task.QUEUED, task.PAUSED) + return task.status in (task.DOWNLOADING, task.QUEUED, task.PAUSING, task.PAUSED, task.CANCELLING) + + def get_player(self, config): + file_type = self.file_type() + if file_type == 'video' and config.player.video and config.player.video != 'default': + player = config.player.video + elif file_type == 'audio' and config.player.audio and config.player.audio != 'default': + player = config.player.audio + else: + player = 'default' + return player + + def can_play(self, config): + """ + # gPodder.playback_episodes() filters selection with this method. + """ + return self.was_downloaded(and_exists=True) or self.can_stream(config) + + def can_stream(self, config): + """ + Don't try streaming if the user has not defined a player + or else we would probably open the browser when giving a URL to xdg-open. + We look at the audio or video player depending on its file type. + """ + player = self.get_player(config) + return player and player != 'default' + + def can_download(self): + """ + gPodder.on_download_selected_episodes() filters selection with this method. + PAUSING and PAUSED tasks can be resumed. + """ + return not self.was_downloaded(and_exists=True) and ( + not self.download_task + or self.download_task.can_queue() + or self.download_task.status == self.download_task.PAUSING) + + def can_pause(self): + """ + gPodder.on_pause_selected_episodes() filters selection with this method. + """ + return self.download_task and self.download_task.can_pause() + + def can_cancel(self): + """ + DownloadTask.cancel() only cancels the following tasks. + """ + return self.download_task and self.download_task.can_cancel() + + def can_delete(self): + """ + gPodder.delete_episode_list() filters out locked episodes, and cancels all unlocked tasks in selection. + """ + return self.state != gpodder.STATE_DELETED and not self.archive and ( + not self.download_task or self.download_task.status == self.download_task.FAILED) + + def can_lock(self): + """ + gPodder.on_item_toggle_lock_activate() unlocks deleted episodes and toggles all others. + Locked episodes can always be unlocked. + """ + return self.state != gpodder.STATE_DELETED or self.archive def check_is_new(self): return (self.state == gpodder.STATE_NORMAL and self.is_new and @@ -488,9 +575,21 @@ age_prop = property(fget=get_age_string)
View file
3.10.21.tar.gz/src/gpodder/my.py -> 3.11.0.tar.gz/src/gpodder/my.py
Changed
@@ -445,7 +445,7 @@ def flush(self, now=False): if not self.can_access_webservice(): - logger.warn('Flush requested, but sync disabled.') + logger.warning('Flush requested, but sync disabled.') return if self._worker_thread is None or now: @@ -512,7 +512,7 @@ raise except Exception as e: - logger.warn('Exception while polling for episodes.', exc_info=True) + logger.warning('Exception while polling for episodes.', exc_info=True) # Step 2: Upload Episode actions @@ -534,7 +534,7 @@ return True except (MissingCredentials, mygpoclient.http.Unauthorized): - logger.warn('Invalid credentials. Disabling gpodder.net.') + logger.warning('Invalid credentials. Disabling gpodder.net.') self._config.mygpo.enabled = False return False @@ -599,7 +599,7 @@ return True except (MissingCredentials, mygpoclient.http.Unauthorized): - logger.warn('Invalid credentials. Disabling gpodder.net.') + logger.warning('Invalid credentials. Disabling gpodder.net.') self._config.mygpo.enabled = False return False @@ -616,7 +616,7 @@ return True except (MissingCredentials, mygpoclient.http.Unauthorized): - logger.warn('Invalid credentials. Disabling gpodder.net.') + logger.warning('Invalid credentials. Disabling gpodder.net.') self._config.mygpo.enabled = False return False @@ -632,7 +632,7 @@ devices = self._client.get_devices() except (MissingCredentials, mygpoclient.http.Unauthorized): - logger.warn('Invalid credentials. Disabling gpodder.net.') + logger.warning('Invalid credentials. Disabling gpodder.net.') self._config.mygpo.enabled = False raise
View file
3.10.21.tar.gz/src/gpodder/plugins/soundcloud.py -> 3.11.0.tar.gz/src/gpodder/plugins/soundcloud.py
Changed
@@ -147,7 +147,7 @@ total_count = len(json_tracks) if len(tracks) == 0 and total_count > 0: - logger.warn("Download of all %i %s of user %s is disabled" % + logger.warning("Download of all %i %s of user %s is disabled" % (total_count, feed, self.username)) else: logger.info("%i/%i downloadable tracks for user %s %s feed" % @@ -167,7 +167,8 @@ yield { 'title': track.get('title', track.get('permalink')) or _('Unknown track'), 'link': track.get('permalink_url') or 'https://soundcloud.com/' + self.username, - 'description': track.get('description') or _('No description available'), + 'description': util.remove_html_tags(track.get('description') or ''), + 'description_html': '', 'url': url, 'file_size': int(filesize), 'mime_type': filetype,
View file
3.10.21.tar.gz/src/gpodder/query.py -> 3.11.0.tar.gz/src/gpodder/query.py
Changed
@@ -46,7 +46,7 @@ return (needle in haystack) if needle in self._episode.title: return True - return (needle in self._episode.description) + return (needle in self._episode._text_description) # case-insensitive search in haystack, or both title and description if no haystack def s(needle, haystack=None): @@ -55,7 +55,7 @@ return (needle in haystack.casefold()) if needle in self._episode.title.casefold(): return True - return (needle in self._episode.description.casefold()) + return (needle in self._episode._text_description.casefold()) # case-sensitive regular expression search in haystack, or both title and description if no haystack def R(needle, haystack=None): @@ -64,7 +64,7 @@ return regexp.search(haystack) if regexp.search(self._episode.title): return True - return regexp.search(self._episode.description) + return regexp.search(self._episode._text_description) # case-insensitive regular expression search in haystack, or both title and description if no haystack def r(needle, haystack=None): @@ -73,7 +73,7 @@ return regexp.search(haystack) if regexp.search(self._episode.title): return True - return regexp.search(self._episode.description) + return regexp.search(self._episode._text_description) return bool(eval(term, {'__builtins__': None, 'S': S, 's': s, 'R': R, 'r': r}, self)) except Exception as e: @@ -108,7 +108,7 @@ elif k == 'title': return episode.title elif k == 'description': - return episode.description + return episode._text_description elif k == 'since': return (datetime.datetime.now() - datetime.datetime.fromtimestamp(episode.published)).days elif k == 'age': @@ -215,7 +215,7 @@ if self._regex: return re.search(self._query, episode.title, self._flags) is not None elif self._string: - return self._query in episode.title.lower() or self._query in episode.description.lower() + return self._query in episode.title.lower() or self._query in episode._text_description.lower() return Matcher(episode).match(self._query)
View file
3.10.21.tar.gz/src/gpodder/schema.py -> 3.11.0.tar.gz/src/gpodder/schema.py
Changed
@@ -50,6 +50,8 @@ 'last_playback', 'payment_url', 'description_html', + 'episode_art_url', + 'chapters', ) PodcastColumns = ( @@ -72,7 +74,7 @@ 'cover_thumb', ) -CURRENT_VERSION = 7 +CURRENT_VERSION = 8 # SQL commands to upgrade old database versions to new ones @@ -114,6 +116,13 @@ UPDATE episode SET description=remove_html_tags(description_html) WHERE is_html(description) UPDATE podcast SET http_last_modified=NULL, http_etag=NULL """), + + # Version 8: Add episode thumbnail URL and chapters + (7, 8, """ + ALTER TABLE episode ADD COLUMN episode_art_url TEXT NULL DEFAULT NULL + ALTER TABLE episode ADD COLUMN chapters TEXT NULL DEFAULT NULL + UPDATE podcast SET http_last_modified=NULL, http_etag=NULL + """), @@ -172,7 +181,9 @@ current_position_updated INTEGER NOT NULL DEFAULT 0, last_playback INTEGER NOT NULL DEFAULT 0, payment_url TEXT NULL DEFAULT NULL, - description_html TEXT NOT NULL DEFAULT '' + description_html TEXT NOT NULL DEFAULT '', + episode_art_url TEXT NULL DEFAULT NULL, + chapters TEXT NULL DEFAULT NULL ) """) @@ -299,6 +310,8 @@ 0, None, '', + None, + None, ) new_db.execute(""" INSERT INTO episode VALUES (%s)
View file
3.10.21.tar.gz/src/gpodder/sync.py -> 3.11.0.tar.gz/src/gpodder/sync.py
Changed
@@ -27,89 +27,42 @@ import glob import logging import os.path +import threading import time +from enum import Enum +from re import S +from urllib.parse import urlparse import gpodder from gpodder import download, services, util +import gi # isort:skip +gi.require_version('Gio', '2.0') # isort:skip +from gi.repository import GLib, Gio # isort:skip + + logger = logging.getLogger(__name__) _ = gpodder.gettext -# -# TODO: Re-enable iPod and MTP sync support -# - -pymtp_available = False gpod_available = True try: - import gpod + from gpodder import libgpod_ctypes except: + logger.info('iPod sync not available') gpod_available = False -# pymtp_available = True -# try: -# import gpodder.gpopymtp as pymtp -# except: -# pymtp_available = False -# logger.warning('Could not load gpopymtp (libmtp not installed?).') - mplayer_available = True if util.find_command('mplayer') is not None else False eyed3mp3_available = True try: import eyed3.mp3 except: + logger.info('eyeD3 MP3 not available') eyed3mp3_available = False -if pymtp_available: - class MTP(pymtp.MTP): - sep = os.path.sep - - def __init__(self): - pymtp.MTP.__init__(self) - self.folders = {} - - def connect(self): - pymtp.MTP.connect(self) - self.folders = self.unfold(self.mtp.LIBMTP_Get_Folder_List(self.device)) - - def get_folder_list(self): - return self.folders - - def unfold(self, folder, path=''): - result = {} - while folder: - folder = folder.contents - name = self.sep.join(path, folder.name).lstrip(self.sep) - resultname = folder.folder_id - if folder.get_child(): - result.update(self.unfold(folder.get_child(), name)) - folder = folder.sibling - return result - - def mkdir(self, path): - folder_id = 0 - prefix = - parts = path.split(self.sep) - while parts: - prefix.append(parts0) - tmpath = self.sep.join(prefix) - if tmpath in self.folders: - folder_id = self.folderstmpath - else: - folder_id = self.create_folder(parts0, parent=folder_id) - # logger.info('Creating subfolder %s in %s (id=%u)' % (parts0, self.sep.join(prefix), folder_id)) - tmpath = self.sep.join(prefix + parts0) - self.folderstmpath = folder_id - # logger.info(">>> %s = %s" % (tmpath, folder_id)) - del parts0 - # logger.info('MTP.mkdir: %s = %u' % (path, folder_id)) - return folder_id - - def open_device(gui): config = gui._config device_type = gui._config.device_sync.device_type @@ -120,7 +73,8 @@ elif device_type == 'filesystem': return MP3PlayerDevice(config, gui.download_status_model, - gui.download_queue_manager) + gui.download_queue_manager, + gui.mount_volume_for_file) return None @@ -136,21 +90,21 @@ logger.error('MPlayer could not determine length: %s', filename, exc_info=True) attempted = True - if eyd3mp3_available: + if eyed3mp3_available: try: length = int(eyed3.mp3.Mp3AudioFile(filename).info.time_secs * 1000) # Notify user on eyed3 success if mplayer failed. # A warning is used to make it visible in gpo or on console. if attempted: - logger.warn('eyed3.mp3 successfully determined length: %s', filename) + logger.warning('eyed3.mp3 successfully determined length: %s', filename) return length except Exception: logger.error('eyed3.mp3 could not determine length: %s', filename, exc_info=True) attempted = True if not attempted: - logger.warn('Could not determine length: %s', filename) - logger.warn('Please install MPlayer or the eyed3.mp3 module for track length detection.') + logger.warning('Could not determine length: %s', filename) + logger.warning('Please install MPlayer or the eyed3.mp3 module for track length detection.') return int(60 * 60 * 1000 * 3) # Default is three hours (to be on the safe side) @@ -208,7 +162,6 @@ Keyword arguments needed: playcount (How often has the track been played?) podcast (Which podcast is this track from? Or: Folder name) - released (The release date of the episode) If any of these fields is unknown, it should not be passed to the function (the values will default to None @@ -223,11 +176,13 @@ # Set some (possible) keyword arguments to default values self.playcount = 0 self.podcast = None - self.released = None # Convert keyword arguments to object attributes self.__dict__.update(kwargs) + def __repr__(self): + return 'SyncTrack(title={}, podcast={})'.format(self.title, self.podcast) + @property def playcount_str(self): return str(self.playcount) @@ -258,6 +213,15 @@ logger.warning('Not syncing disks. Unmount your device before unplugging.') return True + def create_task(self, track): + return SyncTask(track) + + def cancel_task(self, task): + pass + + def cleanup_task(self, task): + pass + def add_sync_tasks(self, tracklist, force_played=False, done_callback=None): for track in list(tracklist): # Filter tracks that are not meant to be synchronized @@ -266,19 +230,21 @@ self._config.device_sync.skip_played_episodes) wrong_type = track.file_type() not in self.allowed_types - if does_not_exist or exclude_played or wrong_type: + if does_not_exist: + tracklist.remove(track) + elif exclude_played or wrong_type: logger.info('Excluding %s from sync', track.title) tracklist.remove(track) if tracklist: for track in sorted(tracklist, key=lambda e: e.pubdate_prop): if self.cancelled: - return False + break # XXX: need to check if track is added properly? - sync_task = SyncTask(track) + sync_task = self.create_task(track) - sync_task.status = sync_task.QUEUED + sync_task.status = sync_task.NEW
View file
3.10.21.tar.gz/src/gpodder/syncui.py -> 3.11.0.tar.gz/src/gpodder/syncui.py
Changed
@@ -35,16 +35,20 @@ class gPodderSyncUI(object): + # download list states + (DL_ONEOFF, DL_ADDING_TASKS, DL_ADDED_TASKS) = list(range(3)) + def __init__(self, config, notification, parent_window, show_confirmation, show_preferences, channels, download_status_model, download_queue_manager, - enable_download_list_update, + set_download_list_state, commit_changes_to_database, delete_episode_list, - select_episodes_to_delete): + select_episodes_to_delete, + mount_volume_for_file): self.device = None self._config = config @@ -56,10 +60,11 @@ self.channels = channels self.download_status_model = download_status_model self.download_queue_manager = download_queue_manager - self.enable_download_list_update = enable_download_list_update + self.set_download_list_state = set_download_list_state self.commit_changes_to_database = commit_changes_to_database self.delete_episode_list = delete_episode_list self.select_episodes_to_delete = select_episodes_to_delete + self.mount_volume_for_file = mount_volume_for_file def _filter_sync_episodes(self, channels, only_downloaded=False): """Return a list of episodes for device synchronization @@ -95,10 +100,16 @@ device = sync.open_device(self) if device is None: - return self._show_message_unconfigured() + self._show_message_unconfigured() + if done_callback: + done_callback() + return if not device.open(): - return self._show_message_cannot_open() + self._show_message_cannot_open() + if done_callback: + done_callback() + return else: # Only set if device is configured and opened successfully self.device = device @@ -144,7 +155,7 @@ return # enable updating of UI - self.enable_download_list_update() + self.set_download_list_state(gPodderSyncUI.DL_ONEOFF) """Update device playlists General approach is as follows: @@ -194,20 +205,26 @@ episodes_for_playlist = ep for ep in episodes_for_playlist if ep.is_new playlist.write_m3u(episodes_for_playlist) - # enable updating of UI - self.enable_download_list_update() + # enable updating of UI, but mark it as tasks being added so that a + # adding a single task that completes immediately doesn't turn off the + # ui updates again + self.set_download_list_state(gPodderSyncUI.DL_ADDING_TASKS) if (self._config.device_sync.device_type == 'filesystem' and self._config.device_sync.playlists.create): title = _('Update successful') message = _('The playlist on your MP3 player has been updated.') self.notification(message, title) + # called from the main thread to complete adding tasks + def add_downloads_complete(): + self.set_download_list_state(gPodderSyncUI.DL_ADDED_TASKS) + # Finally start the synchronization process @util.run_in_background def sync_thread_func(): device.add_sync_tasks(episodes, force_played=force_played, done_callback=done_callback) - + util.idle_add(add_downloads_complete) return if self._config.device_sync.playlists.create: @@ -232,15 +249,13 @@ # if playlist doesn't exist (yet) episodes_in_playlist will be empty if episodes_in_playlists: for episode_filename in episodes_in_playlists: - - if not(os.path.exists(os.path.join(playlist.mountpoint, - episode_filename))): + if not playlist.mountpoint.resolve_relative_path(episode_filename).query_exists(): # episode was synced but no longer on device # i.e. must have been deleted by user, so delete from gpodder try: episodes_to_delete.append(episode_dictepisode_filename) except KeyError as ioe: - logger.warn('Episode %s, removed from device has already been deleted from gpodder', + logger.warning('Episode %s, removed from device has already been deleted from gpodder', episode_filename) # delete all episodes from gpodder (will prompt user) @@ -294,8 +309,9 @@ def cleanup_episodes(): # 'skip_played_episodes' must be used or else all the # played tracks will be copied then immediately deleted - if (self._config.device_sync.delete_played_episodes and - self._config.device_sync.skip_played_episodes): + if (self._config.device_sync.delete_deleted_episodes or + (self._config.device_sync.delete_played_episodes and + self._config.device_sync.skip_played_episodes)): all_episodes = self._filter_sync_episodes( channels, only_downloaded=False) for local_episode in all_episodes:
View file
3.10.21.tar.gz/src/gpodder/util.py -> 3.11.0.tar.gz/src/gpodder/util.py
Changed
@@ -73,14 +73,14 @@ try: import html5lib except ImportError: - logger.warn('html5lib not found, falling back to HTMLParser') + logger.warning("html5lib was not found, fall-back to HTMLParser") html5lib = None if gpodder.ui.win32: try: import gpodder.utilwin32ctypes as win32file except ImportError: - logger.warn('Running on Win32 but utilwin32ctypes can\'t be loaded.') + logger.warning('Running on Win32: utilwin32ctypes cannot be loaded') win32file = None _ = gpodder.gettext @@ -90,7 +90,7 @@ try: locale.setlocale(locale.LC_ALL, '') except Exception as e: - logger.warn('Cannot set locale (%s)', e, exc_info=True) + logger.warning('Cannot set locale (%s)', e, exc_info=True) # Native filesystem encoding detection encoding = sys.getfilesystemencoding() @@ -148,26 +148,58 @@ ('.wmv', 'video/x-ms-wmv'), ('.opus', 'audio/opus'), ('.webm', 'video/webm'), + ('.webm', 'audio/webm'), _MIME_TYPES = dict((k, v) for v, k in _MIME_TYPE_LIST) _MIME_TYPES_EXT = dict(_MIME_TYPE_LIST) +def is_absolute_url(url): + """ + Check if url is an absolute url (i.e. has a scheme) + """ + try: + parsed = urllib.parse.urlparse(url) + # fix #1190: when parsing a windows path, scheme=drive_letter, path=\rest_of_path + return parsed.scheme and not parsed.path.startswith("\\") + except ValueError: + return False + + +def new_gio_file(path): + """ + Create a new Gio.File given a path or uri + """ + from gi.repository import Gio + + if is_absolute_url(path): + return Gio.File.new_for_uri(path) + else: + return Gio.File.new_for_path(path) + + def make_directory(path): """ Tries to create a directory if it does not exist already. Returns True if the directory exists after the function call, False otherwise. """ - if os.path.isdir(path): + from gi.repository import Gio, GLib + + if not isinstance(path, Gio.File): + path = new_gio_file(path) + + if path.query_exists(): return True try: - os.makedirs(path) - except: - logger.warn('Could not create directory: %s', path) - return False + path.make_directory_with_parents() + except GLib.Error as err: + # The sync might be multithreaded, so directories can be created by other threads + if not err.matches(Gio.io_error_quark(), Gio.IOErrorEnum.EXISTS): + logger.warning('Could not create directory %s: %s', path.get_uri(), err.message) + return False return True @@ -216,6 +248,12 @@ if not url or len(url) < 8: return None + # Removes leading and/or trailing whitespaces - if url contains whitespaces + # in between after str.strip() -> conclude invalid url & return None + url = url.strip() + if ' ' in url: + return None + # This is a list of prefixes that you can use to minimize the amount of # keystrokes that you have to use. # Feel free to suggest other useful prefixes, and I'll add them here. @@ -366,9 +404,9 @@ try: sum += calculate_size(os.path.join(path, item)) except: - logger.warn('Cannot get size for %s', path, exc_info=True) + logger.warning('Cannot get size for %s', path, exc_info=True) except: - logger.warn('Cannot access %s', path, exc_info=True) + logger.warning('Cannot access %s', path, exc_info=True) return sum @@ -392,7 +430,7 @@ timestamp = sstat.ST_MTIME return datetime.datetime.fromtimestamp(timestamp) except: - logger.warn('Cannot get mtime for %s', filename, exc_info=True) + logger.warning('Cannot get mtime for %s', filename, exc_info=True) return None @@ -419,7 +457,7 @@ s = os.stat(filename) return sstat.ST_MTIME except: - logger.warn('Cannot get modification timestamp for %s', filename) + logger.warning('Cannot get modification timestamp for %s', filename) return -1 @@ -510,10 +548,10 @@ try: timestamp_date = time.localtime(timestamp):3 except ValueError as ve: - logger.warn('Cannot convert timestamp', exc_info=True) + logger.warning('Cannot convert timestamp', exc_info=True) return None except TypeError as te: - logger.warn('Cannot convert timestamp', exc_info=True) + logger.warning('Cannot convert timestamp', exc_info=True) return None if timestamp_date == today: @@ -524,7 +562,7 @@ try: diff = int((time.time() - timestamp) / seconds_in_a_day) except: - logger.warn('Cannot convert "%s" to date.', timestamp, exc_info=True) + logger.warning('Cannot convert "%s" to date.', timestamp, exc_info=True) return None try: @@ -744,6 +782,10 @@ return self.extracter.get_result() def visit(self, element): + # skip functions generated by html5lib for comments in the HTML + if callable(element.tag): + return + NS = '{http://www.w3.org/1999/xhtml}' tag_name = (element.taglen(NS): if element.tag.startswith(NS) else element.tag).lower() self.extracter.handle_starttag(tag_name, list(element.items())) @@ -802,6 +844,24 @@ return ExtractHyperlinkedTextHTMLParser()(html) +def nice_html_description(img, description): + """ + basic html formating + hyperlink highlighting + video thumbnail + """ + description = re.sub(r'''https?://^\s+''', + r'''<a href="\g<0>">\g<0></a>''', + description) + description = description.replace('\n', '<br>') + html = """<style type="text/css"> + body > img { float: left; max-width: 30vw; margin: 0 1em 1em 0; } + </style> + """ + if img: + html += '<img src="{}">'.format(img) + html += '<p>{}</p>'.format(description) + return html + + def wrong_extension(extension): """ Determine if a given extension looks like it's @@ -1051,7 +1111,7 @@ to_s = str(getattr(o, attr)) result = result.replace(from_s, to_s) except: - logger.warn('Replace of "%s" failed for "%s".', attr, s) + logger.warning('Replace of "%s" failed for "%s".', attr, s) return result
View file
3.10.21.tar.gz/src/gpodder/youtube.py -> 3.11.0.tar.gz/src/gpodder/youtube.py
Changed
@@ -26,6 +26,7 @@ import re import urllib import xml.etree.ElementTree +from functools import lru_cache from html.parser import HTMLParser from urllib.parse import parse_qs @@ -147,8 +148,21 @@ hls_formats_dict = dict(hls_formats) -V3_API_ENDPOINT = 'https://www.googleapis.com/youtube/v3' CHANNEL_VIDEOS_XML = 'https://www.youtube.com/feeds/videos.xml' +WATCH_ENDPOINT = 'https://www.youtube.com/watch?bpctr=9999999999&has_verified=1&v=' + +# The page may contain "};" sequences inside the initial player response. +# Use a greedy match with script end tag, and fallback to a non-greedy match without. +INITIAL_PLAYER_RESPONSE_RE1 = r'ytInitialPlayerResponse\s*=\s*({.+})\s*;\s*</script' +INITIAL_PLAYER_RESPONSE_RE2 = r'ytInitialPlayerResponse\s*=\s*({.+?})\s*;' + + +def get_ipr(page): + for regex in (INITIAL_PLAYER_RESPONSE_RE1, INITIAL_PLAYER_RESPONSE_RE2): + ipr = re.search(regex, page) + if ipr is not None: + return ipr + return None class YouTubeError(Exception): @@ -198,12 +212,12 @@ def youtube_get_new_endpoint(vid): - url = 'https://www.youtube.com/watch?bpctr=9999999999&has_verified=1&v=' + vid + url = WATCH_ENDPOINT + vid r = util.urlopen(url) if not r.ok: raise YouTubeError('Youtube "%s": %d %s' % (url, r.status_code, r.reason)) - ipr = re.search(r'ytInitialPlayerResponse\s*=\s*({.+?})\s*;', r.text) + ipr = get_ipr(r.text) if ipr is None: try: url = get_gdpr_consent_url(r.text) @@ -213,13 +227,41 @@ if not r.ok: raise YouTubeError('Youtube "%s": %d %s' % (url, r.status_code, r.reason)) - ipr = re.search(r'ytInitialPlayerResponse\s*=\s*({.+?})\s*;', r.text) + ipr = get_ipr(r.text) if ipr is None: raise YouTubeError('Youtube "%s": No ytInitialPlayerResponse found' % url) return None, ipr.group(1) +def get_total_time(episode): + try: + vid = get_youtube_id(episode.url) + if vid is None: + return 0 + + url = WATCH_ENDPOINT + vid + r = util.urlopen(url) + if not r.ok: + return 0 + + ipr = get_ipr(r.text) + if ipr is None: + url = get_gdpr_consent_url(r.text) + r = util.urlopen(url) + if not r.ok: + return 0 + + ipr = get_ipr(r.text) + if ipr is None: + return 0 + + player_response = json.loads(ipr.group(1)) + return int(player_response'videoDetails''lengthSeconds') # 0 if live + except: + return 0 + + def get_real_download_url(url, allow_partial, preferred_fmt_ids=None): if not preferred_fmt_ids: preferred_fmt_ids, _, _ = formats_dict22 # MP4 720p @@ -325,16 +367,17 @@ return url, duration +@lru_cache(1) def get_youtube_id(url): - r = re.compile(r'https?://(?:a-z+\.)?youtube\.com/v/(.*)\.swf', re.IGNORECASE).match(url) + r = re.compile(r'https?://(?:a-z+\.)?youtube\.com/watch\?v=(^&*)', re.IGNORECASE).match(url) if r is not None: return r.group(1) - r = re.compile(r'https?://(?:a-z+\.)?youtube\.com/watch\?v=(^&*)', re.IGNORECASE).match(url) + r = re.compile(r'https?://(?:a-z+\.)?youtube\.com/v/(.*)?', re.IGNORECASE).match(url) if r is not None: return r.group(1) - r = re.compile(r'https?://(?:a-z+\.)?youtube\.com/v/(.*)?', re.IGNORECASE).match(url) + r = re.compile(r'https?://(?:a-z+\.)?youtube\.com/v/(.*)\.swf', re.IGNORECASE).match(url) if r is not None: return r.group(1) @@ -361,6 +404,7 @@ r'https?://(?:a-z+\.)?youtube\.com/profile?user=(a-z0-9+)', r'https?://(?:a-z+\.)?youtube\.com/rss/user/(a-z0-9+)/videos\.rss', r'https?://(?:a-z+\.)?youtube\.com/channel/(-_a-z0-9+)', + r'https?://(?:a-z+\.)?youtube\.com/feeds/videos.xml\?user=(a-z0-9+)', r'https?://(?:a-z+\.)?youtube\.com/feeds/videos.xml\?channel_id=(-_a-z0-9+)', r'https?://gdata.youtube.com/feeds/users/(^/+)/uploads', r'https?://gdata.youtube.com/feeds/base/users/(^/+)/uploads', @@ -385,16 +429,22 @@ return for_each_feed_pattern(return_user_feed, url, url) -def get_channel_id_url(url): +@lru_cache(1) +def get_channel_id_url(url, feed_data=None): if 'youtube.com' in url: try: - req = util.urlopen(url) + if feed_data is None: + r = util.urlopen(url) + if not r.ok: + raise YouTubeError('Youtube "%s": %d %s' % (url, r.status_code, r.reason)) + else: + r = feed_data # video page may contain corrupt HTML/XML, search for tag to avoid exception - m = re.search(r'<meta itemprop="channelId" content="(^"+)">', req.text) + m = re.search(r'<meta itemprop="channelId" content="(^"+)">', r.text) if m: channel_id = m.group(1) else: - raw_xml_data = io.BytesIO(req.content) + raw_xml_data = io.BytesIO(r.content) xml_data = xml.etree.ElementTree.parse(raw_xml_data) channel_id = xml_data.find("{http://www.youtube.com/xml/schemas/2015}channelId").text channel_url = 'https://www.youtube.com/channel/{}'.format(channel_id) @@ -403,8 +453,10 @@ except Exception: logger.warning('Could not retrieve youtube channel id.', exc_info=True) + raise Exception('Could not retrieve youtube channel id.') + -def get_cover(url): +def get_cover(url, feed_data=None): if 'youtube.com' in url: class YouTubeHTMLCoverParser(HTMLParser): @@ -429,8 +481,11 @@ self.url.append(attribute_dict'src') try: - channel_url = get_channel_id_url(url) - html_data = util.response_text(util.urlopen(channel_url)) + channel_url = get_channel_id_url(url, feed_data) + r = util.urlopen(channel_url) + if not r.ok: + raise YouTubeError('Youtube "%s": %d %s' % (url, r.status_code, r.reason)) + html_data = util.response_text(r) parser = YouTubeHTMLCoverParser() parser.feed(html_data) if parser.url: @@ -477,11 +532,11 @@ logger.debug('YouTube GDPR accept consent URL is: %s', parser.url) return parser.url else: - logger.debug('YouTube GDPR accepted consent URL could not be resolved.', parser.url) + logger.debug('YouTube GDPR accepted consent URL could not be resolved.') raise YouTubeError('No acceptable GDPR consent URL') -def get_channel_desc(url): +def get_channel_desc(url, feed_data=None): if 'youtube.com' in url: class YouTubeHTMLDesc(HTMLParser): @@ -500,8 +555,11 @@ self.description = attribute_dict'content' try: - channel_url = get_channel_id_url(url) - html_data = util.response_text(util.urlopen(channel_url)) + channel_url = get_channel_id_url(url, feed_data) + r = util.urlopen(channel_url) + if not r.ok: + raise YouTubeError('Youtube "%s": %d %s' % (url, r.status_code, r.reason)) + html_data = util.response_text(r) parser = YouTubeHTMLDesc() parser.feed(html_data) if parser.description:
View file
3.10.21.tar.gz/tests/test_feedcore.py -> 3.11.0.tar.gz/tests/test_feedcore.py
Changed
@@ -25,10 +25,11 @@ class MyFetcher(Fetcher): - def parse_feed(self, url, data_stream, headers, status, **kwargs): + def parse_feed(self, url, feed_data, data_stream, headers, status, **kwargs): return Result(status, { 'parse_feed': { 'url': url, + 'feed_data': feed_data, 'data_stream': data_stream, 'headers': headers, 'extra_args': dict(**kwargs), @@ -112,4 +113,4 @@ assert res.status == UPDATED_FEED args = res.feed'parse_feed' assert args'headers''content-type' == 'text/xml' - assert args'url' == httpserver.url_for('/feed') \ No newline at end of file + assert args'url' == httpserver.url_for('/feed')
View file
3.10.21.tar.gz/tools/mac-osx/launcher.py -> 3.11.0.tar.gz/tools/mac-osx/launcher.py
Changed
@@ -104,7 +104,7 @@ # for forked python os.environ'PYTHONHOME' = bundle_res # Set $PYTHON to point inside the bundle -PYVER = 'python3.8' +PYVER = 'python3.9' sys.path.append(bundle_res) print('System Path:\n', '\n'.join(sys.path))
View file
3.10.21.tar.gz/tools/mac-osx/release_on_mac.sh -> 3.11.0.tar.gz/tools/mac-osx/release_on_mac.sh
Changed
@@ -67,10 +67,13 @@ # install gPodder hard dependencies $run_pip install setuptools wheel -$run_pip install podcastparser==0.6.6 mygpoclient==1.8 requestssocks==2.25.1 - -# install extension dependencies; no explicit version for youtube_dl -$run_pip install mutagen==1.45.1 html5lib==1.1 youtube_dl +$run_pip install mygpoclient==1.9 podcastparser==0.6.8 requestssocks==2.28.1 +# install brotli and pycryptodomex (build from source) +$run_pip debug -v +$run_pip install -v brotli +$run_pip install -v pycryptodomex +# install extension dependencies; no explicit version for yt-dlp +$run_pip install html5lib==1.1 mutagen==1.45.1 yt-dlp cd "$checkout" touch share/applications/gpodder{,-url-handler}.desktop @@ -86,7 +89,7 @@ done # copy fake dbus -cp -r tools/fake-dbus-module/dbus $resources/lib/python3.8/site-packages/dbus +cp -r tools/fake-dbus-module/dbus $resources/lib/python3.9/site-packages/dbus # install "$run_python" setup.py install --root="$resources/" --prefix=. --optimize=0
View file
3.10.21.tar.gz/tools/requirements.txt -> 3.11.0.tar.gz/tools/requirements.txt
Changed
@@ -1,13 +1,13 @@ # PyPI / pip requirements for Linux # For the benefit of e.g. flatpak-pip-generator. # -mygpoclient==1.8 -podcastparser==0.6.6 -requestssocks==2.25.1 -urllib3==1.26.5 +dbus-python html5lib==1.1 mutagen==1.45.1 -dbus-python -youtube_dl +mygpoclient==1.9 +podcastparser==0.6.8 +requestssocks==2.28.1 +urllib3==1.26.10 +yt-dlp # eyed3 is optional and pulls in a lot of dependencies, so disable by default # eyed3
View file
3.10.21.tar.gz/tools/win_installer/_base.sh -> 3.11.0.tar.gz/tools/win_installer/_base.sh
Changed
@@ -84,19 +84,20 @@ } PIP_REQUIREMENTS="\ -podcastparser==0.6.6 -mygpoclient==1.8 +certifi==2022.6.15 +chardet==4.0.0 +comtypes==1.1.11 git+https://github.com/jaraco/pywin32-ctypes.git@f27d6a0 html5lib==1.1 -webencodings==0.5.1 -certifi==2021.5.30 +idna==3.3 mutagen==1.45.1 -youtube_dl -requests==2.25.1 -urllib3==1.26.5 -chardet==4.0.0 -idna==3.2 +mygpoclient==1.9 +podcastparser==0.6.8 PySocks==1.7.1 +requests==2.28.1 +urllib3==1.26.10 +webencodings==0.5.1 +yt-dlp " function install_deps {
View file
3.10.21.tar.gz/tools/win_installer/bootstrap.sh -> 3.11.0.tar.gz/tools/win_installer/bootstrap.sh
Changed
@@ -24,6 +24,9 @@ mingw-w64-i686-python3-cairo \ mingw-w64-i686-python3-pip + pip3 install --user podcastparser mygpoclient \ + pywin32-ctypes \ + html5lib webencodings six } main;
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.