Files
geminiCapsule/rss.xml

359 lines
15 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>Konsthol</title>
<description>Konsthol's site</description>
<language>en-gb</language>
<link>https://konsthol.eu/rss.xml</link>
<atom:link href="https://konsthol.eu/rss.xml" rel="self" type="application/rss+xml"/>
<item>
<title>Simple way to extend yt-dlp</title>
<link>https://konsthol.eu/log/simple_way_to_extend_yt_dlp-12-01-2025.html</link>
<pubDate>Sun, 12 Jan 2025</pubDate>
<description><![CDATA[<blockquote>
<p>DATE: Sun 12 Jan 2025 15:51 By: konsthol@pm.me</p>
</blockquote>
<h1 id="simple-way-to-extend-yt-dlp">Simple way to extend yt-dlp</h1>
<p>
Lots of people use yt-dlp either directly or indirectly through mpv. Its a
powerful tool that acts as a website scraper and it supports thousands of
websites. The website its mostly used for is like the name suggests YouTube.
Now, YouTube is a great resource but usage through the website is quite
unpleasant so lots of people opt out to use alternative frontends like
Invidious or Piped. Lots of times you just want to use mpv to stream a YouTube
video by providing the link like:
</p>
<blockquote>
<p>mpv https://youtube.com/watch?v=[VideoID]</p>
</blockquote>
<p>
That works like a charm, but what happens when you provide a link of an
alternative frontend? Well, it translates it to the aforementioned format in
order to work. But there are so many instances of Invidious and Piped, so how
does it know what to do? That was my question as well since I use a self
hosted Piped instance and it does not recognize the domain. Obviously.
</p>
<p>
Thankfully, yt-dlp is an open source project so you can actually see what goes
on behind the scenes. In my case, I installed it with the Arch Linux package
manager and it resides at:
</p>
<blockquote>
<p>/usr/lib/python3.13/site-packages/yt_dlp/</p>
</blockquote>
<p>
The way yt-dlp works is that it has a folder called “extractor” in that path
and in that folder there is a python file for each supported website. In
YouTubes case its youtube.py. I opened it and I saw this:
</p>
<pre><code>class YoutubeBaseInfoExtractor(InfoExtractor):
&quot;&quot;&quot;Provide base functions for Youtube extractors&quot;&quot;&quot;
_RESERVED_NAMES = (
r&#39;channel|c|user|playlist|watch|w|v|embed|e|live|watch_popup|clip|&#39;
r&#39;shorts|movies|results|search|shared|hashtag|trending|explore|feed|feeds|&#39;
r&#39;browse|oembed|get_video_info|iframe_api|s/player|source|&#39;
r&#39;storefront|oops|index|account|t/terms|about|upload|signin|logout&#39;)
_PLAYLIST_ID_RE = r&#39;(?:(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}|RDMM|WL|LL|LM)&#39;
# _NETRC_MACHINE = &#39;youtube&#39;
# If True it will raise an error if no login info is provided
_LOGIN_REQUIRED = False
_INVIDIOUS_SITES = (
# invidious-redirect websites
r&#39;(?:www\.)?redirect\.invidious\.io&#39;,
r&#39;(?:(?:www|dev)\.)?invidio\.us&#39;,
# Invidious instances taken from https://github.com/iv-org/documentation/blob/master/docs/instances.md
r&#39;(?:www\.)?invidious\.pussthecat\.org&#39;,
r&#39;(?:www\.)?invidious\.zee\.li&#39;,
[more instances here]
)</code></pre>
<p>
There is a class called YoutubeBaseInfoExtractor that has an array of
instances called _INVIDIOUS_SITES that uses a regex to catch every domain
there. Now, I saw at the GitHub page of yt-dlp a lot of people asking the
maintainers to add more instances on this list. Theoretically you also can
just edit the file and add a domain so that it recognizes that one too. But,
in my personal opinion its never a good idea to edit upstream files because
as the program updates your changes will be overwritten. So I found another
way to deal with this.
</p>
<p>
You see, yt-dlp is not just a command line utility. You can use it as a
library to make your own extractors for websites. The way you do that is by
creating your own plugins. In my case, I didnt actually want to make a new
extractor but somehow extend an array of an already existing one. Not all
extractors use this method but since YouTube does, it would work. So I made
this file at this location:
</p>
<blockquote>
<p>~/.config/yt-dlp/plugins/piped/yt_dlp_plugins/extractor/piped.py</p>
</blockquote>
<p>The contents are simple:</p>
<pre><code>from yt_dlp.extractor.youtube import YoutubeBaseInfoExtractor, YoutubeIE
class CustomYoutubeBaseInfoExtractor(YoutubeBaseInfoExtractor):
_INVIDIOUS_SITES = YoutubeBaseInfoExtractor._INVIDIOUS_SITES + (
r&#39;(?:www\.)?piped\.konsthol\.eu&#39;,
)
class PipedKonstholYoutubeIE(YoutubeIE, CustomYoutubeBaseInfoExtractor):
_VALID_URL = r&#39;https?://(?:www\.)?piped\.konsthol\.eu/watch\?v=(?P&lt;id&gt;[0-9A-Za-z_-]{11})&#39;
IE_NAME = &#39;piped.konsthol.eu&#39;
</code></pre>
<p>
We import the class that contains the array we need and the youtube extractor.
We make a new class in which we provide the one that has the array. We access
the array and add a new regex for our domain. Then we make a new class for the
extractor, provide the one we just created and the YouTube extractor class and
we tell it to work for urls that look like the one we provided. In that way,
this pseudo extractor is being activated when we provide a url that looks like
this, it extends the actual YouTube extractor and activates that one, only
this time it works for our domain too.
</p>
<p>
Its amazing what you can do with open source software just by observing how a
program works. Now every time someone needs a new domain for an alternative
YouTube frontend added, instead of asking the developers to do that, using
this simple solution he/she can just add it to the plugin.
</p>
<p><a href="https://github.com/yt-dlp/yt-dlp/">yt-dlp GitHub page</a><br /></p>
<p><a href="..">..</a></p>]]></description>
</item>
<item>
<title>The magic of Wake-On-LAN</title>
<link>https://konsthol.eu/log/the_magic_of_wake_on_lan-19-12-2024.html</link>
<pubDate>Thu, 19 Dec 2024</pubDate>
<description><![CDATA[<blockquote>
<p>DATE: Thu 19 Dec 2024 18:35 By: konsthol@pm.me</p>
</blockquote>
<h1 id="the-magic-of-wake-on-lan">The magic of Wake-On-LAN</h1>
<p>
Years ago, some good friends of mine gifted me a Raspberry Pi 4 with 2GB of
RAM for my birthday. Its hands down the most thoughtful gift Ive ever
received, perfectly matching my hobbies. They were lucky to even find one
during the chip shortage! I initially used it as a VPN server with WireGuard
and played around with Pi-hole for network-wide ad blocking.
</p>
<p>
Eventually, I got into cloud computing and started hosting multiple services
on a VPS I rent from MVPS. This VPS, with its 4GB of RAM, currently runs
several of my daily-use services like Gitea, Searx, NTFY, and more. Although
the Raspberry Pi could theoretically handle these services, its 2GB of RAM
limited simultaneous operations.
</p>
<p>
One day, it hit me: why not use the Raspberry Pi for a simpler project like a
Wake-On-LAN (WOL) server? It requires minimal resources and just needs to stay
on and send WOL packets. The Raspberry Pi is connected via Wi-Fi to the same
network as my laptop. Normally, waking up my laptop with WOL would require an
Ethernet cable connection to the router, but I connected one end to the Pi and
the other to the laptop.
</p>
<p>
I started with a simple shell script using etherwake, a command-line tool to
send WOL packets. After enabling WOL in my laptops BIOS and confirming it on
the OS using ethtool, I could easily wake my laptop remotely using a Termux
shortcut on my phone, which SSHed into the Raspberry Pi to execute the
etherwake command.
</p>
<p>
Though this setup worked perfectly fine, I wanted to make it even better.
Initially, the Raspberry Pi only ran SSH and executed a command to wake my
laptop. So it wasnt really a WOL server. After some research, I found Flask
and created an actual WOL server. This server had routes, authentication,
logging, rate limits, and more to ensure robustness and security.
</p>
<p>
What makes my Flask-based server so cool is its dynamic nature. I can
configure a .env file with multiple device MAC addresses, allowing numerous
routes for different devices. For instance, I have LAPTOP_MAC=“itsmac” and
DESKTOP_MAC=“itsmac”, enabling me to wake them via HTTP requests at
/wol/laptop and /wol/desktop, respectively.
</p>
<p>
One open-source application that fits my use case is HTTP Shortcuts from
F-Droid. After configuring a specific route, I can turn it into a widget on my
home screen. This way, I can wake my laptop up with just a tap! Plus, I use
dynamic DNS, so my Pi is accessible from anywhere.
</p>
<p>
<a href="/images/pic-selected-19-12-24_19-10-42.png">The projects mascot</a
><br />
</p>
<p>
I would suggest anyone to take a look at my projects repo and if they find
that it fits their needs, use the setupSingleBinary.sh script to grab the
latest executable. The repo is over at
</p>
<p><a href="https://git.konsthol.eu/konsthol/WOL-Ly">WOL-Ly</a><br /></p>
<p><a href="..">..</a></p>]]></description>
</item>
<item>
<title>WebCall</title>
<link>https://konsthol.eu/log/webcall-25-02-2023.html</link>
<pubDate>Sat, 25 Feb 2023</pubDate>
<description><![CDATA[<blockquote>
<p>DATE: Sat 25 Feb 2023 22:42 By: konsthol@pm.me</p>
</blockquote>
<h1 id="webcall">WebCall</h1>
<p>One of the simplest ways to host a “telephony” service is to use webcall.</p>
<p>
Like with emails, you can use any webcall server to communicate with any other
webcall server. Meaning that if for example you register a number with
https://timur.mobi/ which is the default public server you can still make a
call to someone who has registered a number with https://talk.konsthol.eu if
you know their number by replacing the server address field in the dialpad
icon.
</p>
<p>
All calls are encrypted and the server does not have access to the content of
the calls. That is because the server uses webrtc and tries to make peer to
peer connections.
</p>
<p>
There is also an integrated TURN server which is used if the peers cant
connect directly but if the connection is made though that then no video
transmission is possible. I suspect that this is a limitation of the TURN
server used in webcall because in jitsi meet which uses coturn instead of
pion, it is always possible.
</p>
<p>
Another differentiation of the two services is that in webcall no more than 2
people can join a conversation, which is more similar to how a regular
telephone call behaves.
</p>
<p>
Also there is currently no functionality to block a number as far as I can see
but it should be fairly easy to figure out the public ip address and block it
like that.
</p>
<p>
You should give it a shot and see if it works for you. The source code is at a
link over at
</p>
<p><a href="https://timur.mobi">https://timur.mobi</a></p>
<p><a href="..">..</a></p>]]></description>
</item>
<item>
<title>wpgtk is just more convenient</title>
<link>https://konsthol.eu/log/choose_wpgtk_over_just_pywal-17-08-2022.html</link>
<pubDate>Wed, 17 Aug 2022</pubDate>
<description><![CDATA[<blockquote>
<p>DATE: Wed 17 Aug 2022 00:09 By: konsthol@pm.me</p>
</blockquote>
<h1 id="wpgtk-is-just-more-convenient">wpgtk is just more convenient</h1>
<p>
Pywal is a simple KISS principled python application that extracts colors from
an image and creates a color pallete to theme different programs
</p>
<p>
By default there are some templates that are stored in its .cache directory
and there is an option to create new templates in its .config directory.
</p>
<p>
I found it to be simpler to create every template with wpgtk and store it in
its templates folder in .config because there it also utilizes symlinks to its
respective files and thus you can have every programs file to manage in one
place.
</p>
<p>
Moreover wpgtk conveniently stores each created colorscheme in a schemes
folder in .config and along with that every wallpaper used as a symlink to the
actual wallpaper in a wallpapers folder.
</p>
<p>
It also has a gui interface but I never really found a use for it as one can
easily perform every needed action using just the cli.
</p>
<p>
After creating a script to be run after every use of the program to theme
application that need third party scripts like telegram and qutebrowser the
process of switching colorschemes on the fly becomes easy as pie and fast as
fuck 🤫
</p>
<p>
Just give it a shot! Maybe Ill upload my postWPG script in my gitea instance
sometime soon and create an actual tutorial on how to use wpgtk
</p>
<p><a href="..">..</a></p>]]></description>
</item>
<item>
<title>Awesome file sharing tool</title>
<link>https://konsthol.eu/log/easy_file_sharing-12-09-2021.html</link>
<pubDate>Sun, 12 Sep 2021</pubDate>
<description><![CDATA[<blockquote>
<p>DATE: Sun 12 Sep 2021 00:53 By: konsthol@pm.me</p>
</blockquote>
<h1 id="awesome-file-sharing-tool">Awesome file sharing tool</h1>
<p>
Croc is one of the best easy to use file sharing cli tools I came across and
only recently discovered how easy it can be to self host your own relay.
</p>
<p>
Croc as far as I understand needs an intermediary to staple as it says the
connection between two computers. If I grasp the concept correctly if two
computers can both connect to a third one then a connection between them can
be established. The files sent over dont get first uploaded to the third one
and then downloaded to the second but somehow get uploaded and downloaded
simultaneously.
</p>
<p>
Ill have to further read about that but in short if you have a computer like
a server with a static ip that is easily accessible from the internet then
because of the great job the author did you can host a relay simply by typing
the command
</p>
<blockquote>
<p>croc relay</p>
</blockquote>
<p>
which will by default use the ports 9009-9013 but you can specify your own
with the ports arguement like
</p>
<blockquote>
<p>croc relay ports 1111,1112</p>
</blockquote>
<p>
Then if you make that into a systemd service (which I wont be covering just
yet cause I dont really understand them and only make them by copy pasting
basic templates 😐) its basically a set and forget kind of thing and you can
now send files to anyone in any operating system by using croc by typing
</p>
<blockquote>
<p>croc relay “your.domain:9009” send [file]</p>
</blockquote>
<p>and the recipient can download it by typing</p>
<blockquote>
<p>croc relay “your.domain:9009” [code]</p>
</blockquote>
<p>
This is super useful cause there was a time when the public instance was down
and I couldnt send files when it was just so easy to not be dependent on the
public instance in the first place.
</p>
<p>
You should definetely read more about it on Crocs github page and set up your
own relay asap 😎
</p>
<p>
<a href="https://github.com/schollz/croc">https://github.com/schollz/croc</a>
</p>
<p><a href="..">..</a></p>]]></description>
</item>
</channel>
</rss>