Compare commits

..

2 Commits

177 changed files with 29651 additions and 53355 deletions

View File

@ -6,9 +6,6 @@ branches:
# Start builds on tags only
# skip_non_tags: true
image:
- Visual Studio 2019
environment:
matrix:
- MSYS2_ARCH: i686
@ -18,8 +15,17 @@ build_script:
- set
- set PATH=C:\msys64\%MSYSTEM%\bin;C:\msys64\usr\bin;%PATH%
- set CHERE_INVOKING=yes
# workaround new msys2 packagers
- curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz
- curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz.sig
- bash -lc "pacman-key --verify msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz.sig"
- bash -lc "pacman --noconfirm -U msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz"
# remove precisely conflicting packages
- bash -lc "pacman --noconfirm --ask 20 --remove mingw-w64-x86_64-gcc-ada mingw-w64-x86_64-gcc-objc mingw-w64-i686-gcc-ada mingw-w64-i686-gcc-objc"
# See https://www.msys2.org/news/#2020-12-26-zstd-exemption-for-core-packages-removed
- pacman --noconfirm -U "http://repo.msys2.org/msys/x86_64/libzstd-1.4.4-2-x86_64.pkg.tar.xz"
- pacman --noconfirm -U "http://repo.msys2.org/msys/x86_64/zstd-1.4.4-2-x86_64.pkg.tar.xz"
- pacman --noconfirm -U "http://repo.msys2.org/msys/x86_64/pacman-5.2.1-6-x86_64.pkg.tar.xz"
# workaround updating msys2-runtime breaks all programs until last one exited
- bash -lc "pacman -Syuu --noconfirm"
- Powershell.exe "Stop-Process -name dirmngr -Erroraction silentlycontinue; echo killing_dirmng"

View File

@ -1,31 +1,28 @@
# :noTabs=true:mode=yaml:tabSize=2:indentSize=2:
version: 2
jobs:
release-from-macos:
macos:
xcode: "13.4.1"
shell: /bin/bash --login -o pipefail
release-from-linux:
docker:
# important: must be same as mac bundle's python
- image: python:3.8
environment:
- BUNDLE_TAG: 22.8.27
- BUNDLE_TAG: base-5.2.2
shell: /bin/bash --login -o pipefail
steps:
- checkout
- run: >
curl -L -o "pythonbase-$BUNDLE_TAG.zip" "https://github.com/gpodder/gpodder-osx-bundle/releases/download/$BUNDLE_TAG/pythonbase-$BUNDLE_TAG.zip";
curl -L -o "pythonbase-$BUNDLE_TAG.zip.sha256" "https://github.com/gpodder/gpodder-osx-bundle/releases/download/$BUNDLE_TAG/pythonbase-$BUNDLE_TAG.zip.sha256";
saved_hash=$(awk '{print $1;}' < "pythonbase-$BUNDLE_TAG.zip.sha256");
comp_hash=$(openssl sha256 "pythonbase-$BUNDLE_TAG.zip" | awk '{print $2;}');
if [ "$saved_hash" != "$comp_hash" ]; then echo "E: $saved_hash != $comp_hash"; exit 1; else echo "valid hash"; fi;
LC_CTYPE=C.UTF-8 LANG=C.UTF-8 tools/mac-osx/release_on_mac.sh "$(pwd)/pythonbase-$BUNDLE_TAG.zip" || exit 1;
rm -Rf tools/mac-osx/_build/{gPodder.app,*.deps.zip*,gPodder.contents,run-*,gpo,gpodder-migrate2tres}
- run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y intltool unzip xsltproc zip
- run: git clone --depth 1 --branch master https://github.com/gpodder/gpodder-osx-bundle.git
- run: cd gpodder-osx-bundle && mkdir _build && cd _build
- run: cd gpodder-osx-bundle/_build && wget "https://github.com/gpodder/gpodder-osx-bundle/releases/download/$BUNDLE_TAG/gPodder-$BUNDLE_TAG.deps.zip"
- run: cd gpodder-osx-bundle/_build && wget "https://github.com/gpodder/gpodder-osx-bundle/releases/download/$BUNDLE_TAG/gPodder-$BUNDLE_TAG.deps.zip.sha256"
- run: cd gpodder-osx-bundle/_build && sha256sum -c "gPodder-$BUNDLE_TAG.deps.zip.sha256"
- run: cd gpodder-osx-bundle && LANG=C.UTF-8 ./release_on_linux.sh "/root/project/gpodder-osx-bundle/_build/gPodder-$BUNDLE_TAG.deps.zip" "/root/project"
- run: rm -Rf gpodder-osx-bundle/_build/gPodder.app/ gpodder-osx-bundle/_build/*.deps.zip* gpodder-osx-bundle/_build/gPodder.contents
- store_artifacts:
path: tools/mac-osx/_build/
path: /root/project/gpodder-osx-bundle/_build
workflows:
version: 2
build-bundle:
jobs:
- release-from-macos:
filters:
branches:
ignore:
- adaptive
- release-from-linux

12
.github/FUNDING.yml vendored
View File

@ -1,12 +0,0 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://gpodder.net/contribute/'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@ -1,32 +0,0 @@
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.7', '3.8', '3.9', '3.10', '3.11']
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
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 codespell requests pytest pytest-httpserver
pip3 install podcastparser mygpoclient
- name: Lint
run: make lint
- name: Test
run: make releasetest

1
.gitignore vendored
View File

@ -12,4 +12,3 @@ share/applications/gpodder-url-handler.desktop
share/applications/gpodder.desktop
share/dbus-1/services/org.gpodder.service
share/locale/
venv/*

13
.travis.yml Normal file
View File

@ -0,0 +1,13 @@
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<5.0' requests pytest pytest-httpserver"
- python3 tools/localdepends.py
script:
- make lint
- make releasetest

View File

@ -1,30 +0,0 @@
# Contributing to this repository <!-- omit in toc -->
## Getting started <!-- omit in toc -->
Before you begin:
- Ensure you are using Python 3.7+
- 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: [Run from Git](https://gpodder.github.io/docs/run-from-git.html)
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`

View File

@ -6,7 +6,7 @@
Media aggregator and podcast client
___
Copyright 2005-2022 The gPodder Team
Copyright 2005-2018 The gPodder Team
## License
@ -26,7 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
## Dependencies
- [Python 3.7](http://python.org/) or newer
- [Python 3.5](http://python.org/) or newer
- [Podcastparser](http://gpodder.org/podcastparser/) 0.6.0 or newer
- [mygpoclient](http://gpodder.org/mygpoclient/) 1.7 or newer
- [requests](https://requests.readthedocs.io) 2.24.0 or newer
@ -35,14 +35,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
As an alternative to python-dbus on Mac OS X and Windows, you can use
the dummy (no-op) D-Bus module provided in "tools/fake-dbus-module/".
For quick testing, see [Run from Git](https://gpodder.github.io/docs/run-from-git.html)
to install dependencies.
For quick testing, you can use the script tools/localdepends.py to
install local copies of podcastparser and mygpoclient into "src/" from
PyPI. With this, you get a self-contained gPodder CLI codebase.
### 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 +51,11 @@ to install dependencies.
- 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: libgpod (tested with 0.8.3)
- iPod Sync Support: python-gpod
- 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 or yt-dlp
- Better Youtube support (> 15 entries in feeds, download audio-only): youtube_dl
### Build Dependencies
@ -135,7 +135,7 @@ into an alternative root (default /) and prefix (default /usr):
[*Debian*](https://wiki.debian.org/Python#Deviations_from_upstream) and *Ubuntu* use `dist-packages`
instead of `site-packages` for third party installs, so you'll want something like:
sudo python3 setup.py install --root / --prefix /usr/local --optimize=1 --install-lib=/usr/local/lib/python3.10/dist-packages
sudo python3 setup.py install --root / --prefix /usr/local --optimize=1 --install-lib=/usr/local/lib/python3.5/dist-packages
In fact, first try running `python -c "import sys; print(sys.path)"` to check what is the exact path.
It depends on your version of python.
@ -219,4 +219,4 @@ check if the bug still appears to see if an extension causes the bug.
- Homepage: http://gpodder.org/
- Bug tracker: https://github.com/gpodder/gpodder/issues
- Mailing list: http://freelists.org/list/gpodder
- IRC channel: #gpodder on irc.libera.chat
- IRC channel: #gpodder on irc.freenode.net

99
bin/gpo
View File

@ -88,7 +88,6 @@ import pydoc
import re
import shlex
import sys
import textwrap
import threading
try:
@ -217,8 +216,8 @@ class gPodderCli(object):
self._extensions_episode_download_cb)
@contextlib.contextmanager
def _action(self, msg):
self._start_action(msg)
def _action(self, msg, *args):
self._start_action(msg, *args)
try:
yield
self._finish_action()
@ -272,8 +271,8 @@ class gPodderCli(object):
self._info(_('Episode download requested by extensions.'))
self._download_episode(episode)
def _start_action(self, msg):
line = util.convert_bytes(msg)
def _start_action(self, msg, *args):
line = util.convert_bytes(msg % args)
if len(line) > self.COLUMNS - 7:
line = line[:self.COLUMNS - 7 - 3] + '...'
else:
@ -336,7 +335,7 @@ class gPodderCli(object):
return self._model.load_podcast(
url, create=True,
authentication_tokens=auth_tokens.get(url, None),
max_episodes=self._config.limit.episodes)
max_episodes=self._config.max_episodes_per_feed)
except feedcore.AuthenticationRequired as e:
if e.url in auth_tokens:
print(inred(_('Wrong username/password')))
@ -380,7 +379,7 @@ class gPodderCli(object):
podcast.rename(title)
podcast.save()
except Exception as e:
logger.warning('Cannot subscribe: %s', e, exc_info=True)
logger.warn('Cannot subscribe: %s', e, exc_info=True)
if hasattr(e, 'strerror'):
self._error(e.strerror)
else:
@ -439,20 +438,10 @@ class gPodderCli(object):
if podcast is None:
self._error(_('You are not subscribed to %s.') % url)
else:
# Clean up downloads and download directories
common.clean_up_downloads()
podcast.delete()
self._db.commit()
self._error(_('Unsubscribed from %s.') % url)
# Delete downloaded episodes
podcast.remove_downloaded()
# TODO: subscribe and unsubscribe need to sync with mygpo
# Upload subscription list changes to the web service
# self.mygpo_client.on_unsubscribe([podcast.url])
return True
def is_episode_new(self, episode):
@ -492,18 +481,13 @@ class gPodderCli(object):
return "disabled"
return "enabled"
title, url, description, link, status = (
podcast.title, podcast.url, podcast.description, podcast.link,
feed_update_status_msg(podcast))
description = '\n'.join(textwrap.wrap(description, subsequent_indent=' ' * 8))
title, url, status = podcast.title, podcast.url, \
feed_update_status_msg(podcast)
episodes = self._episodesList(podcast)
episodes = '\n '.join(episodes)
self._pager("""
Title: %(title)s
URL: %(url)s
Description:
%(description)s
Link: %(link)s
Feed update is %(status)s
Episodes:
@ -559,7 +543,7 @@ class gPodderCli(object):
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):
@ -628,22 +612,17 @@ class gPodderCli(object):
show_guid = '--guid' in args
common.find_partial_downloads(self._model.get_podcasts(),
noop,
noop,
noop,
on_finish)
return True
def _download_episode(self, episode):
with self._action('Downloading %s' % episode.title):
if episode.download_task is None:
task = download.DownloadTask(episode, self._config)
else:
task = episode.download_task
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:
@ -651,11 +630,6 @@ class gPodderCli(object):
episodes = list(model.Model.sort_episodes_by_pubdate(episodes))
if episodes:
# Queue episodes to create partial files
for e in episodes:
if e.download_task is None:
download.DownloadTask(e, self._config)
last_podcast = None
for episode in episodes:
if episode.channel != last_podcast:
@ -688,7 +662,6 @@ class gPodderCli(object):
self._download_episodes(episodes)
common.find_partial_downloads(self._model.get_podcasts(),
noop,
noop,
noop,
on_finish)
@ -855,20 +828,21 @@ class gPodderCli(object):
line = input(msg)
return not line or (line.lower() == _('yes'))
def _delete_episode_list(episodes, confirm=True, callback=None):
def _delete_episode_list(episodes, confirm=True, skip_locked=True, callback=None):
if not episodes:
return False
episodes = [e for e in episodes if not e.archive]
if skip_locked:
episodes = [e for e in episodes if not e.archive]
if not episodes:
title = _('Episodes are locked')
message = _(
'The selected episodes are locked. Please unlock the '
'episodes that you want to delete before trying '
'to delete them.')
_notification(message, title)
return False
if not episodes:
title = _('Episodes are locked')
message = _(
'The selected episodes are locked. Please unlock the '
'episodes that you want to delete before trying '
'to delete them.')
_notification(message, title)
return False
count = len(episodes)
title = N_('Delete %(count)d episode?', 'Delete %(count)d episodes?',
@ -889,7 +863,7 @@ class gPodderCli(object):
episodes_status_update = []
for idx, episode in enumerate(episodes):
if not episode.archive:
if not episode.archive or not skip_locked:
self._start_action(_('Deleting episode: %(episode)s') % {
'episode': episode.title})
episode.delete_from_disk()
@ -962,13 +936,6 @@ class gPodderCli(object):
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
@ -977,22 +944,11 @@ class gPodderCli(object):
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,
@ -1006,8 +962,7 @@ class gPodderCli(object):
_not_applicable,
self._db.commit,
_delete_episode_list,
_episode_selector,
_mount_volume_for_file)
_episode_selector)
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
@ -1178,8 +1133,8 @@ class gPodderCli(object):
defaults = defaults or ()
minarg, maxarg = len(args) - len(defaults), len(args)
if (len(command_line) < minarg
or (len(command_line) > maxarg and varargs is None)):
if (len(command_line) < minarg or
(len(command_line) > maxarg and varargs is None)):
self._error('Wrong argument count for %s.' % func.__name__)
return False

View File

@ -33,12 +33,13 @@ import os.path
import platform
import subprocess
import sys
from optparse import OptionGroup, OptionParser
from optparse import OptionParser
logger = logging.getLogger(__name__)
try:
import dbus
from dbus.mainloop.glib import DBusGMainLoop
have_dbus = True
except ImportError:
print("""
@ -58,8 +59,7 @@ def main():
locale_dir = os.path.join(prefix, 'share', 'locale')
ui_folder = os.path.join(prefix, 'share', 'gpodder', 'ui')
images_folder = os.path.join(prefix, 'share', 'gpodder', 'images')
icons_folder = os.path.join(prefix, 'share', 'icons', 'hicolor', 'scalable')
icon_file = os.path.join(icons_folder, 'apps', 'gpodder-adaptive.svg')
icon_file = os.path.join(prefix, 'share', 'icons', 'hicolor', 'scalable', 'apps', 'gpodder.svg')
if os.path.exists(os.path.join(src_dir, 'gpodder', '__init__.py')):
# Run gPodder from local source folder (not installed)
@ -82,16 +82,12 @@ def main():
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
# Set up paths to folder with GtkBuilder files and gpodder.svg
# gpodder.ui_folders.append(ui_folder)
gpodder.ui_folders.append(ui_folder)
gpodder.images_folder = images_folder
gpodder.icons_folder = icons_folder
gpodder.icon_file = icon_file
s_usage = 'usage: %%prog [options]\n\n%s' % (__doc__.strip())
@ -99,39 +95,25 @@ def main():
parser = OptionParser(usage=s_usage, version=s_version)
grp_subscriptions = OptionGroup(parser, "Subscriptions")
parser.add_option_group(grp_subscriptions)
parser.add_option("-v", "--verbose",
action="store_true", dest="verbose", default=False,
help=_("print logging output on the console"))
grp_subscriptions.add_option('-s', '--subscribe', dest='subscribe',
metavar='URL',
help=_('subscribe to the feed at URL'))
parser.add_option("-q", "--quiet",
action="store_true", dest="quiet", default=False,
help=_("reduce warnings on the console"))
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"))
grp_advanced = OptionGroup(parser, "Advanced")
parser.add_option_group(grp_advanced)
grp_advanced.add_option("--close-after-startup", action="store_true",
help=_("exit once started up (for profiling)"))
parser.add_option('-s', '--subscribe', dest='subscribe', metavar='URL',
help=_('subscribe to the feed at URL'))
# On Mac OS X, support the "psn" parameter for compatibility (bug 939)
if gpodder.ui.osx:
grp_advanced.add_option('-p', '--psn', dest='macpsn', metavar='PSN',
help=_('Mac OS X application process number'))
parser.add_option('-p', '--psn', dest='macpsn', metavar='PSN',
help=_('Mac OS X application process number'))
options, args = parser.parse_args(sys.argv)
gpodder.ui.gtk = True
gpodder.ui.adaptive = True
gpodder.ui.python3 = True
desktop_session = os.environ.get('DESKTOP_SESSION', 'unknown').lower()
@ -142,9 +124,9 @@ def main():
from gpodder import log
log.setup(options.verbose, options.quiet)
if (not (gpodder.ui.win32 or gpodder.ui.osx)
and os.environ.get('DISPLAY', '') == ''
and os.environ.get('WAYLAND_DISPLAY', '') == ''):
if (not (gpodder.ui.win32 or gpodder.ui.osx) and
os.environ.get('DISPLAY', '') == '' and
os.environ.get('WAYLAND_DISPLAY', '') == ''):
logger.error('Cannot start gPodder: $DISPLAY or $WAYLAND_DISPLAY is not set.')
sys.exit(1)

View File

@ -26,6 +26,7 @@
import configparser
import os
import re
import shutil
import sys

11
debian/README.debian vendored
View File

@ -1,11 +0,0 @@
As of gPodder 3.6, alpha support for syncing directly to iPod devices
has been restored. (This was available in gPodder 2.x, but has not
been present in the 3.x version until this release.)
Users may be interested in the gpodder-migrate2tres command which will
migrate gPodder 2.x configurations to the format used by gPodder 3.x.
This binary is included in the gpodder_3.x packages. Similarly, users
can generate a backup of their existing 2.x configurations by using
the gpodder-backup script (currently shipped in the gpodder_2.x packages).
Thank you for using gPodder!

924
debian/changelog vendored
View File

@ -1,924 +0,0 @@
gpodder-adaptive (3.11.4+1-1.1) UNRELEASED; urgency=medium
[ Maryjane ]
* Updated manitainer to Maryjane
* Added libhandy 1 as a runtime dependency
* Import gpodder Debian directory from the salsa.debian.org repository
-- maryjane <maryjane@disroot.org> Fri, 23 Feb 2024 02:04:31 +0000
gpodder (3.10.17-1) unstable; urgency=medium
* New upstream version 3.10.17
* Refresh patches for new upstream version
-- tony mancill <tmancill@debian.org> Mon, 23 Nov 2020 10:26:51 -0800
gpodder (3.10.16-1) unstable; urgency=medium
* New upstream version 3.10.16
* Refresh patches against new upstream version
* Use debhelper-compat 13
-- tony mancill <tmancill@debian.org> Tue, 23 Jun 2020 21:46:05 -0700
gpodder (3.10.15-1) unstable; urgency=medium
* New upstream version 3.10.15
-- tony mancill <tmancill@debian.org> Wed, 15 Apr 2020 19:13:12 -0700
gpodder (3.10.14-1) unstable; urgency=medium
* New upstream version 3.10.14
* Refresh patches against new upstream version
* Remove address_syntax_warnings patch
-- tony mancill <tmancill@debian.org> Tue, 14 Apr 2020 21:06:01 -0700
gpodder (3.10.13-1) unstable; urgency=medium
* New upstream version 3.10.13
* Refresh patches against new upstream version
* Freshen years in debian/copyright
* Bump Standards-Version to 4.5.0
* Remove unneeded lintian overrides
-- tony mancill <tmancill@debian.org> Mon, 03 Feb 2020 01:05:08 -0800
gpodder (3.10.11-2) unstable; urgency=medium
* Remove Depends on dbus-x11; allow dbus-user-session to satisfy this
dependency. Thank you to John-Paul Durrieu for the bug report.
* Specify debhelper compat via debhelper-compat dependency
* Remove outdated debian NEWS file; it referred to upgrades prior
to old-old-stable.
* Add patch to address syntax warnings.
* Set "Rules-Requires-Root: no" in debian/control
-- tony mancill <tmancill@debian.org> Thu, 26 Dec 2019 20:18:05 -0800
gpodder (3.10.11-1) unstable; urgency=medium
* New upstream version 3.10.11
- Fixes the "Check for new episodes at startup" extension
* Bump Standards-Version to 4.4.1
-- tony mancill <tmancill@debian.org> Sun, 29 Sep 2019 19:05:48 -0700
gpodder (3.10.10-1) unstable; urgency=medium
* New upstream version 3.10.10
- Support for paginated feeds (RFC 5005)
- New extension to manage YouTube subscriptions and downloads
- Updated translations
- Numerous bugs fixes and improvements
(see: https://github.com/gpodder/gpodder/releases/tag/3.10.10)
* Refresh patches
* Bump Standards-Version to 4.4.0
* Use debhelper 12
* Add youtube-dl to Suggests
-- tony mancill <tmancill@debian.org> Sat, 28 Sep 2019 07:48:22 -0700
gpodder (3.10.9-1) unstable; urgency=medium
* New upstream version 3.10.9
- Uses HTTPS for YouTube.
Fixes https://github.com/gpodder/gpodder/issues/625
* Upload to unstable.
-- tony mancill <tmancill@debian.org> Thu, 13 Jun 2019 19:05:17 -0700
gpodder (3.10.8-1) experimental; urgency=medium
* New upstream version 3.10.8
- Updated Russian translation
-- tony mancill <tmancill@debian.org> Sat, 06 Apr 2019 08:12:32 -0700
gpodder (3.10.7-1) unstable; urgency=medium
* New upstream version 3.10.7
* Freshen patches for new upstream release
* debian/copyright: freshen copyright years and add comment regarding
AppStream metadata CC0-1.0 designation
-- tony mancill <tmancill@debian.org> Sat, 02 Feb 2019 15:17:35 -0800
gpodder (3.10.6-1) unstable; urgency=medium
[ Ondřej Nový ]
* d/copyright: Use https protocol in Format field
* d/changelog: Remove trailing whitespaces
[ tony mancill ]
* New upstream version 3.10.6
* Drop get-orig-source target from debian/rules
* Bump Standards-Version to 4.3.0
* Refresh debian/patches for new upstream version.
-- tony mancill <tmancill@debian.org> Sat, 19 Jan 2019 11:58:47 -0800
gpodder (3.10.3-2) unstable; urgency=medium
* Rename variable 'async' in services.py (Closes: #902794)
-- tony mancill <tmancill@debian.org> Sat, 30 Jun 2018 21:23:32 -0700
gpodder (3.10.3-1) unstable; urgency=medium
* New upstream version 3.10.3.
New features:
- #402 extension to run a command on download
- #431 update sonos extension to use soco >= 0.7 API
- #442 gpo command for downloading/deleting a single episode
- #384 YouTube feeds without API key
* Freshen patches for new upstream release
-- tony mancill <tmancill@debian.org> Sun, 17 Jun 2018 16:43:06 -0700
gpodder (3.10.1-2) unstable; urgency=medium
* Update Vcs fields for migration from Alioth -> Salsa
* Apply patch for Ayatana App Indicator (Closes: #898424) and replace
recommends on python3-appindicator with gir1.2-ayatanaappindicator3-0.1
- Thank you to Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
* Bump Standards-Version to 4.1.4
* Use debhelper 11
-- tony mancill <tmancill@debian.org> Sun, 27 May 2018 14:25:36 -0700
gpodder (3.10.1-1) unstable; urgency=medium
* New upstream version 3.10.1
* Update debian/watch to repack with compression=xz
* Update year in debian/copyright
* Freshen patches for new upstream release
-- tony mancill <tmancill@debian.org> Wed, 21 Feb 2018 20:21:19 -0800
gpodder (3.10.0-5) unstable; urgency=medium
* Add python3-all and python3-setuptools to Build-Depends
* Add dbus-x11, python3-gi-cairo, and gir1.2-gtk-3.0 to Depends
Promote default-dbus-session-bus | dbus-session-bus to Depends
-- tony mancill <tmancill@debian.org> Sun, 11 Feb 2018 10:09:30 -0800
gpodder (3.10.0-4) unstable; urgency=medium
* Add missing dependency on python3-cairo (Closes: #889850)
-- tony mancill <tmancill@debian.org> Thu, 08 Feb 2018 20:03:06 -0800
gpodder (3.10.0-3) unstable; urgency=medium
* Replace patch for #888420 with upstream commits through e524572.
- Fixes OPML export.
- Fixes issues with YouTube extension downloads.
-- tony mancill <tmancill@debian.org> Sat, 27 Jan 2018 10:36:33 -0800
gpodder (3.10.0-2) unstable; urgency=medium
* Add patch for exception downloading YouTube videos (Closes: #888420)
-- tony mancill <tmancill@debian.org> Thu, 25 Jan 2018 21:12:06 -0800
gpodder (3.10.0-1) unstable; urgency=medium
* New upstream version 3.10.0
- no longer depends upon pygtk (Closes: #885295)
- now builds for Python3 (only)
* Update debian/watch to scan github
* Update Homepage, Vcs URLs, and freshen copyright years
* Add patches for UTF-8
* Use debhelper 10
* Update debian/rules and dependencies for Python3
* Bump Standards-Version to 4.1.3
-- tony mancill <tmancill@debian.org> Sun, 21 Jan 2018 18:33:01 -0800
gpodder (3.9.3-1) unstable; urgency=medium
* New upstream release.
-- tony mancill <tmancill@debian.org> Mon, 26 Dec 2016 20:47:50 -0800
gpodder (3.9.2-1) unstable; urgency=medium
* New upstream release.
* Replace build-dep on feedparser with podcastparser.
* Use HTTPS for Vcs-Git URL.
* Replace Recommends on dbus-x11 with
default-dbus-session-bus | dbus-session-bus. (Closes: #836099)
-- tony mancill <tmancill@debian.org> Wed, 14 Dec 2016 21:49:07 -0800
gpodder (3.9.1-1) unstable; urgency=medium
* New upstream release.
* Bump Standards-Version to 3.9.8.
-- tony mancill <tmancill@debian.org> Sun, 13 Nov 2016 16:47:26 -0800
gpodder (3.9.0-2) unstable; urgency=medium
* Remove depedency on python-webkit recommends on
libqtwebkit-qmlwebkitplugin. (Closes: #790218)
-- tony mancill <tmancill@debian.org> Mon, 15 Feb 2016 08:34:13 -0800
gpodder (3.9.0-1) unstable; urgency=medium
* New upstream release.
* Drop dependencies on libjs-jquery and libjs-jquery-mobile,
now that the web UI has been removed.
* Drop the use_local_jquery.patch.
-- tony mancill <tmancill@debian.org> Sat, 06 Feb 2016 09:30:56 -0800
gpodder (3.8.5-1) unstable; urgency=medium
* New upstream release.
* Remove .menu file. This package contains a desktop file.
* Clean up debian/copyright; remove files no longer part of the source.
* Drop build-dep on python-dev in favor of python for arch all package.
-- tony mancill <tmancill@debian.org> Thu, 03 Dec 2015 22:01:18 -0800
gpodder (3.8.4-1) unstable; urgency=medium
* New upstream release.
-- tony mancill <tmancill@debian.org> Wed, 27 May 2015 19:13:14 -0700
gpodder (3.8.3-2) unstable; urgency=medium
* Remove Recommends on python-gst0.10. (Closes: #785834)
* Add python-appindicator to Recommends. (Closes: #770717)
-- tony mancill <tmancill@debian.org> Wed, 20 May 2015 21:07:34 -0700
gpodder (3.8.3-1) unstable; urgency=medium
* New upstream release.
* Add patch to set the default for update checks to false.
* Bump Standards-Version to 3.9.6.
* Patch HTML to use local resources.
Adds libjs-jquery and libjs-jquery-mobile to dependencies.
-- tony mancill <tmancill@debian.org> Sun, 05 Apr 2015 21:21:39 -0700
gpodder (3.8.1-1) unstable; urgency=medium
* New upstream release.
- Fixes a bug with mixed-case password.
- Improves support for adding certain YouTube channels/feed URLs.
-- tony mancill <tmancill@debian.org> Tue, 09 Sep 2014 22:44:01 -0700
gpodder (3.8.0-1) unstable; urgency=medium
* New upstream release.
-- tony mancill <tmancill@debian.org> Sat, 26 Jul 2014 20:43:14 -0700
gpodder (3.7.0-2) unstable; urgency=medium
* Convert from python-support to dh-python.
* Bump debhelper dependency to DH9.
-- tony mancill <tmancill@debian.org> Tue, 27 May 2014 21:50:33 -0700
gpodder (3.7.0-1) unstable; urgency=medium
* New upstream release.
-- tony mancill <tmancill@debian.org> Sat, 17 May 2014 11:36:25 -0700
gpodder (3.6.1-1) unstable; urgency=medium
* New upstream release (Closes: #742191)
- Fixes YouTube integration bug.
- Use LC_ALL=C during manpage generation.
- Add prefix to path in desktop file.
-- tony mancill <tmancill@debian.org> Thu, 20 Mar 2014 21:41:43 -0700
gpodder (3.6.0-1) unstable; urgency=medium
* New upstream release.
- (Closes: #681638)
- Adds alpha support for iPod (see #688240)
* Remove gpodder-migrate2tres_manpage.patch; integrated upstream.
* Remove Suggests: python-eyed3 until 0.7 is in Debian (see #740457)
* Bump Standards-Version to 3.9.5.
* Update README.Debian.
-- tony mancill <tmancill@debian.org> Sat, 01 Mar 2014 15:26:20 -0800
gpodder (3.5.2-1) unstable; urgency=low
* New upstream.
* Update Vcs- URLs to canonical forms.
* Update d/copyright years.
-- tony mancill <tmancill@debian.org> Fri, 27 Sep 2013 21:20:17 -0700
gpodder (3.5.1-1) unstable; urgency=low
* New upstream release.
* d/control: declare versioned dependency on python-gtk2 (>= 2.16)
-- tony mancill <tmancill@debian.org> Fri, 12 Apr 2013 22:07:02 -0700
gpodder (3.5.0-1) unstable; urgency=low
* New upstream release.
* Mention gpodder-migrate2tres in NEWS.Debian file. (Closes: #695470)
-- tony mancill <tmancill@debian.org> Fri, 08 Mar 2013 21:21:00 -0800
gpodder (3.4.0-1) unstable; urgency=low
* New upstream release.
* Dependency on python-feedparser is now versioned (>= 5.1.2) to
address problems with some feeds.
-- tony mancill <tmancill@debian.org> Sun, 23 Dec 2012 19:24:26 -0800
gpodder (3.3.0-1) unstable; urgency=low
* New upstream release.
* Bump Standards-Version to 3.9.4.
* Update README.Debian to note that syncing to iPod is still not
supported in the 3.x versions.
-- tony mancill <tmancill@debian.org> Mon, 24 Sep 2012 10:34:12 -0700
gpodder (3.2.0-1) unstable; urgency=low
* New upstream release.
* Upload to unstable now that the 3.x series has feature parity with
2.x. (MP3 player device sync is now part of 3.x.)
* d/control:
- Add libqtwebkit-qmlwebkitplugin to Recommends.
- Move python-webkit from Recommends to Depends.
-- tony mancill <tmancill@debian.org> Wed, 25 Jul 2012 22:03:20 -0700
gpodder (3.1.2-1) experimental; urgency=low
* New upstream release.
- Closes: #582656 - intermittently redownloads all [...] episodes
- Closes: #669194 - Repeatedly shows deleted episode
- Closes: #672583 - when run with web interface errors get thrown
* Freshen gpodder-migrate2tres manpage for 3.1.x build.
-- tony mancill <tmancill@debian.org> Mon, 28 May 2012 18:30:33 -0700
gpodder (3.1.1-1) experimental; urgency=low
* New upstream release.
* Bump Standards-Version to 3.9.3 (no changes).
-- tony mancill <tmancill@debian.org> Tue, 15 May 2012 22:32:06 -0700
gpodder (3.1.0-1) experimental; urgency=low
* New upstream release.
-- tony mancill <tmancill@debian.org> Tue, 17 Apr 2012 23:24:49 -0700
gpodder (2.20.1-1) unstable; urgency=low
* New upstream release.
- Bugfix release containing fixes from 3.x release.
* Update d/copyright years and DEP5 fields.
-- tony mancill <tmancill@debian.org> Sun, 19 Feb 2012 10:37:24 -0800
gpodder (3.0.4-1) experimental; urgency=low
* New upstream release.
-- tony mancill <tmancill@debian.org> Tue, 24 Jan 2012 21:59:59 -0800
gpodder (3.0.3-1) experimental; urgency=low
* New upstream release (Closes: #654546)
-- tony mancill <tmancill@debian.org> Mon, 09 Jan 2012 18:26:11 -0800
gpodder (3.0.2-1) experimental; urgency=low
* New upstream release.
-- tony mancill <tmancill@debian.org> Wed, 14 Dec 2011 00:15:05 -0800
gpodder (3.0.1-1) experimental; urgency=low
* New upstream release.
* Uploading to experimental to allow for testing of 3.x.
-- tony mancill <tmancill@debian.org> Sat, 26 Nov 2011 11:19:43 -0800
gpodder (2.20-1) unstable; urgency=low
* New upstream release.
* Update debian/watch.
* Remove translations.patch.
* Tweak package description to address lintian warning.
-- tony mancill <tmancill@debian.org> Wed, 19 Oct 2011 19:36:49 -0700
gpodder (2.18-1) unstable; urgency=low
* New upstream release.
* Add translations.patch to preserve translations from upstream 2.16.
-- tony mancill <tmancill@debian.org> Tue, 16 Aug 2011 21:52:00 -0700
gpodder (2.16-1) unstable; urgency=low
* New upstream release.
-- tony mancill <tmancill@debian.org> Fri, 08 Jul 2011 21:54:34 -0700
gpodder (2.15-2) unstable; urgency=low
* This time without a patch that reverts the source to 2.14.
-- tony mancill <tmancill@debian.org> Tue, 31 May 2011 22:05:31 -0700
gpodder (2.15-1) unstable; urgency=low
* New upstream release
* Bump standards version to 3.9.2 (no changes necessary).
-- tony mancill <tmancill@debian.org> Tue, 03 May 2011 14:21:32 -0700
gpodder (2.14-1) unstable; urgency=low
* New upstream release
-- tony mancill <tmancill@debian.org> Tue, 05 Apr 2011 21:23:23 -0700
gpodder (2.13-3) unstable; urgency=low
* Incorporate upstream patch for .desktop file. (Closes: #620438)
-- tony mancill <tmancill@debian.org> Sat, 02 Apr 2011 21:02:05 -0700
gpodder (2.13-2) unstable; urgency=low
* Update Vcs-* in debian/control; now using git.debian.org
-- tony mancill <tmancill@debian.org> Sun, 27 Feb 2011 20:22:16 -0800
gpodder (2.13-1) unstable; urgency=low
* New upstream release
* Switch source format to "3.0 (quilt)"
* Simplify debian/rules.
* Build-Depend on debhelper (>= 7.3.7)
-- tony mancill <tmancill@debian.org> Fri, 25 Feb 2011 23:01:30 -0800
gpodder (2.12-1) unstable; urgency=low
* New upstream release (Closes: #607180)
* Update Thomas's email address in debian/control.
-- tony mancill <tmancill@debian.org> Wed, 12 Jan 2011 21:32:36 -0800
gpodder (2.11-1) unstable; urgency=low
* New upstream release
-- tony mancill <tmancill@debian.org> Sun, 19 Dec 2010 15:35:25 -0800
gpodder (2.10-1) unstable; urgency=low
* New upstream release
* Upload to unstable.
-- tony mancill <tmancill@debian.org> Sun, 05 Dec 2010 17:08:02 -0800
gpodder (2.9-1) experimental; urgency=low
* New upstream release
* Removes dependency on python-pymtp.
* Update debian/copyright to DEP5 format.
* Upload to experimental pending release of squeeze.
-- tony mancill <tmancill@debian.org> Tue, 12 Oct 2010 22:21:18 -0700
gpodder (2.8-1~pre0) experimental; urgency=low
* New upstream release
* Remove python-pymad from Suggests (no longer used by software)
* Add python-gst0.10 to Recommends (used for track length detection
and iPod sync)
* Update Standards-Version to 3.9.1 (no changes needed)
* Upload to experimental
-- tony mancill <tmancill@debian.org> Mon, 06 Sep 2010 12:14:32 -0700
gpodder (2.7-1) unstable; urgency=low
* New upstream release: "Proposition Infinity"
* debian/control:
- Update Standards Version to 3.9.0 (no changes).
- Add tmancill@debian.org to Uploaders:
- Add Vcs-Browser and Vcs-Svn fields for Debian packaging
-- tony mancill <tmancill@debian.org> Sun, 18 Jul 2010 16:35:57 -0700
gpodder (2.6-1) unstable; urgency=low
* "The Staircase Implementation" release (Closes: #582907)
* Upstream: Add option "Do nothing" for new episodes (Closes: #561632)
* Upstream: Fix for new GtkBuilder version (Closes: #581780)
* Upstream: Removed feed_update_skipping (Closes: #568853)
* Upstream: Better new episode detection code (Closes: #582656)
* debian/control: Add "Recommends:" on python-webkit
* debian/control: Better package description
* debian/watch: Added
-- Thomas Perl <thp@thpinfo.com> Thu, 27 May 2010 17:41:01 +0200
gpodder (2.3-1) unstable; urgency=low
* "The Adhesive Duck Deficiency" release
* Remove help2man and imagemagick build-dependencies
-- Thomas Perl <thp@thpinfo.com> Sat, 27 Feb 2010 23:02:54 +0100
gpodder (2.2-1) unstable; urgency=low
* The "LA X" release
* Add build dependency and dependency on python-mygpoclient
* Remove recommendation on python-gtkhtml2 (Closes: #561337)
* Remove build-depends on python-dev (not necessary for pure Python modules)
* Add "${misc:Depends}" to Depends in debian/control
* Upgrade to standards-version 3.8.4 (no changes necessary)
-- Thomas Perl <thp@thpinfo.com> Fri, 05 Feb 2010 16:16:28 +0100
gpodder (2.1-1) unstable; urgency=low
* "The Luminous Fish Effect" release
* Add a "Recommends:" on dbus-x11 (Closes: #548524)
* Recommend "python-simplejson" for Soundcloud support
-- Thomas Perl <thp@thpinfo.com> Sat, 12 Dec 2009 17:52:45 +0100
gpodder (2.0-1) unstable; urgency=low
* The "Day of the Tentacle" release
-- Thomas Perl <thp@thpinfo.com> Wed, 16 Sep 2009 17:39:06 +0200
gpodder (0.17.0-1) unstable; urgency=low
* The "Orientation" release
-- Thomas Perl <thp@thpinfo.com> Mon, 27 Jul 2009 14:31:01 +0200
gpodder (0.16.1-1) unstable; urgency=low
* The "Adrift" bugfix release
-- Thomas Perl <thp@thpinfo.com> Fri, 05 Jun 2009 13:23:47 +0200
gpodder (0.16.0-1) unstable; urgency=low
* The "Man of Science, Man of Faith" release
* Make SQLite handling more robust (from upstream) (Closes: #527387)
* Upstream applied dbus error running from cron patch (Closes: #520369)
* debian/control: Removed dependency on python-glade2 (now using GtkBuilder)
-- Thomas Perl <thp@thpinfo.com> Mon, 01 Jun 2009 15:08:14 +0200
gpodder (0.15.2-1) unstable; urgency=low
* "The Long Morrow" bugfix release
* Upstream applied dbus error running from cron patch (Closes: #520369)
* debian/compat: Upgrade to debhelper compatibility level 7 (no changes
needed after looking at the changes in the debhelper(7) manpage)
* debian/control: Update Standards-Version to 3.8.1 (no changes needed
after looking at upgrading-checklist.txt and referring to the policy)
-- Thomas Perl <thp@thpinfo.com> Sat, 11 Apr 2009 13:35:17 +0200
gpodder (0.15.1-1) unstable; urgency=low
* The "Passage on the Lady Anne" bugfix release
* debian/control: Add python-dbus as a dependency (missing from 0.15.0)
-- Thomas Perl <thp@thpinfo.com> Thu, 12 Mar 2009 20:23:39 +0100
gpodder (0.15.0-1) unstable; urgency=low
* "The Invaders" release
* debian/rules: Add ChangeLog to the release (included in tarball)
* debian/rules: Remove outdated exclusion of "gui.py.orig" for dh_clean
* debian/copyright: Update year to 2009; add "and the gPodder Team"
-- Thomas Perl <thp@thpinfo.com> Mon, 09 Mar 2009 13:11:11 +0100
gpodder (0.14.1-1) unstable; urgency=low
* "The Thirty-Fathom Grave" bugfix release
* Recommend python-gtkhtml2 for HTML episode shownotes
-- Thomas Perl <thp@thpinfo.com> Sun, 01 Feb 2009 21:58:50 +0100
gpodder (0.14.0-1) unstable; urgency=low
* The "A Short Drink From a Certain Fountain" release
-- Thomas Perl <thp@thpinfo.com> Thu, 11 Dec 2008 15:25:27 +0100
gpodder (0.13.1-1) unstable; urgency=low
* "The Brain Center at Whipple's" bugfix release
-- Thomas Perl <thp@perli.net> Thu, 30 Oct 2008 13:28:15 +0100
gpodder (0.13.0-1) unstable; urgency=low
* The "A Thing About Machines" release
* Push Standards-Version to 3.8.0
* Use "dh_icons" for updating the icon cache and remove custom postinst file
* Suggest python-pymtp for new Media Transfer Protocol MP3 player support
* Update application description to be more accurate for the recent version
* Update website URL, year and e-mail address in debian/copyright file
-- Thomas Perl <thp@perli.net> Mon, 06 Oct 2008 21:39:41 +0200
gpodder (0.12.2-1) unstable; urgency=low
* The "Of Late I Think of Cliffordville" bugfix release
-- Thomas Perl <thp@perli.net> Sun, 17 Aug 2008 15:51:54 +0200
gpodder (0.12.1-1) unstable; urgency=low
* "The Little People" bugfix release (Closes: #491696, #491610)
-- Thomas Perl <thp@perli.net> Thu, 24 Jul 2008 11:22:35 +0200
gpodder (0.12.0-1) unstable; urgency=low
* The "Metropolis" release (Closes: #478748, #489459)
-- Thomas Perl <thp@perli.net> Tue, 15 Jul 2008 11:01:45 +0200
gpodder (0.11.3-1) unstable; urgency=low
* The "To Serve Man" release (Closes: #481229, #482907)
-- Thomas Perl <thp@perli.net> Mon, 02 Jun 2008 11:30:42 +0200
gpodder (0.11.2-1) unstable; urgency=low
* The "Walk like a Panther" release
-- Thomas Perl <thp@perli.net> Sat, 26 Apr 2008 09:56:53 +0200
gpodder (0.11.1-1) unstable; urgency=low
* The "Attacked by Killer Tomatoes" release (Closes: #469736, #466496)
* Alternative dependency for gnome-bluetooth is bluez-gnome (contains
bluetooth-sendto, which is intended to replace gnome-obex-send)
-- Thomas Perl <thp@perli.net> Thu, 27 Mar 2008 14:32:18 +0100
gpodder (0.11.0-1) unstable; urgency=low
* The "Walking for a change makes me feel normal" release
* Suggest python-bluez or bluez-utils and gnome-bluetooth for Bluetooth file
transfer support (new in 0.11.0)
-- Thomas Perl <thp@perli.net> Mon, 25 Feb 2008 14:58:34 +0100
gpodder (0.10.4-1) unstable; urgency=low
* The "Faster Pussycats Kill" release
* Add a last-minute bugfix for the .desktop file (wrong language)
-- Thomas Perl <thp@perli.net> Tue, 22 Jan 2008 09:44:38 +0100
gpodder (0.10.3-1) unstable; urgency=low
* The "A Stop at Willoughby" release
* Patch from 0.10.2-2 is now included upstream
* Category in gpodder.menu is now "Applications/Network/Web News"
-- Thomas Perl <thp@perli.net> Thu, 13 Dec 2007 09:38:03 +0100
gpodder (0.10.2-2) unstable; urgency=low
* Fix bug that prevents the channel list from being saved when no
channels.opml file exists in gPodder's config directory (first run)
-- Thomas Perl <thp@perli.net> Sat, 01 Dec 2007 15:05:39 +0100
gpodder (0.10.2-1) unstable; urgency=low
* The "Ein schweineschnauzen Sandwich, bitte!" release
* Check for free disk space before saving channel list (Closes: #452490)
-- Thomas Perl <thp@perli.net> Mon, 26 Nov 2007 18:52:14 +0100
gpodder (0.10.1-1) unstable; urgency=low
* The "Nukular, das Wort heißt Nukular" release
-- Thomas Perl <thp@perli.net> Mon, 29 Oct 2007 13:18:08 +0100
gpodder (0.10.0-3) unstable; urgency=low
* Only support Python versions >= 2.4
-- Thomas Perl <thp@perli.net> Fri, 05 Oct 2007 09:37:04 +0200
gpodder (0.10.0-2) unstable; urgency=low
* Set XS-Python-Version to "all" (Closes: #445278)
* Update copyright file to reflect GPLv3 change
-- Thomas Perl <thp@perli.net> Fri, 21 Sep 2007 02:16:59 +0200
gpodder (0.10.0-1) unstable; urgency=low
* The "Hier spricht Frank Drebin" release
* New dependency: python-feedparser
* Removed dependencies: wget, python-xml
* Support for Atom feeds through feedparser (Closes: #430844)
* Deleting not-downloaded episodes enabled (Closes: 441285)
-- Thomas Perl <thp@perli.net> Fri, 21 Sep 2007 02:13:35 +0200
gpodder (0.9.5-2) unstable; urgency=low
* Fix problem with invalid file sizes in RSS feeds (Closes: #441284)
-- Thomas Perl <thp@perli.net> Sat, 08 Sep 2007 17:09:48 +0200
gpodder (0.9.5-1) unstable; urgency=low
* The "we can do funky release titles, too" release
* Change rules file to keep gui.py.orig
* Remove Recommends on python-id3 and mplayer
-- Thomas Perl <thp@perli.net> Sun, 26 Aug 2007 20:23:30 +0200
gpodder (0.9.4-1) unstable; urgency=low
* New upstream release (Closes: #432805, #433029)
* Added gpodder.menu file
* Remove locally-changed files (included upstream)
-- Thomas Perl <thp@perli.net> Sat, 21 Jul 2007 13:53:55 +0200
gpodder (0.9.3-2) unstable; urgency=low
* The "oh so many small bugs" release
* Workaround buggy RSS feeds with no titles, thanks to Holger Leskien
(Closes: #430843)
* Applied patch from Mykola Nikishov to fix a wget bug (Closes: #431446)
-- Thomas Perl <thp@perli.net> Mon, 25 Jun 2007 23:16:12 +0200
gpodder (0.9.3-1) unstable; urgency=low
* New upstream release
* Recommend mplayer, python-id3 and python-gpod and
suggest python-eyed3 and python-pymad as dependencies
-- Thomas Perl <thp@perli.net> Mon, 25 Jun 2007 23:14:00 +0200
gpodder (0.9.2-1) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Wed, 23 May 2007 15:05:21 +0200
gpodder (0.9.1-3) unstable; urgency=low
* Fixed FSF address from old GPL/LGPL license stanzas, metioned the
location of the full licenses on Debian systems for GPL/LGPL
-- Thomas Perl <thp@perli.net> Sun, 22 Apr 2007 23:33:12 +0200
gpodder (0.9.1-2) unstable; urgency=low
* Updated copyright file to state copyright of tepache and SimpleGladeApp
-- Thomas Perl <thp@perli.net> Sun, 22 Apr 2007 23:32:03 +0200
gpodder (0.9.1-1) unstable; urgency=low
* New upstream release
* Added postinst script (run gtk-update-icon-cache)
-- Thomas Perl <thp@perli.net> Thu, 05 Apr 2007 09:54:54 +0200
gpodder (0.9.0+svn200703221-1) unstable; urgency=low
* New upstream release (Closes: #415059)
-- Thomas Perl <thp@perli.net> Thu, 22 Mar 2007 13:16:46 +0100
gpodder (0.9.0+svn200703141-1) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Wed, 14 Mar 2007 20:59:20 +0100
gpodder (0.9.0+svn200703101-2) unstable; urgency=low
* Removed some unneeded dh_* commands from rules file
-- Thomas Perl <thp@perli.net> Mon, 12 Mar 2007 21:58:55 +0100
gpodder (0.9.0+svn200703101-1) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Sat, 10 Mar 2007 18:42:19 +0100
gpodder (0.9.0+svn200703081-1) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Fri, 9 Mar 2007 18:36:35 +0100
gpodder (0.9.0+svn200703072-1) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Wed, 7 Mar 2007 16:36:28 +0100
gpodder (0.9.0+svn20070307-1) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Wed, 7 Mar 2007 11:48:58 +0100
gpodder (0.9.0-3) unstable; urgency=low
* Add build-dependency on imagemagick (for convert call)
* Fix broken artwork installation in setup.py
-- Thomas Perl <thp@perli.net> Wed, 7 Mar 2007 11:09:54 +0100
gpodder (0.9.0-2) unstable; urgency=low
* Package for python-support and mentors.debian.net
* Cleanup of package structure, removed unneeded stuff from rules
-- Thomas Perl <thp@perli.net> Wed, 7 Mar 2007 00:13:40 +0100
gpodder (0.9.0-1etch0) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Tue, 6 Mar 2007 20:58:22 +0100
gpodder (0.8.9-1etch0) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Sat, 3 Feb 2007 12:04:19 +0100
gpodder (0.8.0-1sarge0) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Fri, 28 Jul 2006 14:58:26 +0200
gpodder (0.7.9-1sarge0) unstable; urgency=low
* New upstream release
-- Thomas Perl <thp@perli.net> Mon, 17 Jul 2006 17:36:33 +0200
gpodder (0.7-2) unstable; urgency=low
* Fixed problem with buggy RSS feeds (wrong "size")
-- Thomas Perl <thp@perli.net> Sat, 8 Apr 2006 19:40:20 +0200
gpodder (0.7-1) unstable; urgency=low
* Initial release
-- Thomas Perl <thp@perli.net> Sat, 8 Apr 2006 11:17:28 +0200

47
debian/control vendored
View File

@ -1,47 +0,0 @@
Source: gpodder-adaptive
Maintainer: Maryjane <maryjane@disroot.org>
XSBC-Original-Maintainer: Thomas Perl <m@thp.io>
Section: x11
Priority: optional
Standards-Version: 4.5.0
Build-Depends: debhelper-compat (= 13),
dh-python,
intltool,
python3,
python3-all,
python3-setuptools
Homepage: https://gpodder.org/
Vcs-Browser: https://salsa.debian.org/debian/gpodder
Vcs-Git: https://salsa.debian.org/debian/gpodder.git
Rules-Requires-Root: no
Package: gpodder-adaptive
Architecture: all
Depends: ${misc:Depends}, ${python3:Depends},
default-dbus-session-bus | dbus-session-bus,
gir1.2-gtk-3.0,
gir1.2-handy-1,
python3-gi,
python3-dbus,
python3-cairo,
python3-gi-cairo,
python3-mygpoclient,
python3-podcastparser,
python3-requests (>= 2.24)
Recommends:
gir1.2-ayatanaappindicator3-0.1,
libgpod4,
normalize-audio,
python3-eyed3,
python3-html5lib,
python3-simplejson
Suggests: mplayer, gnome-bluetooth, yt-dlp (>= 2023.02.17)
Conflicts: gpodder
Description: podcast client and feed aggregator
gPodder is a podcast receiver/catcher. You can subscribe to feeds
("podcasts") and automatically download new audio and video content.
Downloaded content can be played on your computer or synchronized to
iPods, MTP-based players, filesystem-based MP3 players and Bluetooth
enabled mobile phones. YouTube video feeds are also supported.
.
This package provides the "gpodder" GUI and the "gpo" CLI utility.

33
debian/copyright vendored
View File

@ -1,33 +0,0 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: gPodder
Upstream-Contact: Thomas Perl <thp[at]thpinfo.com>
Source: https://gpodder.org/
Comment: The share/metainfo/org.gpodder.gpodder.appdata.xml
indicates that the AppStream license is CC0-1.0, but that the
project license is GPL-3+.
Files: *
Copyright: 2005-2020, Thomas Perl and the gPodder Team
License: GPL-3+
Files: debian/*
Copyright: 2006-2014, Thomas Perl,
2010-2020, tony mancill <tmancill@debian.org>
License: GPL-3+
License: GPL-3+
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/>
.
On Debian GNU/Linux systems, the complete text of the GNU General
Public License can be found in `/usr/share/common-licenses/GPL-3'.

1
debian/gpodder.docs vendored
View File

@ -1 +0,0 @@
README.md

View File

@ -1,18 +0,0 @@
Description: Modify the default value for check_on_startup to false.
This prevents an privacy/information disclosure unless the user
explicitly opts-in for the update check.
Forwarded: not-needed
Origin: vendor
Author: tony mancill <tmancill@debian.org>
--- a/src/gpodder/config.py
+++ b/src/gpodder/config.py
@@ -93,7 +93,7 @@
# Software updates from gpodder.org
'software_update': {
- 'check_on_startup': True, # check for updates on start
+ 'check_on_startup': False, # check for updates on start
'last_check': 0, # unix timestamp of last update check
'interval': 5, # interval (in days) to check for updates
},

View File

@ -1,2 +0,0 @@
disable_update_check_on_startup_default.patch
switch-appindicator-extension-to-AyatanaAppIndicator-and-python3.patch

View File

@ -1,11 +0,0 @@
--- a/share/gpodder/extensions/ubuntu_appindicator.py
+++ b/share/gpodder/extensions/ubuntu_appindicator.py
@@ -12,7 +12,7 @@
_ = gpodder.gettext
-__title__ = _('Ubuntu App Indicator')
+__title__ = _('Ayatana App Indicator')
__description__ = _('Show a status indicator in the top bar.')
__authors__ = 'Thomas Perl <thp@gpodder.org>'
__category__ = 'desktop-integration'

20
debian/rules vendored
View File

@ -1,20 +0,0 @@
#!/usr/bin/make -f
CHANGELOG = ChangeLog
DOCS = README.md
PYTHON = /usr/bin/python3
PREFIX = /usr
export DH_VERBOSE = 1
%:
dh $@ --with python3 --buildsystem=pybuild
override_dh_auto_test:
# skip tests
override_dh_auto_install:
PREFIX=$(PREFIX) make messages
PREFIX=$(PREFIX) make share/dbus-1/services/org.gpodder.service
DESTDIR=$(CURDIR)/debian/$(DEB_SOURCE) PREFIX=$(PREFIX) make install
dh_auto_install

View File

@ -1 +0,0 @@
3.0 (quilt)

3
debian/watch vendored
View File

@ -1,3 +0,0 @@
version=4
opts=repack,compression=xz,filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/gpodder-$1\.tar\.gz/ \
https://github.com/gpodder/gpodder/tags .*/v?(\d\S+)\.tar\.gz

View File

@ -34,12 +34,11 @@ POFILES = $(wildcard po/*.po)
LOCALEDIR = share/locale
MOFILES = $(patsubst po/%.po,$(LOCALEDIR)/%/LC_MESSAGES/gpodder.mo, $(POFILES))
UIFILES=$(wildcard share/gpodder/ui/gtk/*.ui \
share/gpodder/ui/adaptive/*.ui)
UIFILES=$(wildcard share/gpodder/ui/gtk/*.ui)
UIFILES_H=$(subst .ui,.ui.h,$(UIFILES))
GETTEXT_SOURCE=$(wildcard src/gpodder/*.py \
src/gpodder/gtkui/*.py \
src/gpodder/gtkui/interface/*.py \
src/gpodder/gtkui/*.py \
src/gpodder/gtkui/interface/*.py \
src/gpodder/gtkui/desktop/*.py \
src/gpodder/plugins/*.py \
share/gpodder/extensions/*.py)
@ -67,21 +66,19 @@ unittest:
LC_ALL=C PYTHONPATH=src/ $(PYTEST) --ignore=tests --ignore=src/gpodder/utilwin32ctypes.py --doctest-modules src/gpodder/util.py src/gpodder/jsonconfig.py
LC_ALL=C PYTHONPATH=src/ $(PYTEST) tests --ignore=src/gpodder/utilwin32ctypes.py --ignore=src/mygpoclient --cov=gpodder
ISORTOPTS := -c share src/gpodder tools bin/* *.py
# ISORTOPTS := -c share src/gpodder tools bin/* *.py # for isort >= 5.0
ISORTOPTS := -rc -c share src/gpodder tools bin/* *.py
lint:
pycodestyle --version
pycodestyle share src/gpodder tools bin/* *.py
isort -q $(ISORTOPTS) || isort -df $(ISORTOPTS)
isort --version
isort -q $(ISORTOPTS) || isort --df $(ISORTOPTS)
codespell --quiet-level 3 --skip "./.git,*.po,./share/applications/gpodder.desktop"
release: distclean
$(PYTHON) setup.py sdist
releasetest: unittest $(DESKTOP_FILES) $(POFILES)
for f in $(DESKTOP_FILES); do desktop-file-validate $$f || exit 1; done
for f in $(POFILES); do msgfmt --check $$f || exit 1; done
for f in $(DESKTOP_FILES); do desktop-file-validate $$f; done
for f in $(POFILES); do msgfmt --check $$f; done
$(GPODDER_SERVICE_FILE): $(GPODDER_SERVICE_FILE_IN)
sed -e 's#__PREFIX__#$(PREFIX)#' $< >$@
@ -143,6 +140,7 @@ $(MESSAGES): $(GETTEXT_SOURCE)
messages-force:
xgettext --from-code=utf-8 -LPython -k_:1 -kN_:1 -kN_:1,2 -kn_:1,2 -o $(MESSAGES) $(GETTEXT_SOURCE)
##########################################################################
# This only works in a Git working commit, and assumes that the local Git
@ -173,3 +171,5 @@ distclean: clean
.PHONY: help unittest release releasetest install manpages clean distclean messages headlink lint revbump
##########################################################################

1671
po/ca.po

File diff suppressed because it is too large Load Diff

1789
po/cs.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1781
po/da.po

File diff suppressed because it is too large Load Diff

1830
po/de.po

File diff suppressed because it is too large Load Diff

1780
po/el.po

File diff suppressed because it is too large Load Diff

1789
po/es.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1784
po/eu.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1785
po/fi.po

File diff suppressed because it is too large Load Diff

1886
po/fr.po

File diff suppressed because it is too large Load Diff

1780
po/gl.po

File diff suppressed because it is too large Load Diff

1782
po/he.po

File diff suppressed because it is too large Load Diff

1775
po/hu.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1806
po/it.po

File diff suppressed because it is too large Load Diff

1775
po/kk.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2698
po/nb.po

File diff suppressed because it is too large Load Diff

1849
po/nl.po

File diff suppressed because it is too large Load Diff

1818
po/nn.po

File diff suppressed because it is too large Load Diff

1790
po/pl.po

File diff suppressed because it is too large Load Diff

1774
po/pt.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1769
po/ro.po

File diff suppressed because it is too large Load Diff

1848
po/ru.po

File diff suppressed because it is too large Load Diff

2865
po/sk.po

File diff suppressed because it is too large Load Diff

1783
po/sv.po

File diff suppressed because it is too large Load Diff

1806
po/tr.po

File diff suppressed because it is too large Load Diff

1794
po/uk.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -5,9 +5,5 @@ select = W1, W2, W3, E11, E121, E122, E123, E124, E125, E127, E129, E13, E2, E3,
max-line-length = 142
[isort]
known_third_party=dbus,gi,mutagen,cairo,requests,github3,jinja2,magic,youtube_dl,podcastparser,mygpoclient
known_third_party=cairo,comtypes,dbus,gi,github3,jinja2,kaa,magic,mutagen,mygpoclient,podcastparser,requests,youtube_dl
known_first_party=gpodder,soco
[flake8]
max-line-length = 142
ignore = E126, E128, W503

View File

@ -18,6 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import glob
import os
import re
import sys
@ -25,7 +26,7 @@ from distutils.core import setup
installing = ('install' in sys.argv and '--help' not in sys.argv)
# distutils depends on setup.py being executed from the same dir.
# distutils depends on setup.py beeing executed from the same dir.
# Most of our custom commands work either way, but this makes
# it work in all cases.
os.chdir(os.path.dirname(os.path.realpath(__file__)))
@ -198,7 +199,7 @@ except MissingFile as mf:
setup(
name='gpodder-adaptive',
name='gpodder',
version=metadata['version'],
description=metadata['tagline'],
license=metadata['license'],

View File

@ -1,7 +1,7 @@
[Desktop Entry]
_Name=gPodder-adaptive (subscribe to feed)
_Name=gPodder (subscribe to feed)
Exec=__PREFIX__/bin/gpodder -s %u
Icon=gpodder-adaptive
Icon=gpodder
Terminal=false
NoDisplay=true
Type=Application

View File

@ -1,12 +1,11 @@
[Desktop Entry]
_Name=gPodder-adaptive
_X-GNOME-FullName=gPodder Podcast Client with adaptive interface
_Name=gPodder
_X-GNOME-FullName=gPodder Podcast Client
_GenericName=Podcast Client
_Comment=Subscribe to audio and video content from the web
Exec=__PREFIX__/bin/gpodder
Icon=gpodder-adaptive
Icon=gpodder
Terminal=false
Type=Application
Categories=AudioVideo;Audio;Network;FileTransfer;News;GTK;
StartupWMClass=gpodder
X-Purism-FormFactor=Workstation;Mobile;

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/python3
# Example script that can be used as post-play extension in media players
#
# Set the configuration options "audio_played_dbus" and "video_played_dbus"

View File

@ -60,7 +60,7 @@ class gPodderExtension:
#
# https://docs.python.org/3/library/subprocess.html#subprocess.Popen
#
# This is especially important for extensions responding to
# This is expecially important for extensions responding to
# on_episode_downloaded(), which runs whenever a download finishes.
#
# Otherwise that process will inherit ALL file descriptors gPodder

View File

@ -133,7 +133,7 @@ class gPodderExtension:
logger.info('Converted audio file to %(format)s.' % {'format': new_extension})
gpodder.user_extensions.on_notification_show(_('File converted'), episode.title)
else:
logger.warning('Error converting audio file: %s / %s', stdout, stderr)
logger.warn('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

@ -6,6 +6,7 @@
import datetime
import logging
import os
import subprocess
import gpodder
from gpodder import util
@ -44,7 +45,7 @@ class gPodderExtension:
def read_episode_info(self, episode):
filename = episode.local_filename(create=False, check_only=True)
if filename is None:
logger.warning("%s: missing episode filename", __title__)
logger.warn("%s: missing episode filename", __title__)
return None
info = {
'filename': filename,
@ -73,4 +74,4 @@ class gPodderExtension:
if proc.returncode == 0:
logger.info("%s succeeded", command)
else:
logger.warning("%s run with exit code %i", command, proc.returncode)
logger.warn("%s run with exit code %i", command, proc.returncode)

View File

@ -5,6 +5,7 @@
import logging
import os
import subprocess
from gi.repository import Gtk
@ -37,8 +38,8 @@ class gPodderExtension:
dlg = Gtk.FileChooserDialog(title=_('Save video'),
parent=self.gpodder.get_dialog_parent(),
action=Gtk.FileChooserAction.SAVE)
dlg.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL)
dlg.add_button(_('_Save'), Gtk.ResponseType.OK)
dlg.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
dlg.add_button(Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
if dlg.run() == Gtk.ResponseType.OK:
filename = dlg.get_filename()
@ -74,9 +75,7 @@ class gPodderExtension:
close_fds=True)
result = ffmpeg.wait()
util.delete_file(list_filename)
indicator.on_finished()
util.idle_add(lambda: indicator.on_finished())
util.idle_add(lambda: self.gpodder.show_message(
_('Videos successfully converted') if result == 0 else
_('Error converting videos'),

View File

@ -5,6 +5,7 @@
# Released under the same license terms as gPodder itself.
import functools
import logging
import subprocess
import gpodder
from gpodder import util
@ -71,7 +72,7 @@ class Win32Player(Player):
self.command = win32_read_registry_key(self.command)
return True
except Exception as e:
logger.warning('Win32 player not found: %s (%s)', self.command, e)
logger.warn('Win32 player not found: %s (%s)', self.command, e)
return False
@ -211,9 +212,6 @@ PLAYERS = [
# Clementine, http://www.clementine-player.org/
FreeDesktopPlayer('clementine', 'Clementine', ['clementine', '--append']),
# Strawberry, https://www.strawberrymusicplayer.org/
FreeDesktopPlayer('strawberry', 'Strawberry', ['strawberry', '--append']),
# Parole, http://docs.xfce.org/apps/parole/start
FreeDesktopPlayer('parole', 'Parole', ['parole', '-a']),
@ -242,7 +240,7 @@ RESUMERS = [
# with https://github.com/Serranya/deadbeef-mpris2-plugin
MPRISResumer('resume in deadbeef', 'DeaDBeeF', ['deadbeef'], 'org.mpris.MediaPlayer2.DeaDBeeF'),
# the gPodder Downloads directory must be in gmusicbrowser's library
# the gPodder Dowloads directory must be in gmusicbrowser's library
MPRISResumer('resume in gmusicbrowser', 'gmusicbrowser', ['gmusicbrowser'], 'org.mpris.MediaPlayer2.gmusicbrowser'),
# Audacious doesn't implement MPRIS2.OpenUri

View File

@ -135,13 +135,6 @@ class gPodderExtension:
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
box.set_border_width(10)
# note about Cancel
note = Gtk.Label(use_markup=True, wrap=True, label=_(
'<b>Note:</b> The Cancel button does <b>not</b> return the '
'filter settings to the values they had before. '
'The changes are saved immediately after they are made.'))
box.add(note)
# block widgets
self.block_widget = BlockExceptFrame(value=block,
enable_re=self.key('block_re') is not False,
@ -170,15 +163,10 @@ class gPodderExtension:
box.add(label)
# re-filter
separator = Gtk.HSeparator()
box.add(separator)
button = Gtk.Button(_('Filter episodes now'))
button = Gtk.Button(_('Filter episodes now (undoes any episodes you marked as old)'))
button.connect('clicked', self.refilter_podcast)
box.add(button)
label2 = Gtk.Label(_('Undoes any episodes you marked as old.'))
box.add(label2)
box.show_all()
return box

View File

@ -121,18 +121,18 @@ class CurrentTrackTracker(object):
# If the position is being updated, and the current status was Playing
# If the status *is* playing, and *was* playing, but the position
# has changed discontinuously, notify a stop for the old position
if (cur['status'] == 'Playing'
and ('status' not in kwargs or kwargs['status'] == 'Playing') and not
if (cur['status'] == 'Playing' and
('status' not in kwargs or kwargs['status'] == 'Playing') and not
subsecond_difference(cur['pos'], kwargs['pos'])):
logger.debug('notify Stopped: playback discontinuity:'
+ 'calc: %r observed: %r', cur['pos'], kwargs['pos'])
logger.debug('notify Stopped: playback discontinuity:' +
'calc: %f observed: %f', cur['pos'], kwargs['pos'])
self.notify_stop()
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 self.pos < (self.length + 2 * USECS_IN_SEC)):
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
self.pos < (self.length + 2 * USECS_IN_SEC)):
logger.debug('pos=0 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))
@ -144,8 +144,7 @@ class CurrentTrackTracker(object):
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))
newpos = kwargs.pop('pos')
self.pos = newpos if newpos >= 0 else 0
self.pos = kwargs.pop('pos')
if 'status' in kwargs:
self.status = kwargs.pop('status')
@ -160,7 +159,7 @@ class CurrentTrackTracker(object):
if self.status == 'Playing':
self.notify_playing()
else:
logger.debug('notify Stopped: status %r', self.status)
logger.debug('notify Stopped: status %s', self.status)
self.notify_stop()
def getinfo(self):
@ -174,11 +173,11 @@ class CurrentTrackTracker(object):
self.notify('Playing')
def notify(self, status):
if (self.uri is None
or self.pos is None
or self.status is None
or self.length is None
or self.length <= 0):
if (self.uri is None or
self.pos is None or
self.status is None or
self.length is None or
self.length <= 0):
return
pos = self.pos // USECS_IN_SEC
parsed_url = urllib.parse.urlparse(self.uri)
@ -255,10 +254,10 @@ class MPRISDBusReceiver(object):
invalidated_properties, path=None, sender=None):
if interface_name != self.INTERFACE_MPRIS:
if interface_name not in self.OTHER_MPRIS_INTERFACES:
logger.warning('unexpected interface: %s, props=%r', interface_name, list(changed_properties.keys()))
logger.warn('unexpected interface: %s, props=%r', interface_name, list(changed_properties.keys()))
return
if sender is None:
logger.warning('No sender associated to D-Bus signal, please report a bug')
logger.warn('No sender associated to D-Bus signal, please report a bug')
return
collected_info = {}
@ -275,28 +274,27 @@ class MPRISDBusReceiver(object):
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':
try:
collected_info['pos'] = self.query_property(sender, 'Position')
except dbus.exceptions.DBusException:
pass
if 'status' not in collected_info:
try:
collected_info['status'] = str(self.query_property(
sender, 'PlaybackStatus'))
except dbus.exceptions.DBusException:
pass
collected_info['pos'] = self.query_position(sender)
if 'status' not in collected_info:
collected_info['status'] = str(self.query_status(sender))
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_property(self, sender, prop):
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, prop)
return props.Get(self.INTERFACE_MPRIS, 'Position')
def query_status(self, sender):
proxy = self.bus.get_object(sender, self.PATH_MPRIS)
props = dbus.Interface(proxy, self.INTERFACE_PROPS)
return props.Get(self.INTERFACE_MPRIS, 'PlaybackStatus')
class gPodderNotifier(dbus.service.Object):

View File

@ -91,14 +91,13 @@ class gPodderExtension:
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, cwd=episode.channel.save_dir)
p = util.Popen(cmd)
p.wait()
stdout, stderr = ("<unavailable>",) * 2
else:
p = util.Popen(cmd, cwd=episode.channel.save_dir,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p = util.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
if p.returncode == 0:
@ -106,7 +105,7 @@ class gPodderExtension:
gpodder.user_extensions.on_notification_show(_('File normalized'),
episode.title)
else:
logger.warning('normalize-audio failed: %s / %s', stdout, stderr)
logger.warn('normalize-audio failed: %s / %s', stdout, stderr)
def convert_episodes(self, episodes):
for episode in episodes:

View File

@ -44,6 +44,11 @@ import tempfile
import gpodder
import gi # isort:skip
gi.require_version('Gtk', '3.0') # isort:skip
from gi.repository import Gtk # isort:skip
logger = logging.getLogger(__name__)
_ = gpodder.gettext
@ -100,7 +105,7 @@ try {{
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($APP_ID).Show($toast)
Remove-Item -LiteralPath $MyInvocation.MyCommand.Path -Force # Delete this script temp file.
}} else {{
# use older Balloon notification when not on Windows 10
# use older Baloon notification when not on Windows 10
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$o = New-Object System.Windows.Forms.NotifyIcon

View File

@ -5,7 +5,6 @@
import logging
import os
import time
import gpodder
from gpodder import util
@ -25,14 +24,12 @@ __category__ = 'post-download'
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
}
class gPodderExtension:
def __init__(self, container):
self.container = container
self.gpodder = None
self.config = self.container.config
def on_episode_downloaded(self, episode):
@ -46,39 +43,6 @@ class gPodderExtension:
os.rename(current_filename, new_filename)
util.rename_episode_file(episode, new_filename)
def on_ui_object_available(self, name, ui_object):
if name == 'gpodder-gtk':
self.gpodder = ui_object
def on_create_menu(self):
return [(_("Rename all downloaded episodes"), self.rename_all_downloaded_episodes)]
def rename_all_downloaded_episodes(self):
episodes = [e for c in self.gpodder.channels for e in [e for e in c.children if e.state == gpodder.STATE_DOWNLOADED]]
number_of_episodes = len(episodes)
if number_of_episodes == 0:
self.gpodder.show_message(_('No downloaded episodes to rename'),
_('Rename all downloaded episodes'), important=True)
from gpodder.gtkui.interface.progress import ProgressIndicator
progress_indicator = ProgressIndicator(
_('Renaming all downloaded episodes'),
'', True, self.gpodder.get_dialog_parent(), number_of_episodes)
for episode in episodes:
self.on_episode_downloaded(episode)
if not progress_indicator.on_tick():
break
renamed_count = progress_indicator.tick_counter
progress_indicator.on_finished()
if renamed_count > 0:
self.gpodder.show_message(_('Renamed %(count)d downloaded episodes') % {'count': renamed_count},
_('Rename all downloaded episodes'), important=True)
def make_filename(self, current_filename, title, sortdate, podcast_title):
dirname = os.path.dirname(current_filename)
filename = os.path.basename(current_filename)
@ -86,16 +50,10 @@ class gPodderExtension:
new_basename = []
new_basename.append(title)
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)
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

@ -1,3 +1,4 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
####
# 01/2011 Bernd Schlapsi <brot@gmx.info>
@ -96,4 +97,4 @@ class gPodderExtension:
logger.info('Removed cover art from OGG file: %s', filename)
ogg.save()
except Exception as e:
logger.warning('Failed to remove OGG cover: %s', e, exc_info=True)
logger.warn('Failed to remove OGG cover: %s', e, exc_info=True)

View File

@ -1,3 +1,4 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Requirements: apt-get install python-kaa-metadata ffmpeg python-dbus
# To use, copy it as a Python script into ~/.config/gpodder/extensions/rockbox_mp4_convert.py

View File

@ -39,7 +39,7 @@ class gPodderExtension:
device_folder = device.get_episode_folder_on_device(episode)
episode_art = os.path.join(episode_folder, "folder.jpg")
device_art = os.path.join(device_folder, self.config.art_name_on_device)
# make sure we have art to copy and it doesn't already exist
# make sure we have art to copy and it doesnt already exist
if os.path.isfile(episode_art) and not os.path.isfile(device_art):
logger.info('Syncing cover art for %s', episode.channel.title)
# copy and rename art

View File

@ -1,3 +1,4 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
####
# 01/2011 Bernd Schlapsi <brot@gmx.info>
@ -26,6 +27,7 @@ import base64
import datetime
import logging
import mimetypes
import os
from mutagen import File
from mutagen.easyid3 import EasyID3
@ -62,8 +64,7 @@ DefaultConfig = {
'auto_embed_coverart': False,
'set_artist_to_album': False,
'set_version': 4,
'modify_tags': True,
'remove_before_modify': False
'modify_tags': True
}
@ -83,7 +84,7 @@ class AudioFile(object):
audio.delete()
audio.save()
def write_basic_tags(self, remove_before_modify, modify_tags, set_artist_to_album, set_version):
def write_basic_tags(self, modify_tags, set_artist_to_album, set_version):
audio = File(self.filename, easy=True)
if audio is None:
@ -94,9 +95,6 @@ class AudioFile(object):
audio.add_tags()
if modify_tags:
if remove_before_modify:
audio.delete()
if self.album is not None:
audio.tags['album'] = self.album
@ -131,7 +129,7 @@ class AudioFile(object):
def get_cover_picture(self, cover):
""" Returns mutagen Picture class for the cover image
Useful for OGG and FLAC format
Usefull for OGG and FLAC format
Picture type = cover image
see http://flac.sourceforge.net/documentation_tools_flac.html#encoding_options
@ -263,7 +261,7 @@ class gPodderExtension:
else:
info['title'] = title
info['subtitle'] = episode._text_description
info['subtitle'] = episode.description
if self.container.config.genre_tag is not None:
info['genre'] = self.container.config.genre_tag
@ -288,8 +286,7 @@ class gPodderExtension:
if self.container.config.always_remove_tags:
audio.remove_tags()
else:
audio.write_basic_tags(self.container.config.remove_before_modify,
self.container.config.modify_tags,
audio.write_basic_tags(self.container.config.modify_tags,
self.container.config.set_artist_to_album,
self.container.config.set_version)

View File

@ -20,7 +20,6 @@
# 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,
@ -31,11 +30,6 @@ from comtypes import COMMETHOD, GUID, IUnknown, client, wireHWND
import gpodder
import gi # isort:skip
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk # isort:skip
_ = gpodder.gettext
@ -59,8 +53,6 @@ TBPFLAG = c_int # enum
TBATF_USEMDITHUMBNAIL = 1
TBATF_USEMDILIVEPREVIEW = 2
TBATFLAG = c_int # enum
# return code
S_OK = HRESULT(0).value
class tagTHUMBBUTTON(Structure):
@ -146,14 +138,8 @@ class ITaskbarList3(ITaskbarList2):
(['in'], POINTER(tagRECT), 'prcClip'))]
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()
assert sizeof(tagTHUMBBUTTON) == 540, sizeof(tagTHUMBBUTTON)
assert alignment(tagTHUMBBUTTON) == 4, alignment(tagTHUMBBUTTON)
# based on http://stackoverflow.com/a/1744503/905256
@ -167,44 +153,25 @@ class gPodderExtension:
self.taskbar = client.CreateObject(
'{56FDF344-FD6D-11d0-958A-006097C9A090}',
interface=ITaskbarList3)
ret = self.taskbar.HrInit()
if ret != S_OK:
logger.warning("taskbar.HrInit failed: %r", ret)
del self.taskbar
self.taskbar.HrInit()
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):
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
self.window_handle = window.window.handle
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.warning("No window handle available, a restart max fix this")
logger.warn("No window handle available, a restart max fix this")
self.restart_warning = False
return
if 0 < progress < 1:

View File

@ -48,8 +48,8 @@ class gPodderExtension(object):
srtContent = ''
for captionIndex, caption in enumerate(jsonobject['captions'], 1):
startTime = self.milli_to_srt(introduration + caption['startTime'])
endTime = self.milli_to_srt(introduration + caption['startTime']
+ caption['duration'])
endTime = self.milli_to_srt(introduration + caption['startTime'] +
caption['duration'])
srtContent += ''.join([str(captionIndex), os.linesep, startTime,
' --> ', endTime, os.linesep,
caption['content'], os.linesep * 2])
@ -60,7 +60,7 @@ class gPodderExtension(object):
try:
response = util.urlopen(url).read()
except Exception as e:
logger.warning("subtitle url returned error %s", e)
logger.warn("subtitle url returned error %s", e)
return ''
return response
@ -105,7 +105,7 @@ class gPodderExtension(object):
with open(srt_filename, 'w+') as srtFile:
srtFile.write(sub.encode("utf-8"))
except Exception as e:
logger.warning("Can't write srt file: %s", e)
logger.warn("Can't write srt file: %s", e)
def on_episode_delete(self, episode, filename):
srt_filename = self.get_srt_filename(filename)

View File

@ -4,12 +4,16 @@
# Thomas Perl <thp@gpodder.org>; 2012-02-06
import logging
import os
import subprocess
import sys
import gpodder
from gpodder import util
import gi # isort:skip
gi.require_version('Unity', '7.0') # isort:skip
from gi.repository import GLib, Unity # isort:skip
from gi.repository import GObject, Unity # isort:skip
_ = gpodder.gettext
@ -55,4 +59,4 @@ class gPodderExtension:
self.launcher_entry = None
def on_download_progress(self, progress):
GLib.idle_add(self.launcher_entry.set_progress, float(progress))
GObject.idle_add(self.launcher_entry.set_progress, float(value))

View File

@ -11,7 +11,7 @@ import os
import subprocess
import gpodder
from gpodder import util
from gpodder import util, youtube
logger = logging.getLogger(__name__)
@ -114,7 +114,7 @@ class gPodderExtension:
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.warning('Error converting video file: %s / %s', stdout, stderr)
logger.warn('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

@ -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.
@ -9,23 +9,13 @@ import os
import re
import sys
import time
from collections.abc import Iterable
try:
import yt_dlp as youtube_dl
program_name = 'yt-dlp'
want_ytdl_version = '2023.06.22'
except:
import youtube_dl
program_name = 'youtube-dl'
want_ytdl_version = '2023.02.17' # youtube-dl has been patched, but not yet released
import youtube_dl
from youtube_dl.utils import DownloadError, ExtractorError, sanitize_url
import gpodder
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
from gpodder import download, feedcore, model, registry, youtube
from gpodder.util import mimetype_from_extension, remove_html_tags
_ = gpodder.gettext
@ -33,23 +23,22 @@ _ = gpodder.gettext
logger = logging.getLogger(__name__)
__title__ = 'youtube-dl'
__description__ = _('Manage YouTube subscriptions using youtube-dl (pip install youtube_dl) or yt-dlp (pip install yt-dlp)')
__title__ = 'Youtube-dl'
__description__ = _('Manage Youtube subscriptions using youtube-dl (pip install youtube_dl)')
__only_for__ = 'gtk, cli'
__authors__ = 'Eric Le Lay <elelay.fr:contact>'
__doc__ = 'https://gpodder.github.io/docs/extensions/youtubedl.html'
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.')
want_ytdl_version = '2020.11.12'
want_ytdl_version_msg = _('Your version of youtube-dl %(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 information about it, which is very slow.
# youtube-dl downloads and parses each video page to get informations about it, which is very slow.
# Set to False to fall back to the fast but limited (only 15 episodes) gpodder code
'manage_channel': True,
# If for some reason youtube-dl download doesn't work for you, you can fallback to gpodder code.
# Set to False to fall back to default gpodder code (less available formats).
'manage_downloads': True,
# Embed all available subtitles to downloaded videos. Needs ffmpeg.
'embed_subtitles': False,
}
@ -62,7 +51,7 @@ PLAYLIST_RE = re.compile(r'''https://www.youtube.com/feeds/videos.xml\?playlist_
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:
@ -89,15 +78,6 @@ class YoutubeCustomDownload(download.CustomDownload):
self._reporthook = None
self._prev_dl_bytes = 0
self._episode = episode
self._partial_filename = None
@property
def partial_filename(self):
return self._partial_filename
@partial_filename.setter
def partial_filename(self, val):
self._partial_filename = val
def retrieve_resume(self, tempname, reporthook=None):
"""
@ -105,55 +85,37 @@ class YoutubeCustomDownload(download.CustomDownload):
"""
self._reporthook = reporthook
# outtmpl: use given tempname by DownloadTask
# (escape % because outtmpl used as a string template by youtube-dl)
outtmpl = tempname.replace('%', '%%')
info, opts = self._ytdl.fetch_info(self._url, outtmpl, self._my_hook)
if program_name == 'yt-dlp':
default = opts['outtmpl']['default'] if isinstance(opts['outtmpl'], dict) else opts['outtmpl']
self.partial_filename = os.path.join(opts['paths']['home'], default) % info
elif program_name == 'youtube-dl':
self.partial_filename = opts['outtmpl'] % info
res = self._ytdl.fetch_video(info, opts)
if program_name == 'yt-dlp':
# yt-dlp downloads to whatever file name it wants, so rename
filepath = res.get('requested_downloads', [{}])[0].get('filepath')
if filepath is None:
raise Exception("Could not determine youtube-dl output file")
if filepath != tempname:
logger.debug('yt-dlp downloaded to "%s" instead of "%s", moving',
os.path.basename(filepath),
os.path.basename(tempname))
os.remove(tempname)
os.rename(filepath, tempname)
# (escape % and $ because outtmpl used as a string template by youtube-dl)
outtmpl = tempname.replace('%', '%%').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)
if 'duration' in res and res['duration']:
self._episode.total_time = res['duration']
headers = {}
# youtube-dl doesn't return a content-type but an extension
if 'ext' in res:
dot_ext = '.{}'.format(res['ext'])
if program_name == 'youtube-dl':
# See #673 when merging multiple formats, the extension is appended to the tempname
# by youtube-dl resulting in empty .partial file + .partial.mp4 exists
# and #796 .mkv is chosen by ytdl sometimes
# See #673 when merging multiple formats, the extension is appended to the tempname
# by YoutubeDL 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('youtube-dl downloaded to "%s" instead of "%s", moving',
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 = util.mimetype_from_extension(dot_ext)
ext_filetype = mimetype_from_extension(dot_ext)
if ext_filetype:
# 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/')
headers['content-type'] = ext_filetype
return headers, res.get('url', self._url)
@ -210,7 +172,7 @@ class YoutubeFeed(model.Feed):
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')
@ -246,8 +208,10 @@ class YoutubeFeed(model.Feed):
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 = util.mimetype_from_extension('.{}'.format(en['ext']))
mime_type = mimetype_from_extension('.{}'.format(en['ext']))
else:
mime_type = 'application/octet-stream'
if en.get('filesize'):
@ -258,9 +222,8 @@ class YoutubeFeed(model.Feed):
ep = {
'title': en.get('title', guid),
'link': en.get('webpage_url'),
'episode_art_url': en.get('thumbnail'),
'description': util.remove_html_tags(en.get('description') or ''),
'description_html': '',
'description': description,
'description_html': html_description,
'url': en.get('webpage_url'),
'file_size': filesize,
'mime_type': mime_type,
@ -283,6 +246,25 @@ class YoutubeFeed(model.Feed):
"""
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):
@ -297,27 +279,17 @@ class gPodderYoutubeDL(download.CustomDownloader):
os.makedirs(cachedir, exist_ok=True)
self._ydl_opts = {
'cachedir': cachedir,
'noprogress': True, # prevent progress bar from appearing in console
'no_color': True, # prevent escape codes in desktop notifications on errors
}
# prevent escape codes in desktop notifications on errors
if program_name == 'yt-dlp':
self._ydl_opts['color'] = 'no_color'
else:
self._ydl_opts['no_color'] = True
if gpodder.verbose:
self._ydl_opts['verbose'] = True
else:
self._ydl_opts['quiet'] = True
# Don't create downloaders for URLs supported by these youtube-dl extractors
self.ie_blacklist = ["Generic"]
# Cache URL regexes from youtube-dl matches here, seed with youtube regex
self.regex_cache = [(re.compile(r'https://www.youtube.com/watch\?v=.+'),)]
# #686 on windows without a console, sys.stdout is None, causing exceptions
# when adding podcasts.
# See https://docs.python.org/3/library/sys.html#sys.__stderr__ Note
if not sys.stdout:
logger.debug('no stdout, setting youtube-dl logger')
logger.debug('no stdout, setting YoutubeDL logger')
self._ydl_opts['logger'] = logger
def add_format(self, gpodder_config, opts, fallback=None):
@ -337,29 +309,17 @@ class gPodderYoutubeDL(download.CustomDownloader):
opts['format'] += '/' + fallback
logger.debug('format=%s', opts['format'])
def fetch_info(self, url, tempname, reporthook):
subs = self.my_config.embed_subtitles
def fetch_video(self, url, tempname, reporthook):
opts = {
'paths': {'home': os.path.dirname(tempname)},
# Postprocessing in yt-dlp breaks without ext
'outtmpl': (os.path.basename(tempname) if program_name == 'yt-dlp'
else tempname) + '.%(ext)s',
'outtmpl': tempname,
'nopart': True, # don't append .part (already .partial)
'retries': 3, # retry a few times
'progress_hooks': [reporthook], # to notify UI
'writesubtitles': subs,
'subtitleslangs': ['all'] if subs else [],
'postprocessors': [{'key': 'FFmpegEmbedSubtitle'}] if subs else [],
'progress_hooks': [reporthook] # to notify UI
}
opts.update(self._ydl_opts)
self.add_format(self.gpodder_config, opts)
with youtube_dl.YoutubeDL(opts) as ydl:
info = ydl.extract_info(url, download=False)
return info, opts
def fetch_video(self, info, opts):
with youtube_dl.YoutubeDL(opts) as ydl:
return ydl.process_video_result(info, download=True)
return ydl.extract_info(url, download=True)
def refresh_entries(self, ie_result):
# only interested in video metadata
@ -378,8 +338,8 @@ class gPodderYoutubeDL(download.CustomDownloader):
with youtube_dl.YoutubeDL(opts) as ydl:
ydl.process_ie_result(tmp, download=False)
new_entries.extend(tmp.get('entries'))
except youtube_dl.utils.DownloadError as ex:
if ex.exc_info[0] == youtube_dl.utils.ExtractorError:
except DownloadError as ex:
if ex.exc_info[0] == 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_info[1])
continue
@ -390,7 +350,7 @@ class gPodderYoutubeDL(download.CustomDownloader):
"""
Fetch a channel or playlist contents.
Doesn't yet fetch video entry information, so we only get the video id and title.
Doesn't yet fetch video entry informations, so we only get the video id and title.
"""
# Duplicate a bit of the YoutubeDL machinery here because we only
# want to parse the channel/playlist first, not to fetch video entries.
@ -412,7 +372,7 @@ class gPodderYoutubeDL(download.CustomDownloader):
result_type, has_playlist = extract_type(ie_result)
while not has_playlist:
if result_type in ('url', 'url_transparent'):
ie_result['url'] = youtube_dl.utils.sanitize_url(ie_result['url'])
ie_result['url'] = sanitize_url(ie_result['url'])
if result_type == 'url':
logger.debug("extract_info(%s) to get the video list", ie_result['url'])
# We have to add extra_info to the results because it may be
@ -447,49 +407,20 @@ class gPodderYoutubeDL(download.CustomDownloader):
if m:
url = 'https://www.youtube.com/playlist?list={}'.format(m.group(1))
if url:
logger.info('youtube-dl handling %s => %s', channel.url, url)
logger.info('Youtube-dl Handling %s => %s', channel.url, url)
return self.refresh(url, channel.url, max_episodes)
return None
def is_supported_url(self, url):
if url is None:
return False
for i, res in enumerate(self.regex_cache):
if next(filter(None, (r.match(url) for r in res)), None) is not None:
if i > 0:
self.regex_cache.remove(res)
self.regex_cache.insert(0, res)
return True
with youtube_dl.YoutubeDL(self._ydl_opts) as ydl:
# youtube-dl returns a list, yt-dlp returns a dict
ies = ydl._ies
if isinstance(ydl._ies, dict):
ies = ydl._ies.values()
for ie in ies:
if ie.suitable(url) and ie.ie_key() not in self.ie_blacklist:
self.regex_cache.insert(
0, (ie._VALID_URL_RE if isinstance(ie._VALID_URL_RE, Iterable)
else (ie._VALID_URL_RE,)))
return True
return False
def custom_downloader(self, unused_config, episode):
"""
called from registry.custom_downloader.resolve
"""
if not self.force and not self.my_config.manage_downloads:
return None
try: # Reject URLs linking to known media files
(_, ext) = util.filename_from_url(episode.url)
if util.file_type_by_extension(ext) is not None:
return None
except Exception:
pass
if self.is_supported_url(episode.url):
if re.match(r'''https://www.youtube.com/watch\?v=.+''', episode.url):
return YoutubeCustomDownload(self, episode.url, episode)
elif re.match(r'''https://www.youtube.com/watch\?v=.+''', episode.link):
return YoutubeCustomDownload(self, episode.link, episode)
return None
@ -497,14 +428,15 @@ class gPodderExtension:
def __init__(self, container):
self.container = container
self.ytdl = None
self.infobar = None
def on_load(self):
self.ytdl = gPodderYoutubeDL(self.container.manager.core.config, self.container.config)
logger.info('Registering youtube-dl. (using %s %s)' % (program_name, youtube_dl.version.__version__))
logger.info('Registering youtube-dl.')
registry.feed_handler.register(self.ytdl.fetch_channel)
registry.custom_downloader.register(self.ytdl.custom_downloader)
logger.debug('Youtube-DL %s' % youtube_dl.version.__version__)
if youtube_dl.utils.version_tuple(youtube_dl.version.__version__) < youtube_dl.utils.version_tuple(want_ytdl_version):
logger.error(want_ytdl_version_msg
% {'have_version': youtube_dl.version.__version__, 'want_version': want_ytdl_version})
@ -528,82 +460,14 @@ class gPodderExtension:
if youtube_dl.utils.version_tuple(youtube_dl.version.__version__) < youtube_dl.utils.version_tuple(want_ytdl_version):
ui_object.notification(want_ytdl_version_msg %
{'have_version': youtube_dl.version.__version__, 'want_version': want_ytdl_version},
_('Old youtube-dl'), important=True, widget=ui_object.main_window)
_('Old Youtube-DL'), important=True, widget=ui_object.main_window)
def on_episodes_context_menu(self, episodes):
if not self.container.config.manage_downloads and any(e.can_download() for e in episodes):
return [(_("Download with youtube-dl"), self.download_episodes)]
if not self.container.config.manage_downloads \
and not all(e.was_downloaded(and_exists=True) for e in episodes):
return [(_("Download with Youtube-DL"), self.download_episodes)]
def download_episodes(self, episodes):
episodes = [e for e in episodes if e.can_download()]
# create a new gPodderYoutubeDL to force using it even if manage_downloads is False
downloader = gPodderYoutubeDL(self.container.manager.core.config, self.container.config, force=True)
self.gpodder.download_episode_list(episodes, downloader=downloader)
def toggle_manage_channel(self, widget):
self.container.config.manage_channel = widget.get_active()
def toggle_manage_downloads(self, widget):
self.container.config.manage_downloads = widget.get_active()
def toggle_embed_subtitles(self, widget):
if widget.get_active():
if not util.find_command('ffmpeg'):
self.infobar.show()
widget.set_active(False)
self.container.config.embed_subtitles = False
else:
self.container.config.embed_subtitles = True
else:
self.container.config.embed_subtitles = False
def show_preferences(self):
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
box.set_border_width(10)
label = Gtk.Label('%s %s' % (program_name, youtube_dl.version.__version__))
box.pack_start(label, False, False, 0)
box.pack_start(Gtk.HSeparator(), False, False, 0)
checkbox = Gtk.CheckButton(_('Parse YouTube channel feeds with youtube-dl to access more than 15 episodes'))
checkbox.set_active(self.container.config.manage_channel)
checkbox.connect('toggled', self.toggle_manage_channel)
box.pack_start(checkbox, False, False, 0)
box.pack_start(Gtk.HSeparator(), False, False, 0)
checkbox = Gtk.CheckButton(_('Download all supported episodes with youtube-dl'))
checkbox.set_active(self.container.config.manage_downloads)
checkbox.connect('toggled', self.toggle_manage_downloads)
box.pack_start(checkbox, False, False, 0)
note = Gtk.Label(use_markup=True, wrap=True, label=_(
'youtube-dl provides access to additional YouTube formats and DRM content.'
' Episodes from non-YouTube channels, that have youtube-dl support, will <b>fail</b> to download unless you manually'
' <a href="https://gpodder.github.io/docs/youtube.html#formats">add custom formats</a> for each site.'
' <b>Download with youtube-dl</b> appears in the episode menu when this option is disabled,'
' and can be used to manually download from supported sites.'))
note.connect('activate-link', lambda label, url: util.open_website(url))
note.set_property('xalign', 0.0)
box.add(note)
box.pack_start(Gtk.HSeparator(), False, False, 0)
checkbox = Gtk.CheckButton(_('Embed all available subtitles in downloaded video'))
checkbox.set_active(self.container.config.embed_subtitles)
checkbox.connect('toggled', self.toggle_embed_subtitles)
box.pack_start(checkbox, False, False, 0)
infobar = Gtk.InfoBar()
infobar.get_content_area().add(Gtk.Label(wrap=True, label=_(
'The "ffmpeg" command was not found. FFmpeg is required for embedding subtitles.')))
self.infobar = infobar
box.pack_end(infobar, False, False, 0)
box.show_all()
infobar.hide()
return box
def on_preferences(self):
return [(_('youtube-dl'), self.show_preferences)]

View File

@ -1,839 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<!--*- mode: xml -*-->
<interface>
<requires lib="gtk+" version="3.24"/>
<requires lib="libhandy" version="1.0"/>
<object class="HdyApplicationWindow" id="gPodder">
<property name="can-focus">False</property>
<property name="default-height">480</property>
<signal name="delete-event" handler="on_gPodder_delete_event" swapped="no"/>
<child>
<object class="GtkOverlay" id="main_overlay">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="HdyLeaflet" id="leaflet">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="visible-child">channelsbox</property>
<property name="can-swipe-back">True</property>
<property name="can-swipe-forward">True</property>
<child>
<object class="GtkBox" id="channelsbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<object class="HdyHeaderBar" id="header_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="title" translatable="yes">gPodder adaptive</property>
<property name="show-close-button" bind-source="leaflet" bind-property="folded" bind-flags="sync-create">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="HdySearchBar" id="channels_search_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="HdyClamp">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="maximum-size">400</property>
<property name="tightening-threshold">200</property>
<child>
<object class="GtkEntry" id="entry_search_channels">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">none</property>
<property name="secondary-icon-name">edit-delete-symbolic</property>
<property name="primary-icon-activatable">False</property>
<property name="primary-icon-sensitive">False</property>
<property name="placeholder-text" translatable="yes">Search channels</property>
<signal name="icon-release" handler="on_entry_search_icon_release" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="channels_scrolled_window">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="vexpand">True</property>
<property name="vscrollbar-policy">always</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="treeChannels">
<property name="height-request">-1</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="has-tooltip">True</property>
<property name="hexpand">True</property>
<property name="headers-visible">False</property>
<property name="enable-search">False</property>
<property name="show-expanders">False</property>
<property name="activate-on-single-click">True</property>
<signal name="button-press-event" handler="on_treeview_button_pressed" swapped="no"/>
<signal name="button-release-event" handler="on_treeview_channels_button_released" swapped="no"/>
<signal name="cursor-changed" handler="on_treeChannels_cursor_changed" swapped="no"/>
<signal name="draw" handler="on_treeview_expose_event" swapped="no"/>
<signal name="query-tooltip" handler="on_treeview_query_tooltip" swapped="no"/>
<signal name="row-activated" handler="on_treeChannels_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRevealer" id="update_revealer">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="transition-type">slide-up</property>
<property name="transition-duration">500</property>
<child>
<object class="GtkBox" id="hboxUpdateFeeds">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkProgressBar" id="pbFeedUpdate">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="pulse-step">0.10000000149</property>
<property name="show-text">True</property>
<property name="ellipsize">middle</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnCancelFeedUpdate">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<signal name="clicked" handler="on_btnCancelFeedUpdate_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="image3209">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="stock">gtk-cancel</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkSeparator">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
<packing>
<property name="navigatable">False</property>
</packing>
</child>
<child>
<object class="GtkBox" id="contentbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<object class="HdyDeck" id="deck">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="vexpand">True</property>
<property name="visible-child">episodesbox</property>
<property name="can-swipe-back">True</property>
<child>
<object class="GtkBox" id="episodesbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="HdyHeaderBar" id="episodes_header_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="show-close-button">True</property>
<child type="title">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkMenuButton" id="view_menubutton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="focus-on-click">False</property>
<property name="receives-default">True</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Downloaded</property>
<property name="justify">right</property>
<property name="ellipsize">end</property>
<property name="width-chars">9</property>
<property name="max-width-chars">9</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="GtkMenuButton" id="sort_menubutton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="focus-on-click">False</property>
<property name="receives-default">True</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">by length</property>
<property name="ellipsize">end</property>
<property name="width-chars">7</property>
<property name="max-width-chars">7</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="sortorder_button">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_episode_list_sortorder_clicked" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">view-sort-ascending-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkToggleButton" id="episode_search_toggle">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">system-search-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="episode_list_back">
<property name="visible" bind-source="leaflet" bind-property="folded" bind-flags="sync-create">False</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="relief">none</property>
<signal name="clicked" handler="on_episode_list_back_clicked" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">go-previous-symbolic</property>
</object>
</child>
</object>
<packing>
<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="HdySearchBar" id="episodes_search_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="HdyClamp">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="maximum-size">400</property>
<property name="tightening-threshold">200</property>
<child>
<object class="GtkEntry" id="entry_search_episodes">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">none</property>
<property name="secondary-icon-name">edit-delete-symbolic</property>
<property name="primary-icon-activatable">False</property>
<property name="primary-icon-sensitive">False</property>
<property name="placeholder-text" translatable="yes">Search episodes</property>
<signal name="icon-release" handler="on_entry_search_icon_release" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="episodes_scrolled_window">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="vexpand">True</property>
<property name="vscrollbar-policy">always</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="treeAvailable">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="has-tooltip">True</property>
<property name="vexpand">False</property>
<property name="headers-visible">False</property>
<property name="enable-search">False</property>
<property name="activate-on-single-click">True</property>
<signal name="button-press-event" handler="on_treeview_button_pressed" swapped="no"/>
<signal name="button-release-event" handler="on_treeview_episodes_button_released" swapped="no"/>
<signal name="draw" handler="on_treeview_expose_event" swapped="no"/>
<signal name="query-tooltip" handler="on_treeview_query_tooltip" swapped="no"/>
<signal name="row-activated" handler="on_treeAvailable_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="detailsbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<object class="HdyHeaderBar" id="details_header_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="has-subtitle">False</property>
<property name="show-close-button">True</property>
<child type="title">
<object class="GtkButtonBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">center</property>
<property name="homogeneous">True</property>
<property name="layout-style">expand</property>
<child>
<object class="GtkButton" id="play_button">
<property name="label" translatable="yes">Play</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="hexpand">True</property>
<signal name="clicked" handler="on_playback_selected_episodes" 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="dl_del_button">
<property name="label" translatable="yes">Download</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkToggleButton" id="new_toggle">
<property name="label" translatable="yes">New</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="toggled" handler="on_new_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="pack-type">end</property>
</packing>
</child>
<child>
<object class="GtkButton" id="deck_back">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="relief">none</property>
<signal name="clicked" handler="on_deck_back_clicked" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">go-previous-symbolic</property>
</object>
</child>
</object>
</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="shownotes_box">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="index">-1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="HdyHeaderGroup">
<property name="decorate-all">True</property>
<headerbars>
<headerbar name="header_bar"/>
<headerbar name="episodes_header_bar"/>
<headerbar name="details_header_bar"/>
</headerbars>
</object>
<object class="GtkPopover" id="header_popover">
<property name="width-request">300</property>
<property name="can-focus">False</property>
<property name="border-width">10</property>
<property name="relative-to">header_bar</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">8</property>
<child>
<object class="GtkButton" id="hbutton1">
<property name="label" translatable="yes">Preferences</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="action-name">app.preferences</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="hbutton2">
<property name="label" translatable="yes">Download new episodes</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="action-name">win.downloadAllNew</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="hbutton3">
<property name="label" translatable="yes">Update channels</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="action-name">win.update</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<style>
<class name="menu"/>
</style>
</object>
<object class="GtkWindow" id="progress_window">
<property name="can-focus">False</property>
<child>
<object class="GtkBox">
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkInfoBar" id="resume_all_infobar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="message-type">question</property>
<property name="show-close-button">True</property>
<property name="revealed">False</property>
<signal name="response" handler="on_resume_all_infobar_response" swapped="no"/>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can-focus">False</property>
<property name="spacing">6</property>
<property name="layout-style">end</property>
<child>
<object class="GtkButton" id="resume_all_button">
<property name="label" translatable="yes">Resume all</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</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="position">0</property>
</packing>
</child>
<child internal-child="content_area">
<object class="GtkBox">
<property name="can-focus">False</property>
<property name="spacing">16</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Incomplete downloads from a previous session were found.</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</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="position">0</property>
</packing>
</child>
<action-widgets>
<action-widget response="-5">resume_all_button</action-widget>
</action-widgets>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="treeDownloads">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="headers-visible">False</property>
<property name="reorderable">True</property>
<property name="rubber-banding">True</property>
<signal name="button-press-event" handler="on_treeview_button_pressed" swapped="no"/>
<signal name="button-release-event" handler="on_treeview_downloads_button_released" swapped="no"/>
<signal name="draw" handler="on_treeview_expose_event" swapped="no"/>
<signal name="row-activated" handler="on_treeDownloads_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">5</property>
<property name="spacing">5</property>
<child>
<object class="GtkCheckButton" id="cbLimitDownloads">
<property name="label" translatable="yes">Limit rate to</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<signal name="toggled" handler="on_cbLimitDownloads_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spinLimitDownloads">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="invisible-char">●</property>
<property name="text" translatable="yes">0,0</property>
<property name="climb-rate">1</property>
<property name="digits">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="labelLimitRate">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">KiB/s</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</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">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">5</property>
<property name="spacing">5</property>
<child>
<object class="GtkCheckButton" id="cbMaxDownloads">
<property name="label" translatable="yes">Limit downloads to</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<signal name="toggled" handler="on_cbMaxDownloads_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spinMaxDownloads">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="invisible-char">●</property>
<property name="text" translatable="yes">0</property>
<property name="climb-rate">1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButtonBox">
<property name="can-focus">False</property>
<property name="margin-end">5</property>
<property name="margin-bottom">5</property>
<property name="layout-style">end</property>
<child>
<object class="GtkButton" id="progress_close_button">
<property name="label" translatable="yes">Close</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_progress_close_button_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="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,280 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<!--*- mode: xml -*-->
<interface>
<requires lib="gtk+" version="3.20"/>
<requires lib="libhandy" version="1.0"/>
<object class="HdyWindow" id="gPodderEpisodeSelector">
<property name="can-focus">False</property>
<child>
<object class="HdyDeck" id="new_deck">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can-swipe-back">True</property>
<child>
<object class="GtkBox" id="new_episodes_box">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<object class="HdyHeaderBar" id="selector_header_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="title" translatable="yes">Select episodes</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="labelInstructions">
<property name="can-focus">False</property>
<property name="margin-start">8</property>
<property name="margin-end">8</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="label">additional text</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow7">
<property name="visible">True</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="headers-visible">False</property>
<property name="enable-search">False</property>
<property name="show-expanders">False</property>
<property name="activate-on-single-click">True</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="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkFlowBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="min-children-per-line">1</property>
<property name="max-children-per-line">2</property>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkButtonBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="layout-style">start</property>
<child>
<object class="GtkButton" id="btnCheckAll">
<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>
<signal name="clicked" handler="on_btnCheckAll_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
<property name="non-homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnCheckNone">
<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>
<signal name="clicked" handler="on_btnCheckNone_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
<property name="non-homogeneous">True</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkLabel" id="labelTotalSize">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">8</property>
<property name="margin-end">8</property>
<property name="margin-top">8</property>
<property name="justify">right</property>
<property name="xalign">1</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkButtonBox" id="hbox1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="layout-style">end</property>
<child>
<object class="GtkButton" id="btnRemoveAction">
<property name="label">Remove</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="use-stock">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">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">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnOK">
<property name="label">gtk-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-stock">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">False</property>
<property name="position">6</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="detailsbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<child>
<object class="HdyHeaderBar" id="details_header_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="title" translatable="yes">Episode details</property>
<property name="has-subtitle">False</property>
<child>
<object class="GtkButton" id="stream_button">
<property name="label" translatable="yes">Stream</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_stream_button_clicked" swapped="no"/>
</object>
<packing>
<property name="pack-type">end</property>
</packing>
</child>
<child>
<object class="GtkButton" id="notes_back">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_notes_back_clicked" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">go-previous-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="position">1</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="shownotes_box">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,289 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<requires lib="libhandy" version="1.2"/>
<object class="GtkWindow" id="gPodderPodcastDirectory">
<property name="can-focus">False</property>
<property name="border-width">6</property>
<property name="modal">True</property>
<property name="window-position">center-on-parent</property>
<property name="default-width">600</property>
<property name="default-height">400</property>
<property name="type-hint">dialog</property>
<child>
<object class="GtkBox" id="vb_directory">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="HdyFlap" id="directory_flap">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="vexpand">True</property>
<property name="flap-position">end</property>
<child type="content">
<object class="GtkBox" id="vb_podcasts">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox" id="hb_text_entry">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="lb_search">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="en_query">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="invisible-char">•</property>
<property name="primary-icon-activatable">False</property>
<property name="secondary-icon-activatable">False</property>
<signal name="activate" handler="on_bt_search_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="bt_search">
<property name="label" translatable="yes">...</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_bt_search_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</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="GtkScrolledWindow" id="sw_tagcloud">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="sw_podcasts">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hscrollbar-policy">never</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="tv_podcasts">
<property name="width-request">300</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="headers-visible">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<child type="separator">
<placeholder/>
</child>
<child type="flap">
<object class="GtkScrolledWindow" id="sw_providers">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hscrollbar-policy">never</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="tv_providers">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="headers-visible">False</property>
<property name="enable-search">False</property>
<signal name="cursor-changed" handler="on_tv_providers_cursor_changed" swapped="no"/>
<signal name="row-activated" handler="on_tv_providers_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFlowBox" id="flowbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="min-children-per-line">1</property>
<property name="max-children-per-line">2</property>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkButtonBox" id="selectbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="layout-style">start</property>
<child>
<object class="GtkButton" id="btnSelectAll">
<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>
<property name="use-underline">True</property>
<signal name="clicked" handler="on_btnSelectAll_clicked" 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="btnSelectNone">
<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>
<property name="use-underline">True</property>
<signal name="clicked" handler="on_btnSelectNone_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkButtonBox" id="addbox">
<property name="visible">True</property>
<property name="can-focus">False</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="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>
<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="GtkButton" id="btnOK">
<property name="label" translatable="yes">Add</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<signal name="clicked" handler="on_btnOK_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<child type="titlebar">
<object class="HdyHeaderBar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="title" translatable="yes">Find new podcasts</property>
<property name="has-subtitle">False</property>
<property name="show-close-button">True</property>
<child>
<object class="GtkToggleButton" id="providers_show">
<property name="visible">True</property>
<property name="sensitive" bind-source="directory_flap" bind-property="folded" bind-flags="sync-create">False</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="active" bind-source="directory_flap" bind-property="reveal-flap" bind-flags="sync-create">False</property>
<signal name="toggled" handler="on_providers_show_toggled" swapped="no"/>
<child>
<object class="GtkImage" id="flap_show_image">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</child>
</object>
<packing>
<property name="pack-type">end</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,446 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="app-menu">
<section>
<item>
<attribute name="action">app.preferences</attribute>
<attribute name="label" translatable="yes">Preferences</attribute>
<attribute name="accel">&lt;Primary&gt;p</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">app.gotoMygpo</attribute>
<attribute name="label" translatable="yes">Go to gpodder.net</attribute>
</item>
<item>
<attribute name="action">win.sync</attribute>
<attribute name="label" translatable="yes">Sync to device</attribute>
<attribute name="accel">&lt;Primary&gt;d</attribute>
</item>
<item>
<attribute name="action">win.showProgress</attribute>
<attribute name="label" translatable="yes">Show transfers</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Help</attribute>
<attribute name="action">app.help</attribute>
</item>
<item>
<attribute name="action">app.about</attribute>
<attribute name="label" translatable="yes">About</attribute>
</item>
<item>
<attribute name="action">app.quit</attribute>
<attribute name="label" translatable="yes">Quit</attribute>
<attribute name="accel">&lt;Primary&gt;q</attribute>
</item>
</section>
</menu>
<menu id="menubar">
<submenu id="menuPodcasts">
<attribute name="label" translatable="yes">_Podcasts</attribute>
<section>
<item>
<attribute name="action">win.update</attribute>
<attribute name="label" translatable="yes">Check for new episodes</attribute>
<attribute name="accel">&lt;Primary&gt;r</attribute>
</item>
<item>
<attribute name="action">win.downloadAllNew</attribute>
<attribute name="label" translatable="yes">Download new episodes</attribute>
<attribute name="accel">&lt;Primary&gt;n</attribute>
</item>
<item>
<attribute name="action">win.removeOldEpisodes</attribute>
<attribute name="label" translatable="yes">Delete episodes</attribute>
<attribute name="accel">&lt;Primary&gt;k</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.findPodcast</attribute>
<attribute name="label" translatable="yes">Find Podcast</attribute>
<attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;f</attribute>
</item>
</section>
</submenu>
<submenu id="menuSubscriptions">
<attribute name="label" translatable="yes">_Subscriptions</attribute>
<section>
<item>
<attribute name="action">win.discover</attribute>
<attribute name="label" translatable="yes">Discover new podcasts</attribute>
</item>
<item>
<attribute name="action">win.addChannel</attribute>
<attribute name="label" translatable="yes">Add podcast via URL</attribute>
<attribute name="accel">&lt;Primary&gt;l</attribute>
</item>
<item>
<attribute name="action">win.massUnsubscribe</attribute>
<attribute name="label" translatable="yes">Delete podcasts</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.updateChannel</attribute>
<attribute name="label" translatable="yes">Update podcast</attribute>
</item>
<item>
<attribute name="action">win.editChannel</attribute>
<attribute name="label" translatable="yes">Podcast settings</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.importFromFile</attribute>
<attribute name="label" translatable="yes">Import from OPML file</attribute>
</item>
<item>
<attribute name="action">win.exportChannels</attribute>
<attribute name="label" translatable="yes">Export to OPML file</attribute>
</item>
</section>
</submenu>
<submenu id="menuEpisodes">
<attribute name="label" translatable="yes">_Episodes</attribute>
<section>
<item>
<attribute name="action">win.play</attribute>
<attribute name="label" translatable="yes">Play</attribute>
<attribute name="accel">&lt;Shift&gt;Return</attribute>
</item>
<item>
<attribute name="action">win.open</attribute>
<attribute name="label" translatable="yes">Open</attribute>
</item>
<item>
<attribute name="action">app.download</attribute>
<attribute name="label" translatable="yes">Download</attribute>
</item>
<item>
<attribute name="action">app.pause</attribute>
<attribute name="label" translatable="yes">Pause</attribute>
</item>
<item>
<attribute name="action">app.cancel</attribute>
<attribute name="label" translatable="yes">Cancel</attribute>
</item>
<item>
<attribute name="action">win.delete</attribute>
<attribute name="label" translatable="yes">Delete</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.toggleEpisodeNew</attribute>
<attribute name="label" translatable="yes">Toggle new status</attribute>
<attribute name="accel">&lt;Primary&gt;e</attribute>
</item>
<item>
<attribute name="action">win.toggleEpisodeLock</attribute>
<attribute name="label" translatable="yes">Change delete lock</attribute>
</item>
</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">&lt;Primary&gt;f</attribute>
</item>
<item>
<attribute name="action">win.toggleShownotes</attribute>
<attribute name="label" translatable="yes">Episode details</attribute>
</item>
</section>
</submenu>
<submenu id="menuExtras">
<attribute name="label" translatable="yes">E_xtras</attribute>
<item>
<attribute name="action">win.sync</attribute>
<attribute name="label" translatable="yes">Sync to device</attribute>
<attribute name="accel">&lt;Primary&gt;s</attribute>
</item>
</submenu>
<submenu id="menuView">
<attribute name="label" translatable="yes">_View</attribute>
<section>
<item>
<attribute name="action">win.showToolbar</attribute>
<attribute name="label" translatable="yes">Toolbar</attribute>
<attribute name="accel">&lt;Primary&gt;t</attribute>
</item>
<item>
<attribute name="action">win.showEpisodeDescription</attribute>
<attribute name="label" translatable="yes">Episode descriptions</attribute>
<attribute name="accel">&lt;Primary&gt;d</attribute>
</item>
<item>
<attribute name="action">win.searchAlwaysVisible</attribute>
<attribute name="label" translatable="yes">Always show Find entries</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.viewEpisodes</attribute>
<attribute name="label" translatable="yes">All episodes</attribute>
<attribute name="target">VIEW_ALL</attribute>
<attribute name="accel">&lt;Primary&gt;0</attribute>
</item>
<item>
<attribute name="action">win.viewEpisodes</attribute>
<attribute name="label" translatable="yes">Hide deleted episodes</attribute>
<attribute name="target">VIEW_UNDELETED</attribute>
<attribute name="accel">&lt;Primary&gt;1</attribute>
</item>
<item>
<attribute name="action">win.viewEpisodes</attribute>
<attribute name="label" translatable="yes">Downloaded episodes</attribute>
<attribute name="target">VIEW_DOWNLOADED</attribute>
<attribute name="accel">&lt;Primary&gt;2</attribute>
</item>
<item>
<attribute name="action">win.viewEpisodes</attribute>
<attribute name="label" translatable="yes">Unplayed episodes</attribute>
<attribute name="target">VIEW_UNPLAYED</attribute>
<attribute name="accel">&lt;Primary&gt;3</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.viewHideBoringPodcasts</attribute>
<attribute name="label" translatable="yes">Hide podcasts without episodes</attribute>
</item>
<item>
<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>
</submenu>
</submenu>
</menu>
<menu id="channels-context">
<section>
<item>
<attribute name="action">win.updateChannel</attribute>
<attribute name="label" translatable="yes">Update channel</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.openChannelDownloadFolder</attribute>
<attribute name="label" translatable="yes">Open download folder</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.markEpisodesAsOld</attribute>
<attribute name="label" translatable="yes">Mark episodes as old</attribute>
</item>
<item>
<attribute name="action">win.channelAutoArchive</attribute>
<attribute name="label" translatable="yes">Archive all episodes</attribute>
</item>
<item>
<attribute name="action">win.removeChannel</attribute>
<attribute name="label" translatable="yes">Delete channel</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.editChannel</attribute>
<attribute name="label" translatable="yes">Channel settings</attribute>
</item>
</section>
</menu>
<menu id="episodes-context">
<section>
<item>
<attribute name="action">win.play</attribute>
<attribute name="label" translatable="yes">Play</attribute>
</item>
<item>
<attribute name="action">app.download</attribute>
<attribute name="label" translatable="yes">Download</attribute>
</item>
<!-- Cancel -->
<item>
<attribute name="action">win.delete</attribute>
<attribute name="label" translatable="yes">Delete</attribute>
</item>
</section>
<!-- Extensions -->
<!-- Send To -->
<section>
<item>
<attribute name="action">win.episodeNew</attribute>
<attribute name="label" translatable="yes">New</attribute>
</item>
<item>
<attribute name="action">win.episodeLock</attribute>
<attribute name="label" translatable="yes">Archive</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.toggleShownotes</attribute>
<attribute name="label" translatable="yes">Episode details</attribute>
</item>
<item>
<attribute name="action">win.openEpisodeDownloadFolder</attribute>
<attribute name="label" translatable="yes">Open download folder</attribute>
</item>
</section>
</menu>
<menu id="episodes-context-sendto">
<item>
<attribute name="action">win.saveEpisodes</attribute>
<attribute name="label" translatable="yes">Local folder</attribute>
</item>
<item>
<attribute name="action">win.bluetoothEpisodes</attribute>
<attribute name="label" translatable="yes">Bluetooth device</attribute>
</item>
</menu>
<menu id="downloads-context">
<section>
<item>
<attribute name="action">app.download</attribute>
<attribute name="label" translatable="yes">Start download now</attribute>
</item>
<item>
<attribute name="action">app.pause</attribute>
<attribute name="label" translatable="yes">Pause</attribute>
</item>
<item>
<attribute name="action">app.cancel</attribute>
<attribute name="label" translatable="yes">Cancel</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">app.moveUp</attribute>
<attribute name="label" translatable="yes">Move up</attribute>
</item>
<item>
<attribute name="action">app.moveDown</attribute>
<attribute name="label" translatable="yes">Move down</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">app.remove</attribute>
<attribute name="label" translatable="yes">Remove from list</attribute>
</item>
</section>
</menu>
<menu id="plus-menu">
<section>
<item>
<attribute name="action">win.addChannel</attribute>
<attribute name="label" translatable="yes">Add podcast via URL</attribute>
<attribute name="accel">&lt;Primary&gt;l</attribute>
</item>
<item>
<attribute name="action">win.discover</attribute>
<attribute name="label" translatable="yes">Discover new podcasts</attribute>
</item>
<item>
<attribute name="action">win.massUnsubscribe</attribute>
<attribute name="label" translatable="yes">Delete podcasts</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.downloadAllNew</attribute>
<attribute name="label" translatable="yes">Download new episodes</attribute>
<attribute name="accel">&lt;Primary&gt;n</attribute>
</item>
<item>
<attribute name="action">win.removeOldEpisodes</attribute>
<attribute name="label" translatable="yes">Delete episodes</attribute>
<attribute name="accel">&lt;Primary&gt;k</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.importFromFile</attribute>
<attribute name="label" translatable="yes">Import from OPML file</attribute>
</item>
<item>
<attribute name="action">win.exportChannels</attribute>
<attribute name="label" translatable="yes">Export to OPML file</attribute>
</item>
</section>
</menu>
<menu id="view-menu">
<section>
<item>
<attribute name="action">win.viewEpisodes</attribute>
<attribute name="label" translatable="yes">All episodes</attribute>
<attribute name="target">VIEW_ALL</attribute>
<attribute name="accel">&lt;Primary&gt;0</attribute>
</item>
<item>
<attribute name="action">win.viewEpisodes</attribute>
<attribute name="label" translatable="yes">Hide deleted episodes</attribute>
<attribute name="target">VIEW_UNDELETED</attribute>
<attribute name="accel">&lt;Primary&gt;1</attribute>
</item>
<item>
<attribute name="action">win.viewEpisodes</attribute>
<attribute name="label" translatable="yes">Downloaded episodes</attribute>
<attribute name="target">VIEW_DOWNLOADED</attribute>
<attribute name="accel">&lt;Primary&gt;2</attribute>
</item>
<item>
<attribute name="action">win.viewEpisodes</attribute>
<attribute name="label" translatable="yes">Unplayed episodes</attribute>
<attribute name="target">VIEW_UNPLAYED</attribute>
<attribute name="accel">&lt;Primary&gt;3</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.showProgress</attribute>
<attribute name="label" translatable="yes">Show transfers</attribute>
</item>
</section>
</menu>
<menu id="sort-menu">
<item>
<attribute name="action">win.sortEpisodes</attribute>
<attribute name="label" translatable="yes">Sort by release date</attribute>
<attribute name="target">SORT_PUBLISHED</attribute>
<attribute name="accel">&lt;Primary&gt;0</attribute>
</item>
<item>
<attribute name="action">win.sortEpisodes</attribute>
<attribute name="label" translatable="yes">Sort by length</attribute>
<attribute name="target">SORT_TOTAL_TIME</attribute>
<attribute name="accel">&lt;Primary&gt;1</attribute>
</item>
<item>
<attribute name="action">win.sortEpisodes</attribute>
<attribute name="label" translatable="yes">Sort by title</attribute>
<attribute name="target">SORT_TITLE</attribute>
<attribute name="accel">&lt;Primary&gt;2</attribute>
</item>
</menu>
</interface>
<!-- :noTabs=true:tabSize=2:indentSize=2: -->

View File

@ -1,58 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<?xml version="1.0" encoding="utf-8"?>
<!--*- mode: xml -*-->
<interface>
<requires lib="gtk+" version="3.16"/>
<!-- interface-requires gtk+ 3.10 -->
<object class="GtkAdjustment" id="adjustment1">
<property name="lower">0.5</property>
<property name="upper">10240</property>
<property name="step-increment">0.5</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>
</object>
<object class="GtkAdjustment" id="adjustment2">
<property name="lower">1</property>
<property name="upper">16</property>
<property name="step-increment">1</property>
<property name="lower">1</property>
<property name="page_increment">0</property>
<property name="step_increment">1</property>
<property name="page_size">0</property>
</object>
<object class="GtkApplicationWindow" id="gPodder">
<property name="name">gPodder</property>
<property name="can-focus">False</property>
<property name="application">app</property>
<property name="visible">False</property>
<property name="title">gPodder</property>
<property name="window-position">center</property>
<signal name="delete-event" handler="on_gPodder_delete_event" swapped="no"/>
<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"/>
<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="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-symbolic</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>
<property name="show_arrow">True</property>
<child>
<object class="GtkToolButton" id="toolDownload">
<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">Download</property>
<property name="icon-name">document-save-symbolic</property>
<signal name="clicked" handler="on_download_selected_episodes" swapped="no"/>
<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"/>
</object>
<packing>
<property name="expand">False</property>
@ -60,14 +56,14 @@
</packing>
</child>
<child>
<object class="GtkToolButton" id="toolPause">
<object class="GtkToolButton" id="toolPlay">
<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>
<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-symbolic</property>
<signal name="clicked" handler="on_pause_selected_episodes" swapped="no"/>
<signal handler="on_playback_selected_episodes" name="clicked"/>
</object>
<packing>
<property name="expand">False</property>
@ -77,12 +73,14 @@
<child>
<object class="GtkToolButton" id="toolCancel">
<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">Cancel</property>
<property name="icon-name">process-stop-symbolic</property>
<signal name="clicked" handler="on_item_cancel_download_activate" swapped="no"/>
<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"/>
</object>
<packing>
<property name="expand">False</property>
@ -92,7 +90,8 @@
<child>
<object class="GtkSeparatorToolItem" id="toolbutton3">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
</object>
<packing>
<property name="expand">False</property>
@ -102,10 +101,12 @@
<child>
<object class="GtkToolButton" id="toolPreferences">
<property name="visible">True</property>
<property name="can-focus">False</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="action-name">app.preferences</property>
<property name="label" translatable="yes">Preferences</property>
<property name="icon-name">preferences-other-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
@ -115,7 +116,8 @@
<child>
<object class="GtkSeparatorToolItem" id="toolbutton2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="visible_horizontal">True</property>
<property name="visible_vertical">True</property>
</object>
<packing>
<property name="expand">False</property>
@ -125,10 +127,12 @@
<child>
<object class="GtkToolButton" id="toolQuit">
<property name="visible">True</property>
<property name="can-focus">False</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="label" translatable="yes">Quit</property>
<property name="icon-name">application-exit-symbolic</property>
<signal name="clicked" handler="on_gPodder_delete_event" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@ -136,505 +140,348 @@
</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="can-focus">False</property>
<property name="orientation">horizontal</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="border-width">5</property>
<child>
<object class="GtkNotebook" id="wNotebook">
<property name="visible">True</property>
<property name="can-focus">True</property>
<signal name="switch-page" handler="on_wNotebook_switch_page" swapped="no"/>
<property name="can_focus">True</property>
<property name="show_tabs">True</property>
<property name="show_border">True</property>
<property name="tab_pos">GTK_POS_TOP</property>
<property name="scrollable">False</property>
<property name="enable_popup">False</property>
<signal handler="on_wNotebook_switch_page" name="switch_page"/>
<child>
<object class="GtkPaned" id="channelPaned">
<property name="border_width">5</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="border-width">5</property>
<property name="can_focus">True</property>
<property name="orientation">horizontal</property>
<child>
<!-- n-columns=1 n-rows=3 -->
<object class="GtkGrid" id="vboxChannelNavigator">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="row_spacing">5</property>
<property name="orientation">vertical</property>
<property name="row-spacing">5</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow6">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="vexpand">True</property>
<property name="shadow-type">in</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="vexpand">True</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<object class="GtkTreeView" id="treeChannels">
<property name="name">treeChannels</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<property name="rules_hint">False</property>
<property name="has-tooltip">True</property>
<property name="headers-visible">False</property>
<signal name="button-press-event" handler="on_treeview_button_pressed" swapped="no"/>
<signal name="button-release-event" handler="on_treeview_channels_button_released" swapped="no"/>
<signal name="cursor-changed" handler="on_treeChannels_cursor_changed" swapped="no"/>
<signal name="draw" handler="on_treeview_expose_event" swapped="no"/>
<signal name="query-tooltip" handler="on_treeview_query_tooltip" swapped="no"/>
<signal name="row-activated" handler="on_treeChannels_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<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>
<signal handler="on_treeChannels_row_activated" name="row_activated"/>
<signal handler="on_treeChannels_cursor_changed" name="cursor_changed"/>
<signal handler="on_treeview_query_tooltip" name="query-tooltip"/>
<signal handler="on_treeview_expose_event" name="draw"/>
<signal handler="on_treeview_button_pressed" name="button-press-event"/>
<signal handler="on_treeview_podcasts_button_released" name="button-release-event"/>
</object>
</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="hbox_search_podcasts">
<property name="can-focus">False</property>
<property name="column-spacing">6</property>
<property name="column_spacing">6</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkEntry" id="entry_search_podcasts">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="secondary-icon-name">edit-clear</property>
<property name="visible">True</property>
<property name="secondary-icon-stock">gtk-close</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<!-- n-columns=1 n-rows=2 -->
<object class="GtkGrid" id="vbox42">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="orientation">vertical</property>
<property name="hexpand">True</property>
<child>
<object class="GtkButton" id="btnUpdateFeeds">
<property name="label" translatable="yes">Check for new episodes</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="hexpand">True</property>
<property name="can_focus">True</property>
<property name="focus_on_click">True</property>
<property name="action-name">win.update</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<!-- n-columns=2 n-rows=1 -->
<object class="GtkGrid" id="hboxUpdateFeeds">
<property name="can-focus">False</property>
<property name="column-spacing">6</property>
<property name="column_spacing">6</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkProgressBar" id="pbFeedUpdate">
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="pulse-step">0.10000000149</property>
<property name="pulse_step">0.10000000149</property>
<property name="show-text">True</property>
<property name="ellipsize">middle</property>
<property name="ellipsize">PANGO_ELLIPSIZE_MIDDLE</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnCancelFeedUpdate">
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<signal name="clicked" handler="on_btnCancelFeedUpdate_clicked" swapped="no"/>
<property name="can_focus">True</property>
<property name="focus_on_click">True</property>
<signal handler="on_btnCancelFeedUpdate_clicked" name="clicked"/>
<child>
<object class="GtkImage" id="image3209">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">process-stop</property>
<property name="stock">gtk-cancel</property>
<property name="icon_size">4</property>
</object>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</packing>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">False</property>
<property name="resize">False</property>
</packing>
</child>
<child>
<!-- n-columns=1 n-rows=2 -->
<object class="GtkGrid" id="vbox_episode_list">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="row_spacing">6</property>
<property name="orientation">vertical</property>
<property name="row-spacing">6</property>
<child>
<object class="GtkScrolledWindow" id="scrollAvailable">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="shadow-type">in</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="hexpand">True</property>
<property name="vexpand">True</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<object class="GtkTreeView" id="treeAvailable">
<property name="name">treeAvailable</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">True</property>
<property name="rules_hint">True</property>
<property name="has-tooltip">True</property>
<property name="enable-search">False</property>
<property name="rubber-banding">True</property>
<signal name="button-press-event" handler="on_treeview_button_pressed" swapped="no"/>
<signal name="button-release-event" handler="on_treeview_episodes_button_released" swapped="no"/>
<signal name="draw" handler="on_treeview_expose_event" swapped="no"/>
<signal name="query-tooltip" handler="on_treeview_query_tooltip" swapped="no"/>
<signal name="row-activated" handler="on_treeAvailable_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<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 handler="on_treeAvailable_row_activated" name="row_activated"/>
<signal handler="on_treeview_query_tooltip" name="query-tooltip"/>
<signal handler="on_treeview_expose_event" name="draw"/>
<signal handler="on_treeview_button_pressed" name="button-press-event"/>
<signal handler="on_treeview_episodes_button_released" name="button-release-event"/>
</object>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<!-- n-columns=2 n-rows=1 -->
<object class="GtkGrid" id="hbox_search_episodes">
<property name="can-focus">False</property>
<property name="column-spacing">6</property>
<property name="column_spacing">6</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkLabel" id="label_search_episodes">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Filter:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_search_episodes">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="secondary-icon-name">edit-clear</property>
<property name="visible">True</property>
<property name="secondary-icon-stock">gtk-close</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">False</property>
<property name="resize">True</property>
</packing>
</child>
</object>
<packing>
<property name="tab_expand">False</property>
<property name="tab_fill">True</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Podcasts</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="tab-fill">False</property>
</packing>
</child>
<child>
<object class="GtkBox">
<object class="GtkGrid" id="vboxDownloadStatusWidgets">
<property name="border_width">5</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="row_spacing">5</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkInfoBar" id="resume_all_infobar">
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="message-type">question</property>
<property name="show-close-button">True</property>
<property name="revealed">False</property>
<signal name="response" handler="on_resume_all_infobar_response" swapped="no"/>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can-focus">False</property>
<property name="spacing">6</property>
<property name="layout-style">end</property>
<child>
<object class="GtkButton" id="resume_all_button">
<property name="label" translatable="yes">Resume all</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</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="position">0</property>
</packing>
</child>
<child internal-child="content_area">
<object class="GtkBox">
<property name="can-focus">False</property>
<property name="spacing">16</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Incomplete downloads from a previous session were found.</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</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="position">0</property>
</packing>
</child>
<action-widgets>
<action-widget response="-5">resume_all_button</action-widget>
</action-widgets>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</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="can_focus">True</property>
<property name="vexpand">True</property>
<property name="shadow-type">in</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>
<child>
<object class="GtkTreeView" id="treeDownloads">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="headers-visible">False</property>
<property name="reorderable">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<property name="rules_hint">False</property>
<property name="rubber-banding">True</property>
<signal name="button-press-event" handler="on_treeview_button_pressed" swapped="no"/>
<signal name="button-release-event" handler="on_treeview_downloads_button_released" swapped="no"/>
<signal name="draw" handler="on_treeview_expose_event" swapped="no"/>
<signal name="row-activated" handler="on_treeDownloads_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<property name="reorderable">True</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>
<signal handler="on_treeDownloads_row_activated" name="row_activated"/>
<signal handler="on_treeview_expose_event" name="draw"/>
<signal handler="on_treeview_button_pressed" name="button-press-event"/>
<signal handler="on_treeview_downloads_button_released" name="button-release-event"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<object class="GtkGrid" id="hboxDownloadSettings">
<property name="border_width">5</property>
<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">10</property>
<property name="spacing">5</property>
<property name="column_spacing">10</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkBox">
<object class="GtkGrid" id="hboxDownloadLimit">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">5</property>
<property name="spacing">5</property>
<property name="column_spacing">5</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkCheckButton" id="cbLimitDownloads">
<property name="label" translatable="yes">Limit rate to</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<signal name="toggled" handler="on_cbLimitDownloads_toggled" swapped="no"/>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_cbLimitDownloads_toggled"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spinLimitDownloads">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="caps-lock-warning">False</property>
<property name="input-purpose">number</property>
<property name="adjustment">adjustment1</property>
<property name="climb-rate">1</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="climb_rate">1</property>
<property name="digits">1</property>
<property name="numeric">True</property>
<property name="update-policy">if-valid</property>
<property name="adjustment">adjustment1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="labelLimitRate">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">KiB/s</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">KiB/s</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</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">
<object class="GtkLabel" id="DownloadSettingsSpacer">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<property name="hexpand">True</property>
</object>
</child>
<child>
<object class="GtkGrid" id="hboxDownloadRate">
<property name="visible">True</property>
<property name="column_spacing">5</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkCheckButton" id="cbMaxDownloads">
<property name="label" translatable="yes">Limit downloads to</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
<signal name="toggled" handler="on_cbMaxDownloads_toggled" swapped="no"/>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_cbMaxDownloads_toggled"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spinMaxDownloads">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="caps-lock-warning">False</property>
<property name="input-purpose">number</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="climb_rate">1</property>
<property name="adjustment">adjustment2</property>
<property name="climb-rate">1</property>
<property name="snap-to-ticks">True</property>
<property name="numeric">True</property>
<property name="update-policy">if-valid</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
<property name="tab_expand">False</property>
<property name="tab_fill">True</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="labelDownloads">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Progress</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="position">1</property>
<property name="tab-fill">False</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
</object>

View File

@ -1,114 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<?xml version="1.0" encoding="utf-8"?>
<!--*- 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="default-width">400</property>
<property name="type-hint">dialog</property>
<property name="transient-for">parent_widget</property>
<property name="default_width">400</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="GtkButtonBox" id="hbuttonbox">
<property name="can-focus">False</property>
<property name="layout-style">end</property>
<object class="GtkHButtonBox" id="hbuttonbox">
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<object class="GtkButton" id="btn_close">
<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_btn_close_clicked" swapped="no"/>
<property name="label">gtk-cancel</property>
<property name="use_stock">True</property>
<signal handler="on_btn_close_clicked" name="clicked"/>
</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="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"/>
<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"/>
</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">end</property>
<property name="position">0</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
<child>
<object class="GtkBox" id="hboxurlentry">
<property name="border_width">10</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="border-width">10</property>
<property name="homogeneous">False</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="can-focus">True</property>
<property name="has-focus">True</property>
<property name="activates-default">True</property>
<property name="secondary-icon-name">edit-clear</property>
<signal name="changed" handler="on_entry_url_changed" swapped="no"/>
<property name="has_focus">True</property>
<property name="activates_default">True</property>
<signal handler="on_entry_url_changed" name="changed"/>
</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" translatable="yes">_Paste</property>
<property name="label">gtk-paste</property>
<property name="use_stock">True</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_btn_paste_clicked" swapped="no"/>
<signal handler="on_btn_paste_clicked" name="clicked"/>
</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>

File diff suppressed because it is too large Load Diff

View File

@ -1,136 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<?xml version="1.0" encoding="utf-8"?>
<!--*- 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="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"/>
<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"/>
<child internal-child="vbox">
<object class="GtkBox" id="vbox13">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="homogeneous">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="can-focus">False</property>
<property name="border-width">5</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox" id="hbox38">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="homogeneous">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="invisible-char">●</property>
<signal name="changed" handler="on_entryFilter_changed" swapped="no"/>
<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"/>
</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="receives-default">False</property>
<property name="use-underline">True</property>
<signal name="clicked" handler="on_btnShowAll_clicked" swapped="no"/>
<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"/>
</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="shadow-type">in</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>
<child>
<object class="GtkTreeView" id="configeditor">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<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>
</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>
<property name="position">1</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>
<property name="use_stock">True</property>
<property name="focus_on_click">True</property>
<signal handler="on_btnClose_clicked" name="clicked"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</object>

View File

@ -1,241 +1,294 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<?xml version="1.0" encoding="utf-8"?>
<!--*- mode: xml -*-->
<interface>
<requires lib="gtk+" version="3.16"/>
<object class="GtkDialog" id="gPodderEpisodeSelector">
<property name="can-focus">False</property>
<property name="visible">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="window-position">center-on-parent</property>
<property name="type-hint">dialog</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>
<child internal-child="vbox">
<object class="GtkBox" id="vbox10">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="homogeneous">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="can-focus">False</property>
<property name="border-width">5</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<property name="orientation">vertical</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="shadow-type">in</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>
<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="enable-search">False</property>
<signal name="row-activated" handler="on_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<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"/>
</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="can-focus">False</property>
<property name="homogeneous">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="receives-default">False</property>
<signal name="clicked" handler="on_btnCheckAll_clicked" swapped="no"/>
<property name="can_focus">True</property>
<property name="focus_on_click">True</property>
<signal handler="on_btnCheckAll_clicked" name="clicked"/>
<child>
<object class="GtkBox" id="hbox34">
<object class="GtkAlignment" id="alignment22">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">2</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>
<child>
<object class="GtkImage" id="image2636">
<object class="GtkBox" id="hbox34">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">object-select</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkImage" id="image2636">
<property name="visible">True</property>
<property name="stock">gtk-apply</property>
<property name="icon_size">4</property>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label107">
<property name="visible">True</property>
<property name="label" translatable="yes">Select all</property>
<property name="use_underline">True</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>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label107">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Select _all</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</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="GtkButton" id="btnCheckNone">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<signal name="clicked" handler="on_btnCheckNone_clicked" swapped="no"/>
<property name="can_focus">True</property>
<property name="focus_on_click">True</property>
<signal handler="on_btnCheckNone_clicked" name="clicked"/>
<child>
<object class="GtkBox" id="hbox33">
<object class="GtkAlignment" id="alignment21">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">2</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>
<child>
<object class="GtkImage" id="image2635">
<object class="GtkBox" id="hbox33">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">document-revert</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkImage" id="image2635">
<property name="visible">True</property>
<property name="stock">gtk-revert-to-saved</property>
<property name="icon_size">4</property>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label106">
<property name="visible">True</property>
<property name="label" translatable="yes">Select none</property>
<property name="use_underline">True</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>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label106">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Select _none</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="labelTotalSize">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="justify">right</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_RIGHT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</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">2</property>
</packing>
</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 internal-child="action_area">
<object class="GtkBox" id="hbox35">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">5</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkButton" id="btnRemoveAction">
<property name="visible">False</property>
<property name="can_focus">True</property>
<property name="label">Remove</property>
<property name="use_stock">True</property>
<property name="focus_on_click">True</property>
<signal handler="on_remove_action_activate" name="clicked"/>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnCancel">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-cancel</property>
<property name="use_stock">True</property>
<property name="focus_on_click">True</property>
<signal handler="on_btnCancel_clicked" name="clicked"/>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnOK">
<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-ok</property>
<property name="use_stock">True</property>
<property name="focus_on_click">True</property>
<signal handler="on_btnOK_clicked" name="clicked"/>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</object>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</object>

View File

@ -1,38 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<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>
<requires lib="gtk+" version="3.0"/>
<object class="GtkFileChooserDialog" id="gPodderExportToLocalFolder">
<property name="can-focus">True</property>
<property name="can_focus">False</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">False</property>
<property name="extra-widget">allsamefolder</property>
<property name="preview-widget-active">False</property>
<property name="use-preview-label">False</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>
<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>
<placeholder/>
<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>
</child>
<child>
<placeholder/>
<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>
</child>
</object>
<packing>
@ -43,5 +62,16 @@
</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

@ -1,43 +1,120 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<object class="GtkWindow" id="gPodderPodcastDirectory">
<property name="can-focus">False</property>
<property name="border-width">6</property>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkDialog" id="gPodderPodcastDirectory">
<property name="visible">False</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Find new podcasts</property>
<property name="modal">True</property>
<property name="window-position">center-on-parent</property>
<property name="default-width">600</property>
<property name="default-height">400</property>
<property name="type-hint">dialog</property>
<child>
<property name="transient-for">parent_widget</property>
<property name="window_position">center-on-parent</property>
<property name="default_width">600</property>
<property name="default_height">400</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkBox" id="vb_directory">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="orientation">vertical</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="hboxBottomButtons">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="btnSelectAll">
<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>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_btnSelectAll_clicked" 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="btnSelectNone">
<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>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_btnSelectNone_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="btnCancel">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">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">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btnOK">
<property name="label">gtk-add</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_btnOK_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkPaned" id="hpaned">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="can_focus">True</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkScrolledWindow" id="sw_providers">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hscrollbar-policy">never</property>
<property name="shadow-type">in</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="tv_providers">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="headers-visible">False</property>
<property name="enable-search">False</property>
<signal name="cursor-changed" handler="on_tv_providers_cursor_changed" swapped="no"/>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
<property name="enable_search">False</property>
<signal name="row-activated" handler="on_tv_providers_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<signal name="cursor-changed" handler="on_tv_providers_cursor_changed" swapped="no"/>
</object>
</child>
</object>
@ -49,18 +126,19 @@
<child>
<object class="GtkBox" id="vb_podcasts">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox" id="hb_text_entry">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkLabel" id="lb_search">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
@ -72,10 +150,12 @@
<child>
<object class="GtkEntry" id="en_query">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="invisible-char">•</property>
<property name="primary-icon-activatable">False</property>
<property name="secondary-icon-activatable">False</property>
<property name="can_focus">True</property>
<property name="invisible_char">•</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
<signal name="activate" handler="on_bt_search_clicked" swapped="no"/>
</object>
<packing>
@ -88,8 +168,8 @@
<object class="GtkButton" id="bt_search">
<property name="label" translatable="yes">...</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_bt_search_clicked" swapped="no"/>
</object>
<packing>
@ -108,7 +188,9 @@
<child>
<object class="GtkScrolledWindow" id="sw_tagcloud">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<placeholder/>
</child>
@ -122,17 +204,15 @@
<child>
<object class="GtkScrolledWindow" id="sw_podcasts">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hscrollbar-policy">never</property>
<property name="shadow-type">in</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">never</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="tv_podcasts">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="headers-visible">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
</object>
</child>
</object>
@ -152,112 +232,16 @@
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFlowBox" id="flowbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="min-children-per-line">1</property>
<property name="max-children-per-line">2</property>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkButtonBox" id="selectbox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="layout-style">start</property>
<child>
<object class="GtkButton" id="btnSelectAll">
<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>
<property name="use-underline">True</property>
<signal name="clicked" handler="on_btnSelectAll_clicked" 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="btnSelectNone">
<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>
<property name="use-underline">True</property>
<signal name="clicked" handler="on_btnSelectNone_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFlowBoxChild">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkButtonBox" id="addbox">
<property name="visible">True</property>
<property name="can-focus">False</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="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>
<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="GtkButton" id="btnOK">
<property name="label" translatable="yes">Add</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<signal name="clicked" handler="on_btnOK_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="0">btnSelectAll</action-widget>
<action-widget response="0">btnSelectNone</action-widget>
<action-widget response="0">btnCancel</action-widget>
<action-widget response="0">btnOK</action-widget>
</action-widgets>
</object>
</interface>

File diff suppressed because it is too large Load Diff

View File

@ -1,189 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<?xml version="1.0" encoding="utf-8"?>
<!--*- mode: xml -*-->
<interface>
<requires lib="gtk+" version="3.16"/>
<object class="GtkDialog" id="gPodderWelcome">
<property name="can-focus">False</property>
<property name="title" translatable="yes">Getting started</property>
<property name="default_height">230</property>
<property name="default_width">340</property>
<property name="modal">True</property>
<property name="default-width">340</property>
<property name="default-height">230</property>
<property name="type-hint">dialog</property>
<property name="transient-for">parent_widget</property>
<property name="title" translatable="yes">Getting started</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="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="border_width">12</property>
<property name="spacing">12</property>
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">&lt;big&gt;Welcome to gPodder&lt;/big&gt;</property>
<property name="use-markup">True</property>
<property name="xalign">0</property>
<property name="yalign">1</property>
<property name="use_markup">True</property>
<property name="visible">True</property>
<property name="xalign">0.0</property>
<property name="yalign">1.0</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="visible">True</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>
<property name="visible">True</property>
<property name="xalign">0.0</property>
<property name="yalign">0.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="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<property name="visible">True</property>
<property name="orientation">vertical</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>
<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>
<signal handler="on_show_example_podcasts" name="clicked"/>
</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>
<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>
<signal handler="on_add_podcast_via_url" name="clicked"/>
</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>
<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>
<signal handler="on_setup_my_gpodder" name="clicked"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog1-action_area">
<property name="border_width">5</property>
<property name="layout_style">end</property>
<property name="spacing">6</property>
<property name="visible">True</property>
<child>
<object class="GtkButton" id="btnCancel">
<property name="label">gtk-cancel</property>
<property name="use_stock">True</property>
<property name="visible">True</property>
<signal handler="on_btnCancel_clicked" name="clicked"/>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="pack_type">end</property>
</packing>
</child>
</object>

View File

@ -19,10 +19,6 @@
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Open Logs</attribute>
<attribute name="action">app.logs</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Help</attribute>
<attribute name="action">app.help</attribute>
@ -104,7 +100,7 @@
</item>
</section>
</submenu>
<submenu id="menuEpisodes">
<submenu id="menuChannels">
<attribute name="label" translatable="yes">_Episodes</attribute>
<section>
<item>
@ -120,10 +116,6 @@
<attribute name="action">win.download</attribute>
<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>
@ -144,16 +136,6 @@
<attribute name="label" translatable="yes">Change delete lock</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.openEpisodeDownloadFolder</attribute>
<attribute name="label" translatable="yes">Open download folder</attribute>
</item>
<item>
<attribute name="action">win.selectChannel</attribute>
<attribute name="label" translatable="yes">Select channel</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.findEpisode</attribute>
@ -182,25 +164,16 @@
<attribute name="label" translatable="yes">Toolbar</attribute>
<attribute name="accel">&lt;Primary&gt;t</attribute>
</item>
<item>
<attribute name="action">win.showEpisodeDescription</attribute>
<attribute name="label" translatable="yes">Episode descriptions</attribute>
<attribute name="accel">&lt;Primary&gt;d</attribute>
</item>
<item>
<attribute name="action">win.searchAlwaysVisible</attribute>
<attribute name="label" translatable="yes">Always show Find entries</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.viewHideBoringPodcasts</attribute>
<attribute name="label" translatable="yes">Hide podcasts without episodes</attribute>
</item>
<item>
<attribute name="action">win.viewShowAllEpisodes</attribute>
<attribute name="label" translatable="yes">"All episodes" in podcast list</attribute>
</item>
<item>
<attribute name="action">win.viewShowPodcastSections</attribute>
<attribute name="label" translatable="yes">Use sections for podcast list</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.viewEpisodes</attribute>
@ -228,155 +201,19 @@
</item>
</section>
<section>
<item>
<attribute name="action">win.viewHideBoringPodcasts</attribute>
<attribute name="label" translatable="yes">Hide podcasts without episodes</attribute>
</item>
<item>
<attribute name="action">win.viewAlwaysShowNewEpisodes</attribute>
<attribute name="label" translatable="yes">Always show New Episodes</attribute>
</item>
<item>
<attribute name="action">win.viewTrimEpisodeTitlePrefix</attribute>
<attribute name="label" translatable="yes">Trim episode title prefix</attribute>
</item>
<item>
<attribute name="action">win.viewShowEpisodeDescription</attribute>
<attribute name="label" translatable="yes">Episode descriptions</attribute>
<attribute name="accel">&lt;Primary&gt;d</attribute>
</item>
<item>
<attribute name="action">win.viewShowEpisodeReleasedTime</attribute>
<attribute name="label" translatable="yes">Show episode released time</attribute>
</item>
<item>
<attribute name="action">win.viewRightAlignEpisodeReleasedColumn</attribute>
<attribute name="label" translatable="yes">Right align episode released column</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>
</submenu>
</submenu>
</menu>
<menu id="channels-context">
<section>
<item>
<attribute name="action">win.updateChannel</attribute>
<attribute name="label" translatable="yes">Update channel</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.openChannelDownloadFolder</attribute>
<attribute name="label" translatable="yes">Open download folder</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.markEpisodesAsOld</attribute>
<attribute name="label" translatable="yes">Mark episodes as old</attribute>
</item>
<item>
<attribute name="action">win.channelAutoArchive</attribute>
<attribute name="label" translatable="yes">Archive all episodes</attribute>
</item>
<item>
<attribute name="action">win.refreshImage</attribute>
<attribute name="label" translatable="yes">Refresh image</attribute>
</item>
<item>
<attribute name="action">win.removeChannel</attribute>
<attribute name="label" translatable="yes">Delete channel</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.editChannel</attribute>
<attribute name="label" translatable="yes">Channel settings</attribute>
</item>
</section>
</menu>
<menu id="episodes-context">
<section>
<item>
<attribute name="action">win.play</attribute>
<attribute name="label" translatable="yes">Play</attribute>
</item>
<item>
<attribute name="action">win.download</attribute>
<attribute name="label" translatable="yes">Download</attribute>
</item>
<!-- Cancel -->
<item>
<attribute name="action">win.delete</attribute>
<attribute name="label" translatable="yes">Delete</attribute>
</item>
</section>
<!-- Extensions -->
<!-- Send To -->
<section>
<item>
<attribute name="action">win.episodeNew</attribute>
<attribute name="label" translatable="yes">New</attribute>
</item>
<item>
<attribute name="action">win.episodeLock</attribute>
<attribute name="label" translatable="yes">Archive</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.toggleShownotes</attribute>
<attribute name="label" translatable="yes">Episode details</attribute>
</item>
<item>
<attribute name="action">win.openEpisodeDownloadFolder</attribute>
<attribute name="label" translatable="yes">Open download folder</attribute>
</item>
</section>
</menu>
<menu id="episodes-context-sendto">
<item>
<attribute name="action">win.saveEpisodes</attribute>
<attribute name="label" translatable="yes">Local folder</attribute>
</item>
<item>
<attribute name="action">win.bluetoothEpisodes</attribute>
<attribute name="label" translatable="yes">Bluetooth device</attribute>
</item>
</menu>
<menu id="downloads-context">
<section>
<item>
<attribute name="action">win.download</attribute>
<attribute name="label" translatable="yes">Start download now</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>
</section>
<section>
<item>
<attribute name="action">win.moveUp</attribute>
<attribute name="label" translatable="yes">Move up</attribute>
</item>
<item>
<attribute name="action">win.moveDown</attribute>
<attribute name="label" translatable="yes">Move down</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.remove</attribute>
<attribute name="label" translatable="yes">Remove from list</attribute>
</item>
</section>
</menu>
</interface>
<!-- :noTabs=true:tabSize=2:indentSize=2: -->

View File

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="4.2333331mm"
height="4.2333331mm"
viewBox="0 0 4.2333331 4.2333331"
version="1.1"
id="svg10539"
sodipodi:docname="view-sidebar-end-symbolic.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1016"
id="namedview8"
showgrid="false"
inkscape:zoom="51.04843"
inkscape:cx="7.9999996"
inkscape:cy="7.9999996"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg10539" />
<defs
id="defs10533" />
<metadata
id="metadata10536">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="matrix(-1,0,0,1,-40.972619,-342.50834)">
<path
id="rect10509"
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#241f31;fill-opacity:1;stroke:none;stroke-width:1;marker:none"
d="M 3,2 C 1.9093002,2 1,2.9093039 1,4 v 8 c 0,1.090696 0.9093002,2 2,2 h 10 c 1.090704,0 2,-0.909304 2,-2 V 4 C 15,2.9093039 14.090704,2 13,2 Z m 0,2 h 3 v 8 H 3 Z m 4,0 h 6 v 8 H 7 Z"
transform="matrix(0.26458333,0,0,0.26458333,-45.205952,342.50834)" />
<rect
transform="matrix(0,-1,-1,0,0,0)"
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#241f31;fill-opacity:1;stroke:none;stroke-width:0.264583;marker:none"
id="rect10511"
width="2.1166327"
height="0.79374611"
x="-345.68332"
y="43.618412" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,44 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="4.2333331mm"
height="4.2333331mm"
viewBox="0 0 4.2333331 4.2333331"
version="1.1"
id="svg10539">
<defs
id="defs10533" />
<metadata
id="metadata10536">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="translate(45.205952,-342.50834)">
<path
id="rect10509"
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#241f31;fill-opacity:1;stroke:none;stroke-width:0.99999994;marker:none"
d="M 3 2 C 1.9093002 2 1 2.9093039 1 4 L 1 12 C 1 13.090696 1.9093002 14 3 14 L 13 14 C 14.090704 14 15 13.090696 15 12 L 15 4 C 15 2.9093039 14.090704 2 13 2 L 3 2 z M 3 4 L 6 4 L 6 12 L 3 12 L 3 4 z M 7 4 L 13 4 L 13 12 L 7 12 L 7 4 z "
transform="matrix(0.26458333,0,0,0.26458333,-45.205952,342.50834)" />
<rect
transform="matrix(0,-1,-1,0,0,0)"
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#241f31;fill-opacity:1;stroke:none;stroke-width:0.26458332;marker:none"
id="rect10511"
width="2.1166327"
height="0.79374611"
x="-345.68332"
y="43.618412" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 76 KiB

View File

@ -1,4 +1,4 @@
.TH GPO "1" "August 2023" "gpodder 3.11.2" "User Commands"
.TH GPO "1" "November 2020" "gpodder 3.10.17" "User Commands"
.SH NAME
gpo \- Text mode interface of gPodder
.SH SYNOPSIS

View File

@ -1,5 +1,5 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
.TH GPODDER "1" "August 2023" "gpodder 3.11.2" "User Commands"
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.16.
.TH GPODDER "1" "November 2020" "gpodder 3.10.17" "User Commands"
.SH NAME
gpodder \- Media aggregator and podcast client
.SH SYNOPSIS
@ -17,21 +17,12 @@ show program's version number and exit
.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\-\-close\-after\-startup\fR
exit once started up (for profiling)
\fB\-s\fR URL, \fB\-\-subscribe\fR=\fI\,URL\/\fR
subscribe to the feed at URL

Some files were not shown because too many files have changed in this diff Show More