summaryrefslogtreecommitdiff
path: root/modules/quick-video-capture.el
blob: 05ad70c879a7637c02e4522bb18b7d8ffae6f137 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
;;; quick-video-capture.el --- Video Capturing with Org Capture -*- coding: utf-8; lexical-binding: t; -*-

;;; Commentary:

;; This package provides a seamless "fire-and-forget" workflow for downloading
;; videos from the browser to your local system using yt-dlp and task-spooler.
;;
;; Features:
;; - Browser bookmarklet integration via org-protocol
;; - Automatic queueing of downloads through task-spooler
;; - Works with any yt-dlp supported site
;; - Can be triggered manually via org-capture with URL prompt
;;
;; Setup:
;; 1. Load this file and call (cj/setup-video-download)
;; 2. Add the bookmarklet from `cj/video-download-bookmarklet' to your browser
;; 3. Click the bookmarklet on any video page to queue a download
;;
;; Alternatively, trigger manually with C-c c v and enter a URL

;;; Code:

(require 'org-protocol)
(require 'org-capture)
(require 'media-utils)

(defconst cj/video-download-bookmarklet
  "javascript:location.href='org-protocol://video-download?url='+encodeURIComponent(location.href);void(0);"
  "JavaScript bookmarklet for triggering video downloads from the browser.
Add this as a bookmark in your browser to enable one-click video downloads.")

(defun cj/org-protocol-video-download (info)
  "Process org-protocol video download requests.
INFO is a plist containing :url from the org-protocol call."
  (let ((url (plist-get info :url)))
	(when url
	  ;; Store the URL for the capture template to use
	  (setq cj/video-download-current-url url))
	;; Trigger the capture
	(org-capture nil "v")
	nil))  ; Return nil to indicate we handled it

(defun cj/video-download-capture-handler ()
  "Handle video download during org-capture.
This function is called from the capture template."
  (let ((url (or cj/video-download-current-url
				 (read-string "Video URL: "))))
	;; Clear the stored URL after using it
	(setq cj/video-download-current-url nil)
	(if (string-empty-p url)
		(error "No URL provided for download")
	  (cj/yt-dl-it url)
	  ;; Return empty string to prevent capture from saving anything
	  "")))

(defvar cj/video-download-current-url nil
  "Temporary storage for URL passed via org-protocol.")

;; register the handler and the capture template after org-protocol is loaded
(with-eval-after-load 'org-protocol
  ;; Register the org-protocol handler
  (add-to-list 'org-protocol-protocol-alist
			   '("video-download"
				 :protocol "video-download"
				 :function cj/org-protocol-video-download
				 :kill-client t))

  ;; Add the capture template
  (add-to-list 'org-capture-templates
			   '("v" "Video Download" entry
				 (file "")  ; No file needed since we're not saving
				 "%(cj/video-download-capture-handler)"
				 :immediate-finish t
				 :jump-to-captured nil)))

(defun cj/video-download-bookmarklet-instructions ()
  "Display instructions for setting up the browser bookmarklet."
  (interactive)
  (let ((buf (get-buffer-create "*Video Download Bookmarklet Setup*")))
	(with-current-buffer buf
	  (erase-buffer)
	  (insert "Video Download Bookmarklet Setup\n")
	  (insert "=================================\n\n")
	  (insert "1. Create a new bookmark in your browser\n")
	  (insert "2. Set the name to: Download Video (or your preference)\n")
	  (insert "3. Set the URL to the following JavaScript code:\n\n")
	  (insert cj/video-download-bookmarklet)
	  (insert "\n\n")
	  (insert "4. Save the bookmark to your bookmarks bar\n")
	  (insert "5. Click the bookmark when viewing a video to download it\n\n")
	  (insert "Note: Make sure Emacs server is running (M-x server-start)\n")
	  (insert "and emacsclient is properly configured for org-protocol.\n"))
	(switch-to-buffer buf)))

;;; Commentary for bookmarklet:
;;
;; To use the browser bookmarklet, add this JavaScript as a bookmark URL:
;; javascript:location.href='org-protocol://video-download?url='+encodeURIComponent(location.href);void(0);
;;
;; This will send the current page URL to Emacs via org-protocol, triggering
;; the download through yt-dlp and task-spooler.

(provide 'quick-video-capture)
;;; quick-video-capture.el ends here.