Fintube and Fintune

After struggling with alot of issues on getting Micro tube and the native youtube/yt-music android apps working properly i put together my own versions of the apps.
Hopefully all moving parts of the app (yt-dlp, ffmpeg and Proof of Origin tokens) just work without having to update the app or manually install dependency binaries.

FinTube
FinTune

Now available on OpenRepos:

17 Likes

Promising effort. ytdlp is unable to update because it tries to write to /usr/bin. Maybe write ot private app path. Also on Jolla Phone 2026 it shows internal stream error. But this is maybe due to old ytdlp?

Thanks for testing!!
Currently it writes the yt-dlp binary to /home/defaultuser/.local/bin/yt-dlp (Personally i wont ever use the binary outside the application, thats why its there.)

Did you enable the PO provider in settings too, it helps alot in getting a video to play.
Sometimes you have to swipe out from the video and reload a couple of times for it to work, i can assist you in PM too :slightly_smiling_face:

Is the 1.0 rpm on github the actual current code? Because that’s what I downloaded and it tried mucking with yt-dlp at /usr/bin. Maybe it’s because I have it globally installed from another package?

Yes, it looks for an existing binary

# yt-dlp may live outside the (sandbox-trimmed) PATH, so check common spots too.
_CANDIDATE_PATHS = (
    os.path.expanduser("~/.local/bin/yt-dlp"),
    "/usr/local/bin/yt-dlp",
    "/usr/bin/yt-dlp",
    "/usr/share/harbour-youfish/bin/yt-dlp",  # future bundled location
)

So perhaps just delete it or rename it as it might be too old yt-dlp had a new release last week so thats most likley why its not working.
Then just use the reinstall button in settings

That got it working. But probably I think it would make more sense to just ignore any other binary than the one that the app installs, but that’s just me.

1 Like

Yes that is reasonable

Nice. I assume you used AI to write the code?
Still.
It works.

An aside or minor feature request:

yt-dlp — the extraction engine (the part YouTube breaks most). Update runs its own -U; that alone fixes the vast majority of breakages.

I recently switched to always updating to the nightly builds, which usually just shortens the wait until a new hurdle created by YT is overcome.
So if this could be an option? Instead of yt-dlp -U it would be yt-dlp --update-to nightly@latest

Yes, it’s a footnoter at the bottom of the readme, perhaps not the most clear message although.

I’m a graphics designer, so coding isnt really my area of expertise so take my architectural decisions with a grain of salt, but i think your idea with the nightly release is sound.
I will look into it :slightly_smiling_face:

Did you use AI to write this? Can you expand a little on your process? Both apps look extremely polished, which actually makes me skeptical; AI is known to disregard deeper OS principles or even coding principles.

Questions about ffmpeg and deno:

  • ffmpeg is not installed in PATH but both apps work nicely. the settings suggest all my videos are 360p because of that? They still look pretty good though. BTW ffmpeg - an ancient version - is installed on SfOS by default, just not the cli exe ‘ffmpeg’.
  • I just installed deno (2.9.5) to ~/.local/bin, where yt-dlp also resides, and it is executable, but the settings page still says not found?

Well i dont quite know how to explain it well, but here is a (ish) summary:

  • First off i use Claude, specifically Opus 4.8 becuase Opus 5 is really bad at basic stuff and Fable burns way too many tokens for coding projects that need constant testing.

  • I use Fable to create a architectural document spanning the goal for the project and detail my requirements and goals, then hand that off to a VSCode instance with Opus running.

  • Then i setup the SDK suite on my own and such according to the documents requirements aswell as prepare my J2 for installing the uploaded RPM

  • After that i just test and report back in a feedback loop until i think the app is in a good spot

  • Lastly i always do a security sweep on memory leaks and other holes (Like deno’s network only policy), no need for access that app dont require i cant personally stand that.

To answer your question, the 360p limit is the PO provider not working as you have seen, youtube only offers anything other than 360p when you pass the Anti-Bot “firewall” which is what the PO (Proof of Origin) Provider does.
Basically it legitimizes your traffic to access the youtube API as far as i understand it.

Could you possibly go into a SSH session and run YOUFISH_DEBUG=1 harbour-fintube
This should give you some debug info, aswell as taking a look at ~/.local/share/harbour-fintube/potprovider/server.log

I’m available in DM/PM if you want to discuss there :slightly_smiling_face:

7 Likes

Thank you, that’s very clear.

I checked the package contents and what it does when launched and it all seems kosher.

I will answer the rest in a pm as requested.

It might be better if you start a dedicated topic for your app(s).

2 Likes

+1 for a dedicated topic.

I’m blown away by FinTube in initial testing. I think it will be my preferred way to watch Youtube going forward.

6 Likes

Ditto. It was very easy to setup and get working quickly. Great job vibe-coding or not :slight_smile:

Minor gripe: the main page pulley menu has many items. The recommendation seems to be fewer than 5, from a usability standpoint UI | Sailfish OS Documentation

But again, excellent job.

2 Likes

Using PO token provider seems to break downloads, with it disabled both a/v downloads work great, wish it would download straight to ~/Videos(Music)

Hello, first of all let me congratulate with you because it’s the only client that works on my jolla, so congrats

Anyway, one thing i wanted to adress, is the interface

It’s, well, pretty crowded and i guess there are a few areas that would benefit from some refinements, especially for making the pulley menu lighter

This, if you are open to suggestions of course


Are you deliberately trying to annoy people with AI slop that defends AI code?

I recently spent some time looking under the hood of the youfish.py backend (the engine powering the FinTube app). Given the increasingly hostile environment YouTube has created for third-party clients in 2026 (PO-tokens, BotGuard, constant API changes), I wanted to understand how this app manages to stay afloat so successfully on Sailfish OS.

This is uninformed chatbot puffery.
The backend of the backend is yt-dlp. It’s completely separate from this app. yt-dlp has been fighting the good fight against YT* for many many years (fork of youtube-dl, which has been fighting that fight even longer).

The fact that @masen knew to rely on it is what makes this app work.

And that the end user keeps yt-dlp up-to-date, I might add.

There are already a few more apps like this in the SfOS universe: SailTube and ”Tube.


The problem with vibecoding is that many people have even less clue what they’re doing with it than the AI itself.
I’m happy to state that @masen is the exception here, I wouldn’t even consider this vibecoding (see their breakdown of their work process a few posts up).

But I stand by my skepticism.

Ultimately using AI for coding always means that you (even the dev) are never 100% clear what the end product even does.
Different types of testing are required. E.g. by a Luddite like me.

As long as people use AI in this way - open source code, not getting emotional when called out, transparent communication, open for improvement suggested by humans - I’m kinda OK with it.

The environmental and political impact remains highly problematic though.


All that said Fintube and Fintune are pretty, feature-rich, and seem to work reliably so far.


* it also supports many many other sites, e.g. Bandcamp, Soundcloud, Instagram reels, TikTok, various news/media outlets etc etc etc

9 Likes

Good news, the 1.1.0 release offloads the cluttered pulldown menu to Refresh and Search only now.
On the home screen (or subscriptions view if you will) you can now swipe right-to-left and access Downloads, Playlists, History, Channels, Settings and Providers (I separated the 3rd party stuff into a new menu).

Also for @throwaway69 i have implemented setting a specific dir as the download target, see the settings.

I added support for using the EJS through Deno instead of the built in yt-dlp pythonJS fallback. (basically just futureproofing if ever yt-dlp removes that fallback)

For those who have issues with the PO provider there is now a “Run diagnostics” button that shows what dependecies its using, it makes it clear if it has for some reason decided to pick a random outdated binary or if the provier just plain breaks.

(The started then exited is normal, as long as verdict says “Working” its fine.)

I’m aware that there is omega amounts of slop with AI these days, so while i am not a coder i kinda do understand the process and some parts of programming and im quite familiar with Linux so it’s more on the park of playing minesweeper with the applications :grin:

6 Likes

Following is a pm discussion between me & @masen, which they allowed me to publish here.

ohnonot wrote

There is no server.log anywhere in any of your apps’ directories.

YOUFISH_DEBUG=1 harbour-fintube
###
### start fintube, play 1 video, close it
###
[D] unknown:0 - Using Wayland-EGL
library "libui_compat_layer.so" not found
library "libutils.so" not found
library "libcutils.so" not found
library "libhardware.so" not found
library "android.hardware.graphics.mapper@2.0.so" not found
library "android.hardware.graphics.mapper@2.1.so" not found
library "android.hardware.graphics.mapper@3.0.so" not found
library "android.hardware.graphics.mapper@4.0.so" not found
library "libc++.so" not found
library "libhidlbase.so" not found
library "libgralloctypes.so" not found
library "android.hardware.graphics.common@1.2.so" not found
library "libion.so" not found
library "libz.so" not found
library "libhidlmemory.so" not found
library "android.hidl.memory@1.0.so" not found
library "vendor.qti.qspmhal@1.0.so" not found
[D] unknown:0 - Got library name:  "/usr/lib64/qt5/qml/io/thp/pyotherside/libpyothersideplugin.so"
library "libandroidicu.so" needed or dlopened by "/system/lib64/libmedia.so" is not accessible for the namespace "(default)"
[D] unknown:0 - [youfish] play(): building pipeline 
  video: "http://127.0.0.1:44355/play?u=https%3A%2F%2Fmanifest.googlevideo.com%2Fapi%2Fman" 
  audio: "http://127.0.0.1:44355/play?u=https%3A%2F%2Frr8---sn-qo5-9a4e.googlevideo.com%2F" 
  ua: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb"
[D] unknown:0 - [youfish/hw] droideglsink created
[D] unknown:0 - [youfish] hw: uridecodebin stops at encoded video; droidvdec is explicit
[D] unknown:0 - [youfish] download buffering enabled (for seek)
[D] unknown:0 - [youfish] audio chain: eq= true  boost= true  limiter= true
[D] unknown:0 - [youfish] pipeline built, bus watch id 7
[D] unknown:0 - [youfish] source-setup on source
[D] unknown:0 - [youfish]   set user-agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb"
[D] unknown:0 - [youfish] source-setup on source
[D] unknown:0 - [youfish]   set user-agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb"
[D] unknown:0 - [youfish] set_state(PLAYING) returned ASYNC
[D] unknown:0 - [youfish] pipeline state NULL -> READY
[D] unknown:0 - [youfish] bus msg need-context from source
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg need-context from source
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg element from source
[D] unknown:0 - [youfish] bus msg element from source
[D] unknown:0 - [youfish] bus msg duration-changed from source
[D] unknown:0 - [youfish] bus msg element from hlsdemux0
[D] unknown:0 - [youfish] bus msg duration-changed from hlsdemux0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg need-context from souphttpsrc0
[D] unknown:0 - [youfish] bus msg have-context from souphttpsrc0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] buffering 1 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 3 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 6 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 12 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 25 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 50 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] buffering 49 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] bus msg element from souphttpsrc0
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg have-context from souphttpsrc0
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] video uridecodebin pad-added, isVideo= true
[D] unknown:0 - [youfish]   linked video pad -> ok
[D] unknown:0 - [youfish] bus msg element from souphttpsrc0
[D] unknown:0 - [youfish] buffering 1 % (from multiqueue1 )
8< snip
[D] unknown:0 - [youfish] buffering 100 % (from multiqueue1 )
library "/apex/com.android.vndk.v30/lib64/hw/android.hidl.memory@1.0-impl.so" needed or dlopened by "/usr/libexec/droid-hybris/system/lib64/libvndksupport.so" is not accessible for the namespace "sphal"
[D] unknown:0 - [youfish] bus msg element from source
[D] unknown:0 - [youfish] buffering 0 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 100 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish/hw] video size QSizeF(1280, 720)
[D] unknown:0 - [youfish] bus msg tag from hwvsink
[D] unknown:0 - [youfish] bus msg tag from hwvsink
[D] unknown:0 - [youfish] bus msg latency from hwvsink
[D] unknown:0 - [youfish] audio uridecodebin pad-added, isAudio= true
[D] unknown:0 - [youfish]   linked audio pad -> ok
[D] unknown:0 - [youfish] bus msg latency from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] pipeline state READY -> PAUSED
[D] unknown:0 - [youfish] bus msg async-done from youfish-player
[D] unknown:0 - [youfish] bus msg latency from asink
[D] unknown:0 - [youfish] bus msg new-clock from youfish-player
[D] unknown:0 - [youfish] pipeline state PAUSED -> PLAYING
[D] unknown:0 - [youfish/t] preroll (build->PLAYING) 1561 ms
[D] unknown:0 - [youfish] bus msg stream-status from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg qos from hwvsink
[D] unknown:0 - [youfish] bus msg qos from hwdec
[D] unknown:0 - [youfish] bus msg qos from hwdec
[D] unknown:0 - [youfish] bus msg qos from hwdec
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg element from source
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg element from downloadbuffer0
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg element from hlsdemux0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg have-context from souphttpsrc0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg element from souphttpsrc0
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg qos from hwvsink
[D] unknown:0 - [youfish] bus msg qos from hwdec
[D] unknown:0 - [youfish] bus msg qos from hwdec
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg qos from hwdec
[D] unknown:0 - [youfish] bus msg element from hlsdemux0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg have-context from souphttpsrc0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg element from souphttpsrc0
[D] unknown:0 - [youfish] bus msg qos from hwdec
[D] unknown:0 - [youfish] bus msg element from hlsdemux0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg have-context from souphttpsrc0
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg element from souphttpsrc0

The above log gives no hint about deno.

I manually downloaded a video with yt-dlp --verbose, it mentions both ejs and deno in a way that reads like it found them and will use them.

So that’s OK.

I am now thinking that your app does not see deno if it hasn’t installed it itself. But if yt-dlp is user-provided, it makes sense that deno could be user-provided too.

And what about yt_dlp_ejs? As I’m reading this both elements - EJS and js runtime - are required, but yt_dlp_ejs is not always included when one manually installs yt-dlp.


masen wrote

Ah that must be because it cant find the deno binary, i got a bit gaslighted by Claude it said everything was a 3rd party download from the settings menu.

But obviously (as i realize this in post) i downloaded Deno using the curl script from their official page
This one: curl -fsSL ``https://deno.land/install.sh`` | sh

The script seems to install deno to /home/defaultuser/.deno/bin/deno

Looking at the python script that looks for deno it says:

_DENO_CANDIDATES = (
os.path.expanduser(“~/.deno/bin/deno”), # default deno install location
os.path.expanduser(“~/.local/bin/deno”), # common user-local spot (a launcher’s PATH omits it)
“/usr/local/bin/deno”,
“/usr/bin/deno”,
)

So try to copy to that path and reinstall the provider or try the latest release (1.0.0-2) that should install deno bundled with the PO provider (aswell as that nightly release yt-dlp binary as an option)

My logs look like this, you can see the initial [youfish/t] pot_ensure which tells me that its serving tokens.

[youfish/t] pot_ensure 0.65s
[youfish/t] dump 4.48s rc=0
[youfish/t] resolve TOTAL 5.14s
[D] unknown:0 - [youfish] play(): building pipeline
video: “``http://127.0.0.1:35765/play?u=https%3A%2F%2Frr8---sn-c5ioiv45c-5gol.googlevideo.”
audio: “``http://127.0.0.1:35765/play?u=https%3A%2F%2Frr8---sn-c5ioiv45c-5gol.googlevideo.”
ua: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb”
[D] unknown:0 - [youfish/hw] droideglsink created
[D] unknown:0 - [youfish] hw: uridecodebin stops at encoded video; droidvdec is explicit
[D] unknown:0 - [youfish] download buffering enabled (for seek)
[D] unknown:0 - [youfish] audio chain: eq= true boost= true limiter= true
[D] unknown:0 - [youfish] pipeline built, bus watch id 7
[D] unknown:0 - [youfish] source-setup on source
[D] unknown:0 - [youfish] set user-agent: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb”
[D] unknown:0 - [youfish] source-setup on source
[D] unknown:0 - [youfish] set user-agent: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb”
[D] unknown:0 - [youfish] set_state(PLAYING) returned ASYNC
[D] unknown:0 - [youfish] pipeline state NULL → READY
[D] unknown:0 - [youfish] bus msg need-context from source
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg need-context from source
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg element from source
[D] unknown:0 - [youfish] bus msg duration-changed from source
[D] unknown:0 - [youfish] bus msg element from source
[D] unknown:0 - [youfish] bus msg duration-changed from source
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] buffering 1 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 3 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] buffering 1 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] buffering 6 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] bus msg stream-status from sink
[D] unknown:0 - [youfish] buffering 3 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] buffering 12 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 24 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 0 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] buffering 3 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] buffering 9 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] buffering 21 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg element from source
[D] unknown:0 - [youfish] buffering 0 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] buffering 100 % (from downloadbuffer0 )
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg stream-status from src_0
[D] unknown:0 - [youfish] bus msg element from source
library “libcom.android.media.swcodec.apexcodecs.so” not found
[D] unknown:0 - [youfish] audio uridecodebin pad-added, isAudio= true
[D] unknown:0 - [youfish] bus msg element from source
[D] unknown:0 - [youfish] video uridecodebin pad-added, isVideo= true
[D] unknown:0 - [youfish] buffering 1 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] linked video pad → ok
[D] unknown:0 - [youfish] buffering 7 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] buffering 4 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] buffering 21 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] buffering 100 % (from downloadbuffer1 )
[D] unknown:0 - [youfish] linked audio pad → ok
[D] unknown:0 - [youfish] bus msg latency from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg tag from asink
[D] unknown:0 - [youfish] bus msg latency from asink
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish] bus msg stream-status from src
[D] unknown:0 - [youfish/hw] video size QSizeF(1920, 1080)
[D] unknown:0 - [youfish] bus msg tag from hwvsink
[D] unknown:0 - [youfish] bus msg tag from hwvsink

Note the: [D] unknown:0 - [youfish/hw] video size QSizeF(1920, 1080) Implying 1080p playback.

So i havent had the need for the EJS as far as i have seen? :slightly_smiling_face:

EDIT: i understand now why i havent had the need for the EJS now, the binary that the apps download bundle a Python fallback thats why its been working without me being aware.

So i guess i have another thing on my checklist to fix, allowing yt-dlp to access deno very helpful report actually
Thanks!


ohnonot wrote

Thanks.

yt-dlp has access to deno, at least when I use it by itself.

I cannot get the string pot_ensure with YOUFISH_DEBUG=1 harbour-fintube.

There is still no server.log in your apps’ locations.

I hope your app allows yt-dlp access to deno in ~/.local/bin, even if the app itself cannot see it.
Since yt-dlp defaults to using deno anyhow, it just has to find it in PATH. I don’t think it looks in ~/.local/bin directly.


I guess the same would go for ffmpeg which I have now installed in ~/.local/bin as well (something I commonly do on my SfOS devices).


I’m attaching a verbose log from a video download with yt-dlp.

This shows you that it finds ffmpeg in PATH and supposed ly also deno but it still says “[debug] [youtube] [pot] PO Token Providers: none” in the beginning.


Long story short, I don’t know 100% if SfOS apps and their subprocesses generally have access to environment variables like PATH.

This dialog should really be public so more eyes can look at it. If you want I can ask a mod to do that.


Here’s the log:

yt-dlp --verbose "https://www.youtube.com/watch?v=g1S7Fo-vjTA" >yt-dlp.log 2>&1
[debug] Command-line config: ['--verbose', 'https://www.youtube.com/watch?v=g1S7Fo-vjTA']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8 (No ANSI), error utf-8 (No ANSI), screen utf-8 (No ANSI)
[debug] yt-dlp version nightly@2026.08.25.233329 from yt-dlp/yt-dlp-nightly-builds [66f49765d] (pip)
[debug] Python 3.11.15 (CPython aarch64 64bit) - Linux-4.19.248-aarch64-with-glibc2.41 (OpenSSL 3.5.6 7 Apr 2026, glibc 2.41)
[debug] exe versions: ffmpeg 7.0.2-static (setts), ffprobe 7.0.2-static
[debug] Optional libraries: Cryptodome-3.23.0, brotli-1.2.0, certifi-2026.07.22, mutagen-1.48.1, requests-2.34.2, sqlite3-3.50.4, urllib3-2.7.0, websockets-17.1, yt_dlp_ejs-0.8.0
[debug] JS runtimes: deno-2.9.5
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets
[debug] Plugin directories: none
[debug] Loaded 1745 extractors
[debug] [youtube] [pot] PO Token Providers: none
[debug] [youtube] [pot] PO Token Cache Providers: memory
[debug] [youtube] [pot] PO Token Cache Spec Providers: webpo
[debug] [youtube] [jsc] JS Challenge Providers: bun (unavailable), deno, node (unavailable), quickjs (unavailable)
[youtube] Extracting URL: https://www.youtube.com/watch?v=g1S7Fo-vjTA
[youtube] g1S7Fo-vjTA: Downloading webpage
[debug] [youtube] Forcing "main" player JS variant for player 6a0e84d6
        original url = /s/player/6a0e84d6/player_es6.vflset/en_US/base.js
[youtube] g1S7Fo-vjTA: Downloading visionos player API JSON
[youtube] g1S7Fo-vjTA: Downloading m3u8 information
[debug] [youtube] g1S7Fo-vjTA: Detected experiment to bind GVS PO Token to video ID for web client
[youtube] g1S7Fo-vjTA: Downloading player 6a0e84d6-main
[youtube] [jsc:deno] Solving JS challenges using deno
[debug] [youtube] [jsc:deno] Using challenge solver lib script v0.8.0 (source: python package, variant: minified)
[debug] [youtube] [jsc:deno] Using challenge solver core script v0.8.0 (source: python package, variant: minified)
[debug] [youtube] [jsc:deno] Running deno: deno run --ext=js --no-code-cache --no-prompt --no-remote --no-lock --node-modules-dir=none --no-config --no-npm --cached-only -
[debug] [youtube] g1S7Fo-vjTA: Some web client https formats have been skipped as they are missing a URL. YouTube is forcing SABR streaming for this client. See  https://github.com/yt-dlp/yt-dlp/issues/12482  for more details
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec, channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] g1S7Fo-vjTA: Downloading 1 format(s): 299+251
[debug] Invoking http downloader on "https://rr1---sn-qo5-9a4e.googlevideo.com/videoplayback?expire=1787806090&ei=Km2PaofMDcTC0u8Py6nB6A0&ip=2001%3A14bb%3Ace%3A809%3A69af%3A9a84%3A4c1c%3A3bcc&id=o-ADOb9a5TJ6bXDmiXBPCBGZtmCiQGJ9PB037KJu7bbC8n&itag=299&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&cps=150&met=1787784490%2C&mh=Xe&mm=31%2C29&mn=sn-qo5-9a4e%2Csn-ixh7yn7e&ms=au%2Crdu&mv=m&mvi=1&pl=49&rms=au%2Cau&initcwndbps=2801250&bui=AR3QkAk_FQg4O2Br1PHM25KAeYT9-Pum74dlFYCSdeCl7Ygkyr5aVTq0zVyWGh2XwDFzpUPRnFgdobXQ&spc=KBGBcim7xspuvTgKeUG7c_309rSsnSR9vHspQTYPmMZ7OATKyDgiJpJY_A&vprv=1&svpuc=1&mime=video%2Fmp4&rqh=1&gir=yes&clen=123489467&dur=252.920&lmt=1746366293571170&mt=1787784061&fvip=1&keepalive=yes&fexp=51565116%2C52135441&c=VISIONOS&txp=8208224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AE0s2JYwRAIgC1GEgu1yPHhusQqUCX1Fef8gwka4n3CJtSUyyYAKPkMCIFjxF4DAo7u9jIwkMVA1UHFfElMc3Vsnt8y-EMGj2mcj&lsparams=cps%2Cmet%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinitcwndbps&lsig=APaTxxMwRAIgGOtlza3Qn_PW42lAp1Ek-wNnWRQhRs-ZTyS9IASdIRICIH-MU5t79zPh6OSTVZnvSDfZZaicrsIYGhB46QWbJor5"
[download] Destination: How to enter the Boot Menu on a Toshiba Portege laptop - The easy way! [g1S7Fo-vjTA].f299.mp4

[download]   0.0% of  117.77MiB at  524.09KiB/s ETA 03:50
[download] 100.0% of  117.77MiB at    3.57MiB/s ETA 00:00
[download] 100% of  117.77MiB in 00:00:47 at 2.49MiB/s   
[debug] Invoking http downloader on "https://rr1---sn-qo5-9a4e.googlevideo.com/videoplayback?expire=1787806090&ei=Km2PaofMDcTC0u8Py6nB6A0&ip=2001%3A14bb%3Ace%3A809%3A69af%3A9a84%3A4c1c%3A3bcc&id=o-ADOb9a5TJ6bXDmiXBPCBGZtmCiQGJ9PB037KJu7bbC8n&itag=251&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&cps=150&met=1787784490%2C&mh=Xe&mm=31%2C29&mn=sn-qo5-9a4e%2Csn-ixh7yn7e&ms=au%2Crdu&mv=m&mvi=1&pl=49&rms=au%2Cau&initcwndbps=2801250&bui=AR3QkAk_FQg4O2Br1PHM25KAeYT9-Pum74dlFYCSdeCl7Ygkyr5aVTq0zVyWGh2XwDFzpUPRnFgdobXQ&spc=KBGBcim7xspuvTgKeUG7c_309rSsnSR9vHspQTYPmMZ7OATKyDgiJpJY_A&vprv=1&svpuc=1&mime=audio%2Fwebm&rqh=1&gir=yes&clen=3865994&dur=252.941&lmt=1626272407796627&mt=1787784061&fvip=1&keepalive=yes&fexp=51565116%2C52135441&c=VISIONOS&txp=5311222&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AE0s2JYwRQIgDA_YyKstLg9JMdmb6PemSSnlkP6JOcb7lGY-Td_7UoYCIQCRTP5WJAFtPK1bSr4-lHVc0N-sItWUckqNRtxeBALzpQ%3D%3D&lsparams=cps%2Cmet%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinitcwndbps&lsig=APaTxxMwRAIgGOtlza3Qn_PW42lAp1Ek-wNnWRQhRs-ZTyS9IASdIRICIH-MU5t79zPh6OSTVZnvSDfZZaicrsIYGhB46QWbJor5"
[download] Destination: How to enter the Boot Menu on a Toshiba Portege laptop - The easy way! [g1S7Fo-vjTA].f251.webm

[download]   0.0% of    3.69MiB at  175.43KiB/s ETA 00:21
[download] 100.0% of    3.69MiB at    2.82MiB/s ETA 00:00
[download] 100% of    3.69MiB in 00:00:01 at 2.45MiB/s   
[Merger] Merging formats into "How to enter the Boot Menu on a Toshiba Portege laptop - The easy way! [g1S7Fo-vjTA].mkv"
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -i 'file:How to enter the Boot Menu on a Toshiba Portege laptop - The easy way! [g1S7Fo-vjTA].f299.mp4' -i 'file:How to enter the Boot Menu on a Toshiba Portege laptop - The easy way! [g1S7Fo-vjTA].f251.webm' -c copy -map 0:v:0 -map 1:a:0 -movflags +faststart 'file:How to enter the Boot Menu on a Toshiba Portege laptop - The easy way! [g1S7Fo-vjTA].temp.mkv'
Deleting original file How to enter the Boot Menu on a Toshiba Portege laptop - The easy way! [g1S7Fo-vjTA].f251.webm (pass -k to keep)
Deleting original file How to enter the Boot Menu on a Toshiba Portege laptop - The easy way! [g1S7Fo-vjTA].f299.mp4 (pass -k to keep)

(the forum software does not let me upload plain text files)


masen wrote

It’s fine to make this public if you’d like :slightly_smiling_face:

Youtube still offers some videos with the older style video type that doesnt need the PO token at all but to get access to the “vast wide world of videos” you most of the time need those tokens hehe

Two easy ways to fix this:

  1. Update to the build that looks in the ~/.local/bin dir, i fixed that in the latest release.
    or
  2. Symlink: ln -s ~/.local/bin/deno ~/.deno/bin/deno every version checks ~/.deno/bin

You may have to press the “Reinstall provider” button

To explain the PATH thing, yt-dlp --verbose showing PO Token Providers: none is expected as that is the standalone binary in your path that doesnt have the bgutil plugin.
The app installs that plugin separately only when the provider is set up.

I have the fix for the deno EJS lookup queued for tomorrow (late night here atm), happy that you like it outside of this little hiccup :slightly_smiling_face:

1 Like