aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--emacs/.emacs.d/lisp/my/my-web.el66
1 files changed, 66 insertions, 0 deletions
diff --git a/emacs/.emacs.d/lisp/my/my-web.el b/emacs/.emacs.d/lisp/my/my-web.el
index 92ef599..87c319f 100644
--- a/emacs/.emacs.d/lisp/my/my-web.el
+++ b/emacs/.emacs.d/lisp/my/my-web.el
@@ -253,5 +253,71 @@ https://emacs.stackexchange.com/questions/40887/in-org-mode-how-do-i-link-to-int
(lambda (_)
(funcall my-url-context-function url)))))
+(defvar my-dw-host "dw.com")
+
+(defun my-dw-parse-article-url (url)
+ "Returns (lang . article-id)"
+ (let* ((urlobj (url-generic-parse-url url))
+ (path (url-filename urlobj))
+ (components (string-split path "/")))
+ `(,(elt components 1) . ,(string-remove-prefix "a-" (elt components 3)))))
+
+(defun my-dw-article-api (url)
+ (pcase-let ((`(,lang . ,id) (my-dw-parse-article-url url)))
+ (my-url-fetch-json
+ (format "https://%s/graph-api/%s/content/article/%s" my-dw-host lang id))))
+
+(defun my-dw-extract (info)
+ "Returns list of (url . file-name) pairs."
+ (let* ((content (alist-get 'content (alist-get 'data info)))
+ (dir (file-name-concat my-audio-incoming-dir
+ (my-make-doc-file-name
+ (alist-get 'title content))))
+ (audios (alist-get 'audios content)))
+ (seq-map
+ (lambda (audio)
+ (let ((url (alist-get 'mp3Src audio)))
+ `(,url
+ .
+ ,(expand-file-name
+ (file-name-concat dir (file-name-with-extension
+ (my-make-doc-file-name
+ (alist-get 'name audio))
+ (file-name-extension url)))))))
+ audios)))
+
+(defun my-dw-download (pairs)
+ "Download list of (url . file-name) pairs with aria2."
+ (let ((file (make-temp-file "/tmp/aria2"))
+ (n (length pairs)))
+ (with-temp-file file
+ (dolist (pair pairs)
+ (insert (car pair) "\n out=" (cdr pair) "\n"))
+ ;; (buffer-string)
+ )
+ (message "Downloading %d files..." n)
+ (set-process-sentinel
+ (start-process "aria2" "*aria2*" "aria2c" "-x" "5" "-d" "/"
+ "-R" "true" "-i" file)
+ (lambda (proc event)
+ (let ((status (process-exit-status proc)))
+ (if (eq status 0)
+ (progn
+ (message "Downloading %d files...Done" n))
+ (message "Downloading %d files...Failed: %s" n event)))))))
+
+(defun my-dw-download-url (url)
+ (interactive "sDW Download URL: ")
+ (my-dw-download (my-dw-extract (my-dw-article-api url))))
+
+(defun my-dw-download-urls (urls)
+ (my-dw-download (seq-mapcat
+ (lambda (url) (my-dw-extract (my-dw-article-api url)))
+ urls)))
+
+(defun my-local-archive-open-url (url)
+ "Open url from local archive."
+ )
+
(provide 'my-web)
;;; my-web.el ends here