Compare commits
2 Commits
debian/lat
...
win-remove
Author | SHA1 | Date |
---|---|---|
Eric Le Lay | ac49363597 | |
Eric Le Lay | ab76aa70a0 |
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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']
|
|
@ -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
|
|
@ -12,4 +12,3 @@ share/applications/gpodder-url-handler.desktop
|
|||
share/applications/gpodder.desktop
|
||||
share/dbus-1/services/org.gpodder.service
|
||||
share/locale/
|
||||
venv/*
|
||||
|
|
|
@ -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
|
|
@ -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`
|
18
README.md
18
README.md
|
@ -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
99
bin/gpo
|
@ -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
|
||||
|
||||
|
|
52
bin/gpodder
52
bin/gpodder
|
@ -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)
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
import configparser
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
|
||||
|
|
|
@ -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!
|
|
@ -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
|
|
@ -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.
|
|
@ -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 +0,0 @@
|
|||
README.md
|
|
@ -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
|
||||
},
|
|
@ -1,2 +0,0 @@
|
|||
disable_update_check_on_startup_default.patch
|
||||
switch-appindicator-extension-to-AyatanaAppIndicator-and-python3.patch
|
|
@ -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'
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
3.0 (quilt)
|
|
@ -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
|
22
makefile
22
makefile
|
@ -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
|
||||
|
||||
##########################################################################
|
||||
|
||||
|
||||
|
|
1779
po/cs_CZ.po
1779
po/cs_CZ.po
File diff suppressed because it is too large
Load Diff
1789
po/es_ES.po
1789
po/es_ES.po
File diff suppressed because it is too large
Load Diff
1778
po/es_MX.po
1778
po/es_MX.po
File diff suppressed because it is too large
Load Diff
1680
po/fa_IR.po
1680
po/fa_IR.po
File diff suppressed because it is too large
Load Diff
1666
po/id_ID.po
1666
po/id_ID.po
File diff suppressed because it is too large
Load Diff
1769
po/ko_KR.po
1769
po/ko_KR.po
File diff suppressed because it is too large
Load Diff
1671
po/messages.pot
1671
po/messages.pot
File diff suppressed because it is too large
Load Diff
1779
po/pt_BR.po
1779
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
1790
po/zh_CN.po
1790
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
|
5
setup.py
5
setup.py
|
@ -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'],
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)]
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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"><Primary>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"><Primary>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"><Primary>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"><Primary>r</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.downloadAllNew</attribute>
|
||||
<attribute name="label" translatable="yes">Download new episodes</attribute>
|
||||
<attribute name="accel"><Primary>n</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.removeOldEpisodes</attribute>
|
||||
<attribute name="label" translatable="yes">Delete episodes</attribute>
|
||||
<attribute name="accel"><Primary>k</attribute>
|
||||
</item>
|
||||
</section>
|
||||
<section>
|
||||
<item>
|
||||
<attribute name="action">win.findPodcast</attribute>
|
||||
<attribute name="label" translatable="yes">Find Podcast</attribute>
|
||||
<attribute name="accel"><Primary><Shift>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"><Primary>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"><Shift>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"><Primary>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"><Primary>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"><Primary>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"><Primary>t</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.showEpisodeDescription</attribute>
|
||||
<attribute name="label" translatable="yes">Episode descriptions</attribute>
|
||||
<attribute name="accel"><Primary>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"><Primary>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"><Primary>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"><Primary>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"><Primary>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"><Primary>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"><Primary>n</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.removeOldEpisodes</attribute>
|
||||
<attribute name="label" translatable="yes">Delete episodes</attribute>
|
||||
<attribute name="accel"><Primary>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"><Primary>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"><Primary>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"><Primary>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"><Primary>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"><Primary>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"><Primary>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"><Primary>2</attribute>
|
||||
</item>
|
||||
</menu>
|
||||
</interface>
|
||||
<!-- :noTabs=true:tabSize=2:indentSize=2: -->
|
|
@ -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">●</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">●</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>
|
||||
|
|
|
@ -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
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
@ -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"><big>Welcome to gPodder</big></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>
|
||||
|
|
|
@ -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"><Primary>t</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.showEpisodeDescription</attribute>
|
||||
<attribute name="label" translatable="yes">Episode descriptions</attribute>
|
||||
<attribute name="accel"><Primary>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"><Primary>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: -->
|
||||
|
|
|
@ -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 |
|
@ -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 |
|
@ -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
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue