Re: Option to define external link handler

Rodrigo Arias <[email protected]>
Newsgroups gmane.comp.web.dillo.devel
Message-ID <[email protected]>
Hi Alex,

On Sun, Jun 16, 2024 at 06:54:41PM +0200, [email protected] wrote:
>> Sure, here is a very basic example which mainly just goes by the
>> extension in the URL to handle some common filetypes. I suppose that
>> for more complex links in which the filetype can't be parsed like
>> this, you could curl the link into the 'file' command to determine
>> the type: curl -s "https://example.com/filename" | file -
>> But that's overkill for my needs.
>> There are many ways to improve on this, but hopefully it at
>> least illustrates the concept.
>
>Just for fun, here is a version which uses curl instead of wget. This
>has the advantage that curl can output the Content-Type from the
>server, and we can use this to perform actions instead of relying on
>the file extension. Another advantage is that curl can tell us the
>output filename, so we don't have to mess around to get that anymore.

These examples are very useful to test the ideas of rules and actions. 
Here is how I could imagine it being written:

   action youtube label "Open YouTube in MPV" shell "mpv $url"
   action audio label "Open audio in MPV" shell "mpv $url"
   action video label "Open video in MPV" shell "mpv $url"
   action image label "Open image in NSXIV" download shell "nsxiv $out"
   action mupdf label "Open PDF in MuPDF" download shell "mupdf $out"
   action default open-new-tab "$url"
   
   match url "outu" action youtube
   match url "\.(mp3|ogg)$" action audio
   match url "\.(mkv|mp4|webm)$" action video
   # From here on Dillo needs to fetch the headers
   match mime-type "image" action image
   match mime-type "pdf" action mupdf
   # Catchall for non-matched urls
   match any action default

Although, we may use Dillo to download the content on the fly, like
this:

   action image label "Open image in NSXIV" pipe "nsxiv -"
   action mupdf label "Open PDF in MuPDF" pipe "mupdf -"

So there is no need to download the file completely before it is piped
to the tools.

On the other hand, I can already spot a problem. When we right-click on
a link to find out which actions are available, some of them require the
mime type to be known, which would require a request to the server. So
we cannot determine which actions will match beforehand.

Maybe a better way is to define the set of menu entries first, which
could also be altered by match rules:

   menu label "Open in default program" tag open
   menu label "Save in notes" tag save-notes

Then we use the information of which menu item was selected *and* the
clicked url to do the full handling:

   action youtube shell "mpv $url"
   action audio shell "mpv $url"
   action video shell "mpv $url"
   action image download shell "nsxiv $out"
   action mupdf download shell "mupdf $out"
   action save-notes shell "echo $url >> ~/.dillo/notes.txt && echo Saved"
   action default open-new-tab "$url"

   match tag open {
     match url "outu" action youtube
     match url "\.(mp3|ogg)$" action audio
     match url "\.(mkv|mp4|webm)$" action video
     # From here on Dillo needs to fetch the headers
     match mime-type "image" action image
     match mime-type "pdf" action mupdf
   }
   match tag save-notes action save-notes
   match any action default

So when the user clicks "Save in notes" it doesn't go through
the normal "open with" rules, but only matches the save-notes rule.

Anyway, I need to think more about it. I also need to consider how this
could be moved out of Dillo, so we don't bring more complexity to it.

Executing a user script is fine, but I also want to be able to rewrite
the page and bring it back to Dillo for display, which requires more
cooperation.

># temporary file location
>tmp_dir="/tmp/dillo"
>
># youtube. checks for "outu" string in URL
>if echo $1 | grep outu
>then $youtube "$1"
>else

Just a small comment, you can use `exec` to avoid nesting the ifs as it
won't return:

   if echo $1 | grep outu; then
     exec $youtube "$1"
   fi

Or exit:

   if echo $1 | grep outu; then
     $youtube "$1"
     exit $?
   fi

Best,
Rodrigo.
_______________________________________________
Dillo-dev mailing list -- dillo-dev-lx9mn2B4QYRWk0Htik3J/[email protected]
To unsubscribe send an email to dillo-dev-leave-lx9mn2B4QYRWk0Htik3J/[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.