ttyplayer 0.3.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,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Weblift SRL
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,222 @@
1
+ Metadata-Version: 2.4
2
+ Name: ttyplayer
3
+ Version: 0.3.0
4
+ Summary: ttyplayer: a modern YouTube player for the terminal — search, queue, and play audio or video via mpv
5
+ Keywords: youtube,music,player,mpv,cli,terminal,tui,yt-dlp
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: End Users/Desktop
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Players
16
+ Requires-Dist: textual>=8.2
17
+ Requires-Dist: typer>=0.27.2
18
+ Requires-Dist: yt-dlp>=2026.8.19
19
+ Requires-Python: >=3.13
20
+ Project-URL: Homepage, https://github.com/webliftro/ttyplayer
21
+ Project-URL: Repository, https://github.com/webliftro/ttyplayer
22
+ Description-Content-Type: text/markdown
23
+
24
+ # ttyplayer
25
+
26
+ A modern YouTube player for the terminal. Search YouTube, queue videos and playlists, and play audio, or video too, through mpv: from the command line, or from a full-screen TUI. Keep a history and favorites, and drive the player from any other terminal.
27
+
28
+ ## Usage
29
+
30
+ ```
31
+ ttyplayer play <url> play a video link, audio only
32
+ ttyplayer play <playlist url> queue every entry of a playlist
33
+ ttyplayer play <words...> search, pick one or more results, play them in order
34
+ ttyplayer play ... --video open a video window as well
35
+ ttyplayer play ... --limit 10 show more search results
36
+
37
+ ttyplayer search <words...> list results with durations
38
+ ttyplayer history recently played, newest first
39
+ ttyplayer history --play pick from history and play again
40
+ ttyplayer history --clear forget the history
41
+ ttyplayer favorite <url | words...> add a link, a playlist, or search picks to favorites
42
+ ttyplayer favorites favorites, newest first
43
+ ttyplayer favorites --play pick from favorites and play them
44
+ ttyplayer favorites --remove 2 drop the second favorite as listed
45
+ ttyplayer favorites --clear forget all favorites
46
+ ttyplayer tui [--video] full-screen: search box, results list, now-playing bar
47
+ ttyplayer doctor check Python, yt-dlp, mpv and ttyplayer's folders
48
+ ttyplayer version
49
+ ```
50
+
51
+ While ttyplayer plays in one terminal, any other terminal can drive it:
52
+
53
+ ```
54
+ ttyplayer pause pause / resume
55
+ ttyplayer next next in the queue
56
+ ttyplayer prev previous in the queue
57
+ ttyplayer stop quit the player
58
+ ttyplayer status 1:23 / 4:56 Playing <title>
59
+ ```
60
+
61
+ Keys while playing:
62
+
63
+ | Key | Action |
64
+ |---|---|
65
+ | space | pause / resume |
66
+ | left / right, `,` / `.` | seek 5 seconds |
67
+ | up / down | volume |
68
+ | `n` / `p` | next / previous in the queue |
69
+ | `q` or Ctrl-C | quit, restores the terminal and stops mpv |
70
+
71
+ On Windows (Windows Terminal, PowerShell) the keys, arrows included, map the same way.
72
+
73
+ The volume meter, and the volume keys here and in the TUI, follow the Mac's system volume on macOS (the Mac's own volume keys move the meter within 2 seconds) and mpv's device (per-app) volume on Linux and Windows.
74
+
75
+ Picks accept several numbers at once: `1 3 5` queues those three in that order. After a search, `m` lists the next batch of results.
76
+
77
+ `TTYPLAYER_TIMING=1 ttyplayer play <words>` prints how long the YouTube lookup took and adds `started in 2.4s` (from `loadfile` to the first sound) to the status line.
78
+
79
+ ## TUI
80
+
81
+ `ttyplayer tui` opens a full-screen player: a search box, Search / Queue / History / Favorites tabs, and a now-playing panel. Type a search or paste a link and press Enter. Ctrl-P opens the command palette (search, next theme, help, quit, pause, next, previous, mute, and Textual's own theme picker); `?` lists every key and command.
82
+
83
+ | Where | Key | Action |
84
+ |---|---|---|
85
+ | anywhere | `/` | focus the search box (`esc` returns to the table) |
86
+ | anywhere | `?` | help: every key and command (`esc` closes) |
87
+ | anywhere | `1` `2` `3` `4` | Search / Queue / History / Favorites tab |
88
+ | anywhere | Ctrl-C | quit and stop mpv |
89
+ | anywhere | Ctrl-P | command palette |
90
+ | anywhere | `t` | next theme |
91
+ | table | `q` | quit and stop mpv (in the search box it is just a letter) |
92
+ | table | `space` | pause / resume |
93
+ | table | `n` / `p` | next / previous |
94
+ | table | `,` / `.` | seek −5 s / +5 s |
95
+ | table | `<` / `>` | seek −30 s / +30 s |
96
+ | table | `-` / `+` | volume −5 / +5 |
97
+ | table | `M` | mute / unmute (🔇 in the panel) |
98
+ | table | `f` | favorite / unfavorite this row (the track playing when there is no row) |
99
+ | Search · History · Favorites row | Enter | play this one, then the rows after it |
100
+ | Search · History · Favorites row | `a` | add to the queue |
101
+ | Search | `m` | more results |
102
+ | Queue row | Enter | jump to this item |
103
+ | Queue row | `d` | remove from the queue |
104
+ | Queue row | `K` / `J` (or `shift+↑` / `shift+↓`) | move up / down |
105
+ | Queue | `c` | clear the queue (keeps the current track playing) |
106
+ | Favorites row | `d` | remove from favorites |
107
+
108
+ In the search box, letters, digits, `/` and `?` are typed as text; `esc` leaves it for the table.
109
+
110
+ ## Install
111
+
112
+ One command installs everything ttyplayer needs.
113
+
114
+ macOS and Linux:
115
+
116
+ ```
117
+ curl -LsSf https://raw.githubusercontent.com/webliftro/ttyplayer/main/install.sh | sh
118
+ ```
119
+
120
+ Windows (PowerShell):
121
+
122
+ ```
123
+ irm https://raw.githubusercontent.com/webliftro/ttyplayer/main/install.ps1 | iex
124
+ ```
125
+
126
+ Or clone the repository and run `./install.sh` (macOS, Linux) or `powershell -ExecutionPolicy ByPass -File .\install.ps1` (Windows) inside it; that installs the checkout you cloned.
127
+
128
+ The script:
129
+
130
+ 1. installs [uv](https://docs.astral.sh/uv/) with its official installer if `uv` is missing (uv brings its own Python 3.13+; it runs as you, without sudo),
131
+ 2. installs mpv if it is missing: Homebrew on macOS, your package manager on Linux (`apt-get`, `dnf`, `pacman`, `zypper` or `apk`, with `sudo`), winget on Windows,
132
+ 3. installs ttyplayer with `uv tool install`,
133
+ 4. runs `ttyplayer doctor`: every line should start with ✓.
134
+
135
+ It prints every command before running it. `TTYPLAYER_INSTALL_DRY_RUN=1 ./install.sh` and `install.ps1 -DryRun` only print them. If Homebrew (macOS) or winget (Windows) is missing, the script tells you how to install it and stops. If `ttyplayer` is not found in a new terminal, run `uv tool update-shell`.
136
+
137
+ <details>
138
+ <summary>By hand</summary>
139
+
140
+ Three steps on every system: install uv, install mpv, install ttyplayer. Then run `ttyplayer doctor`.
141
+
142
+ macOS:
143
+
144
+ ```
145
+ curl -LsSf https://astral.sh/uv/install.sh | sh
146
+ brew install mpv
147
+ uv tool install ttyplayer
148
+ ```
149
+
150
+ Linux:
151
+
152
+ ```
153
+ curl -LsSf https://astral.sh/uv/install.sh | sh
154
+ sudo apt-get install -y mpv
155
+ uv tool install ttyplayer
156
+ ```
157
+
158
+ On Fedora use `sudo dnf install -y mpv`, on Arch `sudo pacman -S --noconfirm mpv`, on openSUSE `sudo zypper install -y mpv`, on Alpine `sudo apk add mpv`.
159
+
160
+ Windows:
161
+
162
+ ```
163
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
164
+ winget install -e --id shinchiro.mpv
165
+ uv tool install ttyplayer
166
+ ```
167
+
168
+ Instead of winget, `scoop install mpv` (from the `extras` bucket) or `choco install mpv` work too.
169
+
170
+ `uv tool install ttyplayer` installs from PyPI once ttyplayer is published there. Until then install straight from GitHub:
171
+
172
+ ```
173
+ uv tool install git+https://github.com/webliftro/ttyplayer
174
+ ```
175
+
176
+ </details>
177
+
178
+ Upgrade with `uv tool upgrade ttyplayer`. Uninstall with `uv tool uninstall ttyplayer`.
179
+
180
+ ## Development
181
+
182
+ Install from a checkout, with mpv installed as above:
183
+
184
+ ```
185
+ uv tool install --editable .
186
+ ```
187
+
188
+ The `--editable` flag means edits to the source are live without reinstalling.
189
+
190
+ ```
191
+ uv run pytest # unit tests, no network and no mpv needed
192
+ uv run ttyplayer ... # run from the checkout
193
+ ```
194
+
195
+ The live tests talk to the real YouTube through `ttyplayer.youtube`, so a yt-dlp or YouTube change shows up as a failing test. They are skipped unless `TTYPLAYER_LIVE=1` is set:
196
+
197
+ ```
198
+ uv run pytest -q # default suite, live tests skipped
199
+ TTYPLAYER_LIVE=1 uv run pytest -q tests/test_live.py # live tests, needs network
200
+ ```
201
+
202
+ History lives in `$XDG_DATA_HOME/ttyplayer/history.jsonl`, by default `~/.local/share/ttyplayer/history.jsonl` (`%LOCALAPPDATA%\ttyplayer\history.jsonl` on Windows). Favorites live next to it in `favorites.jsonl`. History and favorites kept under the player's earlier name are moved here on the first run.
203
+
204
+ ### Releasing
205
+
206
+ CI (`.github/workflows/tests.yml`) runs the suite on Linux and macOS on every push. Pushing a `v*` tag runs `.github/workflows/release.yml`, which builds with `uv build` and publishes to PyPI through trusted publishing, so there is no token to store.
207
+
208
+ One-time setup on PyPI: create an account, then under "Publishing" add a pending GitHub publisher for the project `ttyplayer` with owner `webliftro`, repository `ttyplayer` and workflow `release.yml`. The first tagged release creates the project.
209
+
210
+ To release, bump the version (`uv version --bump minor`, or edit `version` in `pyproject.toml`), commit, then:
211
+
212
+ ```
213
+ git tag v0.3.0 && git push --tags
214
+ ```
215
+
216
+ ## How it works
217
+
218
+ yt-dlp resolves what to play: a search or a playlist becomes a list of videos, a link becomes one. mpv produces the sound, started in the background with a private IPC socket. ttyplayer talks to it in JSON over that socket, owns the keyboard, and redraws a one-line status. See `docs/architecture.md`.
219
+
220
+ ## License
221
+
222
+ MIT. See `LICENSE`.
@@ -0,0 +1,199 @@
1
+ # ttyplayer
2
+
3
+ A modern YouTube player for the terminal. Search YouTube, queue videos and playlists, and play audio, or video too, through mpv: from the command line, or from a full-screen TUI. Keep a history and favorites, and drive the player from any other terminal.
4
+
5
+ ## Usage
6
+
7
+ ```
8
+ ttyplayer play <url> play a video link, audio only
9
+ ttyplayer play <playlist url> queue every entry of a playlist
10
+ ttyplayer play <words...> search, pick one or more results, play them in order
11
+ ttyplayer play ... --video open a video window as well
12
+ ttyplayer play ... --limit 10 show more search results
13
+
14
+ ttyplayer search <words...> list results with durations
15
+ ttyplayer history recently played, newest first
16
+ ttyplayer history --play pick from history and play again
17
+ ttyplayer history --clear forget the history
18
+ ttyplayer favorite <url | words...> add a link, a playlist, or search picks to favorites
19
+ ttyplayer favorites favorites, newest first
20
+ ttyplayer favorites --play pick from favorites and play them
21
+ ttyplayer favorites --remove 2 drop the second favorite as listed
22
+ ttyplayer favorites --clear forget all favorites
23
+ ttyplayer tui [--video] full-screen: search box, results list, now-playing bar
24
+ ttyplayer doctor check Python, yt-dlp, mpv and ttyplayer's folders
25
+ ttyplayer version
26
+ ```
27
+
28
+ While ttyplayer plays in one terminal, any other terminal can drive it:
29
+
30
+ ```
31
+ ttyplayer pause pause / resume
32
+ ttyplayer next next in the queue
33
+ ttyplayer prev previous in the queue
34
+ ttyplayer stop quit the player
35
+ ttyplayer status 1:23 / 4:56 Playing <title>
36
+ ```
37
+
38
+ Keys while playing:
39
+
40
+ | Key | Action |
41
+ |---|---|
42
+ | space | pause / resume |
43
+ | left / right, `,` / `.` | seek 5 seconds |
44
+ | up / down | volume |
45
+ | `n` / `p` | next / previous in the queue |
46
+ | `q` or Ctrl-C | quit, restores the terminal and stops mpv |
47
+
48
+ On Windows (Windows Terminal, PowerShell) the keys, arrows included, map the same way.
49
+
50
+ The volume meter, and the volume keys here and in the TUI, follow the Mac's system volume on macOS (the Mac's own volume keys move the meter within 2 seconds) and mpv's device (per-app) volume on Linux and Windows.
51
+
52
+ Picks accept several numbers at once: `1 3 5` queues those three in that order. After a search, `m` lists the next batch of results.
53
+
54
+ `TTYPLAYER_TIMING=1 ttyplayer play <words>` prints how long the YouTube lookup took and adds `started in 2.4s` (from `loadfile` to the first sound) to the status line.
55
+
56
+ ## TUI
57
+
58
+ `ttyplayer tui` opens a full-screen player: a search box, Search / Queue / History / Favorites tabs, and a now-playing panel. Type a search or paste a link and press Enter. Ctrl-P opens the command palette (search, next theme, help, quit, pause, next, previous, mute, and Textual's own theme picker); `?` lists every key and command.
59
+
60
+ | Where | Key | Action |
61
+ |---|---|---|
62
+ | anywhere | `/` | focus the search box (`esc` returns to the table) |
63
+ | anywhere | `?` | help: every key and command (`esc` closes) |
64
+ | anywhere | `1` `2` `3` `4` | Search / Queue / History / Favorites tab |
65
+ | anywhere | Ctrl-C | quit and stop mpv |
66
+ | anywhere | Ctrl-P | command palette |
67
+ | anywhere | `t` | next theme |
68
+ | table | `q` | quit and stop mpv (in the search box it is just a letter) |
69
+ | table | `space` | pause / resume |
70
+ | table | `n` / `p` | next / previous |
71
+ | table | `,` / `.` | seek −5 s / +5 s |
72
+ | table | `<` / `>` | seek −30 s / +30 s |
73
+ | table | `-` / `+` | volume −5 / +5 |
74
+ | table | `M` | mute / unmute (🔇 in the panel) |
75
+ | table | `f` | favorite / unfavorite this row (the track playing when there is no row) |
76
+ | Search · History · Favorites row | Enter | play this one, then the rows after it |
77
+ | Search · History · Favorites row | `a` | add to the queue |
78
+ | Search | `m` | more results |
79
+ | Queue row | Enter | jump to this item |
80
+ | Queue row | `d` | remove from the queue |
81
+ | Queue row | `K` / `J` (or `shift+↑` / `shift+↓`) | move up / down |
82
+ | Queue | `c` | clear the queue (keeps the current track playing) |
83
+ | Favorites row | `d` | remove from favorites |
84
+
85
+ In the search box, letters, digits, `/` and `?` are typed as text; `esc` leaves it for the table.
86
+
87
+ ## Install
88
+
89
+ One command installs everything ttyplayer needs.
90
+
91
+ macOS and Linux:
92
+
93
+ ```
94
+ curl -LsSf https://raw.githubusercontent.com/webliftro/ttyplayer/main/install.sh | sh
95
+ ```
96
+
97
+ Windows (PowerShell):
98
+
99
+ ```
100
+ irm https://raw.githubusercontent.com/webliftro/ttyplayer/main/install.ps1 | iex
101
+ ```
102
+
103
+ Or clone the repository and run `./install.sh` (macOS, Linux) or `powershell -ExecutionPolicy ByPass -File .\install.ps1` (Windows) inside it; that installs the checkout you cloned.
104
+
105
+ The script:
106
+
107
+ 1. installs [uv](https://docs.astral.sh/uv/) with its official installer if `uv` is missing (uv brings its own Python 3.13+; it runs as you, without sudo),
108
+ 2. installs mpv if it is missing: Homebrew on macOS, your package manager on Linux (`apt-get`, `dnf`, `pacman`, `zypper` or `apk`, with `sudo`), winget on Windows,
109
+ 3. installs ttyplayer with `uv tool install`,
110
+ 4. runs `ttyplayer doctor`: every line should start with ✓.
111
+
112
+ It prints every command before running it. `TTYPLAYER_INSTALL_DRY_RUN=1 ./install.sh` and `install.ps1 -DryRun` only print them. If Homebrew (macOS) or winget (Windows) is missing, the script tells you how to install it and stops. If `ttyplayer` is not found in a new terminal, run `uv tool update-shell`.
113
+
114
+ <details>
115
+ <summary>By hand</summary>
116
+
117
+ Three steps on every system: install uv, install mpv, install ttyplayer. Then run `ttyplayer doctor`.
118
+
119
+ macOS:
120
+
121
+ ```
122
+ curl -LsSf https://astral.sh/uv/install.sh | sh
123
+ brew install mpv
124
+ uv tool install ttyplayer
125
+ ```
126
+
127
+ Linux:
128
+
129
+ ```
130
+ curl -LsSf https://astral.sh/uv/install.sh | sh
131
+ sudo apt-get install -y mpv
132
+ uv tool install ttyplayer
133
+ ```
134
+
135
+ On Fedora use `sudo dnf install -y mpv`, on Arch `sudo pacman -S --noconfirm mpv`, on openSUSE `sudo zypper install -y mpv`, on Alpine `sudo apk add mpv`.
136
+
137
+ Windows:
138
+
139
+ ```
140
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
141
+ winget install -e --id shinchiro.mpv
142
+ uv tool install ttyplayer
143
+ ```
144
+
145
+ Instead of winget, `scoop install mpv` (from the `extras` bucket) or `choco install mpv` work too.
146
+
147
+ `uv tool install ttyplayer` installs from PyPI once ttyplayer is published there. Until then install straight from GitHub:
148
+
149
+ ```
150
+ uv tool install git+https://github.com/webliftro/ttyplayer
151
+ ```
152
+
153
+ </details>
154
+
155
+ Upgrade with `uv tool upgrade ttyplayer`. Uninstall with `uv tool uninstall ttyplayer`.
156
+
157
+ ## Development
158
+
159
+ Install from a checkout, with mpv installed as above:
160
+
161
+ ```
162
+ uv tool install --editable .
163
+ ```
164
+
165
+ The `--editable` flag means edits to the source are live without reinstalling.
166
+
167
+ ```
168
+ uv run pytest # unit tests, no network and no mpv needed
169
+ uv run ttyplayer ... # run from the checkout
170
+ ```
171
+
172
+ The live tests talk to the real YouTube through `ttyplayer.youtube`, so a yt-dlp or YouTube change shows up as a failing test. They are skipped unless `TTYPLAYER_LIVE=1` is set:
173
+
174
+ ```
175
+ uv run pytest -q # default suite, live tests skipped
176
+ TTYPLAYER_LIVE=1 uv run pytest -q tests/test_live.py # live tests, needs network
177
+ ```
178
+
179
+ History lives in `$XDG_DATA_HOME/ttyplayer/history.jsonl`, by default `~/.local/share/ttyplayer/history.jsonl` (`%LOCALAPPDATA%\ttyplayer\history.jsonl` on Windows). Favorites live next to it in `favorites.jsonl`. History and favorites kept under the player's earlier name are moved here on the first run.
180
+
181
+ ### Releasing
182
+
183
+ CI (`.github/workflows/tests.yml`) runs the suite on Linux and macOS on every push. Pushing a `v*` tag runs `.github/workflows/release.yml`, which builds with `uv build` and publishes to PyPI through trusted publishing, so there is no token to store.
184
+
185
+ One-time setup on PyPI: create an account, then under "Publishing" add a pending GitHub publisher for the project `ttyplayer` with owner `webliftro`, repository `ttyplayer` and workflow `release.yml`. The first tagged release creates the project.
186
+
187
+ To release, bump the version (`uv version --bump minor`, or edit `version` in `pyproject.toml`), commit, then:
188
+
189
+ ```
190
+ git tag v0.3.0 && git push --tags
191
+ ```
192
+
193
+ ## How it works
194
+
195
+ yt-dlp resolves what to play: a search or a playlist becomes a list of videos, a link becomes one. mpv produces the sound, started in the background with a private IPC socket. ttyplayer talks to it in JSON over that socket, owns the keyboard, and redraws a one-line status. See `docs/architecture.md`.
196
+
197
+ ## License
198
+
199
+ MIT. See `LICENSE`.
@@ -0,0 +1,47 @@
1
+ [project]
2
+ name = "ttyplayer"
3
+ version = "0.3.0"
4
+ description = "ttyplayer: a modern YouTube player for the terminal — search, queue, and play audio or video via mpv"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13"
7
+ license = "MIT"
8
+ license-files = ["LICENSE"]
9
+ keywords = [
10
+ "youtube",
11
+ "music",
12
+ "player",
13
+ "mpv",
14
+ "cli",
15
+ "terminal",
16
+ "tui",
17
+ "yt-dlp",
18
+ ]
19
+ classifiers = [
20
+ "Development Status :: 4 - Beta",
21
+ "Environment :: Console",
22
+ "Intended Audience :: End Users/Desktop",
23
+ "License :: OSI Approved :: MIT License",
24
+ "Operating System :: OS Independent",
25
+ "Programming Language :: Python :: 3",
26
+ "Programming Language :: Python :: 3.13",
27
+ "Topic :: Multimedia :: Sound/Audio :: Players",
28
+ ]
29
+ dependencies = [
30
+ "textual>=8.2",
31
+ "typer>=0.27.2",
32
+ "yt-dlp>=2026.8.19",
33
+ ]
34
+
35
+ [project.urls]
36
+ Homepage = "https://github.com/webliftro/ttyplayer"
37
+ Repository = "https://github.com/webliftro/ttyplayer"
38
+
39
+ [project.scripts]
40
+ ttyplayer = "ttyplayer.cli:main"
41
+
42
+ [build-system]
43
+ requires = ["uv_build>=0.12.10,<0.13.0"]
44
+ build-backend = "uv_build"
45
+
46
+ [dependency-groups]
47
+ dev = ["pytest>=9.1.1"]
@@ -0,0 +1,40 @@
1
+ [project]
2
+ name = "ttyplayer"
3
+ version = "0.3.0"
4
+ description = "ttyplayer: a modern YouTube player for the terminal — search, queue, and play audio or video via mpv"
5
+ readme = "README.md"
6
+ requires-python = ">=3.13"
7
+ license = "MIT"
8
+ license-files = ["LICENSE"]
9
+ keywords = ["youtube", "music", "player", "mpv", "cli", "terminal", "tui", "yt-dlp"]
10
+ classifiers = [
11
+ "Development Status :: 4 - Beta",
12
+ "Environment :: Console",
13
+ "Intended Audience :: End Users/Desktop",
14
+ "License :: OSI Approved :: MIT License",
15
+ "Operating System :: OS Independent",
16
+ "Programming Language :: Python :: 3",
17
+ "Programming Language :: Python :: 3.13",
18
+ "Topic :: Multimedia :: Sound/Audio :: Players",
19
+ ]
20
+ dependencies = [
21
+ "textual>=8.2",
22
+ "typer>=0.27.2",
23
+ "yt-dlp>=2026.8.19",
24
+ ]
25
+
26
+ [project.urls]
27
+ Homepage = "https://github.com/webliftro/ttyplayer"
28
+ Repository = "https://github.com/webliftro/ttyplayer"
29
+
30
+ [project.scripts]
31
+ ttyplayer = "ttyplayer.cli:main"
32
+
33
+ [build-system]
34
+ requires = ["uv_build>=0.12.10,<0.13.0"]
35
+ build-backend = "uv_build"
36
+
37
+ [dependency-groups]
38
+ dev = [
39
+ "pytest>=9.1.1",
40
+ ]
@@ -0,0 +1,2 @@
1
+ def main() -> None:
2
+ print("Hello from ttyplayer!")