Ooh, the #Tauon music player supports embedded lyrics and has a good-enough synchronized lyrics display

this might become a thing for me, it would be MUCH easier to edit and sync lyrics on PC before copying to mobile

It's also written in Python using PyInstaller :O
the only question then is whether this application will let me edit and sync on PC, and how good that is compared to Musicolet's version
okay Tauon does have an synchronized lyrics editor. the UX isn't as good as Musicolet's, but it's there.

in particular, Tauon's workflow is pretty smooth, and I'm quoting from the manual here "if you don't make any mistakes"

if you *do* make a mistake, particularly one where you advanced a line too early, well, good luck

AFAICT the best UX currently for that is to copy the text for that line, delete the line, insert a new one, and re-time it.
in Musicolet, you rewind a bit and tap the sync button at the right time. Musicolet's interactive timing marks the moment that a line *begins*, but Tauon's workflow is organized around you pressing the button when whatever it currently thinks is the current line ENDS
[inner computer gremlin voice] improve it
not really any dev instructions, and the "magic" `run.sh` that looks like the one-stop shop for development environment setup didn't work for me.

excuse me, what

```
if sethint_result is None:
logging.error("Failed to run SetHint, probably due to https://github.com/Aermoss/PySDL3/issues/35, will try a workaround")
sys.exit(1)
```

System libraries are not used when running in a venv · Issue #35 · Aermoss/PySDL3

0.9.8b3 Downstream report - Taiko2k/Tauon#1625 I can reproduce this 100% by running Tauon's clean venv script, which does this https://github.com/Taiko2k/Tauon/blob/d09209bd117d6b1d52842a45e06063de...

GitHub
some kind of quirk of `PySDL3-Build` that involves downloading a tarball of a bunch of .so directly from GitHub (😬) and which I seem to have to trigger manually
BUT, I managed to build it

oh

```
builtins._ = translation.gettext
```

oh dear

7000 line main() 

the way Tauon detects a click in the lyrics editor is a dizzying nest of conditions and loops that scans over every clickable thing and determines if a click occurred and if it's in-bounds

rather than inverting that, starting with a click as an event and looking up what might have been targeted by it

[low whistle]

https://github.com/Taiko2k/Tauon/blob/6f731e93cde18419aa14b303278da7e6f2338e1f/src/tauon/t_modules/t_main.py#L38054-L38076

clearly I am not going to get anywhere with this right now, especially as it is exceedingly late (early?) here

but this was a fun little exercise, and maybe I can tweak this to be less painful for me personally to use.

even an ability to reset the timing of a line will help. maybe that even exists already but is poorly documented. we'll see

@SnoopJ
My brother in christ
[low whistle]
That's insane
@SnoopJ that's a whole little community living inside your main() function. free them!!!?
@SnoopJ Yeah... Calibre does that too...
@xgranade issue here is that the clever trick didn't actually work in at least one spot, but that might be a gaffe since the last release, I'm not on a tag
@xgranade yea, looks like some kind of bug they introduced since December. Guess I have more homework to do if I end up contributing anything.
@SnoopJ Yeah, there's a reason hooking things onto builtins is... inadvisable.

@xgranade yea I'm not even sure *how* it broke in that way, other than that I'm sure it's due to being excessively clever by binding it this way.

makes `global` look sophisticated!

@SnoopJ Global state is to be avoided, but there will always be some, I get it. Attaching global state to random stdlib modules is... not how I would suggest handling it.

@xgranade @SnoopJ I'm not sure Tauon or Calibre can be blamed for that one, since it's a longstanding convention for hooking UI string display for local translation: https://docs.python.org/3/library/gettext.html#internationalizing-your-programs-and-modules

Even the stdlib isn't really the origin of the convention, though, as Python's gettext layer inherited that convention from C. Hysterical raisins strike again!

gettext — Multilingual internationalization services

Source code: Lib/gettext.py The gettext module provides internationalization (I18N) and localization (L10N) services for your Python modules and applications. It supports both the GNU gettext messa...

Python documentation
@ancoghlan @SnoopJ Absolutely. It's more the practice of attaching it to a stdlib module that I was calling out.

@ancoghlan @xgranade I guess I'm outing myself as someone who doesn't work with a lot of internationalization, then!

I wonder if the behavior I saw was due to doing this manually rather than calling `install()` 

@SnoopJ Did you have the dependencies already installed (incidentally)?
@ax6761 no, there was a bunch of hoop-jumping involved
@SnoopJ Link, out of morbid curiosity?
GitHub - Taiko2k/Tauon: The music player of today! :city_sunrise:

The music player of today! :city_sunrise:. Contribute to Taiko2k/Tauon development by creating an account on GitHub.

GitHub
@SnoopJ oh fuck

@xgranade `run.sh` doesn't look *too* hard to hold correctly, but sorting out the implicit system dependencies (so far at least libgirespository-2.0 and libdbus-1-dev were missing for me) is the first hurdle

plus, the build process just started pushing my (perpetually redlined) home directory towards the size limit, so now I've got to take a beat and sort *that* out

@xgranade but if I contribute anything to this project, the very first thing would be "here's how you can install it as a dev" 😐

@xgranade heh, they were also waiting on TOML v1.1 to drop at some point and struggling with the limitations of v1.0:

https://github.com/Taiko2k/Tauon/blob/38914ec7cd31da6190c5644a0d04a45f22117299/pyproject.toml#L73-L74

Tauon/pyproject.toml at 38914ec7cd31da6190c5644a0d04a45f22117299 · Taiko2k/Tauon

The music player of today! :city_sunrise:. Contribute to Taiko2k/Tauon development by creating an account on GitHub.

GitHub
@SnoopJ I think there was another way they could have done that in TOML 1.0, but it would have required [[subtable]] syntax, which is one of the uglyist parts of TOML, imho.
@xgranade I assume it was some approach they aborted anyway, since it's all commented out

@xgranade the final damage on "what the hell are the dependencies" turned out to be 12 libraries I was missing, one of which involved building `libjxl` from source in order to build `jxlpy`

(but that particular jank is just because I'm trying to do this with Python 3.14 for… some reason)

@SnoopJ Yeah, using setuptools to compile platform-specific extension modules is... not fun. Much easier to make it a separate wheel, then use conditional dependencies...