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.
- termradio-0.1.0/.gitignore +6 -0
- termradio-0.1.0/PKG-INFO +85 -0
- termradio-0.1.0/README.md +70 -0
- termradio-0.1.0/pyproject.toml +28 -0
- termradio-0.1.0/src/termradio/__init__.py +2 -0
- termradio-0.1.0/src/termradio/__main__.py +3 -0
- termradio-0.1.0/src/termradio/app.py +849 -0
- termradio-0.1.0/src/termradio/player.py +226 -0
- termradio-0.1.0/src/termradio/sources.py +567 -0
termradio-0.1.0/PKG-INFO
ADDED
|
@@ -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"]
|