One of my favorite things is custom protocol handlers. The idea you can launch an application with a URL is
awesome to me. I implemented it at my current company for their internal application and it is far and away
the most progressive feature the business users love.
One of my side hobbies is digital archiving, which is simply downloading stuff and saving it. Aside from the
archivist mentality of it, I do like to have local copies of items just because you can’t trust the Internet for
anything. Content comes and goes at will, and even with that, connectivity comes and goes, and one thing that
keeps coming and never goes is advertising. So, local copies win out every time in every case.
I’ve written utilities to assist in my image archiving, but when it comes to video archiving, I’ve usually used
FreeDownloadManager. but sometimes it doesn’t do the job. I had recently learned of an open-source tool called
YouTube-dl, which is a command-line tool to download videos from a wide variety of websites.
I downloaded it and tried it out on a few concert videos and the utility worked quite well, so it’s been added into
my toolkit. But, being a command-line tool, it’s a little cumbersome. What I wanted to do was launch the
downloader passing the URL of the page I was currently viewing, which was hosting the video I wanted to
download. This is something I do with my image downloading utilities, too, so it’s a concept not too foreign
to me. It involves custom protocol handlers and bookmarklets.
First thing we need to do is create a custom protocol handler. For this, ytdl:// is the protocol I chose to
use. I created a registry file (protocol.reg) with the following contents.
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\ytdl] "URL Protocol"="" @="URL:Youtube-DL Application" [HKEY_CLASSES_ROOT\ytdl\shell] [HKEY_CLASSES_ROOT\ytdl\shell\open] [HKEY_CLASSES_ROOT\ytdl\shell\open\command] @="\"wscript \"y:\\videos\\youtube-dlWrapper.vbs\" \"%1"\""
Notice the execution path command. This will obviously be different paths for different people, but there is a
VBScript file that needs to be created at that location to execute. The contents of that script are as
follows.
dim shell
set shell=createobject(“wscript.shell”)
cmdline=”””y:\videos\youtube-dl.exe”” “”” & replace(wscript.arguments(0),”ytdl://”,””) & “”””
ret=shell.run(cmdline,8,true)
set shell=nothing
The cmdline is generated to execute the actual youtube-dl utility, passing the URL of the video. However, the
URL in arguments(0) has the custom protocol handler ytdl:// prefixing it, so that is stripped out.
The last part is the bookmarklet itself. In your web browser, create a new bookmark for whatever page you’re
on, then edit the bookmark to give it a better title and to have the following URL:
javascript:location.href='ytdl://'+location.href;
This is how the VBScript ends up with ytdl:// in the address. To summarize the entire process:
- You click the bookmarklet on a page with a video
- The URL of the page is prepended with ytdl:// and is navigated to
- Your browser recognizes it as a custom protocol and executes the URL on the local system (after appropriate
security warnings) - Windows looks up the protocol in the registry and determines it is to launch youtube-dlWrapper.vbs passing the
URL as an argument. The URL still has ytdl:// in front of it at this time. - The wrapper VBScript strips out the leading protocol and passes the remaining URL to the youtube-dl.exe for
download. - A command window opens with youtube-dl running and closes when the download is complete.