Giter Club home page Giter Club logo

podfetch's Introduction

Podfetch

dependency status build status

Lint

Test

Podfetch is a self-hosted podcast manager. It is a web app that lets you download podcasts and listen to them online. It is written in Rust and uses React for the frontend. It also contains a GPodder integration, so you can continue using your current podcast app.

Every time a new commit is pushed to the main branch, a new docker image is built and pushed to docker hub. So it is best to use something like watchtower to automatically update the docker image.

You can find the documentation with a UI preview here.

podfetch's People

Contributors

apraxx avatar arcoast avatar artox avatar chifilly avatar dependabot[bot] avatar doba16 avatar jchue avatar mgoral avatar mrneil avatar piano1029 avatar raeitus avatar samtv12345 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  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

podfetch's Issues

Message/progress bar for podcasts imported with .opml

Clear and concise description of the problem

When adding podcasts, there is no feedback when uploading an OPML file.

image

In my case, there is some strange bug that only the first podcast in the file is being added.

Suggested solution

A "successfully added" and/or "importing 35 podcast out of 45" message.

Alternative

No response

Additional context

No response

Validations

Add opml export (with both original and Podfetch URLs)

Clear and concise description of the problem

I'm currently using Podgrab so my interest in your project was piqued by my realisation that Podgrab is no longer receiving updates.

Currently my podgrab instance grabs all podcast episodes and archives them to my server.

I then export an OPML file to my android device and import this to my podcast player (AntennaPod)

Podgrab currently has two options for OPML export:

  1. Using the original RSS feed
  2. Using a Podgrab generated RSS feed

I use the latter so my Android podcast client then downloads/streams podcast episodes from my own selfhosted instance of Podgrab.

I'd love the option to do the same in Podfetch.

Currently I can export a concatenated RSS feed from Podfetch which isn't quite ideal, as I use the OPML file to import different podcasts to both my own phone (chiefly tech/linux podcasts) and my wife's phone (gardening and lifestyle podcasts)

Suggested solution

Being able to reproduce the current Podgrab functionality would be awesome.

Alternative

No response

Additional context

No response

Validations

Add a notification bell

Clear and concise description of the problem

There is no way of knowing if a new podcast episode is available.

Suggested solution

Add a notification bell that can be clicked. It should display incoming messages like a new podcast episode was downloaded.

Alternative

No response

Additional context

No response

Validations

Issues importing OPML files that have repeated podcasts. The import breaks.

Describe the bug

There are podcasts that are on different platforms, therefore they have different feeds, but the name is the same. When I import an OPML file, the importation stops and gets stuck. If there are 200 subscriptions in the file and the numbers 7 and 8 are the same podcast with the same title but a different feed URL, it stops and doesn't continue importing the rest of the feeds.

It seems to be a problem where something breaks when creating the database and the title matches. In this case, it would be interesting to import repeated podcasts with different feeds and if there is any problem of this type, skip it and continue importing the rest of the feeds if they are not added.

Reproduction

System Info

linux, firefox, brave

Used Package Manager

npm

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

SERVER_URL setting not respecting paths

Describe the bug

Setting a path in the SERVER_URL variable doesn't allow access on that path.

What I did:

  1. Created container with the supplied docker compose file
  2. add container_name: podfetch to make container reachable by name
  3. Setup subdomain reverse proxy with caddy
podfetch.my.tld {
  import global_headers
  import root_tls
  reverse_proxy podfetch:8000
}
  1. PodFetch is accessible from https://podfetch.my.tld and works
  2. Setup subpath reverse proxy in caddy
my.tld {
  import global_headers
  import root_tls
  ... # other paths
  reverse_proxy /podfetch* podfetch:8000
}
  1. Set SERVER_URL=http://localhost:8000/podfetch in compose file, recreate container
  2. PodFetch is NOT accessible from https://my.tld/podfetch/, but is still accessible from https://podfetch.my.tld/ (without the path)

Expected result is that podfetch is accessible from both URLs, with the subdomain version redirecting with the path in place.

I also tried with SERVER_URL set to

Reproduction

See above

System Info

Using latest docker image as of the time this issue was opened

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Episodes are not imported(ARM)

Describe the bug

There is apparently a problem with the ARM version of podfetch (could only test this) updating episodes.

For tracking:

I completely rebuilt the container and imported my podcasts here (OPML).
All directories in 'podgrab-podcasts' are created and corresponding images are downloaded.

After that the process stops and no episodes are loaded.

Here is the corresponding log:

Debug file located at /app/src/target/release/build/podfetch-df2e0023372c1419/out/built.rs
  ____           _ _____    _       _
 |  _ \ ___   __| |  ___|__| |_ ___| |__
 | |_) / _ \ / _` | |_ / _ \ __/ __| '_ \
 |  __/ (_) | (_| |  _|  __/ || (__| | | |
 |_|   \___/ \__,_|_|  \___|\__\___|_| |_|

2023-05-06T08:35:37 [INFO] - No settings found, inserting default settings
2023-05-06T08:35:37 [INFO] - Starting with the following environment variables:
Public server url: http://localhost:86/
Polling interval for new episodes: 60 minutes
GPodder integration enabled: false
Database url is set to: sqlite://./db/podcast.db
Podindex API key&secret configured: false
2023-05-06T08:35:37 [INFO] - starting 4 workers
2023-05-06T08:35:37 [INFO] - Actix runtime found; starting in Actix runtime
thread 'tokio-runtime-worker' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: Empty }', src/service/podcast_episode_service.rs:235:55
stack backtrace:
   0:   0xe8510c - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h0d267d3ddd434858
   1:   0xeaae70 - core::fmt::write::h7253a9d64981ec1f
   2:   0xe7d218 - std::io::Write::write_fmt::h6d19611cef50d2cb
   3:   0xe86be4 - std::panicking::default_hook::{{closure}}::h7a778041ee0c25b0
   4:   0xe8673c - std::panicking::default_hook::h00d2a169ed3329c4
   5:   0xe873b8 - std::panicking::rust_panic_with_hook::h233948492a2daf92
   6:   0xe870fc - std::panicking::begin_panic_handler::{{closure}}::h0594b0f8e73c9f79
   7:   0xe856dc - std::sys_common::backtrace::__rust_end_short_backtrace::h86679e0e7e726aea
   8:   0xe86eb0 - rust_begin_unwind
   9:   0x4bc94c - core::panicking::panic_fmt::he71af873a4d08fbd
  10:   0x4bca78 - core::result::unwrap_failed::hf16f916d1dba6e7a
  11:   0x58f23c - podfetch::service::podcast_episode_service::PodcastEpisodeService::insert_podcast_episodes::h936e5bd12001a96c
  12:   0x51c47c - <tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll::h572df02aa80f45f7
  13:   0x76cca0 - tokio::runtime::task::core::Core<T,S>::poll::h1d708efd78fa42d6
  14:   0x57ebd4 - tokio::runtime::task::harness::Harness<T,S>::poll::h8c994f6f72864cc5
  15:   0xd12a1c - tokio::runtime::blocking::pool::Inner::run::hfface49d139e479e
  16:   0xd0d1b0 - std::sys_common::backtrace::__rust_begin_short_backtrace::h45cd0b36965f8d2e
  17:   0xd0e7dc - core::ops::function::FnOnce::call_once{{vtable.shim}}::hed19b19589300585
  18:   0xe8b03c - std::sys::unix::thread::Thread::new::thread_start::hc48028146cb4213a
thread 'tokio-runtime-worker' panicked at 'called `Result::unwrap()` on an `Err` value: JoinError::Panic(Id(1616), ...)', src/service/rust_service.rs:169:18
stack backtrace:
   0:   0xe8510c - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h0d267d3ddd434858
   1:   0xeaae70 - core::fmt::write::h7253a9d64981ec1f
   2:   0xe7d218 - std::io::Write::write_fmt::h6d19611cef50d2cb
   3:   0xe86be4 - std::panicking::default_hook::{{closure}}::h7a778041ee0c25b0
   4:   0xe8673c - std::panicking::default_hook::h00d2a169ed3329c4
   5:   0xe873b8 - std::panicking::rust_panic_with_hook::h233948492a2daf92
   6:   0xe870fc - std::panicking::begin_panic_handler::{{closure}}::h0594b0f8e73c9f79
   7:   0xe856dc - std::sys_common::backtrace::__rust_end_short_backtrace::h86679e0e7e726aea
   8:   0xe86eb0 - rust_begin_unwind
   9:   0x4bc94c - core::panicking::panic_fmt::he71af873a4d08fbd
  10:   0x4bca78 - core::result::unwrap_failed::hf16f916d1dba6e7a
  11:   0x6220a4 - <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll::hcecc0745cd91d75e
  12:   0x61b254 - <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll::hb1b76a062df3f193
  13:   0x51bcc8 - <tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll::h0ad448ac5ae58cf6
  14:   0x76cf70 - tokio::runtime::task::core::Core<T,S>::poll::h4aadf4118cc0f4b8
  15:   0x57f2fc - tokio::runtime::task::harness::Harness<T,S>::poll::hd90bed8febdc3dce
  16:   0xd12a1c - tokio::runtime::blocking::pool::Inner::run::hfface49d139e479e
  17:   0xd0d1b0 - std::sys_common::backtrace::__rust_begin_short_backtrace::h45cd0b36965f8d2e
  18:   0xd0e7dc - core::ops::function::FnOnce::call_once{{vtable.shim}}::hed19b19589300585
  19:   0xe8b03c - std::sys::unix::thread::Thread::new::thread_start::hc48028146cb4213a

Reproduction

start import on a fresh install

System Info

System:
    OS: Linux 5.15 Debian GNU/Linux 11 (bullseye) 11 (bullseye)
    CPU: (4) arm ARMv7 Processor rev 5 (v7l)
    Memory: 312.07 MB / 999.02 MB
    Container: Yes
    Shell: 5.1.4 - /bin/bash
  Binaries:
    Node: 19.9.0 - /usr/local/bin/node
    npm: 9.6.3 - /usr/local/bin/npm

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Initial loading of podcasts not working

Describe the bug

Initial loading not working

Reproduction

Go to podcasts page

System Info

/

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Some things I noticed

Clear and concise description of the problem

See below

Suggested solution

  • No possibility to stream episodes, must be downloaded to play.
    image

  • Can't change playback speed in media player.
    image

  • When trying to upload OPML, the default is for XML files and you have to manually change to "all files"
    image

  • Maybe add a way to see all episodes (and sort by date etc).

Alternative

No response

Additional context

No response

Validations

Playback fails in some formats

Describe the bug

The audio player fails depending on the codec. For example, the podcast from http://www.rtve.es/api/programas/1881/audios.rss which is from RTVE, Spanish public television and radio, fails and does not play it. I have a script that converts youtube videos to mp3 audio with youtube-dl, then I convert them into a podcast with feed and it still doesn’t play them. I have to select the download option to listen to it.

Reproduction

System Info

linux,browsers

Used Package Manager

npm

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Readd ARMv7 support

Clear and concise description of the problem

ARMv7 support is removed in the newer Rust version. Maybe compile on my own?

Suggested solution

Create a docker image for Rust ARMv7

Alternative

No response

Additional context

No response

Validations

Inconsistency with authentication types and strange behaviour

Describe the bug

OIDC

When searching via Podcastindex, nothing happens, and checking the developer tools shows that it's returning a 401 Unauthorized error for the URL https://podfetch.domain.tld/api/v1/podcasts/1/search%20term/search. When adding an RSS feed manually, the same thing happens.

I also notice that if I go to the Administration page, I can't access anything because I'm not an administrator but there's no information on how to set an administrator or anything.

Basic Auth

When searching via Podcastindex, nothing happens, and checking the developer tools shows that it's returning a 502 Bad Gateway error for the URL https://podfetch.domain.tld/api/v1/podcasts/1/search%20term/search. When adding an RSS feed manually, the same happens except it does actually add it (even though it appears nothing happens). Trying to delete it with files causes a 502 and nothing happens, deleting without files works fine, although it doesn't update the UI until refreshed.

The Administration page works fine for this type.

No Auth

Essentially the same as Basic Auth but without the Administration page.


There doesn't seem to be any useful Docker logs so I'm not sure if I can find information anywhere as to what's happening.

Reproduction

See below

System Info

My compose file is as follows:

services:
  podfetch:
    container_name: podfetch
    image: samuel19982/podfetch:latest
    networks:
      main:
    ports:
      - "4635:8000"
    volumes:
      - /media/nas/media/podcasts:/app/podcasts
      - ./volumes/podfetch/database:/app/db
    environment:
      POLLING_INTERVAL: 60
      SERVER_URL: https://podfetch.${DOMAIN}

      # BASIC_AUTH: true
      # USERNAME: username
      # PASSWORD: password

      # OIDC_AUTH: true
      # OIDC_AUTHORITY: https://auth.${DOMAIN}/application/o/podfetch/
      # OIDC_CLIENT_ID: client_id
      # OIDC_REDIRECT_URI: https://podfetch.${DOMAIN}/ui/login/
      # OIDC_SCOPE: openid profile email
      # OIDC_JWKS: https://auth.${DOMAIN}/application/o/podfetch/jwks/

      PODINDEX_API_KEY: podindex_key
      PODINDEX_API_SECRET: podindex_secret
    restart: unless-stopped

    labels:
      traefik.enable: true

      traefik.http.routers.podfetch.rule: HOST(`podfetch.${DOMAIN}`)
      traefik.http.routers.podfetch.entrypoints: https
      traefik.http.routers.podfetch.service: podfetch
      traefik.http.services.podfetch.loadbalancer.server.port: 8000

and obviously uncommenting/commenting the BASIC_AUTH and OIDC_AUTH blocks depending on what I want to enable

If there's any other info that'll be helpful, let me know


Also, the output of the command is as follows:

System:
    OS: Linux 5.4 Ubuntu 20.04.6 LTS (Focal Fossa)
    CPU: (8) x64 Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
    Memory: 629.38 MB / 15.58 GB
    Container: Yes
    Shell: 5.0.17 - /bin/bash
  Binaries:
    Node: 8.12.0 - ~/.nvm/versions/node/v8.12.0/bin/node
    npm: 6.4.1 - ~/.nvm/versions/node/v8.12.0/bin/npm
  Browsers:
    Firefox: 112.0.2

and that is on my server, with Docker version 20.10.17, build 100c701.

The browser I'm accessing PodFetch from is Firefox version 113.0.1

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Add Podcast Index as search source

Clear and concise description of the problem

I don't want to rely entirely on iTunes to supply my podcasts. It would be great to add the Podcast Index as a source. https://podcastindex.org/

Suggested solution

Provide a toggle or drop down list to choose which source to search and add podcasts from.

Alternative

No response

Additional context

No response

Validations

Single-Sign-On with OpenID Connect

Clear and concise description of the problem

It would be nice to have different user accounts that can be handled with OIDC.
Popular selfhosted OIDC solutions are Authelia, Authentik, Keycloak or Nextcloud.
It would surely be nice if PodFetch would support that.

Suggested solution

I don't know. Maybe via this or this crate?

It would be nice if the parameters could be provided via ENV variables.
For instance

    PODFETCH_OPENID_CONNECT_AUTHORIZATION_ENDPOINT
    PODFETCH_OPENID_CONNECT_TOKEN_ENDPOINT
    PODFETCH_OPENID_CONNECT_USERINFO_ENDPOINT
    PODFETCH_OPENID_CONNECT_SEND_NONCE

Alternative

No response

Additional context

No response

Validations

Adding Basic Auth makes PodFetch unreachable

Describe the bug

If I add the basic auth variables to the docker-compose.yml file I can no longer reach the PodFetch webpage. Understandable since I am not authorized but how do I pass my authentication credentials?

Reproduction

Add Basic Auth variables to the environment section of the docker-compose file

System Info

System:
    OS: Linux 5.15 Ubuntu 22.04.2 LTS 22.04.2 LTS (Jammy Jellyfish)
    CPU: (8) x64 Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
    Memory: 13.73 GB / 19.40 GB
    Container: Yes
    Shell: 5.1.16 - /bin/bash
  Binaries:
    Node: 12.22.9 - /usr/bin/node
    npm: 8.5.1 - /usr/bin/npm

Used Package Manager

npm

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

default.jpg not loading because of a mangled URL

Describe the bug

default.jpg is unable to load because of a mangled URL.

Expected:
http://example.com:8000/ui/default.jpg

Actual:
http://example.com:8000/http://localhost/ui/default.jpg

I'm using this podcast (if you don't know one that doesn't serve a suitable image) it has images in it but not in the correct format to be used (itunes tags)

Reproduction

Try to load the podcast list, or any page which would show the default image

System Info

I use the docker image on my server and access the instance using machine name and port.  
relevant docker compose environment variable:
SERVER_URL=http://example.com:8000

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

'Upload OPML'-button grayed out

Describe the bug

Hello,

tried to import my podcasts from my Android app "Podcast Addict".

Podfetch shows

"The following file will be uploaded:
PodcastAddict_OPML_export_20230501_055429.opml",

but the "Upload OPML"-button is grayed out, so I can't do it as nothing happens.

Same issue with OPML-files from other sources.

Am I doing Something wrong?

Reproduction

happens with every version of podfetch

System Info

System:
    OS: Linux 5.15 Debian GNU/Linux 11 (bullseye) 11 (bullseye)
    CPU: (4) arm ARMv7 Processor rev 5 (v7l)
    Memory: 394.19 MB / 999.02 MB
    Container: Yes
    Shell: 5.1.4 - /bin/bash

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Add a detailed audio player

Clear and concise description of the problem

It should be possible to:

  • View the podcast in a view that expands the whole screen.
  • Play/Pause etc.
  • Show always the current episode time

Suggested solution

Create detailed audio player in ui package.

Alternative

No response

Additional context

No response

Validations

Mobile (iOS): Allow PodFetch to Run/Play in Background

Clear and concise description of the problem

PodFetch plays well when I have Safari open, but when I leave Safari and go to the home screen or if the screen locks, PodFetch stops playing audio. Then when I switch back to the Safari browser, the podcasts turn back on. It's frustrating because the podcast stops if I start playing a podcast and put my phone in my pocket to walk somewhere. I must always keep the screen on and the Safari window open to listen to podcasts with PodFetch.

Suggested solution

First, I think this is an awesome project and appreciate all the work that is being put into it. Unfortunately, I don't know the solution to this issue. Though, I hope some of the experts on this project will know a solution.

Alternative

No response

Additional context

No response

Validations

gPodder compatible API

Clear and concise description of the problem

Users who want to use their mobile or desktop clients (like AntennaPod the Podcast app for Garmin watches or the gPodder desktop application) often want to have a possibility to sync the listening state across all devices.
gPodder solved exactly this, but it's old Python code and the official instance is often so slow that the devices are running into timeouts.

If PodFetch could replace that bottleneck by providing a compatible API, then people would have less to worry about (furthermore gPodder causes faulty behaviour on various clients like duplicated subscriptions if a subscription URL changed).

PS: This one is probably a difficult issue but it will give obvious benefits

Suggested solution

A gPodder compatible API interface.

Alternative

No response

Additional context

No response

Validations

Downloads html instead of audio file

Describe the bug

When clicking on the "i" icon next to an episode and selecting "Save to computer" the file downloaded is an html document, not the episode audio file. I presume this is why I cannot play an episode in the browser or stream an episode.

Reproduction

Latest docker image

System Info

Server:
System:
    OS: Linux 5.15 Ubuntu 22.04.2 LTS 22.04.2 LTS (Jammy Jellyfish)
    CPU: (8) x64 Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
    Memory: 16.19 GB / 19.40 GB
    Container: Yes
    Shell: 5.1.16 - /bin/bash
  Binaries:
    Node: 12.22.9 - /usr/bin/node
    npm: 8.5.1 - /usr/bin/npm

PC:
System:
    OS: Linux 5.4 Linux Mint 20.3 (Una)
    CPU: (8) x64 AMD FX(tm)-8350 Eight-Core Processor
    Memory: 2.67 GB / 23.43 GB
    Container: Yes
    Shell: 5.0.17 - /bin/bash
  Binaries:
    Node: 10.19.0 - /usr/bin/node
    npm: 6.14.4 - /usr/bin/npm
  Browsers:
    Firefox: 112.0.1

Used Package Manager

npm

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Episode list doesn't show all podcasts

Describe the bug

If I add a podcast with more than 75 episodes, the list does only show the 75 newest episodes.

Reproduction

Add Podcast "Retterview - Gedanken, Wissen und Spaß aus dem Pflasterlaster", go to episode list, scroll down. As of today, it only shows episodes 28 to 101.

System Info

System:
    OS: Linux 5.19 Ubuntu 22.04.1 LTS 22.04.1 LTS (Jammy Jellyfish)
    CPU: (4) x64 Intel(R) Core(TM) i7-6650U CPU @ 2.20GHz
    Memory: 8.51 GB / 15.52 GB
    Container: Yes
    Shell: 5.1.16 - /bin/bash
  Binaries:
    Node: 18.12.0 - ~/.nvm/versions/node/v18.12.0/bin/node
    Yarn: 1.22.19 - ~/.nvm/versions/node/v18.12.0/bin/yarn
    npm: 8.19.2 - ~/.nvm/versions/node/v18.12.0/bin/npm
  Browsers:
    Chromium: 112.0.5615.49
    Firefox: 112.0.1

Used Package Manager

yarn

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Include PodFetch version number on info page

Clear and concise description of the problem

It might be a great idea to have a version number somewhere on the info page. This would be great to know what version I'm using so I can know if I'm using the current version.

Suggested solution

Add a version number or container version or date or something to the info page

Alternative

No response

Additional context

No response

Validations

Date remains in German despite language setting.

Describe the bug

Using the latest docker image with the language set to English

    podfetch:
        image: samuel19982/podgrabv2:latest
        container_name: podfetch
        ports:
            - 8005:8000
        volumes:
            - ${CONFIG}/podfetch/podcasts:/app/podcasts
            - ${CONFIG}/podfetch/db:/app/db
        environment:
            - POLLING_INTERVAL=60
            - SERVER_URL=http://10.146.0.1:8005
        restart: unless-stopped

image

vor 3 Tagen is displayed rather than 3 Days ago, this is also the case if language is set to Français.

I checked https://github.com/SamTV12345/PodFetch/tree/main/ui/src/language/json but can't see the localisation translation for the error above.

Reproduction

See above for docker-compose

System Info

Linux x64 host using 


Docker version 20.10.21, build baeda1f


### Used Package Manager

n/a

### Validations

- [X] Follow our [Code of Conduct](https://github.com/SamTV12345/.github/blob/main/CODE_OF_CONDUCT.md)
- [X] Read the [Contributing Guide](https://github.com/SamTV12345/.github/blob/main/CONTRIBUTING.md).
- [X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
- [X] Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
- [X] The provided reproduction is a [minimal reproducible](https://stackoverflow.com/help/minimal-reproducible-example) of the bug.

Podcast episodes and podcasts are bad labeled on local machine

Describe the bug

-12312312
123123

are not human readable

Reproduction

Download podcast episode

System Info

/

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Persist current selection in filter

Clear and concise description of the problem

Persist current selection in filter in database.

Suggested solution

Save in new table.

Alternative

No response

Additional context

No response

Validations

Podcasts with long names - Star symbol is pushed out of square

Describe the bug

Screenshot 2023-05-07 180548

Star leaves the area of the "podcast square" when name is too long.
Screenshot 2023-05-07 180930

Reproduction

Add any podcast with a longer name, such as Freakonomics Radio

System Info

Home Assitant 2023.5.2, running on Lubuntu via Virtualbox.
Firefox 112.0.2  browser

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Auto-delete option

Clear and concise description of the problem

If you forget to tidy up behind you, deleting episodes as you go, then PodFetch could soon accumulate GBs of auto-downloaded clutter.

Suggested solution

What about an option to auto-delete downloaded episodes after a user-defined number of (10 - 100) days?

Alternative

No response

Additional context

No response

Validations

Basic auth shows loading after login

Describe the bug

Loading screen even though just logged in

Reproduction

Enable basic auth

System Info

/

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Create a new section like the timeline, but with all the podcasts to which we are subscribed

Clear and concise description of the problem

It is still difficult to access recently released episodes. Although the filter option has been added, which works great, waiting for the last selected order option to be saved, it is difficult to see the latest episodes published in the rest of the podcasts that are not favorites.

Suggested solution

Create a new section where the podcast episodes appear in order of publication. The last podcasts would be the first. Something similar to the timeline section but with all the podcasts.

Alternative

I miss that the timeline option does not appear more days, I understand that it has been limited so that the page does not become heavy, in this case it could generate several podcast numbers in the section and add, for example, a week with the latest published episodes, ordered by date - time of publication (as in timeline) and separated by days up to the last week (as in timeline)

Additional context

image

Validations

Add deleting podasts

Clear and concise description of the problem

I want to delete podcasts I don't want to listen to.

Suggested solution

Implement deleting podcast episodes

Alternative

No response

Additional context

No response

Validations

Add better active and hover states

Clear and concise description of the problem

The ui is very flat.

Suggested solution

Add other color/sizes on hover and active.

Alternative

No response

Additional context

No response

Validations

Not all podcasts contain an id

Describe the bug

When downloading Logbuch:Netzpolitik from the rss feed the url is inserted as episode id.

Reproduction

Choose Logbuch:Netzpolitik in the menu

System Info

Browser: All

Used Package Manager

npm

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Mobile Friendly UI / Fast Forward 15 or 30 Seconds

Clear and concise description of the problem

I mostly listen to podcasts via my cell phone, and the current UI isn't mobile friendly. Also, it would be helpful to be able to fast forward by 15 or 30 seconds to skip podcast commercials.

Suggested solution

Implement a mobile friendly UI. Add a feature to fast forward by 15 or 30 seconds.

Alternative

No response

Additional context

No response

Validations

Error When Trying to Look at Podcast During Downloads

Describe the bug

Trying to view a Podcast while downloading

CleanShot 2023-04-03 at 22 43 26@2x

2023-04-04T04:39:06 [INFO] - Downloading podcast episode: Tesla Opens its Superchargers and Weird MWC Gadgets?
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10

Reproduction

Use the Docker Compose

System Info

Host System

  System:
    OS: macOS 13.1
    CPU: (10) arm64 Apple M1 Max
    Memory: 28.50 GB / 64.00 GB
    Shell: 5.8.1 - /bin/zsh
  Binaries:
    Node: 19.8.0 - /opt/homebrew/bin/node
    Yarn: 1.22.19 - /opt/homebrew/bin/yarn
    npm: 9.5.1 - /opt/homebrew/bin/npm

Server

Used Package Manager

npm

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Panic on episode fetch for patreon feed

Describe the bug

Trying to add a patreon private feed I get the following error:

thread 'tokio-runtime-worker' panicked at 'called `Option::unwrap()` on a `None` value', src/service/podcast_episode_service.rs:234:41
stack backtrace:
   0: rust_begin_unwind
             at /rustc/8460ca823e8367a30dda430efda790588b8c84d3/library/std/src/panicking.rs:575:5
   1: core::panicking::panic_fmt
             at /rustc/8460ca823e8367a30dda430efda790588b8c84d3/library/core/src/panicking.rs:64:14
   2: core::panicking::panic
             at /rustc/8460ca823e8367a30dda430efda790588b8c84d3/library/core/src/panicking.rs:114:5
   3: podfetch::service::podcast_episode_service::PodcastEpisodeService::get_url_file_suffix
   4: podfetch::service::rust_service::PodcastService::handle_insert_of_podcast::{{closure}}
   5: podfetch::controllers::podcast_controller::insert_outline::{{closure}}
   6: futures_executor::local_pool::block_on
   7: <tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll
   8: tokio::loom::std::unsafe_cell::UnsafeCell<T>::with_mut
   9: tokio::runtime::task::core::Core<T,S>::poll
  10: tokio::runtime::task::harness::Harness<T,S>::poll
  11: tokio::runtime::blocking::pool::Inner::run

Looks like patreon file URLS aren't conforming to your regex capture structure correctly.

Reproduction

add a private patreon feed it will produce this stack trace.

System Info

Not sure how to get this via my docker setup.

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Consider changing the name

Clear and concise description of the problem

This project seems to be more 'inspired by podgrab' than 'podgrab 2'. I expected there to be some shared code or contributors, but as far as I can tell this is an entirely separate project that just uses the name. Other potential users and contributors might arrive with similar expectations. Would you consider changing the name to signal the differences better?

Suggested solution

Names are hard, er... PodNab? Gatherpod?

Alternative

No response

Additional context

No response

Validations

Add feed by url

Clear and concise description of the problem

Currently it is only possible to add feeds from itunes or opml files

Suggested solution

add a third option that is to add from the feed url.

Alternative

No response

Additional context

No response

Validations

[Enhancement] Update UI to indicate that a click on a podcast's "+" is being processed

Clear and concise description of the problem

As a general principle it's nice to react to a click within a tenth of a second, but this is a specific case where I think it's a good first place to spend effort.

When searching for a podcast, I switch from "Home" to "Podcast" and then click the little "+" button. I then type some text, scroll through the resulting list, and then click one of their "+" icons.

The system appears to not do anything; but in fact the logs report than in the background it's searching, finding the podcast at a specific server, getting RSS, and downloading 4 most recent episodes. Meanwhile, the user has no affordance that anything is happening; they might click other "+" buttons, try the search again, reload, flip through pages, and at some point they'll suddenly notice that (apparently after all 4 episodes have downloaded) a podcast entry will appear -- if they wait long enough.

Suggested solution

The following two ideas could work independently or together.

  1. Maybe replace the "+" button with an animation of a cycling circle? Or in some way indicate there's a recognition of the user's click. (This could in principle also apply when the user begins a search -- change the submit-button into an animation when a search is ongoing, and change it back into a search button once it's complete.)
  2. Maybe dynamically update the podcast page as soon as data is available, allowing that to show in the background behind the search window.

Alternative

Providing a simple animated gif is good enough to let the user feel that their input worked, but more feedback is possible; an animated gif can be worse than nothing if the server crashes, leaving the gif "happily" spinning misleadingly. Progress bars or a little subwindow giving a general indication of the task that's currently being done can be both more reassuring and more informative.

Additional context

No response

Validations

Ability to Manually Refresh All Podcast Subscriptions

Clear and concise description of the problem

To get the latest podcast releases, a setting can be set in the docker-compose.yml, which specifies how frequently to check for new releases. That said, I don't know why, but my podcast subscriptions don't always update and show the latest releases.

Suggested solution

Currently, when you click on a specific podcast, there is a refresh button that manually forces the system to look for new releases for that particular podcast. Would it be possible to add a refresh button on the Podcast page (ui/podcasts) to allow users to manually request Podfetch to look for new podcasts across all your subscriptions?

Alternative

No response

Additional context

No response

Validations

Add basic auth to the service

Clear and concise description of the problem

Adding basic auth to this service would be beneficial as you don't have to stick to the plain basic auth form and can stay logged in on iPhone etc.

Suggested solution

Add web http basic auth via actix-web-httpauth

Alternative

%

Additional context

No response

Validations

streaming playback

Describe the bug

when the audios are downloaded locally they are reproduced without any kind of problem. On the other hand, when there is a direct reproduction with the server, depending on the audio format, it is not reproduced.

One of the advantages of having the server is being able to play the audios directly and not need to download them.

Reproduction

_

System Info

linux,brave,firefox

Used Package Manager

npm

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Custom folder/file naming

Clear and concise description of the problem

As a user, I would like the podcast folders and files to keep spaces in their names. I find it much easier to read outside the app.

Suggested solution

In the settings, we could provide options to define how the files are named. For example, we could give the following options for spaces: remove, keep, replace with '-' or '_'.

The same could be done with colons: remove or replace with ' - '.

It might also be useful to keep the episode number, if available, in the name, e.g. 35 - The episode.mp3

Alternative

No response

Additional context

Sonarr does this nicely, though it is much more complex:
Screenshot_20230507-093244_Mull

Validations

Error When Trying to Look at Podcast During Downloads

Describe the bug

Trying to view a Podcast while downloading

CleanShot 2023-04-03 at 22 43 26@2x

2023-04-04T04:39:06 [INFO] - Downloading podcast episode: Tesla Opens its Superchargers and Weird MWC Gadgets?
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:1' panicked at 'Error locking db: PoisonError { .. }', src/controllers/notification_controller.rs:10:10
thread 'actix-rt|system:0|arbiter:0' panicked at 'Error acquiring lock: PoisonError { .. }', src/controllers/podcast_controller.rs:44:10

Reproduction

Use the Docker Compose, Put it behind Traefik, Once started add a podcast. Try to view the podcast

System Info

Host System

  System:
    OS: macOS 13.1
    CPU: (10) arm64 Apple M1 Max
    Memory: 28.50 GB / 64.00 GB
    Shell: 5.8.1 - /bin/zsh
  Binaries:
    Node: 19.8.0 - /opt/homebrew/bin/node
    Yarn: 1.22.19 - /opt/homebrew/bin/yarn
    npm: 9.5.1 - /opt/homebrew/bin/npm

Server

  System:
    OS: Linux 5.4 Ubuntu 20.04.6 LTS (Focal Fossa)
    CPU: (2) x64 AMD EPYC Processor
    Memory: 12.45 GB / 15.63 GB
    Container: Yes
    Shell: 5.0.17 - /bin/bash
  Binaries:
    Node: 10.19.0 - /usr/bin/node
    npm: 6.14.4 - /usr/bin/npm

Used Package Manager

npm

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Error when inserting a podcast episode with no image

Describe the bug

There appears to be some podcasts that don't include an image on some episodes.

Reproduction

Download podcast with no image

System Info

/

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Suggestions for navigating the interface more quickly

Clear and concise description of the problem

Navigate through the interface menus to listen to podcasts or subscribe, unsubscribe,... when you have many subscriptions can become complicated. Here are some personal suggestions that I have missed when using PodFetch.

Suggested solution

  • In the podcast section, to quickly access the podcast we want to listen to, have the ability to filter by title, sort by title, and sort by latest publication.
  • In the podcast section, when we access the desired podcast, have the ability to unsubscribe.
  • In the Settings section, filter by podcast title to be able to unsubscribe.

Alternative

No response

Additional context

No response

Validations

PodFetch crashes when starting fresh without a database

Describe the bug

Itried to start with a fresh directory for podfetch and I tried to copy over to old DB from podgrab. Nothing worked for me

I tried to open an issue in your repository, but it needs to much information, I use docker, not npm

version: '3'
services:
  podgrabv2:
    image: samuel19982/podgrabv2:latest
    ports:
      - "9514:8000"
    volumes:
      - /medien/podcast:/app/podcasts
      - /docker/podfetch/podfetch.db:/app/podcast.db
    environment:
      - POLLING_INTERVAL=240
      - SERVER_URL=http://localhost

Reproduction

Start above docker-compose

System Info

/

Used Package Manager

n/a

Validations

  • Follow our Code of Conduct
  • Read the Contributing Guide.
  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • Check that this is a concrete bug. For Q&A, please open a GitHub Discussion instead.
  • The provided reproduction is a minimal reproducible of the bug.

Allow more or all previous episodes to be downloaded

Clear and concise description of the problem

As a user, I want to download and archive all the episodes of a podcast.

Suggested solution

Currently, the last 5 episodes are downloaded. We could make that number configurable, and even give the option to disable the limit.

Eventually (should probably a new issue), it would be nice if this setting could be overridden on a per-podcast basis.

Alternative

No response

Additional context

No response

Validations

Project Name

Clear and concise description of the problem

Currently the project is called Podfetch on Github (I like the name, no issues here) but the Docker hub project is called podgrabv2

It's clear that currently development is progressing and you're posting on the selfhosted subreddit (this is where I learned about your project) and it seems reasonable to expect more users in time.

I think having two different project names on Github & Docker hub is a little confusing and its's probably worthwhile changing the name on Docker hub before you get more popular.

Suggested solution

Change the name on Docker Hub to PodFetch to reduce confusion.

Alternative

No response

Additional context

No response

Validations

UI contrib

Hi,

Saw in your readme that you were looking for a UI contributor. I just graduated a coding bootcamp and would love the extra practice.

Add better file name when downloading podcast

Clear and concise description of the problem

The current podcast are all named podcast.[ext]

Suggested solution

title.[ext]

Alternative

No response

Additional context

No response

Validations

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.