org-media-note icon indicating copy to clipboard operation
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
  • 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:
    1. 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
    2. 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
    1. Manually download org-media-note, include it in your =load-path=, then refers to the above config
    2. 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
    3. 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:
      1. When point at a file link, play it in mpv.
      2. 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=
      3. 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.
      4. 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=)
  • 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= 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
    • =s= Insert current subtitle text (=org-media-note-insert-sub-text=)
  • 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!