mytunes-pro 2.1.3__tar.gz → 2.1.5__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.
- {mytunes_pro-2.1.3/src/mytunes_pro.egg-info → mytunes_pro-2.1.5}/PKG-INFO +14 -4
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/README.md +13 -3
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/pyproject.toml +1 -1
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/src/mytunes/app.py +50 -21
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5/src/mytunes_pro.egg-info}/PKG-INFO +14 -4
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/LICENSE +0 -0
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/setup.cfg +0 -0
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/src/mytunes/__init__.py +0 -0
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/src/mytunes_pro.egg-info/SOURCES.txt +0 -0
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/src/mytunes_pro.egg-info/dependency_links.txt +0 -0
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/src/mytunes_pro.egg-info/entry_points.txt +0 -0
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/src/mytunes_pro.egg-info/requires.txt +0 -0
- {mytunes_pro-2.1.3 → mytunes_pro-2.1.5}/src/mytunes_pro.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mytunes-pro
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.5
|
|
4
4
|
Summary: A lightweight, keyboard-centric terminal player for streaming YouTube music.
|
|
5
5
|
Author-email: loxo <loxo5432@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/postgresql-co-kr/mytunes
|
|
@@ -18,9 +18,9 @@ Requires-Dist: yt-dlp
|
|
|
18
18
|
Requires-Dist: pusher
|
|
19
19
|
Dynamic: license-file
|
|
20
20
|
|
|
21
|
-
# 🎵 MyTunes Pro - Professional TUI Edition v2.1.
|
|
21
|
+
# 🎵 MyTunes Pro - Professional TUI Edition v2.1.5
|
|
22
22
|
|
|
23
|
-
## 🚀 Terminal-based Media Workflow Experiment v2.1.
|
|
23
|
+
## 🚀 Terminal-based Media Workflow Experiment v2.1.5
|
|
24
24
|
|
|
25
25
|
> [!IMPORTANT]
|
|
26
26
|
> **Legal Disclaimer:** This project is a personal, non-commercial research experiment for developer education.
|
|
@@ -216,7 +216,7 @@ Executes immediately without worrying about input language status.
|
|
|
216
216
|
|
|
217
217
|
# 🎵 MyTunes Pro (Experimental Media Tool - KR)
|
|
218
218
|
|
|
219
|
-
## 🚀 터미널 기반 미디어 워크플로우 실험 v2.1.
|
|
219
|
+
## 🚀 터미널 기반 미디어 워크플로우 실험 v2.1.5
|
|
220
220
|
|
|
221
221
|
> [!IMPORTANT]
|
|
222
222
|
> **법적 면책 고지:** 본 프로젝트는 개발자 교육 및 연구를 목적으로 하는 개인적, 비상업적 실험입니다.
|
|
@@ -390,6 +390,16 @@ Windows 환경에서 한글 검색이 안 되거나 설치가 어려운 분들
|
|
|
390
390
|
|
|
391
391
|
## 🔄 Changelog
|
|
392
392
|
|
|
393
|
+
### v2.1.5 (2026-02-04)
|
|
394
|
+
- **Absolute Volume Display**: Now displays volume as a precise percentage (0-100%) with a "(Boost)" indicator for levels above 100%.
|
|
395
|
+
- **Volume Persistence**: Volume level is now permanently saved and restored across app restarts.
|
|
396
|
+
- **Offline Control**: Adjust volume levels globally even when the player is stopped; changes apply immediately upon next playback.
|
|
397
|
+
|
|
398
|
+
### v2.1.4 (2026-02-03)
|
|
399
|
+
- **Mouse Support Removed**: Reverted to pure keyboard interface for cleaner experience.
|
|
400
|
+
- **Bug Fixes**: Resolved IndentationError and key loop crashes.
|
|
401
|
+
- **Stability**: Removed unused code paths.
|
|
402
|
+
|
|
393
403
|
### v2.1.3 (2026-02-02)
|
|
394
404
|
- **Resolved TUI Freeze on Song Launch**: Fixed a critical regression from v2.0.6 where misplaced blocking input code caused the TUI to freeze on "Loading" during song transitions or resume until a key was pressed.
|
|
395
405
|
- **Fixed EQ Application**: Restored correct Auto EQ initialization during `play_music` in `app.py`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# 🎵 MyTunes Pro - Professional TUI Edition v2.1.
|
|
1
|
+
# 🎵 MyTunes Pro - Professional TUI Edition v2.1.5
|
|
2
2
|
|
|
3
|
-
## 🚀 Terminal-based Media Workflow Experiment v2.1.
|
|
3
|
+
## 🚀 Terminal-based Media Workflow Experiment v2.1.5
|
|
4
4
|
|
|
5
5
|
> [!IMPORTANT]
|
|
6
6
|
> **Legal Disclaimer:** This project is a personal, non-commercial research experiment for developer education.
|
|
@@ -196,7 +196,7 @@ Executes immediately without worrying about input language status.
|
|
|
196
196
|
|
|
197
197
|
# 🎵 MyTunes Pro (Experimental Media Tool - KR)
|
|
198
198
|
|
|
199
|
-
## 🚀 터미널 기반 미디어 워크플로우 실험 v2.1.
|
|
199
|
+
## 🚀 터미널 기반 미디어 워크플로우 실험 v2.1.5
|
|
200
200
|
|
|
201
201
|
> [!IMPORTANT]
|
|
202
202
|
> **법적 면책 고지:** 본 프로젝트는 개발자 교육 및 연구를 목적으로 하는 개인적, 비상업적 실험입니다.
|
|
@@ -370,6 +370,16 @@ Windows 환경에서 한글 검색이 안 되거나 설치가 어려운 분들
|
|
|
370
370
|
|
|
371
371
|
## 🔄 Changelog
|
|
372
372
|
|
|
373
|
+
### v2.1.5 (2026-02-04)
|
|
374
|
+
- **Absolute Volume Display**: Now displays volume as a precise percentage (0-100%) with a "(Boost)" indicator for levels above 100%.
|
|
375
|
+
- **Volume Persistence**: Volume level is now permanently saved and restored across app restarts.
|
|
376
|
+
- **Offline Control**: Adjust volume levels globally even when the player is stopped; changes apply immediately upon next playback.
|
|
377
|
+
|
|
378
|
+
### v2.1.4 (2026-02-03)
|
|
379
|
+
- **Mouse Support Removed**: Reverted to pure keyboard interface for cleaner experience.
|
|
380
|
+
- **Bug Fixes**: Resolved IndentationError and key loop crashes.
|
|
381
|
+
- **Stability**: Removed unused code paths.
|
|
382
|
+
|
|
373
383
|
### v2.1.3 (2026-02-02)
|
|
374
384
|
- **Resolved TUI Freeze on Song Launch**: Fixed a critical regression from v2.0.6 where misplaced blocking input code caused the TUI to freeze on "Loading" during song transitions or resume until a key was pressed.
|
|
375
385
|
- **Fixed EQ Application**: Restored correct Auto EQ initialization during `play_music` in `app.py`.
|
|
@@ -44,7 +44,7 @@ MPV_SOCKET = "/tmp/mpv_socket"
|
|
|
44
44
|
LOG_FILE = "/tmp/mytunes_mpv.log"
|
|
45
45
|
PID_FILE = "/tmp/mytunes_mpv.pid"
|
|
46
46
|
APP_NAME = "MyTunes Pro"
|
|
47
|
-
APP_VERSION = "2.1.
|
|
47
|
+
APP_VERSION = "2.1.5"
|
|
48
48
|
|
|
49
49
|
# Initial Locale Setup for WSL/Windows Multibyte/Emoji Harmony
|
|
50
50
|
try:
|
|
@@ -336,7 +336,7 @@ class Player:
|
|
|
336
336
|
subprocess.run(["pkill", "-f", "mpv --video=no"], stderr=subprocess.DEVNULL)
|
|
337
337
|
except: pass
|
|
338
338
|
|
|
339
|
-
def play(self, url, start_pos=0, initial_eq_preset="Flat"):
|
|
339
|
+
def play(self, url, start_pos=0, initial_eq_preset="Flat", initial_volume=100):
|
|
340
340
|
# 1. Try to reuse existing instance via IPC (Graceful)
|
|
341
341
|
if os.path.exists(MPV_SOCKET):
|
|
342
342
|
try:
|
|
@@ -349,6 +349,9 @@ class Player:
|
|
|
349
349
|
# Apply EQ immediately for reused instance
|
|
350
350
|
if initial_eq_preset and initial_eq_preset != "Flat":
|
|
351
351
|
self.set_equalizer(initial_eq_preset)
|
|
352
|
+
|
|
353
|
+
# Apply Volume for reused instance
|
|
354
|
+
self.send_cmd(["set_property", "volume", initial_volume])
|
|
352
355
|
|
|
353
356
|
self.loading = True
|
|
354
357
|
self.loading_ts = time.time()
|
|
@@ -374,6 +377,7 @@ class Player:
|
|
|
374
377
|
"mpv", "--video=no", "--vo=null", "--force-window=no",
|
|
375
378
|
"--audio-display=no", "--no-config",
|
|
376
379
|
f"--input-ipc-server={MPV_SOCKET}",
|
|
380
|
+
f"--volume={initial_volume}",
|
|
377
381
|
"--idle=yes"
|
|
378
382
|
]
|
|
379
383
|
|
|
@@ -444,6 +448,7 @@ class Player:
|
|
|
444
448
|
|
|
445
449
|
def change_volume(self, delta):
|
|
446
450
|
self.send_cmd(["add", "volume", delta])
|
|
451
|
+
return self.get_property("volume")
|
|
447
452
|
|
|
448
453
|
def send_cmd(self, command):
|
|
449
454
|
"""Send raw command list to MPV via JSON IPC with resilience."""
|
|
@@ -606,11 +611,13 @@ class MyTunesApp:
|
|
|
606
611
|
signal.signal(signal.SIGHUP, self.handle_disconnect)
|
|
607
612
|
except: pass
|
|
608
613
|
|
|
609
|
-
|
|
610
|
-
curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION)
|
|
611
|
-
print("\033[?1003h") # Enable mouse tracking
|
|
614
|
+
|
|
612
615
|
|
|
613
616
|
self.sent_history = {}
|
|
617
|
+
|
|
618
|
+
# Volume Control (Persisted)
|
|
619
|
+
self.volume = self.dm.data.get("volume", 100)
|
|
620
|
+
|
|
614
621
|
|
|
615
622
|
|
|
616
623
|
def show_feedback(self, msg, duration=2.5):
|
|
@@ -733,6 +740,12 @@ class MyTunesApp:
|
|
|
733
740
|
|
|
734
741
|
# Periodic Save (Throttle 10s)
|
|
735
742
|
if time.time() - getattr(self, 'last_save_time', 0) > 10:
|
|
743
|
+
# Sync volume if playing (in case changed externally/via scripts)
|
|
744
|
+
v = self.player.get_property("volume")
|
|
745
|
+
if v is not None:
|
|
746
|
+
self.volume = int(float(v))
|
|
747
|
+
self.dm.data["volume"] = self.volume
|
|
748
|
+
|
|
736
749
|
self.dm.save_data()
|
|
737
750
|
self.last_save_time = time.time()
|
|
738
751
|
|
|
@@ -772,19 +785,8 @@ class MyTunesApp:
|
|
|
772
785
|
return "EXIT_BKG" # Standard ESC
|
|
773
786
|
|
|
774
787
|
# 3. Mouse Click
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
_, mx, my, _, bstate = curses.getmouse()
|
|
778
|
-
if bstate & (curses.BUTTON1_CLICKED | curses.BUTTON1_RELEASED):
|
|
779
|
-
h, w = self.stdscr.getmaxyx()
|
|
780
|
-
branding = "mytunes-pro.com/postgresql.co.kr"
|
|
781
|
-
branding_x = w - 2 - len(branding)
|
|
782
|
-
if my == h - 2 and branding_x <= mx < w - 2:
|
|
783
|
-
rel_x = mx - branding_x
|
|
784
|
-
if rel_x < 15: return "OPEN_HOME"
|
|
785
|
-
if rel_x > 15: return "OPEN_PARTNER"
|
|
786
|
-
except: pass
|
|
787
|
-
return "MOUSE_CLICK"
|
|
788
|
+
# 3. Mouse Click & Scroll
|
|
789
|
+
# 3. Mouse Click (Removed)
|
|
788
790
|
|
|
789
791
|
# 4. Standard Keys Mapping
|
|
790
792
|
k_char = str(key).lower() if isinstance(key, str) else str(key)
|
|
@@ -877,8 +879,35 @@ class MyTunesApp:
|
|
|
877
879
|
self.forward_stack = []; self.view_stack = ["main"]; self.selection_idx = 0; self.scroll_offset = 0; self.set_view_status("")
|
|
878
880
|
|
|
879
881
|
elif cmd == "TOGGLE_PAUSE": self.player.toggle_pause()
|
|
880
|
-
elif cmd == "VOL_DOWN":
|
|
881
|
-
|
|
882
|
+
elif cmd == "VOL_DOWN":
|
|
883
|
+
if self.player.socket_ok and self.player.current_proc:
|
|
884
|
+
vol = self.player.change_volume(-5)
|
|
885
|
+
if vol is not None: self.volume = int(vol)
|
|
886
|
+
else:
|
|
887
|
+
self.volume = max(0, self.volume - 5)
|
|
888
|
+
|
|
889
|
+
# Persist
|
|
890
|
+
self.dm.data["volume"] = self.volume
|
|
891
|
+
self.dm.save_data()
|
|
892
|
+
|
|
893
|
+
msg = self.t("vol_fmt", self.volume)
|
|
894
|
+
if self.volume > 100: msg += " (Boost)"
|
|
895
|
+
self.show_feedback(msg)
|
|
896
|
+
|
|
897
|
+
elif cmd == "VOL_UP":
|
|
898
|
+
if self.player.socket_ok and self.player.current_proc:
|
|
899
|
+
vol = self.player.change_volume(5)
|
|
900
|
+
if vol is not None: self.volume = int(vol)
|
|
901
|
+
else:
|
|
902
|
+
self.volume = min(130, self.volume + 5)
|
|
903
|
+
|
|
904
|
+
# Persist
|
|
905
|
+
self.dm.data["volume"] = self.volume
|
|
906
|
+
self.dm.save_data()
|
|
907
|
+
|
|
908
|
+
msg = self.t("vol_fmt", self.volume)
|
|
909
|
+
if self.volume > 100: msg += " (Boost)"
|
|
910
|
+
self.show_feedback(msg)
|
|
882
911
|
elif cmd == "SEEK_BACK_10": self.player.seek(-10)
|
|
883
912
|
elif cmd == "SEEK_FWD_10": self.player.seek(10)
|
|
884
913
|
elif cmd == "SEEK_BACK_30": self.player.seek(-30); self.show_feedback("Rewind 30s")
|
|
@@ -1206,7 +1235,7 @@ class MyTunesApp:
|
|
|
1206
1235
|
else:
|
|
1207
1236
|
start_pos = 0
|
|
1208
1237
|
|
|
1209
|
-
self.player.play(item['url'], start_pos, initial_eq_preset=target_eq_preset)
|
|
1238
|
+
self.player.play(item['url'], start_pos, initial_eq_preset=target_eq_preset, initial_volume=self.volume)
|
|
1210
1239
|
|
|
1211
1240
|
# Re-apply EQ logic (double check: mpv restart wipes af property?)
|
|
1212
1241
|
# Yes, play() might restart mpv if socket fails.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mytunes-pro
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.5
|
|
4
4
|
Summary: A lightweight, keyboard-centric terminal player for streaming YouTube music.
|
|
5
5
|
Author-email: loxo <loxo5432@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/postgresql-co-kr/mytunes
|
|
@@ -18,9 +18,9 @@ Requires-Dist: yt-dlp
|
|
|
18
18
|
Requires-Dist: pusher
|
|
19
19
|
Dynamic: license-file
|
|
20
20
|
|
|
21
|
-
# 🎵 MyTunes Pro - Professional TUI Edition v2.1.
|
|
21
|
+
# 🎵 MyTunes Pro - Professional TUI Edition v2.1.5
|
|
22
22
|
|
|
23
|
-
## 🚀 Terminal-based Media Workflow Experiment v2.1.
|
|
23
|
+
## 🚀 Terminal-based Media Workflow Experiment v2.1.5
|
|
24
24
|
|
|
25
25
|
> [!IMPORTANT]
|
|
26
26
|
> **Legal Disclaimer:** This project is a personal, non-commercial research experiment for developer education.
|
|
@@ -216,7 +216,7 @@ Executes immediately without worrying about input language status.
|
|
|
216
216
|
|
|
217
217
|
# 🎵 MyTunes Pro (Experimental Media Tool - KR)
|
|
218
218
|
|
|
219
|
-
## 🚀 터미널 기반 미디어 워크플로우 실험 v2.1.
|
|
219
|
+
## 🚀 터미널 기반 미디어 워크플로우 실험 v2.1.5
|
|
220
220
|
|
|
221
221
|
> [!IMPORTANT]
|
|
222
222
|
> **법적 면책 고지:** 본 프로젝트는 개발자 교육 및 연구를 목적으로 하는 개인적, 비상업적 실험입니다.
|
|
@@ -390,6 +390,16 @@ Windows 환경에서 한글 검색이 안 되거나 설치가 어려운 분들
|
|
|
390
390
|
|
|
391
391
|
## 🔄 Changelog
|
|
392
392
|
|
|
393
|
+
### v2.1.5 (2026-02-04)
|
|
394
|
+
- **Absolute Volume Display**: Now displays volume as a precise percentage (0-100%) with a "(Boost)" indicator for levels above 100%.
|
|
395
|
+
- **Volume Persistence**: Volume level is now permanently saved and restored across app restarts.
|
|
396
|
+
- **Offline Control**: Adjust volume levels globally even when the player is stopped; changes apply immediately upon next playback.
|
|
397
|
+
|
|
398
|
+
### v2.1.4 (2026-02-03)
|
|
399
|
+
- **Mouse Support Removed**: Reverted to pure keyboard interface for cleaner experience.
|
|
400
|
+
- **Bug Fixes**: Resolved IndentationError and key loop crashes.
|
|
401
|
+
- **Stability**: Removed unused code paths.
|
|
402
|
+
|
|
393
403
|
### v2.1.3 (2026-02-02)
|
|
394
404
|
- **Resolved TUI Freeze on Song Launch**: Fixed a critical regression from v2.0.6 where misplaced blocking input code caused the TUI to freeze on "Loading" during song transitions or resume until a key was pressed.
|
|
395
405
|
- **Fixed EQ Application**: Restored correct Auto EQ initialization during `play_music` in `app.py`.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|