mirror of https://codeberg.org/cage/tinmop/
- [gemini] added "no wait" directive when downloading non gemini text format from gemini
allow opening file before it is downloaded completely.
This commit is contained in:
parent
dc8df6c91f
commit
8209d5739c
|
@ -169,8 +169,16 @@ color-regexp = ":rendering" cyan
|
||||||
# open png files with gimp but cache them before
|
# open png files with gimp but cache them before
|
||||||
# ▼▼▼▼▼▼▼▼▼
|
# ▼▼▼▼▼▼▼▼▼
|
||||||
# open "https?://png$" with "gimp" use cache
|
# open "https?://png$" with "gimp" use cache
|
||||||
# if you want to open some kind of file with tinmop try the following
|
|
||||||
# valid values are "tinmop" "me" "internal"
|
# using "no wait" allow for content to be opened before download is
|
||||||
|
# completed; note that not all file types can be opened before the
|
||||||
|
# whole file is available to the opening program
|
||||||
|
# ▼▼▼▼▼▼▼
|
||||||
|
# open "mp3$" with "xterm -e mpv" no wait
|
||||||
|
#
|
||||||
|
|
||||||
|
# finally if you want to open some kind of file with tinmop try the
|
||||||
|
# following: valid values are "tinmop" "me" "internal"
|
||||||
# ▼▼▼▼▼▼▼▼
|
# ▼▼▼▼▼▼▼▼
|
||||||
open "^((gemini://)|(\\.)|(/)).+gmi$" with "tinmop"
|
open "^((gemini://)|(\\.)|(/)).+gmi$" with "tinmop"
|
||||||
open "^((gemini://)|(\\.)|(/)).+txt$" with "tinmop"
|
open "^((gemini://)|(\\.)|(/)).+txt$" with "tinmop"
|
||||||
|
|
|
@ -19,9 +19,12 @@
|
||||||
|
|
||||||
(defparameter *gemini-db-streams-lock* (bt:make-recursive-lock))
|
(defparameter *gemini-db-streams-lock* (bt:make-recursive-lock))
|
||||||
|
|
||||||
(define-constant +read-buffer-size+ 1024
|
(define-constant +read-buffer-size+ 2048
|
||||||
:documentation "Chunk's size of the buffer when reading non gemini contents from stream")
|
:documentation "Chunk's size of the buffer when reading non gemini contents from stream")
|
||||||
|
|
||||||
|
(define-constant +buffer-minimum-size-to-open+ 4096
|
||||||
|
:documentation "Minimum size of the saved contents (non gemini text) before attempt to opening with an user defined program: see configuration directive 'use program foo *no wait*'")
|
||||||
|
|
||||||
(defparameter *gemini-streams-db* ())
|
(defparameter *gemini-streams-db* ())
|
||||||
|
|
||||||
(defun push-db-stream (stream-object)
|
(defun push-db-stream (stream-object)
|
||||||
|
@ -462,25 +465,42 @@
|
||||||
(when-let ((extension (fs:get-extension path)))
|
(when-let ((extension (fs:get-extension path)))
|
||||||
(setf support-file (fs:temporary-file :extension extension)))
|
(setf support-file (fs:temporary-file :extension extension)))
|
||||||
(with-open-support-file (file-stream support-file)
|
(with-open-support-file (file-stream support-file)
|
||||||
(labels ((%fill-buffer ()
|
(let ((partial-content-not-opened t))
|
||||||
|
(labels ((download-completed-p (buffer read-so-far)
|
||||||
|
(< read-so-far (length buffer)))
|
||||||
|
(opening-partial-contents-p (read-so-far)
|
||||||
|
(> read-so-far +buffer-minimum-size-to-open+))
|
||||||
|
(%fill-buffer ()
|
||||||
(declare (optimize (debug 0) (speed 3)))
|
(declare (optimize (debug 0) (speed 3)))
|
||||||
(when (downloading-allowed-p wrapper-object)
|
(when (downloading-allowed-p wrapper-object)
|
||||||
|
(multiple-value-bind (program-exists y wait-for-download)
|
||||||
|
(swconf:link-regex->program-to-use support-file)
|
||||||
|
(declare (ignore y))
|
||||||
(multiple-value-bind (buffer read-so-far)
|
(multiple-value-bind (buffer read-so-far)
|
||||||
(read-array download-stream +read-buffer-size+)
|
(read-array download-stream +read-buffer-size+)
|
||||||
(declare ((vector (unsigned-byte 8)) buffer))
|
(declare ((vector (unsigned-byte 8)) buffer))
|
||||||
(declare (fixnum read-so-far))
|
(declare (fixnum read-so-far))
|
||||||
(increment-bytes-count wrapper-object read-so-far)
|
(increment-bytes-count wrapper-object read-so-far)
|
||||||
(if (< read-so-far (length buffer))
|
(if (download-completed-p buffer read-so-far)
|
||||||
(progn
|
(progn
|
||||||
(write-sequence buffer file-stream :start 0 :end read-so-far)
|
(write-sequence buffer file-stream :start 0 :end read-so-far)
|
||||||
(force-output file-stream)
|
(force-output file-stream)
|
||||||
(setf (stream-status wrapper-object) :completed)
|
(setf (stream-status wrapper-object) :completed)
|
||||||
(gemini-client:close-ssl-socket socket)
|
(gemini-client:close-ssl-socket socket)
|
||||||
(os-utils:open-resource-with-external-program support-file nil))
|
(when wait-for-download
|
||||||
|
(os-utils:open-resource-with-external-program support-file
|
||||||
|
nil)))
|
||||||
(progn
|
(progn
|
||||||
(write-sequence buffer file-stream)
|
(write-sequence buffer file-stream)
|
||||||
|
(when (and partial-content-not-opened
|
||||||
|
program-exists
|
||||||
|
(not wait-for-download)
|
||||||
|
(opening-partial-contents-p (octect-count wrapper-object)))
|
||||||
|
(setf partial-content-not-opened nil)
|
||||||
|
(os-utils:open-resource-with-external-program support-file
|
||||||
|
nil))
|
||||||
|
(%fill-buffer))))))))
|
||||||
(%fill-buffer)))))))
|
(%fill-buffer)))))))
|
||||||
(%fill-buffer))))))
|
|
||||||
|
|
||||||
(defun request-success-dispatched-clrs (enqueue)
|
(defun request-success-dispatched-clrs (enqueue)
|
||||||
(lambda (status code-description meta response socket iri parsed-iri)
|
(lambda (status code-description meta response socket iri parsed-iri)
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
;; COMMENT*
|
;; COMMENT*
|
||||||
;; SERVER-ASSIGN := SERVER-KEY BLANKS ASSIGN BLANKS GENERIC-VALUE BLANKS
|
;; SERVER-ASSIGN := SERVER-KEY BLANKS ASSIGN BLANKS GENERIC-VALUE BLANKS
|
||||||
;; USERNAME-ASSIGN := USERNAME-KEY BLANKS WITH BLANKS GENERIC-VALUE BLANKS
|
;; USERNAME-ASSIGN := USERNAME-KEY BLANKS WITH BLANKS GENERIC-VALUE BLANKS
|
||||||
;; OPEN-LINK-HELPER := OPEN-LINK-HELPER-KEY BLANKS ASSIGN BLANKS REGEXP PROGRAM-NAME BLANKS USE-CACHE
|
;; OPEN-LINK-HELPER := OPEN-LINK-HELPER-KEY BLANKS ASSIGN BLANKS REGEXP PROGRAM-NAME BLANKS USE-CACHE? NOWAIT?
|
||||||
;; GENERIC-ASSIGN := (and key blanks assign blanks
|
;; GENERIC-ASSIGN := (and key blanks assign blanks
|
||||||
;; (or quoted-string
|
;; (or quoted-string
|
||||||
;; hexcolor
|
;; hexcolor
|
||||||
|
@ -44,6 +44,9 @@
|
||||||
;; FILEPATH := QUOTED-STRING
|
;; FILEPATH := QUOTED-STRING
|
||||||
;; PROGRAM-NAME := QUOTED-STRING
|
;; PROGRAM-NAME := QUOTED-STRING
|
||||||
;; USE-CACHE := USE BLANKS CACHE
|
;; USE-CACHE := USE BLANKS CACHE
|
||||||
|
;; NOWAIT := NO BLANKS WAIT
|
||||||
|
;; NO := "no"
|
||||||
|
;; WAIT := "wait"
|
||||||
;; CACHE := "cache"
|
;; CACHE := "cache"
|
||||||
;; USE := "use"
|
;; USE := "use"
|
||||||
;; SERVER-KEY := "server"
|
;; SERVER-KEY := "server"
|
||||||
|
@ -294,7 +297,12 @@
|
||||||
:initform t
|
:initform t
|
||||||
:initarg :use-cache
|
:initarg :use-cache
|
||||||
:reader use-cache-p
|
:reader use-cache-p
|
||||||
:writer (setf use-cache)))
|
:writer (setf use-cache))
|
||||||
|
(wait
|
||||||
|
:initform t
|
||||||
|
:initarg :wait
|
||||||
|
:reader waitp
|
||||||
|
:writer (setf wait)))
|
||||||
(:documentation "When a gemini link matches `re' try to open it with 'program-name'"))
|
(:documentation "When a gemini link matches `re' try to open it with 'program-name'"))
|
||||||
|
|
||||||
(defmethod print-object ((object open-link-helper) stream)
|
(defmethod print-object ((object open-link-helper) stream)
|
||||||
|
@ -304,13 +312,14 @@
|
||||||
(use-cache-p use-cache-p)) object
|
(use-cache-p use-cache-p)) object
|
||||||
(format stream "re: ~s program: ~s use cache? ~a" re program-name use-cache-p))))
|
(format stream "re: ~s program: ~s use cache? ~a" re program-name use-cache-p))))
|
||||||
|
|
||||||
(defun make-open-link-helper (re program-name use-cache)
|
(defun make-open-link-helper (re program-name use-cache &key (wait t))
|
||||||
(assert (stringp program-name))
|
(assert (stringp program-name))
|
||||||
(assert (stringp re))
|
(assert (stringp re))
|
||||||
(make-instance 'open-link-helper
|
(make-instance 'open-link-helper
|
||||||
:re re
|
:re re
|
||||||
:program-name program-name
|
:program-name program-name
|
||||||
:use-cache use-cache))
|
:use-cache use-cache
|
||||||
|
:wait wait))
|
||||||
|
|
||||||
(defrule use "use"
|
(defrule use "use"
|
||||||
(:text t))
|
(:text t))
|
||||||
|
@ -318,7 +327,17 @@
|
||||||
(defrule cache "cache"
|
(defrule cache "cache"
|
||||||
(:text t))
|
(:text t))
|
||||||
|
|
||||||
(defrule use-cache (and use blanks cache))
|
(defrule no "no"
|
||||||
|
(:text t))
|
||||||
|
|
||||||
|
(defrule wait "wait"
|
||||||
|
(:text t))
|
||||||
|
|
||||||
|
(defrule use-cache (and use blanks cache)
|
||||||
|
(:constant t))
|
||||||
|
|
||||||
|
(defrule no-wait (and no blanks wait)
|
||||||
|
(:constant t))
|
||||||
|
|
||||||
(defrule open-link-helper
|
(defrule open-link-helper
|
||||||
(and open-link-helper-key
|
(and open-link-helper-key
|
||||||
|
@ -330,11 +349,15 @@
|
||||||
regexp ; 6 program to use
|
regexp ; 6 program to use
|
||||||
blanks
|
blanks
|
||||||
(? (and use-cache ; 8 use cache?
|
(? (and use-cache ; 8 use cache?
|
||||||
|
blanks))
|
||||||
|
(? (and no-wait ; 9 wait download?
|
||||||
blanks)))
|
blanks)))
|
||||||
(:function (lambda (args)
|
(:function (lambda (args)
|
||||||
(list :open-link-helper
|
(list :open-link-helper
|
||||||
(make-open-link-helper (elt args 2) (elt args 6) (elt args 8))))))
|
(make-open-link-helper (elt args 2)
|
||||||
|
(elt args 6)
|
||||||
|
(elt args 8)
|
||||||
|
:wait (not (elt args 9)))))))
|
||||||
(defrule filepath quoted-string)
|
(defrule filepath quoted-string)
|
||||||
|
|
||||||
(defparameter *already-included-files* ())
|
(defparameter *already-included-files* ())
|
||||||
|
@ -883,7 +906,8 @@
|
||||||
(cl-ppcre:scan (re a) link))
|
(cl-ppcre:scan (re a) link))
|
||||||
(config-all-link-open-program))))
|
(config-all-link-open-program))))
|
||||||
(values (program-name found)
|
(values (program-name found)
|
||||||
(use-cache-p found))))
|
(use-cache-p found)
|
||||||
|
(waitp found))))
|
||||||
|
|
||||||
(defun use-tinmop-as-external-program-p (program)
|
(defun use-tinmop-as-external-program-p (program)
|
||||||
(cl-ppcre:scan "(^me$)|(^internal$)|(tinmop)" program))
|
(cl-ppcre:scan "(^me$)|(^internal$)|(tinmop)" program))
|
||||||
|
|
Loading…
Reference in New Issue