Skip to content

Cannot launch video anymore #211

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Femto-godhand opened this issue Mar 15, 2025 · 10 comments
Closed

Cannot launch video anymore #211

Femto-godhand opened this issue Mar 15, 2025 · 10 comments

Comments

@Femto-godhand
Copy link

Hello, since few days, I cannot launch anymore any videos like this:

recording.mp4

This is my configuration file:

#!/usr/bin/perl

# CLI Pipe Viewer 0.5.3 - configuration file

use utf8;

our $CONFIG = {
  api_host                      => "auto",
  audio_quality                 => "best",
  auto_captions                 => 0,
  autoplay_mode                 => 0,
  bypass_age_gate_native        => 0,
  bypass_age_gate_with_proxy    => 0,
  cache_dir                     => "$ENV{HOME}/.cache/pipe-viewer",
  colors                        => 1,
  comments_order                => "top",
  confirm                       => 0,
  convert_cmd                   => "ffmpeg -i *IN* *OUT*",
  convert_to                    => undef,
  cookie_file                   => undef,
  copy_caption                  => 0,
  custom_channel_layout_format  => [
                                     { align => "right", color => "bold", text => "*NO*.", width => 3 },
                                     { align => "left", color => "bold blue", text => "*AUTHOR*", width => "55%" },
                                     { align => "right", color => "green", text => "*VIDEOS* videos", width => 14 },
                                     {
                                       align => "right",
                                       color => "green",
                                       text  => "*SUBS_SHORT* subs",
                                       width => 10,
                                     },
                                   ],
  custom_layout_format          => [
                                     { align => "right", color => "bold", text => "*NO*.", width => 3 },
                                     { align => "left", color => "bold blue", text => "*TITLE*", width => "55%" },
                                     { align => "left", color => "magenta", text => "*AUTHOR*", width => "15%" },
                                     { align => "right", color => "green", text => "*AGE_SHORT*", width => 3 },
                                     { align => "right", color => "green", text => "*VIEWS_SHORT*", width => 5 },
                                     { align => "right", color => "blue", text => "*TIME*", width => 8 },
                                   ],
  custom_playlist_layout_format => [
                                     { align => "right", color => "bold", text => "*NO*.", width => 3 },
                                     { align => "left", color => "bold blue", text => "*TITLE*", width => "55%" },
                                     { align => "right", color => "green", text => "*ITEMS* videos", width => 14 },
                                     { align => "left", color => "magenta", text => "*AUTHOR*", width => "20%" },
                                   ],
  dash                          => 1,
  date                          => undef,
  debug                         => 0,
  download_and_play             => 0,
  download_with_wget            => 1,
  download_with_ytdl            => 1,
  downloads_dir                 => "$ENV{HOME}/Vidéos/",
  env_proxy                     => 1,
  fat32safe                     => 0,
  features                      => [],
  ffmpeg_cmd                    => "ffmpeg",
  force_fallback                => 0,
  fullscreen                    => 0,
  get_captions                  => 1,
  get_subscriptions_in_parallel => 0,
  get_term_width                => 1,
  hfr                           => 1,
  highlight_color               => "bold",
  highlight_watched             => 1,
  history                       => 1,
  history_file                  => "$ENV{HOME}/.config/pipe-viewer/cli-history.txt",
  history_limit                 => 100000,
  http_proxy                    => undef,
  ignore_av1                    => 0,
  ignored_projections           => [],
  interactive                   => 1,
  keep_original_video           => 0,
  local_playlist_limit          => -1,
  maxResults                    => 20,
  merge_into_mkv                => 0,
  merge_into_mkv_args           => "-loglevel warning -c:s srt -c:v copy -c:a copy -disposition:s forced",
  merge_with_captions           => 1,
  order                         => undef,
  page                          => 1,
  prefer_av1                    => 0,
  prefer_invidious              => 0,
  prefer_m4a                    => 0,
  prefer_mp4                    => 0,
  region                        => undef,
  remove_played_file            => 0,
  resolution                    => "best",
  saved_channels_file           => "$ENV{HOME}/.config/pipe-viewer/users.txt",
  show_video_info               => 1,
  skip_if_exists                => 1,
  skip_watched                  => 0,
  split_videos                  => 1,
  srt_languages                 => ["en", "fr"],
  subscribed_channels_file      => "$ENV{HOME}/.config/pipe-viewer/subscribed_channels.txt",
  subscription_results          => "uploads,streams",
  subscriptions_lifetime        => 600,
  subscriptions_limit           => 10000,
  thousand_separator            => ",",
  timeout                       => undef,
  user_agent                    => undef,
  video_filename_format         => "*FTITLE* - *ID*.*FORMAT*",
  video_player_selected         => "mpv",
  video_players                 => {
                                     mpv => {
                                       arg => "--really-quiet --force-media-title=*TITLE* --no-ytdl *VIDEO*",
                                       audio => "--audio-file=*AUDIO*",
                                       cmd => "/usr/bin/mpv",
                                       fs => "--fullscreen",
                                       novideo => "--no-video",
                                       srt => "--sub-file=*SUB*",
                                     },
                                     mpvraw => {
                                       arg => "--ytdl-raw-options-append=\"format-sort=ext,res:*RESOLUTION*\" *URL*",
                                       cmd => "mpv",
                                       fs => "--fullscreen",
                                       novideo => "--no-video",
                                       srt => "--sub-file=*SUB*",
                                     },
                                     vlc => {
                                       arg => "--quiet --play-and-exit --no-video-title-show --input-title-format=*TITLE* *VIDEO*",
                                       audio => "--input-slave=*AUDIO*",
                                       cmd => "vlc",
                                       fs => "--fullscreen",
                                       novideo => "--intf=dummy --novideo",
                                       srt => "--sub-file=*SUB*",
                                     },
                                   },
  videoDuration                 => undef,
  watch_history                 => 1,
  watch_history_file            => "$ENV{HOME}/.config/pipe-viewer/watched.txt",
  wget_cmd                      => "/usr/bin/wget",
  youtube_channel_url           => "https://www.youtube.com/channel/%s",
  youtube_playlist_url          => "https://www.youtube.com/playlist?list=%s",
  youtube_video_url             => "https://www.youtube.com/watch?v=%s",
  ytdl                          => 1,
  ytdl_cmd                      => "/usr/bin/yt-dlp",
  ytdlp_comments                => 0,
  ytdlp_max_comments            => 10,
  ytdlp_max_replies             => 3,
}

I'm using pipe-viewer version 0.5.3 on Void linux.
Best regards.

@trizen
Copy link
Owner

trizen commented Mar 16, 2025

Confirmed. The video URLs extracted by pipe-viewer (using the ANDROID client), now produce the "403 Forbidden" error.

A workaround would be to set in the config-file:

   force_fallback => 1,

...which will use yt-dlp to extract the video URLs.

@trizen trizen pinned this issue Mar 16, 2025
@Femto-godhand
Copy link
Author

Femto-godhand commented Mar 16, 2025

Confirmed. The video URLs extracted by pipe-viewer (using the ANDROID client), now produce the "403 Forbidden" error.

A workaround would be to set in the config-file:

force_fallback => 1,
...which will use yt-dlp to extract the video URLs.

Thank you, the workaround works for me now.

@DidierSpaier
Copy link

Thank you, the workaround works for me too.

@m040601
Copy link

m040601 commented Mar 22, 2025

I'm also getting some new errors. I'm 99% I was not getting them last week. I'm
not sure if this is related to this same issue here. But here it goes.

I strongly suspect this to be related to youtube strangling invidious and/or changing the interface.

Regarding yt-dlp, I also make heavy use of it on the command line, and have not
experienced any throtling or errors.

I only use the CLI version of pipe-viewer never the GUI, on Archlinux.

Name            : pipe-viewer-git
Version         : 0.5.4.r0.g0254986-1
Depends On      : perl  perl-data-dump  perl-json  perl-lwp-protocol-https  perl-gtk3  perl-libwww  perl-file-sharedir  perl-unicode-linebreak
Optional Deps   : ffmpeg: conversions and MKV merging [installed]
                  gnome-icon-theme: icons in menus
                  perl-json-xs: faster JSON parsing [installed]
                  perl-lwp-useragent-cached: local cache support [installed]
                  perl-term-readline-gnu: better STDIN support [installed]
                  perl-parallel-forkmanager: for option get_subscriptions_in_parallel [installed]
                  mpv: play videos with MPV (recommended) [installed]
                  vlc: play videos with VLC
                  wget: download videos with wget [installed]
                  youtube-dl: play videos with encrypted signatures
Packager        : Unknown Packager
Build Date      : Tue 21 Jan 2025 04:48:43 PM WET
Install Date    : Wed 22 Jan 2025 03:18:14 AM WET

I have

  api_host                      => "auto",
  force_fallback                => 0,
  prefer_invidious              => 0,

I also tested all this removing the caches and restarting a fresh,

~/.cache/pipe-viewer/
~/.config/pipe-viewer/instances.json

I do not use the default player

107                                      mpv => {
108                                        arg => "--really-quiet --force-media-title=*TITLE*
109                                        audio => "--audio-file=*AUDIO*",
110                                        cmd => "/usr/bin/mpv",
111                                        fs => "--fullscreen",
112                                        novideo => "--no-video",
113                                        srt => "--sub-file=*SUB*",
114                                      },

Pipe-viewer is only responsible for browsing, not downloading.

I only take the "URL". I have been using for many many years some custom
"player" scripts with yt-dlp, umpv(mpv), wget, mpc, batch download/queue managers etc.

Basicly,

=> {
  arg => "*URL*",
  cmd =>  ~/.local/mybins/custom_script",
},

So in the last day(s) I noticed that:

Searching seems to work fine.

But when i press ";i22" to get info on video "22" I immediately get,

Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.

It then takes an awfull lot of time to get the metadata.

That 1478 line,

1474     if ($res->is_success) {
1475         return $res->decoded_content;
1476     }
1477     else {
1478         warn 'Request error: ' . $res->status_line();
1479     }

It also seems that pipe-viewer is not caching that request or making use of
"watched_videos.dat". At least for searching and browsing.

That is, if i press again ";i22" it does a new network request, and takes a lot
of time again to get that same metadata again.

Playing.

If I know press "22" to "play" the video, same error message, same awfull delay again.
But after that URL is passed to my custom player . Pipe-viewer is now out of
the game, and the download proceds fast. The "watched_videos.dat" then gets written this 02:14.

force_fallback => 1 doesnt seem to make any difference ????

I also tried to change the user agent.

$ yt-dlp --dump-user-agent

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.50 Safari/537.36

From,

  prefer_invidious              => 0,

To,

  prefer_invidious              => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.50 Safari/537.36",

But then I start getting,

> 25
[401 Unauthorized] Error occurred on URL: https://inv.nadeko.net/api/v1/channels/UCkReSfs5w1gRfEL7B-CUf7w/videos?hl=en-US

[!] No video results!

:: Probably the selected invidious instance is down. Try:

        /usr/bin/pipe-viewer --api=auto

See also: https://github.com/trizen/pipe-viewer#invidious-instances

And cant neither search nor download.

About Instances.

I also never quite understood this quite well. I had always assumed that with the default,

  prefer_invidious              => 0,

Since I am very skeptical of the future of invidious, I assumed I was "safe"
with pipe-viewer parsing directly the html of the youtube interface.

pipe-viewer would never make use of invidious. Am I correct in this assumption ?

Why that contact with an invidious instance, "401 unauthorized" to "https://inv.nadeko.net/api/" then ?

Why with "0" is there a ~/.config/pipe-viewer/current_instance.json than ?

I think I can understand that with "1" a ~/.config/pipe-viewer/instances.json shows up.

@m040601
Copy link

m040601 commented Mar 22, 2025

Just used this,

  debug                         => 1,

$ pipe-viewer

=>> Search for YouTube videos (:h for help)
> japan
** GET https://m.youtube.com/results?hl=en&search_query=japan&sp=CAASBggAEAEYAFAe ==> 200 OK (1s)
:: Returning results with a continuation page token...

 1. 87O0M_F7cb4 JAPAN FIRST to book World Cup spot! | Japan - Ba AFC Asian  1d  1.2M    03:01
 2. 7u0_nrsfxXs Why Japanese Railways Win                        Wendover   1d  455K    20:51
 3. 3hEm5Y_74U0 Wonders of Japan | The Most Amazing Places in Ja Trip Insi  4m  2.5M    57:58
=>> Select one or more videos to play (:h for help)
> ;i2
:: Extracting video info using the fallback method...

Hhhm ... so it used the fallback even when I have "force_fallback => 0,"


** POST https://youtubei.googleapis.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 ==> 400 Bad Request (1s)
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
** POST https://youtubei.googleapis.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 ==> 400 Bad Request
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
** POST https://youtubei.googleapis.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 ==> 400 Bad Request
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
:: Extracting video info with youtube-dl...

=> Description
---------------------------------------------------------------------------------------------
Get an exclusive 15% discount on Saily data plans! Use code Wendover at checkout.
......
7d07aea278166c0dfb&ab_segments=0/basic_search_gsv2/control&initiator=search-results&
acceptTC=1 
[2]
https://documents1.worldbank.org/curated/es/256221468752350809/pdf/multi-page.pdf
---------------------------------------------------------------------------------------------
=> URL: https://www.youtube.com/watch?v=7u0_nrsfxXs
---------------------------------------------------------------------------------------------
                              =>> Why Japanese Railways Win <<=

-> Channel   : Wendover Productions
-> ChannelID : UC9RM-iSvTu1uPJb8X5yp3EQ
-> VideoID   : 7u0_nrsfxXs
-> Category  : Education
-> Duration  : 20:51
-> Likes     : 17,100
-> Rating    : 75%
-> Views     : 456,127
-> Published : 1 day ago
---------------------------------------------------------------------------------------------

=>> Press ENTER to continue...


=>> Select one or more videos to play (:h for help)
> 1
** POST https://youtubei.googleapis.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 ==> 400 Bad Request
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
** POST https://youtubei.googleapis.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 ==> 400 Bad Request
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
** POST https://youtubei.googleapis.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 ==> 400 Bad Request
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
:: Trying to bypass age-restricted gate...
:: Using `player_response` to extract the streaming URLs...
:: Using /usr/bin/yt-dlp to extract the streaming URLs...
:: /usr/bin/yt-dlp: found 47 streaming URLs...
:: Using /usr/bin/yt-dlp to extract the streaming URLs...
:: /usr/bin/yt-dlp: found 47 streaming URLs...
:: Extracting closed-caption URLs with /usr/bin/yt-dlp
:: Found 47 streaming URLs...
:: Extracting video info using the fallback method...

Hmmm again is using the fallback...

:: Extracting video info with youtube-dl...

=> Description
---------------------------------------------------------------------------------------------
Enjoy the highlights of the match between Japan and Bahrain from matchday 7 of the
AFC Asian Qualifiers™ Road to 26.
..........
X Japanese: https://x.com/afcasiancup_jp
---------------------------------------------------------------------------------------------
=> URL: https://www.youtube.com/watch?v=87O0M_F7cb4
---------------------------------------------------------------------------------------------
=>> JAPAN FIRST to book World Cup spot! | Japan - Bahrain | Highlights #AsianQualifiers - Road To 26 <<=

-> Channel   : AFC Asian Cup
-> ChannelID : UCXTRFt1vLvZpahQtiKJjLaQ
-> VideoID   : 87O0M_F7cb4
-> Category  : Sports
-> Duration  : 03:00
-> Likes     : 16,503
-> Rating    : 70%
-> Views     : 1,165,484
-> Published : 1 day ago
---------------------------------------------------------------------------------------------
-> Resolution: 360
-> Video itag: 18
-> Video type: video/mp4
-> Command: TS_SOCKET=/tmp/pipe_worst_socket tsp ~/.local/mybins/umpvmpdw https\:\/\/www\.youtube\.com\/watch\?v\=87O0M_F7cb4

That url "https://www.youtube.com/watch?v=87O0M_F7cb4" gets passed to
my player script and then the video gets downloaded very fast.

@trizen
Copy link
Owner

trizen commented Mar 22, 2025

@m040601 The extraction of video info (:i=n) should be fixed in 9e2b980.

Regarding prefer_invidious, it's a boolean option. When set to a non-zero value, it will prefer Invidious instances. When set to 0, Invidious instances are tried only as a last resort, when the other methods (our code and yt-dlp) failed.

@m040601
Copy link

m040601 commented Mar 23, 2025

  @m040601 The extraction of video info ( :i=n ) should be fixed 

I can now confirm this. Thanks for the prompt fix.

@m040601
Copy link

m040601 commented Mar 23, 2025

About the user_agent.

I made a type in my previous comment.

I was trying changing this option,

  user_agent                    => undef,

To

  user_agent                    => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537

But that fails, at least for searching with,

=>> Search for YouTube videos (:h for help)
> japan
** GET https://m.youtube.com/results?hl=en&search_query=japan&sp=CAASBggAEAEYAFAe ==> 302 Found
** GET https://www.youtube.com/results?app=desktop&hl=en&search_query=japan&sp=CAASBggAEAEYAFAe ==> 200 OK (1s)
:: Found 0 invidious instances:
:: Found 2 invidious instances: inv.nadeko.net id.420129.xyz
:: Changed the instance to: https://inv.nadeko.net
** GET https://inv.nadeko.net/api/v1/search?date=anytime&hl=en-US&q=japan&sort=relevance&type=video ==> 401 Unauthorized (1s)
[401 Unauthorized] Error occurred on URL: https://inv.nadeko.net/api/v1/search?date=anytime&hl=en-US&q=japan&sort=relevance&type=video

[!] No video results!

:: Probably the selected invidious instance is down. Try:

        /usr/bin/pipe-viewer --api=auto

See also: https://github.com/trizen/pipe-viewer#invidious-instances

And then pipe-viewer auto closes.

@trizen
Copy link
Owner

trizen commented Mar 23, 2025

The value for user_agent needs to be an user agent of a mobile or a tablet. Although, it's not recommended to mess with this value. This config-option exists just in case the default user agent fails to work.

@lilmike
Copy link

lilmike commented Mar 26, 2025

I'm using force_fallback = 1, and in the last couple days, I've come across more and more videos that pipe-viewer fails to get yt-dlp to download and play. When running yt-dlp on the url directly, it works fine. Could this have something to do with the test of drm encryption that youtube's been trying out? Example log:

=>> Select one or more videos to play (:h for help)
> 2
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
Request error: 400 Bad Request at /usr/share/perl5/vendor_perl/WWW/PipeViewer.pm line 1478.
WARNING: [youtube] GeCP-0nuziE: Native nsig extraction failed: Trying with PhantomJS
         n = WUzkSHCvkl20flEO9 ; player = https://www.youtube.com/s/player/4fcd6e4a/player_ias.vflset/en_US/base.js
WARNING: [youtube] GeCP-0nuziE: nsig extraction failed: Some formats may be missing
         n = WUzkSHCvkl20flEO9 ; player = https://www.youtube.com/s/player/4fcd6e4a/player_ias.vflset/en_US/base.js
WARNING: [youtube] GeCP-0nuziE: Native nsig extraction failed: Trying with PhantomJS
         n = B6FFAlMyILNLzFYhM ; player = https://www.youtube.com/s/player/4fcd6e4a/player_ias.vflset/en_US/base.js
WARNING: [youtube] GeCP-0nuziE: nsig extraction failed: Some formats may be missing
         n = B6FFAlMyILNLzFYhM ; player = https://www.youtube.com/s/player/4fcd6e4a/player_ias.vflset/en_US/base.js
WARNING: [youtube] GeCP-0nuziE: Native nsig extraction failed: Trying with PhantomJS
         n = F04fV21ImFFGprCtD ; player = https://www.youtube.com/s/player/4fcd6e4a/player_ias.vflset/en_US/base.js
WARNING: [youtube] GeCP-0nuziE: nsig extraction failed: Some formats may be missing
         n = F04fV21ImFFGprCtD ; player = https://www.youtube.com/s/player/4fcd6e4a/player_ias.vflset/en_US/base.js
WARNING: [youtube] GeCP-0nuziE: Native nsig extraction failed: Trying with PhantomJS
         n = -DFuRA2rZcV9ydp2P ; player = https://www.youtube.com/s/player/4fcd6e4a/player_ias.vflset/en_US/base.js
WARNING: [youtube] GeCP-0nuziE: nsig extraction failed: Some formats may be missing
         n = -DFuRA2rZcV9ydp2P ; player = https://www.youtube.com/s/player/4fcd6e4a/player_ias.vflset/en_US/base.js
WARNING: Only images are available for download. use --list-formats to see them
[BUG] Unknown video formats:
[
  {
    itag => "sb3",
    type => "video/mhtml",
    url  => "https://i.ytimg.com/sb/GeCP-0nuziE/storyboard3_L0/default.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjt7oe_Bg==&sigh=rs\$AOn4CLBi3gfJS9n564OzpoZIhkxrZaqCUQ",
  },
  {
    itag => "sb2",
    type => "video/mhtml",
    url  => "https://i.ytimg.com/sb/GeCP-0nuziE/storyboard3_L1/M\$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjt7oe_Bg==&sigh=rs\$AOn4CLAEyHyqnJk-wwsa6nQqIp5dUcysXw",
  },
  {
    itag => "sb1",
    type => "video/mhtml",
    url  => "https://i.ytimg.com/sb/GeCP-0nuziE/storyboard3_L2/M\$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjt7oe_Bg==&sigh=rs\$AOn4CLAAdAomfu-KEknVi-JLGfVwt-PmHw",
  },
  {
    itag => "sb0",
    type => "video/mhtml",
    url  => "https://i.ytimg.com/sb/GeCP-0nuziE/storyboard3_L3/M\$M.jpg?sqp=-oaymwENSDfyq4qpAwVwAcABBqLzl_8DBgjt7oe_Bg==&sigh=rs\$AOn4CLBu-TiqIc1-Udwvo0JYo0YxzVz7mQ",
  },
]

yt-dlp 2025.03.21, pipe-viewer 0.5.3 cli

-Michael.

@trizen trizen closed this as completed in c542284 Mar 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants