termradio 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ __pycache__/
2
+ *.pyc
3
+ dist/
4
+ build/
5
+ *.egg-info/
6
+ .venv/
@@ -0,0 +1,85 @@
1
+ Metadata-Version: 2.5
2
+ Name: termradio
3
+ Version: 0.1.0
4
+ Summary: Radio, music and podcasts in your terminal. No API keys.
5
+ License-Expression: MIT
6
+ Keywords: music,podcasts,radio,terminal,textual,tui,vlc
7
+ Classifier: Environment :: Console
8
+ Classifier: Intended Audience :: End Users/Desktop
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Players
11
+ Requires-Python: >=3.9
12
+ Requires-Dist: python-vlc<4,>=3.0
13
+ Requires-Dist: textual>=8.0
14
+ Description-Content-Type: text/markdown
15
+
16
+ # termradio
17
+
18
+ Radio, music and podcasts in your terminal. No browser, no API keys, no extra executables:
19
+ audio goes through the VLC you already have installed (`python-vlc` loads `libvlc.dll` from it).
20
+
21
+ ## Install
22
+
23
+ ```
24
+ pip install termradio
25
+ termradio
26
+ termradio --country IN # podcast charts for India (remembered)
27
+ ```
28
+
29
+ Needs Python 3.9+ and [VLC 3.x](https://www.videolan.org/vlc/) installed (the app plays audio through it).
30
+
31
+ ## What's in it
32
+
33
+ | Tab | Sources | What you get |
34
+ |---|---|---|
35
+ | **1 Radio** | Radio Browser, SomaFM, a curated list | ~50,000 live stations. Browse by genre, country or language, or see trending, most played and top voted. 49 hand-checked stations (Radio Paradise, KEXP, FIP, NTS, BBC World Service, WFMU, Swiss Jazz, Nightride…) and all ~46 SomaFM channels |
36
+ | **2 Music** | Audius, Internet Archive, ccMixter | Full-length on-demand tracks. Audius has trending tracks by genre (36 genres) and playlists. Internet Archive has live concerts, Grateful Dead, netlabels, 78 RPM records, jazz and classical. ccMixter has Creative Commons tracks. Search covers all three |
37
+ | **3 Podcasts** | Apple Podcasts directory + RSS, Internet Archive | Top charts in 20 categories, search for any podcast, full episode lists. Also LibriVox audiobooks and Old Time Radio. Episodes remember where you stopped |
38
+ | **4 Favourites** | – | Anything you star with `f` or the ☆ Fav button: stations, tracks, albums, playlists, podcasts, episodes, and whole categories from the sidebar (e.g. Radio › Jazz) |
39
+ | **5 History** | – | The last 300 things you played |
40
+
41
+ ## Keys
42
+
43
+ | Key | Action |
44
+ |---|---|
45
+ | `enter` | play, or open a folder / album / podcast |
46
+ | `backspace` / `esc` | go back to the previous list (after opening something, a search or a category); while loading, cancels |
47
+ | `/` | search (in the current tab) |
48
+ | `space` | pause / resume |
49
+ | `s` | stop |
50
+ | `n` / `p` | next / previous in the list |
51
+ | `+` / `-` | volume, `m` mute |
52
+ | `[` / `]` | seek -15s / +30s (tracks and episodes) |
53
+ | `,` / `.` | seek -5s / +5s |
54
+ | mouse | click or drag the progress bar at the bottom to jump anywhere |
55
+ | `f` | add / remove favourite |
56
+ | `c` | copy a shareable ID for the selected item |
57
+ | `t` | sleep timer: 15 → 30 → 60 → 90 min → off |
58
+ | `1`–`5` | switch tab |
59
+ | `q` | quit |
60
+
61
+ **Favourites and sharing.** `f` / ☆ Fav and `c` / ⧉ Copy ID act on the highlighted row, or on the
62
+ highlighted sidebar category when the sidebar has focus. The copied ID looks like
63
+ `termradio:audius-album:eNpN…`; paste it into any tab's search box to bring that exact item up
64
+ (play it, open it or favourite it). It carries everything needed, so it works on a colleague's machine too.
65
+
66
+ Radio search can filter: `tag:jazz`, `country:IN`, `lang:hindi`, and they combine,
67
+ e.g. `country:IN tag:bollywood` or `mirchi country:IN`.
68
+
69
+ ## Files
70
+
71
+ - `app.py`: the terminal UI (Textual)
72
+ - `sources.py`: every data source. All are free and need no key
73
+ - `player.py`: playback through libvlc
74
+ - If audio won't start, termradio says why and exits: VLC missing, 32-bit VLC with 64-bit Python
75
+ (or the reverse), or VLC 4 (only VLC 3.x is supported). Installed somewhere unusual? Set
76
+ `TERMRADIO_VLC_DIR` to the folder that contains `libvlc.dll`.
77
+ - State (favourites, history, volume, podcast positions): `~/.termradio/state.json`
78
+
79
+ ## Notes
80
+
81
+ - SomaFM rejects requests that send no User-Agent (you get a 403, as with plain `curl`).
82
+ termradio always sends one.
83
+ - ccMixter refuses hotlinks without a Referer header. The player sends the stream's own site as the Referer.
84
+ - Podcast URLs often chain 4–6 tracking redirects, which VLC won't follow, so they're resolved in Python first.
85
+ - Radio streams that drop reconnect automatically, up to 3 times in a row.
@@ -0,0 +1,70 @@
1
+ # termradio
2
+
3
+ Radio, music and podcasts in your terminal. No browser, no API keys, no extra executables:
4
+ audio goes through the VLC you already have installed (`python-vlc` loads `libvlc.dll` from it).
5
+
6
+ ## Install
7
+
8
+ ```
9
+ pip install termradio
10
+ termradio
11
+ termradio --country IN # podcast charts for India (remembered)
12
+ ```
13
+
14
+ Needs Python 3.9+ and [VLC 3.x](https://www.videolan.org/vlc/) installed (the app plays audio through it).
15
+
16
+ ## What's in it
17
+
18
+ | Tab | Sources | What you get |
19
+ |---|---|---|
20
+ | **1 Radio** | Radio Browser, SomaFM, a curated list | ~50,000 live stations. Browse by genre, country or language, or see trending, most played and top voted. 49 hand-checked stations (Radio Paradise, KEXP, FIP, NTS, BBC World Service, WFMU, Swiss Jazz, Nightride…) and all ~46 SomaFM channels |
21
+ | **2 Music** | Audius, Internet Archive, ccMixter | Full-length on-demand tracks. Audius has trending tracks by genre (36 genres) and playlists. Internet Archive has live concerts, Grateful Dead, netlabels, 78 RPM records, jazz and classical. ccMixter has Creative Commons tracks. Search covers all three |
22
+ | **3 Podcasts** | Apple Podcasts directory + RSS, Internet Archive | Top charts in 20 categories, search for any podcast, full episode lists. Also LibriVox audiobooks and Old Time Radio. Episodes remember where you stopped |
23
+ | **4 Favourites** | – | Anything you star with `f` or the ☆ Fav button: stations, tracks, albums, playlists, podcasts, episodes, and whole categories from the sidebar (e.g. Radio › Jazz) |
24
+ | **5 History** | – | The last 300 things you played |
25
+
26
+ ## Keys
27
+
28
+ | Key | Action |
29
+ |---|---|
30
+ | `enter` | play, or open a folder / album / podcast |
31
+ | `backspace` / `esc` | go back to the previous list (after opening something, a search or a category); while loading, cancels |
32
+ | `/` | search (in the current tab) |
33
+ | `space` | pause / resume |
34
+ | `s` | stop |
35
+ | `n` / `p` | next / previous in the list |
36
+ | `+` / `-` | volume, `m` mute |
37
+ | `[` / `]` | seek -15s / +30s (tracks and episodes) |
38
+ | `,` / `.` | seek -5s / +5s |
39
+ | mouse | click or drag the progress bar at the bottom to jump anywhere |
40
+ | `f` | add / remove favourite |
41
+ | `c` | copy a shareable ID for the selected item |
42
+ | `t` | sleep timer: 15 → 30 → 60 → 90 min → off |
43
+ | `1`–`5` | switch tab |
44
+ | `q` | quit |
45
+
46
+ **Favourites and sharing.** `f` / ☆ Fav and `c` / ⧉ Copy ID act on the highlighted row, or on the
47
+ highlighted sidebar category when the sidebar has focus. The copied ID looks like
48
+ `termradio:audius-album:eNpN…`; paste it into any tab's search box to bring that exact item up
49
+ (play it, open it or favourite it). It carries everything needed, so it works on a colleague's machine too.
50
+
51
+ Radio search can filter: `tag:jazz`, `country:IN`, `lang:hindi`, and they combine,
52
+ e.g. `country:IN tag:bollywood` or `mirchi country:IN`.
53
+
54
+ ## Files
55
+
56
+ - `app.py`: the terminal UI (Textual)
57
+ - `sources.py`: every data source. All are free and need no key
58
+ - `player.py`: playback through libvlc
59
+ - If audio won't start, termradio says why and exits: VLC missing, 32-bit VLC with 64-bit Python
60
+ (or the reverse), or VLC 4 (only VLC 3.x is supported). Installed somewhere unusual? Set
61
+ `TERMRADIO_VLC_DIR` to the folder that contains `libvlc.dll`.
62
+ - State (favourites, history, volume, podcast positions): `~/.termradio/state.json`
63
+
64
+ ## Notes
65
+
66
+ - SomaFM rejects requests that send no User-Agent (you get a 403, as with plain `curl`).
67
+ termradio always sends one.
68
+ - ccMixter refuses hotlinks without a Referer header. The player sends the stream's own site as the Referer.
69
+ - Podcast URLs often chain 4–6 tracking redirects, which VLC won't follow, so they're resolved in Python first.
70
+ - Radio streams that drop reconnect automatically, up to 3 times in a row.
@@ -0,0 +1,28 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "termradio"
7
+ version = "0.1.0"
8
+ description = "Radio, music and podcasts in your terminal. No API keys."
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = "MIT"
12
+ keywords = ["radio", "podcasts", "music", "terminal", "tui", "textual", "vlc"]
13
+ classifiers = [
14
+ "Environment :: Console",
15
+ "Intended Audience :: End Users/Desktop",
16
+ "Programming Language :: Python :: 3",
17
+ "Topic :: Multimedia :: Sound/Audio :: Players",
18
+ ]
19
+ dependencies = [
20
+ "textual>=8.0",
21
+ "python-vlc>=3.0,<4",
22
+ ]
23
+
24
+ [project.scripts]
25
+ termradio = "termradio.app:main"
26
+
27
+ [tool.hatch.build.targets.wheel]
28
+ packages = ["src/termradio"]
@@ -0,0 +1,2 @@
1
+ """termradio - radio, music and podcasts in your terminal."""
2
+ __version__ = "0.1.0"
@@ -0,0 +1,3 @@
1
+ from .app import main
2
+
3
+ main()