Giter VIP home page Giter VIP logo

detlef's Introduction

      ___         _    _           ____
 __ _| _ \___  __| |__| |___ _ _  |__ /
/ _` |  _/ _ \/ _` / _` / -_) '_|  |_ \
\__, |_| \___/\__,_\__,_\___|_|   |___/
|___/
        Media aggregator and podcast client

Copyright 2005-2022 The gPodder Team

License

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/.

Dependencies

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 to install dependencies.

GTK3 UI - Additional Dependencies

Optional Dependencies

  • Bluetooth file sending: gnome-obex-send or bluetooth-sendto
  • 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)
  • 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

Build Dependencies

  • help2man
  • intltool

Test Dependencies

  • python-minimock
  • pytest
  • pytest-httpserver
  • pytest-cov
  • desktop-file-utils

Testing

To run tests, use...

make unittest

To set a specific python binary set PYTHON:

PYTHON=python3 make unittest

Tests in gPodder are written in two different ways:

If you want to add doctests, simply write the doctest and make sure that the module appears after --doctest-modules in pytest.ini. If you add tests to any module in src/gpodder you have nothing to do.

If you want to add unit tests for a specific module (ex: gpodder.model), you should add the tests as gpodder.test.model, or in other words:

The file:       src/gpodder/model.py
is tested by:   src/gpodder/test/model.py

After you've added the test, make sure that the module appears in "test_modules" in src/gpodder/unittests.py - for the example above, the unittests in src/gpodder/test/model.py are added as 'model'. For unit tests, coverage reporting happens for the tested module (that's why the test module name should mirror the module to be tested).

Running and Installation

To run gPodder from source, use..

bin/gpodder              # for the Gtk+ UI
bin/gpo                  # for the command-line interface

To install gPodder system-wide, use make install. By default, this will install all UIs and all translations. The following environment variables are processed by setup.py:

LINGUAS                  space-separated list of languages to install
GPODDER_INSTALL_UIS      space-separated list of UIs to install
GPODDER_MANPATH_NO_SHARE if set, install manpages to $PREFIX/man/man1

See setup.py for a list of recognized UIs.

Example: Install the CLI and Gtk UI with German and Dutch translations:

export LINGUAS="de nl"
export GPODDER_INSTALL_UIS="cli gtk"
make install

The "make install" target also supports DESTDIR and PREFIX for installing into an alternative root (default /) and prefix (default /usr):

make install DESTDIR=tmp/ PREFIX=/usr/local/

Debian 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

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.

Portable Mode / Roaming Profiles

The run-time environment variable GPODDER_HOME is used to set the location for storing the database and downloaded files.

This can be used for multiple configurations or to store the download directory directly on a MP3 player or USB disk:

export GPODDER_HOME=/media/usbdisk/gpodder-data/

OS X Specific Notes

  • default GPODDER_HOME="$HOME/Library/Application Support/gPodder"
  • default GPODDER_DOWNLOAD_DIR="$HOME/Library/Application Support/gPodder/download"

These settings may be modified by editing the following file of the .app :

/Applications/gPodder.app/Contents/MacOSX/_launcher

Add and edit the following lines to alter the launch environment on OS X :

export GPODDER_HOME="$HOME/Library/Application Support/gPodder"
export GPODDER_DOWNLOAD_DIR="$HOME/Library/Application Support/gPodder/download"

Changing the Download Directory

The run-time environment variable GPODDER_DOWNLOAD_DIR is used to set the location for storing the downloads only (independent of the data directory GPODDER_HOME):

export GPODDER_DOWNLOAD_DIR=/media/BigDisk/Podcasts/

In this case, the database and settings will be stored in the default location, with the downloads stored in /media/BigDisk/Podcasts/.

Another example would be to set both environment variables:

export GPODDER_HOME=~/.config/gpodder/
export GPODDER_DOWNLOAD_DIR=~/Podcasts/

This will store the database and settings files in ~/.config/gpodder/ and the downloads in ~/Podcasts/. If GPODDER_DOWNLOAD_DIR is not set, $GPODDER_HOME/Downloads/ will be used if it is set.

Logging

By default, gPodder writes log files to $GPODDER_HOME/Logs/ and removes them after a certain amount of times. To avoid this behavior, you can set the environment variable GPODDER_WRITE_LOGS to "no", e.g:

export GPODDER_WRITE_LOGS=no

Extensions

Extensions are normally loaded from gPodder's "extensions/" folder (in share/gpodder/extensions/) and from $GPODDER_HOME/Extensions/ - you can override this by setting an environment variable:

export GPODDER_EXTENSIONS="/path/to/extension1.py extension2.py"

In addition to that, if you want to disable loading of all extensions, you can do this by setting the following environment variable to a non- empty value:

export GPODDER_DISABLE_EXTENSIONS=yes

If you want to report a bug, please try to disable all extensions and check if the bug still appears to see if an extension causes the bug.

More Information

detlef's People

Contributors

horrendus avatar johanv avatar mic92 avatar moee avatar musuruan avatar ravualhemio avatar schaal avatar schuay avatar thp avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

detlef's Issues

If the episode search filter is opened, the sort order is lost

Reproduction: Add some Podcasts, go to "Show all Episodes" and sort by release date. Then click on the search icon in the bottom right corner. The search widget opens and the list is sorted by podcast.
Expected Behaviour: The order should stay the same as it was before opening the search.

lost_sort_order

Make use of the Android4 design guidelines

There are some design guidelines for Android which you should make use of:
https://developer.android.com/design/index.html

Especially

Instead of the player tab I would add the playlist there. The player could be always visible at the bottom instead of the Refresh/Playlist/Search/Sort buttons

If you make use of the Action Bar you can move the refresh and search action into the Action Bar.

If you make use of the selection feature you can select more than one episode and start an action for all of them (download, mark as listened, move to the playlist)

Here is an inspiring video where a developer explains design/layout changes in his app. The new app looks really amazing:
https://www.youtube.com/watch?v=hpqUbpVx5Bo

Delete listened episodes

I would like to have a way to delete the episodes I have listened. I now end up deleting them from the file system.

There might be a more elegant way, but if so, I did not find it yet.

No episodes shown

I've installed detlef from the play store. Every time I hit the refresh button, I get the "refresh successful" message but no podcasts are shown. In practise I cannot get the podcasts (and the episodes) from my gpodder.net account (the account verification was ok and I can see my phone in the device list). I'd love to make a wireshark capture to see what's going on but I don't think it's so easy to get one on android.

Remotely usubscribed feed still shows up until restart

If you unsubscribe to a feed on gpodder.net, and you refresh in detlef, the feed still shows up in the feed list. It's icon is gone, but the episodes still show up.

The podcast is deleted from the database, and it is gone when Detlef is restarted. So I think it is some caching problem. Probably the cache should be invalidated or something.

Stop playback when calling a number

Today I listened to an episode and without pausing the playback I called a number from my phone book.
But the episode is still playing while the telephone is ringing. You should pause the playback until I hang up the phone call

Change text at register device

Change the text "your device is now connected to gpodder.net. Detlef will now synchronize your podcast list." to something that says that the user should add the device to a synchgroup before synchronizing with the podcast list.

Do local feed parsing

Using gpodder.net for feed parsing is slow. Instead, fetch and parse feeds locally.

Vanishing podcast logo files

Some podcast logo files seem to vanish after the initial download.

02-12 16:24:08.078: V/at.ac.tuwien.detlef.download.DetlefDownloadManager(12162): File /mnt/sdcard/Android/data/at.ac.tuwien.detlef/files/Pictures/Science_Friday_Audio_Podcast/Podcast600-1.png downloaded successfully
02-12 16:32:42.574: W/at.ac.tuwien.detlef.domain.Podcast(12162): Removing reference to invalid logo path /mnt/sdcard/Android/data/at.ac.tuwien.detlef/files/Pictures/Science_Friday_Audio_Podcast/Podcast600-1.png

The download appears to be successful, but opening the image fails.
To reproduce:

  1. clear detlef data
  2. add several podcasts (the entire toplist + suggestions)
  3. wait until refresh is done
  4. scroll down the list

Several images are already lost in this pass.

  1. close & reopen detlef
  2. scroll down the list

More images are lost now.

Show complete show notes

Please show the complete show notes and also show the provided links so that I can start the browser directly from the player activity

Make refresh faster

Refresh takes quite some time when the user is subscribed to more podcasts, maybe change to device updates API endpoint

Let the user chose from a list of devices upon set up

Adapt the set up process such that the user gets a list of devices in the set up screen along with an option "Register new device".

The use case is that a user might want to import an existing device id if a new device is bought.

Suggested at the gpodder.net hackday

New Feature: Sleep Timer

On other podcast or media players there is the "Sleep timer" feature.
You can define a time in Hour:Minutes when the application should stop to play an episode. This is really nice if someone likes listen to podcasts while going to bed.

Wrong use of "new" episode actions

Detlef currently sends a "new" episode action for every new episode it detects. As actions are shared among devices and are meant to semantically "overwrite" each other, this does not reflect the intended meaning. A "new" action should be used to mark an episode as new again, eg after it has been played. As there is (currently) no such functionality in detlef, it should not send such actions at all.

NullPointerException during refresh

This occurred while refreshing 39 podcasts (including duplicates!). There was initially a huge slowdown, the screen was locked once or twice, and the screen was rotated one or two times.

E/AndroidRuntime( 1427): FATAL EXCEPTION: pool-1-thread-1
E/AndroidRuntime( 1427): java.lang.NullPointerException
E/AndroidRuntime( 1427):        at at.ac.tuwien.detlef.db.CachingEpisodeDAO.getEpisodeByUrlOrGuid(CachingEpisodeDAO.java:106)
E/AndroidRuntime( 1427):        at at.ac.tuwien.detlef.gpodder.SyncEpisodeActionsAsyncTask.applyActionChanges(SyncEpisodeActionsAsyncTask.java:135)
E/AndroidRuntime( 1427):        at at.ac.tuwien.detlef.gpodder.SyncEpisodeActionsAsyncTask.run(SyncEpisodeActionsAsyncTask.java:94)
E/AndroidRuntime( 1427):        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
E/AndroidRuntime( 1427):        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
E/AndroidRuntime( 1427):        at java.lang.Thread.run(Thread.java:856)

Rename packages to net.gpodder.detlef

As Detlef is a standalone project now and is no longer developed within the scope of a university course, rename the packages from at.ac.tuwien.detlef to net.gpodder.detlef.

Improve the startup time

On my Nexus-S (Cyanogenmod 10.1) the startup time is about 15-25sec.
This is definitely too long!

Sort the podcast list

I can't figure out how the podcast list is sorted. So please sort them alphabetically. Maybe you could add an option for different sorting, but there should be a sort criteria by default

Playback of an episode stops

Today I listend to an episode and the playback of detlef stopped.

  • the first time I started a download over my wifi
  • the second time I started Airdroid and the playback stopped the moment I logged into my phone from my desktop
  • the third time after I started aLogCat. Sadly there is no usable log output

When I start the playback again it starts about 10-15min before it stops. I think the last position I pressed pause by myself.

With this behaviour Detlef is really useless because I have to find the right position in the episode every time Detlef stops the episode

Unclear settings on first start

When first starting Detlef it asks for a username and password. It is, however, not obvious if a user is about to create a new account somewhere, or if he should use existing credentials, and even which site those refer to.

I'd recommend to explicitly ask for a "gpodder.net username" and offer a link to the registration page (https://gpodder.net/register)

MiniPlayer still there if app is closed

when I listen to an episode the mini-player in the notifcation area shows up and is usable. But if I close Detlef (e.g. via swiping it in the recent tasks screen) the player is still there but is unusable (can be closed extra via clicking on the X, but then also shows up again on the next start of Detlef)

Add unit tests again

This is probably not the most urgent issue, but I add it for the sake of completeness :-)

Detlef used to have unit tests, but in the working branch they are deleted in 30E360. It would be cool if we could reintroduce unit test projects, because they can prevent us from making the same mistakes over and over again.

Detelf doesn't sync subscriptions in working branch

I have this issue on the working branch, on master it works as expected.

If you add a new subscription using the gpodder.net website or another (synchronised) client, Detlef doesn't pull the new subscription when refreshing. The same problem when a subscription is deleted.

Loads of garbage collection and CPU activity during refresh feed parsing

The app actually became unresponsive during this period.

In the log, many lines such as this one appear:

D/dalvikvm( 1427): GC_CONCURRENT freed 3072K, 52% free 11365K/23495K, paused 1ms+4ms
E/ActivityManager(  196): ANR in at.ac.tuwien.detlef (at.ac.tuwien.detlef/.activities.MainActivity)
E/ActivityManager(  196): Reason: keyDispatchingTimedOut
E/ActivityManager(  196): Load: 1.32 / 1.02 / 0.61
E/ActivityManager(  196): CPU usage from 8617ms to 3556ms ago:
E/ActivityManager(  196):   81% 1427/at.ac.tuwien.detlef: 59% user + 22% kernel / faults: 552 minor
E/ActivityManager(  196):   7.9% 196/system_server: 6.9% user + 0.9% kernel / faults: 288 minor
E/ActivityManager(  196):   2.1% 134/surfaceflinger: 0.9% user + 1.1% kernel / faults: 670 minor
E/ActivityManager(  196):   1.9% 108/yaffs-bg-1: 0% user + 1.9% kernel
E/ActivityManager(  196):   0% 137/mediaserver: 0% user + 0% kernel / faults: 5 minor
E/ActivityManager(  196):   0.9% 12/kworker/0:1: 0% user + 0.9% kernel
E/ActivityManager(  196):   0.9% 269/com.android.systemui: 0.7% user + 0.1% kernel / faults: 699 minor
E/ActivityManager(  196):   0.9% 1058/kworker/u:3: 0% user + 0.9% kernel
E/ActivityManager(  196):   0.5% 331/com.google.process.gapps: 0.1% user + 0.3% kernel / faults: 215 minor
E/ActivityManager(  196):   0% 5/kworker/u:0: 0% user + 0% kernel
E/ActivityManager(  196):   0% 384/com.android.phone: 0% user + 0% kernel / faults: 15 minor
E/ActivityManager(  196):   0.1% 424/android.process.acore: 0.1% user + 0% kernel / faults: 259 minor
E/ActivityManager(  196):   0% 957/com.android.calendar: 0% user + 0% kernel / faults: 14 minor
E/ActivityManager(  196):   0% 1217/com.android.mms: 0% user + 0% kernel / faults: 150 minor
E/ActivityManager(  196): 99% TOTAL: 70% user + 29% kernel
E/ActivityManager(  196): CPU usage from 501ms to 1019ms later:
E/ActivityManager(  196):   90% 1427/at.ac.tuwien.detlef: 90% user + 0% kernel / faults: 92 minor
E/ActivityManager(  196):     78% 1427/c.tuwien.detlef: 78% user + 0% kernel
E/ActivityManager(  196):     9.6% 1429/GC: 9.6% user + 0% kernel
E/ActivityManager(  196):     1.9% 1501/pool-1-thread-1: 1.9% user + 0% kernel
E/ActivityManager(  196):   1.2% 12/kworker/0:1: 0% user + 1.2% kernel
E/ActivityManager(  196):   1.2% 108/yaffs-bg-1: 0% user + 1.2% kernel
E/ActivityManager(  196):   1.9% 196/system_server: 0% user + 1.9% kernel / faults: 1 minor
E/ActivityManager(  196):     1.9% 232/InputDispatcher: 0% user + 1.9% kernel
E/ActivityManager(  196): 98% TOTAL: 92% user + 3.7% kernel + 1.8% softirq

Add lock screen widget

All other media players or podcast clients I used before adding a widget to the lock screen, so you can pause/play your playback directly from your lock screen.
Without this widget you have to unlock your phone and activate your notification area to pause a playback which takes a lot more time.

YouTube channel stanford university not retrieved from gpodder.net

Hello detlef team,

I noticed that the following feed does not appear in the gpodderson application when synchronizing from gpodder.net

http://gdata.youtube.com/feeds/base/users/StanfordUniversity/uploads?alt=rss&v=2&orderby=published&client=ytapi-youtube-profile

I have subscribed to the feed from the website, and installed and configured the app on both my phone (Samsung S3 mini) and my tablet (Samsung note 10.1) and no matter how many times I add and remove the feed, it does not appear in the list of podcasts. It does sync on gpodder desktop, though, but it had an empty description or sth similar.

Thanks for your work!
Thomas

When refreshing podcasts, "HTTP/1.1 500 INTERNAL SERVER ERROR" and no episodes are listed

I've added several feeds (some via detlef, some via gpodder.net assignment; some of those that I already listen to on other devices, others that are new to me). Every podcast appears to add fine, and appears with album artwork, however attempting to refresh so as to get episode listings results in a "HTTP/1.1 500 INTERNAL SERVER ERROR" popup message and no episodes ever appear for any of the subscriptions.

This is on a Nexus 4 running Android 4.2.2, build JDQ39 (entirely stock; not even rooted). I've tested this on my cellular connection and via wifi; on both networks my Nokia N9 is able to fetch episode listings. On the other hands, wouldn't entirely rule out network issues on my end or somewhere along the line.

I can try with my Nexus 7 later today, likely, but I figured I'd post now in case it's a known issue (I looked here, but I may just be blind) or otherwise easily fixable and/or explicable.

Screenshot_2013-03-12-17-55-00

Rename Settings* to Preferences*

Android's terminology is talking about preferences and not about settings. So every class and variable that referes to the android preferences and has a prefix "Settings" should be renamed into "Preferences" for consistency's sake.

e.g. public class SettingsGpodderNet extends PreferenceFragment

should become

public class PreferencesGpodderNet extends PreferenceFragment

It's not that urgent, but shouldn't be that much effort either.

Podcast logo does not show up reliably when first added

On the current git version, the podcast logo does not show up reliably when first adding a podcast. The logo is downloaded, but the displayed icon is retrieved before that's done and is never updated subsequently.
After a restart, the logo appears.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.