Browsed by
Tag: dev

rav1e GUI v1.14 released!

rav1e GUI v1.14 released!

Hi everyone,

Today, I have released rav1e GUI v1.14:

rav1e GUI v1.14
rav1e GUI v1.14

This release makes it possible to encode video files with no audio. It also will predefine the output path using the input path, and change the output extension to .webm. What’s more, is that if you manually type the input path, the output path will be dynamically adjusted too!

You can download this release on GitHub by clicking here.


Rav1e GUI v1.11 released!

Rav1e GUI v1.11 released!

Hi everyone,

Today, I have released rav1e GUI v1.11:

rav1e GUI v1.11 Main Window
rav1e GUI v1.11 Main Window

This new version adds support for tiles. It allows you to encode a video using rav1e’s multithreading. When Tiles are enabled, rav1e GUI will not split the video files into segments. Rather, it will use a single rav1e instance but it will utilize the amount of threads specified, which is passed as an argument to rav1e.

The Advanced Options window was updated to include the tiles row and column options:

rav1e GUI v1.11 Advanced Options
rav1e GUI v1.11 Advanced Options

This version also fixed a bug with the Low Latency option, and it is adjusted for how the option now works with the newer versions of rav1e. Also, the Speed setting was adjusted from speed level 3 to 5, which is now the default speed level in rav1e.

Lastly, Opusenc is no longer needed and the audio will now be encoded using ffmpeg, by using the libopus library. This reduces a step and saves a couple of megabytes of space.

You can download this new release at GitHub by clicking here.


Programming Saturday: rav1e GUI

Programming Saturday: rav1e GUI

Hi everyone,

Today, I spent the afternoon programming my rav1e GUI software. It’s been about a month since I last released a rav1e GUI update, and rav1e itself has improved by then.

While I still haven’t released a new GUI version, I did some programming to it to add some of the new rav1e features. Unfortunately, the tests were not successful and I believe this has to do to some changed in the encoder itself. Don’t worry, I’ve opened an issue and I hope to hear back. If this bug is fixed in the encoder, I’ll release the new rav1e GUI version 😁.

The issue I opened

Now, let’s talk about the new GUI features:

rav1e GUI not-yet-released v1.9 screenshot

First, I placed the temporary folder location below the Output video path. I did this to have the text boxes easily accessible and to allow the path to be easily set.

Second, you can see that I moved the quantizer setting and also added a bitrate setting along with 2 radio buttons that allow you to switch between quality control modes. When the Quantizer radio button is checked, the Bitrate text box will get greyed and you can only specify the quantizer value. When the Bitrate radio button is checked, the quantizer value is greyed out and the bitrate textbox is enabled, allowing you to specify the video bitrate in kilobits/second (kb/s or kbps).

Third, I added a 2-Pass option which at the moment does nothing. rav1e added this option but as far as I know, it’s not yet actually implemented. Testing the encoder using its limit function didn’t showed extended encoding times.

Finally, I renamed the “Advanced Encoder Options” button to just “Advanced Options”. It was redundant as it was placed in the Encoder Options group box.

When we press the Advanced Options button, we get shown some more parameters:

Advanced Options

There, I added 2 new arguments that rav1e now accepts:

  • Content Light
  • Range

Also, due to some default arguments that rav1e changed, I also did some default option changes in the GUI.

  1. Low Latency is now disabled by default.
  2. Quality Tuning is now set to Psychovisual (In the above image, I manually changed it back to Psnr).

And with that, I conclude this post. The above changed will be released soon, when rav1e starts working again and I can fully test them. I’ll let you all know when I release it. In the meantime, you can go to the rav1e GUI repo and try running the latest source code.

See ya soon!

Introducing IPFS Local Explorer

Introducing IPFS Local Explorer

Hi everyone,

I present to you today IPFS Local Explorer:

IPFS Explorer
IPFS Explorer

I started coding this software yesterday, in order to work with my local IPFS storage node. It allows file upload, creating new folders, removing content, and opening the files and folders on an IPFS Gateway. It’s very simple, actually, and the best part is that it’s open source!

You can check out the source code in GitHub here:


Installing Rust on Windows

Installing Rust on Windows

Hi everyone,

Today, I’ll show you how to install Rust on Windows. The steps are very easy!

1. First, navigate to

Rust Windows 1

2. Click the “rustup-init.exe” link and save the installer:

Rust windows 2

3. Click “Run”:

Rust Windows 3

4. You’ll be presented a Command-Line window. Type “1” and press enter:

Rust Windows 4

5. Installation will begin:

Rust Windows 5

6. If everything runs as it should, you should see the following:

Rust Windows 7

That’s it! Rust is installed!

DLNA Player v0.2 released

DLNA Player v0.2 released

Hi everyone,

Yesterday, I continued improving my DLNA Player software. It includes some improvements and also adds Google Drive support, so now you will be able to stream your music files stored in the cloud to your DLNA-Enabled device!

By going to the new Cloud menu and selecting Google Drive, you’ll be presented with a convenient browser listing your files and folders, allowing you to select which files to add to the play queue.

Once the files are added to the queue, you just press the Play button and start enjoying your music.

This cloud feature is perfect as you could rip your music CD collection into a format like FLAC and store those files in the cloud. Then, by using this software and a DLNA-compatible renderer device, you can play them back.


Download v0.2 here:

The source code is here:

Commits performed to bring you this new version:


Learning and Programming Days – DLNA Player

Learning and Programming Days – DLNA Player

Hi everyone,

I got my HiBy R3 music player some time ago and I’ve been enjoying it a lot, and I recently started playing the DLNA portion of it.

Using DLNA with Android is a piece of cake thanks to an app called BubbleUPnP, for which I purchased the app license as it allows me to stream my media files without limitations compared with the free version. However, it is when it comes to the PC where I had difficulties finding compatible DLNA-compatible software. All of which I tried were either buggy or were not able to playback the files to my HiBy R3. That’s when I started researching about the DLNA/UPnP protocol and found some examples. I then started developing software to fit my needs immediately.

DLNA is a protocol used to send media files to wireless players. It usually consists of a Server, Renderer, and a Controller:

  • Server: This is where the media files are stored. They are sent to the player by the controller or the player itself if it is able to browse the server
  • Renderer: This is the device that plays back the media file. The renderer can also be able to browse and play the media acting as a controller, but if the renderer is just a renderer, a controller is needed.
  • Controller: This is like a remote control. You choose the media file and the renderer device with this.

I found one great resource at CodeProject, which you can see here. It talked about how to communicate with DLNA devices and send media files to it, given you have a DLNA Server. It worked using my own HTTP server, but then I wanted to develop software that allows me to playback my media locally. That’s where the fun part began.

I then started researching how to implement HTTP servers in C#. I found some examples which I tried and they seemed to work, but were not able to handle partial requests, which seems are needed for media playback as my player was sending partial requests in the HTTP header. That’s when I also found this other great resource at CodeProject which implemented a simple DLNA server.

Since both codes are open source and their license allows its use in projects including modifying them to fit the needs of others, I used both of these as a base for my project.

Meet DLNA-Player:

DLNA Player
DLNA Player Screenshot

I adapted the above codes to work with a player I designed. It allows you to select a rendered device to playback your music files, build a queue, and control your device with its Play, Pause, Stop, Previous and Next buttons. It also allows you to seek the track by using the slider and shows the track progress in real-time! Clearly, this is my first app that deals with socket connections in particular, since this is all the software does. It’s all about sockets!

You simply need to specify your machine’s IP Address, choose a port and press the Apply button, then Scan for Media Renderers, select one, and then drag and drop your music files. Then press the Play button and enjoy your music!

When you playback a file, it is copied to your machine’s RAM which is then used to send the media file to the renderer as it requests it when it sends the HTTP request. This means the software has its own internal web server, so you don’t need a separate DLNA Server as this software does that, serving the files in the queue as it’s being played.

This project is available at GitHub here:

DLNA Player GitHub Repo

Tested with my Hiby R3 player, I can now enjoy true wireless music playback without the quality loss that happens during the Bluetooth transmission. This is all done via Wifi and the player does all the rendering using the original file. I’ve tested it with FLAC 16-bit/44.1Hz as well as MP3 files, which are working correctly.

I hope this tool is useful for others and this has been an incredible learning journey.

Running BOINC Tasks in my website updated! Scripts and tool updated

Running BOINC Tasks in my website updated! Scripts and tool updated


Hi everyone,

In the weekend, I worked to improve the BOINC Tasks section of my website:

BOINC Statistics Website Update 1

Instead of manually updating this page, I’ve updated the PHP files in charge of retrieving the tasks and showing it. This file was custom made and was not in the GitHub repo. Instead, the file that was in the repo was the one that looks like this:

BOINC Statistics Website Update 2

Because that one shows all of the tasks from all of the hosts, I made another PHP file to replicate the format I used in my website but instead of having to manually type each machine there, I made the php file use some functions and loops to retrieve the machines and tasks from the database. The result is the following:

BOINC Statistics Website Update 3
BOINC Statistics Website Update 4

Looks better, right?

Let’s take a look at the code:

First, I made a separate file called config.php to keep the MySQL details there. I’m also using a global mysqli object. Because of this change, I modified the original BOINC Tasks PHP script:

BOINC Statistics Website Update 5

After doing that, I wrote the next file, which I called boinc_tasks_per_machine.php:

BOINC Statistics Website Update 6

There’s 3 functions in this file:

BOINC Statistics Website Update 7

function printMachinesLinks($mysqli)

This function gets the machines from the MySQL database and it’s used to print the machine list, which is printed with a clickable link that goes to the machine table that shows the BOINC Tasks

function getTasksFromMachines($mysqli)

After getting and printing the machine list, we call this function which will then call the next function I’ll mention below.

function getTasksPerMachine($mysqli, $machine)

This function will get the BOINC tasks that a specific machine is running. It generates the table and prints the header as well.

Those are the functions. Next, we call them to print the neatly formatted document with these 2 lines:


The first one calls the printMachinesLinls($mysqli) function to print the machine list and the second line is the one that calls the function that generates the tables.

The software that populates the database:

BOINC Statistics Website Update 8

I also did some updates to this software. First, I made TruncateTables a function which will return True if it was successful truncating the table, and False if it wasn’t:

BOINC Statistics Website Update 9

Also, I added a NotifyIcon element to hide the software in the system tray and added a function to run the software when we pass the -s argument. This way, the software can be programmed for the Task Scheduler tool so it is launched in a minimized way and start retrieving the tasks:

BOINC Statistics Website Update 10

Then, I also made the Fetch button a Stop button. Clicking it after the software is running and is fetching the tasks will stop the process:

BOINC Statistics Website Update 11

Also, I refactored some code:

BOINC Statistics Website Update 12

And that’s it for the software changes. Basically I improved it in some ways. The page is now dinamically updated instead of manually updating which is a real plus for me. No more coding in the page! I just need to add and alter the machine list in the software and that’s it! The page will get updated with the machines listed in the software which it was able to connect and retrieve the tasks successfully.

Because the PHP files are very simple and straightforward, you can copy the file content into another page or add some styling. In my case, I integrated it with Drupal by making a PHP content page there.

PHP Files:

The PHP Files shown in this post can be found here.

Integration example:

You can see how the script looks integrated into WordPress here.

What next should I do with this? I’ve yet to know 🤔

Hope you like this!

Previous posts:

  1. Introductory post
  2. v1.1 changes
  3. v1.2 changes