org-media-note
org-media-note copied to clipboard
Taking interactive notes when watching videos or listening to audios in org-mode.
[[file:README_CN.org][中文文档]]
[[file:CHANGELOG.org][Changelog]]
- About Take notes for video and audio files in org-mode! Now supported:
- media control: seek backward/forward, control volume and playback speed ...
- new link types =video=, =audio=
-
Timestamp Link e.g. =[[video:course.mp4#0:01:56][0:01:56]]=
- insert current timestamp during playing media
- click link to jump to corresponding position
-
A-B Loop Link e.g. =[[video:course.mp4#0:01:56-0:01:58][0:01:56-0:01:58]]=
- insert this kind of link when playing in a A-B loop
- click link to jump to point A, and auto loop between A and B
-
Timestamp Link e.g. =[[video:course.mp4#0:01:56][0:01:56]]=
- both local and online medias are supported
- insert screenshot and subtitle
- import from:
- PBF: generated by PotPlayer
- TXT: exported by [[https://www.notedapp.io/][Noted]]
- [[https://orgmode.org/manual/Timers.html][Timers]]
Working with [[https://github.com/jkitchin/org-ref][org-ref]] to get a better experience:
- quick open related media file in org-ref note (file path is got from bib file)
- new link types =videocite=, =audiocite=
- e.g. =[[videocite:key#0:01:56][0:01:56]]= or =[[videocite:key#0:01:56-0:01:58][0:01:56-0:01:58]]=
- you can chose to insert =video= or =videocite= link
- click link to jump to corresponding position, or start A-B loop
- show bib info when pointing at link
- open org-ref action list
- Demo
Open related media file in org-ref note,play on top,insert current timestamp and subtitle
[[../demo/org-media-note-add.gif?raw=true]]
Insert current screenshot. Also, you can customize to auto insert screenshot when create a new note item [[../demo/org-media-note-screenshot.gif?raw=true]]
Jump to the right position by clicking link [[../demo/org-media-note-follow.gif?raw=true]]
Open online video, then operate the same as local files! [[../demo/org-media-note-online-video.gif?raw=true]]
- QuickStart ℹ Currently, you have to install this package from github.
- for doom users:
- Install #+BEGIN_SRC emacs-lisp :tangle "packages.el" (package! pretty-hydra) ;; dependency (package! org-media-note :recipe (:host github :repo "yuchen-lea/org-media-note")) #+END_SRC
- Config
- don't use org-ref #+BEGIN_SRC emacs-lisp (use-package! org-media-note :hook (org-mode . org-media-note-mode) :bind ( ("H-v" . org-media-note-hydra/body)) ;; Main entrance :config (setq org-media-note-screenshot-image-dir "~/Notes/imgs/") ;; Folder to save screenshot ) #+END_SRC
- use org-ref #+BEGIN_SRC emacs-lisp (use-package! org-media-note :init (setq org-media-note-use-org-ref t) :hook (org-mode . org-media-note-mode) :bind ( ("H-v" . org-media-note-hydra/body)) ;; Main entrance :config (setq org-media-note-screenshot-image-dir "~/Notes/imgs/") ;; Folder to save screenshot (setq org-media-note-use-refcite-first t) ;; use videocite link instead of video link if possible ) #+END_SRC
- for non-doom users: You can
- Manually download org-media-note, include it in your =load-path=, then refers to the above config
- Or use quelpa-use-package (thanks [[https://github.com/japhir][japhir]] for kindly providing this snippet) #+BEGIN_SRC emacs-lisp (use-package quelpa-use-package) ;; to allow installation of github packages (use-package pretty-hydra) (use-package org-media-note :quelpa (org-media-note :fetcher github :repo "yuchen-lea/org-media-note") :hook (org-mode . org-media-note-mode) :bind (("H-v" . org-media-note-hydra/body)) ;; Main entrance :config (setq org-media-note-screenshot-image-dir "~/notes/imgs/")) #+END_SRC
- If manually loading org-media-note without a package manager like =package.el= or =straight=, you need to =(require 'org-media-note-org-ref)=.
Now, you can access all functions in =org-media-note-hydra/body=
ℹ Here, I use Hyper key =H= for keybinding. In this way, I can quickly access personal functions, and no major or minor modes will stamp on my keys. Look into this for more information: [[http://ergoemacs.org/emacs/emacs_hyper_super_keys.html][Emacs: How to Bind Super Hyper Keys]]. Or you can bind it to any other key you like. After all, it's Emacs ;)
- Functions All functions can be reached from =org-media-note-hydra/body= :
[[../demo/org-media-note-hydra.png?raw=true]]
- Header:Display basic info, file path, volume, duration and so on
- File:Functions about media file
- =o= Conditionally open media file in mpv. (=org-media-note-mpv-smart-play=) Priorities are as follows:
- When point at a file link, play it in mpv.
- When integrated with org-ref, calling this function in an org-ref note will open the media file described in bib entry.
- Your media file will be auto opened if all of the following are true:
- You're under an org-ref note, which means the =Custom_ID= stores the entry key.
- Files can be found by =bibtex-completion-find-pdf=. You should keep the value of =bibtex-completion-pdf-field= and the field which store files consistent.
- Your media file extension is included in =org-media-note--video-types= or =org-media-note--audio-types=
- Your media file will be auto opened if all of the following are true:
- When media files found in org-attach-dir, open this file if there's only one file, else, let user chose file from attach directory.
- Else, find the file by yourself.
- =j= Cycle through subtitles
- =T= Toggle video window on top of other windows
- =c= Increase speed by 0.1
- =x= Decrease speed by 0.1
- =z= Toggle speed between 1.0 and last customized speed (=org-media-note-mpv-toggle-speed=)
- =o= Conditionally open media file in mpv. (=org-media-note-mpv-smart-play=) Priorities are as follows:
- Playback:Functions about playing media file
- =<SPC>= pause/unpause
- =l= Set/clear A-B loop points, show points info if possible
- =g= jump to the position found in current line, useful when you're browsing related subtitles. If no timestamp found, manually input the timestamp.
- =
= Forward 5s - =
= Backward 5s - =C-
= Skip to previous subtitle - =C-
= Skip to next subtitle
- Volume:Functions about volume
- =+= add volume 5
- =-= add volume -5
- =0= Toggle volume between 100 and last customized volume (=org-media-note-mpv-toggle-volume=)
- =m= mute/unmute
- Note:Functions about insert notes
- =i= Insert current link, there're several links according to customization and playing state: (=org-media-note-insert-link=)
- A-B Loop?
- If in an A-B Loop, which means Playback displays "Clear A-B loop (xxx - xxx)", A-B Loop Link is inserted. The default link description is =timestamp of A-timestamp of B=, you can set this by =org-media-note-ab-loop-link-format=.
- If not in an A-B Loop, Timestamp Link is inserted. The default link description is =timestamp=, you can set this by =org-media-note-timestamp-link-format=.
- prefer ref key?
- When prefers ref key, which means Toggle displays Use ref key instead of absolute path (*), =videocite= or =audiocite= link is inserted
- else, =video= or =audio= link is inserted
- 💡 When in a list like =- [[video:video.mp4#00:03:24][00:03:24]] description=, =<M-return>= will auto insert media link.
- 💡 Video path format is consistent with =org-link-file-path-type=
- 💡 When set =org-media-note-cursor-start-position= to =before= , move cursor to the start of link after insertion. This works for manual insertion only. Cursor is always at the end of link for those auto inserted by =<M-return>=.
- A-B Loop?
- =a= Adjust current link position to current playing position. Then, apply this offset to all links under current heading.
- =S= Insert current screenshot (=org-media-note-insert-screenshot=)
- ℹ variables related:
- =org-media-note-screenshot-save-method= : customize the place to save screenshot
- directory: save to =org-media-note-screenshot-image-dir=
- attach: save to corresponding org-attach-dir.
- =org-media-note-screenshot-link-type-when-save-in-attach-dir= when save screenshots to attach dir, use file link or attachment link
- Screenshot path format is consistent with =org-link-file-path-type= in file: link
- =org-media-note-screenshot-save-method= : customize the place to save screenshot
- ℹ variables related:
- =s= Insert current subtitle text (=org-media-note-insert-sub-text=)
- =i= Insert current link, there're several links according to customization and playing state: (=org-media-note-insert-link=)
- Import: Import notes from other format
- =I p= Import from PotPlayer PBF file (=org-media-note-insert-note-from-pbf=)
- =I n= Import from Noted TXT file (=org-media-note-insert-note-from-noted=)
- =I t= Import from org-timer (=org-media-note-convert-from-org-timer=)
- =I s= Import from srt (=org-media-note-insert-note-from-srt=)
- Toggle:Customization
- =t m= When in a list like =- [[video:video.mp4#00:03:24][00:03:24]] description=, =<M-return>= will auto insert media link if this toggles on.
- =t c= When on,insert =videocite= or =audiocite= link instead of =video= or =audio= link if possible.
- =t p= When on,auto pause media after inserting media link.
- =t s= When on, =<M-return>= will auto insert both media link and current screenshot.
- =t S= When on,save screenshot with subtitles
- =t t= Toggle timestamp format between =hh:mm:ss= and =hh:mm:ss.fff=
ℹ Corresponding function is in the brackets. Those without brackets usually call mpv commands directly. More info refers =org-media-note-hydra=.
- Dependencies
- [[https://github.com/kljohann/mpv.el][mpv.el]] control media inside emacs
- [[https://github.com/jerrypnz/major-mode-hydra.el][pretty-hydra]] create an amiable hydra
[[https://github.com/jkitchin/org-ref][org-ref]] is not required, but it's worth to have a try if you use bib to manage your media file!