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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mytunes-pro
3
- Version: 2.1.3
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.3
21
+ # 🎵 MyTunes Pro - Professional TUI Edition v2.1.5
22
22
 
23
- ## 🚀 Terminal-based Media Workflow Experiment v2.1.3
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.0
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.3
1
+ # 🎵 MyTunes Pro - Professional TUI Edition v2.1.5
2
2
 
3
- ## 🚀 Terminal-based Media Workflow Experiment v2.1.3
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.0
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`.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mytunes-pro"
7
- version = "2.1.3"
7
+ version = "2.1.5"
8
8
  authors = [
9
9
  { name = "loxo", email = "loxo5432@gmail.com" },
10
10
  ]
@@ -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.3"
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
- # Enable Mouse Support
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
- if key == curses.KEY_MOUSE:
776
- try:
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": self.player.change_volume(-5); self.show_feedback("Volume -5")
881
- elif cmd == "VOL_UP": self.player.change_volume(5); self.show_feedback("Volume +5")
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
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.3
21
+ # 🎵 MyTunes Pro - Professional TUI Edition v2.1.5
22
22
 
23
- ## 🚀 Terminal-based Media Workflow Experiment v2.1.3
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.0
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