{"id":13454978,"url":"https://github.com/gpodder/gpodder","last_synced_at":"2025-10-04T17:10:44.289Z","repository":{"id":37706484,"uuid":"1677760","full_name":"gpodder/gpodder","owner":"gpodder","description":"The gPodder podcast client.","archived":false,"fork":false,"pushed_at":"2025-10-01T20:01:38.000Z","size":36720,"stargazers_count":1388,"open_issues_count":343,"forks_count":214,"subscribers_count":42,"default_branch":"master","last_synced_at":"2025-10-01T21:26:49.404Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://gpodder.org/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gpodder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["https://gpodder.net/contribute/"]}},"created_at":"2011-04-28T20:53:14.000Z","updated_at":"2025-10-01T19:41:49.000Z","dependencies_parsed_at":"2023-10-04T12:24:15.352Z","dependency_job_id":"f0e27213-fdb0-4456-869f-8dcd30371f3d","html_url":"https://github.com/gpodder/gpodder","commit_stats":{"total_commits":4771,"total_committers":232,"mean_commits":"20.564655172413794","dds":0.7813875497799203,"last_synced_commit":"81d58f559e6df393042c921ce4eab4a74a5477cd"},"previous_names":[],"tags_count":192,"template":false,"template_full_name":null,"purl":"pkg:github/gpodder/gpodder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gpodder%2Fgpodder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gpodder%2Fgpodder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gpodder%2Fgpodder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gpodder%2Fgpodder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gpodder","download_url":"https://codeload.github.com/gpodder/gpodder/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gpodder%2Fgpodder/sbom","scorecard":{"id":442724,"data":{"date":"2025-08-11","repo":{"name":"github.com/gpodder/gpodder","commit":"56cc584b70ae961b24569d1a9b1c4467a7c24b74"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Code-Review","score":5,"reason":"Found 8/15 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"17 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/linttest.yml:1","Warn: no topLevel permission defined: .github/workflows/release-from-macos.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: COPYING:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: COPYING:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linttest.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/gpodder/gpodder/linttest.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linttest.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/gpodder/gpodder/linttest.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-from-macos.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/gpodder/gpodder/release-from-macos.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-from-macos.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/gpodder/gpodder/release-from-macos.yml/master?enable=pin","Warn: pipCommand not pinned by hash: tools/win_installer/bootstrap.sh:29","Warn: pipCommand not pinned by hash: .github/workflows/linttest.yml:27","Warn: pipCommand not pinned by hash: .github/workflows/linttest.yml:28","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 3.11.5 not signed: https://api.github.com/repos/gpodder/gpodder/releases/191838673","Warn: release artifact 3.11.4 not signed: https://api.github.com/repos/gpodder/gpodder/releases/124708477","Warn: release artifact 3.11.3 not signed: https://api.github.com/repos/gpodder/gpodder/releases/123207813","Warn: release artifact 3.11.2 not signed: https://api.github.com/repos/gpodder/gpodder/releases/117103886","Warn: release artifact 3.11.1 not signed: https://api.github.com/repos/gpodder/gpodder/releases/92912464","Warn: release artifact 3.11.5 does not have provenance: https://api.github.com/repos/gpodder/gpodder/releases/191838673","Warn: release artifact 3.11.4 does not have provenance: https://api.github.com/repos/gpodder/gpodder/releases/124708477","Warn: release artifact 3.11.3 does not have provenance: https://api.github.com/repos/gpodder/gpodder/releases/123207813","Warn: release artifact 3.11.2 does not have provenance: https://api.github.com/repos/gpodder/gpodder/releases/117103886","Warn: release artifact 3.11.1 does not have provenance: https://api.github.com/repos/gpodder/gpodder/releases/92912464"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T05:55:04.424Z","repository_id":37706484,"created_at":"2025-08-19T05:55:04.425Z","updated_at":"2025-08-19T05:55:04.425Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278343086,"owners_count":25971400,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T08:00:59.973Z","updated_at":"2025-10-04T17:10:44.247Z","avatar_url":"https://github.com/gpodder.png","language":"Python","readme":"          ___         _    _           ____\n     __ _| _ \\___  __| |__| |___ _ _  |__ /\n    / _` |  _/ _ \\/ _` / _` / -_) '_|  |_ \\\n    \\__, |_| \\___/\\__,_\\__,_\\___|_|   |___/\n    |___/\n            Media aggregator and podcast client\n___\n\nCopyright  2005-2022 The gPodder Team\n\n\n## License\n\ngPodder is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 3 of the License, or\n(at your option) any later version.\n\ngPodder is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see \u003chttp://www.gnu.org/licenses/\u003e.\n\n## Dependencies\n\n- [Python 3.8](http://python.org/) or newer\n- [Podcastparser](http://gpodder.org/podcastparser/) 0.6.0 or newer\n- [mygpoclient](http://gpodder.org/mygpoclient/) 1.7 or newer\n- [requests](https://requests.readthedocs.io) 2.24.0 or newer\n- [dbus-python](http://dbus.freedesktop.org/doc/dbus-python/)\n\nAs an alternative to python-dbus on Mac OS X and Windows, you can use\nthe dummy (no-op) D-Bus module provided in \"tools/fake-dbus-module/\".\n\nFor quick testing, see [Run from Git](\nhttps://gpodder.github.io/docs/run-from-git.html)\nto install dependencies.\n\n\n### GTK3 UI - Additional Dependencies\n\n- [PyGObject](https://wiki.gnome.org/PyGObject) 3.22.0 or newer\n- [GTK+3](https://www.gtk.org/) 3.16 or newer\n\n\n### Optional Dependencies\n\n- Bluetooth file sending: gnome-obex-send or bluetooth-sendto\n- Size detection on Windows: PyWin32\n- Native OS X support: ige-mac-integration\n- MP3 Player Sync Support: python-eyed3 (0.7 or newer)\n- iPod Sync Support: libgpod (tested with 0.8.3)\n- Clickable links in GTK UI show notes: html5lib\n- HTML show notes: WebKit2 gobject bindings\n    (webkit2gtk, webkitgtk4 or gir1.2-webkit2-4.0 packages).\n- Better Youtube support (\u003e 15 entries in feeds, download audio-only):\n    youtube_dl or yt-dlp\n\n\n### Build Dependencies\n\n- [build](https://github.com/pypa/build/) only if using `make buildwheel` or\n    `make install`\n- [installer](https://github.com/pypa/installer/) only if using `make install`\n- help2man\n- intltool\n\n\n### Test Dependencies\n\n- pytest\n- pytest-httpserver\n- pytest-cov\n- desktop-file-utils\n\n## Testing\n\nTo run tests, use...\n\n    make unittest\n\nTo set a specific python binary set PYTHON:\n\n    PYTHON=python3 make unittest\n\nTests in gPodder are written in two different ways:\n\n- [doctests](http://docs.python.org/3/library/doctest.html)\n- [unittests](http://docs.python.org/3/library/unittest.html)\n\nIf you want to add doctests, simply write the doctest and make sure that\nthe module appears after `--doctest-modules` in `pytest.ini`. If you\nadd tests to any module in `src/gpodder` you have nothing to do.\n\nIf you want to add unit tests for a specific module (ex: gpodder.model),\nyou should add the tests as gpodder.test.model, or in other words:\n\n    The file:       src/gpodder/model.py\n    is tested by:   src/gpodder/test/model.py\n\nAfter you've added the test, make sure that the module appears in\n\"test_modules\" in src/gpodder/unittests.py - for the example above, the\nunittests in src/gpodder/test/model.py are added as 'model'. For unit\ntests, coverage reporting happens for the tested module (that's why the\ntest module name should mirror the module to be tested).\n\n\n## Running and Installation\n\nTo run gPodder from source, use..\n\n    bin/gpodder              # for the Gtk+ UI\n    bin/gpo                  # for the command-line interface\n\nTo install gPodder system-wide, use `make install`. By default, this\nwill install *all* UIs and all translations. The following environment\nvariables are processed by setup.py:\n\n    LINGUAS                  space-separated list of languages to install\n    GPODDER_INSTALL_UIS      space-separated list of UIs to install\n    GPODDER_MANPATH_NO_SHARE if set, install manpages to $PREFIX/man/man1\n\nSee setup.py for a list of recognized UIs.\n\nExample: Install the CLI and Gtk UI with German and Dutch translations:\n\n    export LINGUAS=\"de nl\"\n    export GPODDER_INSTALL_UIS=\"cli gtk\"\n    make install\n\nThe \"make install\" target also supports DESTDIR and PREFIX for installing\ninto an alternative root (default /) and prefix (default /usr):\n\n    make install DESTDIR=tmp/ PREFIX=/usr/local/\n\n[*Debian*](https://wiki.debian.org/Python#Deviations_from_upstream) and *Ubuntu*\nuse `dist-packages` instead of `site-packages` for third party installs, so\nyou'll want something like:\n\n    sudo python3 setup.py install --root / --prefix /usr/local --optimize=1 --install-lib=/usr/local/lib/python3.10/dist-packages\n\nIn fact, first try running `python -c \"import sys; print(sys.path)\"` to check\nwhat is the exact path.  It depends on your version of python.\n\n## Portable Mode / Roaming Profiles\n\nThe run-time environment variable GPODDER_HOME is used to set\nthe location for storing the database and downloaded files.\n\nThis can be used for multiple configurations or to store the\ndownload directory directly on a MP3 player or USB disk:\n\n    export GPODDER_HOME=/media/usbdisk/gpodder-data/\n\n\n## OS X Specific Notes\n\nDefault directories:\n\n - GPODDER_HOME=\"$HOME/Library/Application Support/gPodder\"\n - GPODDER_DOWNLOAD_DIR=\"$HOME/Library/Application Support/gPodder/download\"\n\nThese settings may be modified by editing the following file of the .app :\n\n    /Applications/gPodder.app/Contents/MacOSX/_launcher\n\nAdd and edit the following lines to alter the launch environment on OS X :\n\n    export GPODDER_HOME=\"$HOME/Library/Application Support/gPodder\"\n    export GPODDER_DOWNLOAD_DIR=\"$HOME/Library/Application Support/gPodder/download\"\n\n\n##  Changing the Download Directory\n\nThe run-time environment variable GPODDER_DOWNLOAD_DIR is used to\nset the location for storing the downloads only (independent of the\ndata directory GPODDER_HOME):\n\n    export GPODDER_DOWNLOAD_DIR=/media/BigDisk/Podcasts/\n\nIn this case, the database and settings will be stored in the default\nlocation, with the downloads stored in /media/BigDisk/Podcasts/.\n\nAnother example would be to set both environment variables:\n\n    export GPODDER_HOME=~/.config/gpodder/\n    export GPODDER_DOWNLOAD_DIR=~/Podcasts/\n\nThis will store the database and settings files in ~/.config/gpodder/\nand the downloads in ~/Podcasts/. If GPODDER_DOWNLOAD_DIR is not set,\n$GPODDER_HOME/Downloads/ will be used if it is set.\n\n\n## Logging\n\nBy default, gPodder writes log files to $GPODDER_HOME/Logs/ and removes\nthem after a certain amount of times. To avoid this behavior, you can set\nthe environment variable GPODDER_WRITE_LOGS to \"no\", e.g:\n\n    export GPODDER_WRITE_LOGS=no\n\n\n## Extensions\n\nExtensions are normally loaded from gPodder's \"extensions/\" folder (in\nshare/gpodder/extensions/) and from $GPODDER_HOME/Extensions/ - you can\noverride this by setting an environment variable:\n\n    export GPODDER_EXTENSIONS=\"/path/to/extension1.py extension2.py\"\n\nIn addition to that, if you want to disable loading of all extensions,\nyou can do this by setting the following environment variable to a non-\nempty value:\n\n    export GPODDER_DISABLE_EXTENSIONS=yes\n\nIf you want to report a bug, please try to disable all extensions and\ncheck if the bug still appears to see if an extension causes the bug.\n\n\n## More Information\n\n- Homepage:                         http://gpodder.org/\n- Bug tracker:                      https://github.com/gpodder/gpodder/issues\n- Mailing list:                     http://freelists.org/list/gpodder\n- IRC channel:                      #gpodder on irc.libera.chat\n","funding_links":["https://gpodder.net/contribute/"],"categories":["\u003ca id=\"tag-internet\" href=\"#tag-internet\"\u003eInternet\u003c/a\u003e","Python","Applications","others","应用"],"sub_categories":["Audio","Podcast","音频","📦 Podcast (7)"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgpodder%2Fgpodder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgpodder%2Fgpodder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgpodder%2Fgpodder/lists"}