{"id":48088080,"url":"https://github.com/tnoff/hathor","last_synced_at":"2026-04-04T15:25:46.632Z","repository":{"id":69235259,"uuid":"76080668","full_name":"tnoff/hathor","owner":"tnoff","description":"Hathor Podcast Manager","archived":false,"fork":false,"pushed_at":"2026-03-28T17:43:07.000Z","size":447,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-28T19:25:52.323Z","etag":null,"topics":["podcast","python","rss","youtube"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tnoff.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.rst","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2016-12-10T00:30:39.000Z","updated_at":"2026-03-26T17:52:55.000Z","dependencies_parsed_at":"2024-03-26T05:21:48.682Z","dependency_job_id":"4068a8a0-bd93-4c45-92c7-9b54ad8d2572","html_url":"https://github.com/tnoff/hathor","commit_stats":null,"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"purl":"pkg:github/tnoff/hathor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnoff%2Fhathor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnoff%2Fhathor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnoff%2Fhathor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnoff%2Fhathor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tnoff","download_url":"https://codeload.github.com/tnoff/hathor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tnoff%2Fhathor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31403958,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["podcast","python","rss","youtube"],"created_at":"2026-04-04T15:25:45.769Z","updated_at":"2026-04-04T15:25:46.622Z","avatar_url":"https://github.com/tnoff.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hathor\n\nHathor is a python package that is designed to help users download and maintain media files, focusing on podcasts.\n\nIncludes support for the following feed types:\n- RSS\n- Youtube\n\n\n## Installation\n\nClone the repo from github and use pip to install:\n\n```\ngit clone https://github.com/tnoff/hathor.git\npip install hathor/\n```\n\n### What Is Installed\n\nThe ``hathor`` python module will be installed, as well as 2 cli scripts:\n\n- `hathor` — downloading and managing podcast media files\n- `audio-tool` — reading and modifying metadata on audio files\n\n## The Hathor Client\n\nThe hathor client is the main component of hathor. Using the hathor cli or hathor python\npackage, it is possible to create new podcast records, update them, and download the latest episodes.\n\nYou can use hathor with the command line:\n\n    hathor podcast --help\n\n### Initialization and Settings\n\nThese variables can be loaded from a settings file. The default location of this settings file\nis the home directory, under ``~/.hathor_config.yml``. It can also be specified on the command line\nwith the ``-c`` flag.\n\nThere should be two sections, `hathor` and `logging`:\n\n```yaml\n---\nhathor:\n  podcast_directory: /home/user/foo\n  database_connection_string: sqlite:////home/user/foo.sql\n  google_api_key: abc1234\n  datetime_output_format: \"%Y-%m-%d\"\nlogging:\n  logging_file: /home/user/foo.log\n  console_logging: true\n  log_level: 10\n  logging_file_backup_count: 5\n  logging_file_max_bytes: 102400\n```\n\n### Podcast Archives\n\nWhen creating a new podcast record, users will need to specify where the podcast will be downloaded\nfrom, we call that the \"archive\". The following archives are supported:\n\n- Youtube\n- RSS Feeds\n\n#### Google API Keys\n\nTo download podcasts from youtube, users will need a [Google API secret key](https://console.developers.google.com).\n\nThis can be placed in the settings file under `google_api_key`, or passed directly when initializing the client.\n\n#### Broadcast ID\n\nThe broadcast ID is the unique identifier for a podcast within its archive.\n\nFor **RSS**, the broadcast ID is the feed URL:\n\n```\n$ hathor podcast create \"rss\" \"https://example.com/feed.rss\" \"podcast-name\"\n```\n\nFor **Youtube**, the broadcast ID is the channel ID from the channel URL. For example, given\n`https://www.youtube.com/channel/UC27vDmUZpQjuJFFkUz8ujtg`, the broadcast ID is `UC27vDmUZpQjuJFFkUz8ujtg`.\n\nYou may need to use 3rd party tools to find the channel ID of a particular uploader, such as [ytlarge](https://ytlarge.com/youtube/channel-id-finder/).\n\n\n### Downloading Podcasts\n\nWith an archive type and broadcast ID, create a new podcast record:\n\n```\n$ hathor podcast create \"rss\" \"http://example.foo/rss/feed\" \"podcast-name\"\n```\n\nRun a podcast sync to check for new episodes and download them:\n\n```\n$ hathor podcast sync\n```\n\nList episodes:\n\n```\n# Only episodes with downloaded files\n$ hathor episode list --only-files\n# All episodes\n$ hathor episode list\n```\n\nSync episode metadata without downloading files:\n\n```\n$ hathor episode sync\n```\n\nDownload a specific episode by ID:\n\n```\n$ hathor episode download \u003cepisode-id\u003e\n```\n\n#### Max Allowed\n\nThe \"max allowed\" option controls how many episode files are kept at one time. For example, if\nmax allowed is set to 5, hathor will keep the five latest episodes and delete any older files.\n\n```\n$ hathor podcast update \u003cpodcast-id\u003e --max-allowed 5\n```\n\nTo remove the limit and keep all episodes, set it to 0:\n\n```\n$ hathor podcast update \u003cpodcast-id\u003e --max-allowed 0\n```\n\nTo prevent a specific episode from being deleted by max allowed:\n\n```\n$ hathor episode update \u003cepisode-id\u003e True\n```\n\n#### Episode Filters\n\nEpisode filters control which episodes are added to the database and downloaded, matched against\nepisode titles using regexes.\n\n```\n$ hathor filter create \u003cpodcast-id\u003e \u003cregex-filter\u003e\n```\n\n## The Audio Tool\n\n`audio-tool` provides standalone commands for reading and modifying audio file metadata.\n\nShow tags on an audio file:\n\n```\n$ audio-tool tags-show \u003cfile\u003e\n```\n\nUpdate tags on an audio file (comma-separated `key=value` pairs):\n\n```\n$ audio-tool tags-update \u003cfile\u003e \"artist=My Artist,album=My Album\"\n```\n\nUpdate the cover art on an audio file:\n\n```\n$ audio-tool picture-update \u003caudio-file\u003e \u003cimage-file\u003e\n```\n\nExtract cover art from an audio file:\n\n```\n$ audio-tool picture-extract \u003caudio-file\u003e \u003coutput-file\u003e\n```\n\n## Docker\n\nBuild the image:\n\n```bash\ndocker build -t hathor .\n```\n\nCreate a config file pointing to container paths:\n\n```yaml\n---\nhathor:\n  podcast_directory: /podcasts\n  database_connection_string: sqlite:////data/hathor.sql\n  google_api_key: abc1234\nlogging:\n  logging_file: /data/hathor.log\n  console_logging: true\n  log_level: 20\n```\n\nRun a podcast sync, mounting your local directories:\n\n```bash\ndocker run --rm \\\n  -v /home/user/podcasts:/podcasts \\\n  -v /home/user/hathor-data:/data \\\n  -v /home/user/hathor-config:/config \\\n  hathor -c /config/hathor_config.yml podcast sync\n```\n\nTo use `audio-tool`, override the entrypoint:\n\n```bash\ndocker run --rm \\\n  --entrypoint audio-tool \\\n  -v /home/user/podcasts:/podcasts \\\n  hathor tags-show /podcasts/episode.mp3\n```\n\n## Development\n\nSee [DEVELOPMENT.md](DEVELOPMENT.md) for instructions on setting up a local dev environment, running tests, and writing plugins.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftnoff%2Fhathor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftnoff%2Fhathor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftnoff%2Fhathor/lists"}