(Re)generate: (find-audiovideo-intro)
Source code: (find-eev "eev-intro.el" "find-audiovideo-intro")
More intros: (find-eev-quick-intro)
(find-eev-intro)
(find-videos-intro)
This buffer is _temporary_ and _editable_.
It is meant as both a tutorial and a sandbox.
Prerequisite:
(find-pdf-like-intro)
This intro is being rewritten.
1. Time offsets
Links to audio and video files are similar to links to pdf-like
documents, but instead of page numbers we use "time offsets" to
refer to positions. Time offsets are strings like 1:23, 12:34, or
1:23:45. The sexp hyperlinks below should all work if you have the
files that they refer to, and if you have mpv and xterm installed:
(find-audio "/tmp/mysong.mp3")
(find-audio "/tmp/mysong.mp3" "1:23")
(find-audio "/tmp/mysong.mp3" "1:23" "comments are ignored")
(find-video "/tmp/myvideo.mp4")
(find-video "/tmp/myvideo.mp4" "1:23")
(find-video "/tmp/myvideo.mp4" "1:23" "comments are ignored")
Note that they work by invoking an external player - mpv, by
default - and its error messages appear here:
(find-ebuffer "*Messages*")
[Video links:]
(find-eev2020video "06:25" "`find-video'")
2. `eev-avadj-mode'
"avadj-mode" is a shorthand for "audio/video adjust mode".
When `eev-avadj-mode' is active we get keys for adjusting time
offsets quickly and for playing again the default audio or video
file at a given time offset, all of this without moving the
point. The keys are:
M-- decrease the time offset by one second
M-+ increase the time offset by one second
M-= same as M-+, for convenience
M-p play the default audio/video file at a time offset
You can toggle eev-avadj-mode on and off with `M-x
eev-avadj-mode', or with these sexps:
(eev-avadj-mode 0)
(eev-avadj-mode)
When it is on you will see an "avadj" at the mode line. Let's
examine `M--' and `M-+' first. With eev-avadj-mode on, try typing
several `M--'s and `M-+'s (or `M-='s) on the line below:
This time offset - 10:00 - will change
Now, as an exercise, try to use `M--'s and `M-+'s/`M-='s, plus
`M-h M-2' (`ee-duplicate-this-line') and other more standard
editing commands, to convert this line
(find-exampleaudio "0:00")
into:
(find-exampleaudio "0:00")
(find-exampleaudio "0:12" "blah")
(find-exampleaudio "0:30" "bleh")
That should give you an idea of how to index audio or video files
- by creating elisp hyperlinks, with comments, to specific
positions in them. Of course in a real-world situation we would
execute these sexps occasionally to check if they are really
pointing to the right places, and then make further adjustments;
we are not doing that yet.
The idea of a "default audio/video file" will be explained in
section 4.4.
3. The time-from-bol
All the keys in eev-avadj-mode operate on the "time-from-bol"
of the current line: the first occurrence, in the current line,
of a string that looks like a time offset. Note that the search
starts from the beginning of the line ("-from-bol"), and if
there are several possibilities, the first one is chosen.
Remember that `M-e' has a variant that just highlights what would
be executed, instead of evaluating a sexp:
(find-eval-intro "`M-0 M-e'")
`M-p' also has something like this: `M-0 M-p' highlights the
time-from-bol and displays in the echo area the sexp that it
would execute to invoke a player - instead of running that sexp.
Try to evaluate these sexps:
(code-audio "sunwillset" "~/Zoe_Keating/Sun_Will_Set.ogg")
(find-sunwillset)
;; ^ don't worry if this fails - we are only calling it
;; to set `ee-audiovideo-last'
and now try `M-0 M-p' on these lines:
;; 4:19 blah
;; 2:19
4. Short hyperlinks to audio and video files
This sexp
(code-video "ec2020video" "~/eev-videos/emacsconf2020.mp4")
defines a function `find-ec2020video'. The function `code-video'
is similar to the functions `code-c-d' and `code-pdf-page', that
we saw in:
(find-eev-quick-intro "9. Shorter hyperlinks")
(find-pdf-like-intro "7. Shorter hyperlinks to PDF files")
After running the `(code-video ...)' above, this sexp
(find-ec2020video "8:20" "defines several functions")
becomes a shorthand for:
(find-video "~/eev-videos/emacsconf2020.mp4" "8:20")
Note that the string "defines several functions" is treated as a
comment, and is ignored - as in `find-pdf-page'.
If we run the second sexp below instead of the first one,
(code-video "ec2020video" "~/eev-videos/emacsconf2020.mp4")
(find-code-video "ec2020video" "~/eev-videos/emacsconf2020.mp4")
we get a temporary buffer with the code that the
sexp `(code-video ...)' would execute. Try it - and note that the
definition of `find-ec2020video' in the temporary buffer
contains a line like this:
(setq ee-audiovideo-last 'find-ec2020video)
That line will be explained in the section 4.4.
[Video links:]
(find-eev2020video "12:54" "This block is a kind of an index for that video")
(find-eev2020video "13:27" "we can index video tutorials")
4.1. `find-extra-file-links'
The easiest way to produce `code-audio' and `code-video'
hyperlinks is with `M-h M-e', that runs `find-extra-file-links'.
If you run
(find-extra-file-links "/tmp/foo.mp4")
you will get a temporary buffer whose first line is
;; (find-extra-file-links "/tmp/foo.mp4" "{c}")
and that contains several blocks like this one:
;; Links to a video file:
;; (find-video "/tmp/foo.mp4")
(code-video "{c}video" "/tmp/foo.mp4")
;; (find-{c}video)
;; (find-{c}video "0:00")
If you change the "{c}" in the first line to "FOO" and
execute it you will get a buffer generated from the same
template, but with all the "{c}"s replaced by "FOO"s. In the
new version of the buffer the block above will become this:
;; Links to a video file:
;; (find-video "/tmp/foo.mp4")
(code-video "FOOvideo" "/tmp/foo.mp4")
;; (find-FOOvideo)
;; (find-FOOvideo "0:00")
The typical way of using `find-extra-file-links' is from dired,
by placing the cursor on the line of a file that you want to
create links to, and then typing `M-h M-e'. Try that on the sexp
below, that opens a dired buffer and puts the point on the line
with the file "eev-load.el":
(find-eevfile "" "eev-load.el")
A historical note: `M-h M-e' was inspired by the "dired half"
of `M-h M-p' - see:
(find-pdf-like-intro "9. Generating three pairs")
(find-pdf-like-intro "9. Generating three pairs" "M-h M-p")
but `M-h M-e' produces many more links, and `M-h M-e' made that way
of using `M-h M-p' obsolete.
[Video links:]
(find-eevtemplvideo "28:11" "6. `find-here-links' and `find-extra-file-links'")
(find-eevtemplvideo "30:19" "`M-h M-e' runs `find-extra-file-links'")
(find-eevtemplvideo "30:42" "here is an example in Lisp")
(find-eevtemplvideo "31:06" "and I can change this {c}")
(find-eevtemplvideo "31:21" "Let me show a more realistic example")
(find-eevtemplvideo "31:26" "let's go to the directory with the video file")
(find-eevtemplvideo "31:50" "this file is a video file")
4.2. `eewrap-audiovideo'
And older, and clumsier, way of creating short links to audio and
video files is with `M-V'. If you type `M-V' (`eewrap-audiovideo')
on a line containing a shorthand word and a file name of an audio
or video file - for example, here,
sunwillset ~/Zoe_Keating/Sun_Will_Set.ogg
you will get something like this:
;; (find-fline "~/Zoe_Keating/")
(code-audio "sunwillset" "~/Zoe_Keating/Sun_Will_Set.ogg")
(code-video "sunwillset" "~/Zoe_Keating/Sun_Will_Set.ogg")
;; (find-sunwillset)
;; (find-sunwillset "0:00")
you should delete the line with the wrong sexp by hand - in this
case the wrong one is the one with `code-video', as we are
working with a sound file - and execute the other one; this will
define a function called `find-sunwillset', that plays the audio
file with `find-audio'. Run this this sexp to inspect its code:
(find-code-audio "sunwillset" "/tmp/Zoe_Keating__Sun_Will_Set.ogg")
you will notice that running `find-sunwillset' sets a variable,
with:
(setq ee-audiovideo-last 'find-sunwillset)
As we shall see soon, some operations play again the default
audio or video file, starting from some given time offset. The
default is always what is stored in `ee-audiovideo-last', and
each call to a short hyperlink of the form `find-xxxaudio' or
`find-xxxvideo' sets that variable.
4.3. A demo
Here's some code to test `find-video' and `code-video'. Make sure
that you have mpv installed, and run this escript block:
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
# http://www.youtube.com/watch?v=K6LmZ0A1s9U
# http://anggtwu.net/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4
mkdir ~/eev-videos/
cd ~/eev-videos/
wget -nc http://anggtwu.net/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4
It will download a copy of a video from youtube; I prepared the
.mp4 by running "youtube-dl -f 18" on the youtube URL and
renaming the result.
Then try:
(find-video "~/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4")
(code-video "punchandjudyvideo" "~/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4")
(find-punchandjudyvideo)
(find-punchandjudyvideo "0:00")
(find-punchandjudyvideo "0:10" "calls the baby")
(find-punchandjudyvideo "0:40" "where's the baby")
(find-punchandjudyvideo "1:04" "right position")
(find-punchandjudyvideo "1:17" "he will sing the baby to sleep")
(find-punchandjudyvideo "1:33" "1-2-3")
(find-punchandjudyvideo "1:48" "baby downstairs")
(find-punchandjudyvideo "3:12" "slaps")
(find-punchandjudyvideo "3:50" "1-2-3")
(find-punchandjudyvideo "4:34" "you keep an eye on mr Punch")
(find-punchandjudyvideo "4:46" "hat")
(find-punchandjudyvideo "5:03" "hat")
(find-punchandjudyvideo "5:25" "did you see him?")
(find-punchandjudyvideo "5:55" "clown")
(find-punchandjudyvideo "6:14" "slaps")
(find-punchandjudyvideo "6:52" "sausages")
(find-punchandjudyvideo "7:24" "crocodile")
(find-punchandjudyvideo "8:07" "crocodile + sausages")
(find-punchandjudyvideo "8:32" "another scene")
(find-punchandjudyvideo "8:39" "fight")
(find-punchandjudyvideo "9:03" "clown")
(find-punchandjudyvideo "9:45" "mr punch")
4.4. The default audio/video file
One of the things that the function `find-punchandjudyvideo' does
when executed is this:
(setq ee-audiovideo-last 'find-punchandjudyvideo)
It sets the "default audio/video file" - more precisely, it
sets the global variable `ee-audiovideo-last' that indicate that
the way to play again the "default audio/video file" is by
running the function `find-punchandjudyvideo'.
This is similar to what the `find-xxxtext' functions do - they
store some information about the last PDF opened with a
`find-xxxtext' function into global variables. See:
(find-pdf-like-intro "11. How `M-h M-p' guesses everything")
(find-pdf-like-intro "11. How `M-h M-p' guesses everything" "find-xxxtext")
and, for more technical details:
(find-eev-quick-intro "9.1. `code-c-d'")
(find-eev-quick-intro "9.1. `code-c-d'" "find-code-c-d")
(find-code-video "punchandjudyvideo"
"~/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4")
In section 2 we mentioned that the key `M-p' in `eev-avadj-mode'
does this:
M-p play the default audio/video file at a time offset
Let's see in practice what this means. If we run these three
sexps here,
(code-video "punchandjudyvideo" "~/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4")
(find-punchandjudyvideo "1:17" "he will sing the baby to sleep")
(eev-avadj-mode 1)
we will a) define `find-punchandjudyvideo', b) set the global
variable `ee-audiovideo-last' to `find-punchandjudyvideo', c)
turn `eev-avadj-mode' on. Now `M-p' should work! If you type
`M-p' on any of the lines with timestamps below it will open the
default audio/video file at that timestamp.
0:00
0:10 calls the baby
0:40 where's the baby
1:04 right position
1:17 he will sing the baby to sleep
1:33 1-2-3
1:48 baby downstairs
3:12 slaps
3:50 1-2-3
4:34 you keep an eye on mr Punch
4:46 hat
5:03 hat
5:25 did you see him?
5:55 clown
6:14 slaps
6:52 sausages
7:24 crocodile
8:07 crocodile + sausages
8:32 another scene
8:39 fight
9:03 clown
9:45 mr punch
5. Passing options to mpv
By default mpv is called with just a few command-line options,
besides the ones that tell it at what position to start playing -
typically just these for videos,
-fs -osdlevel 2
to make it run in full-screen mode with an on-screen display
showing the current position, and no options for audio.
If you want to change this you should set the variable
`ee-mpv-video-options'. See:
(find-efunction 'find-mpv-video)
(find-evariable 'ee-mpv-video-options)
Here is an example of changing `'ee-mpv-video-options' temporarily:
(defun find-mpv-rot90-video (fname &optional pos &rest rest)
"Like `find-mpv-video', but with the extra option '--video-rotate=90'."
(interactive "sFile name: ")
(let ((ee-mpv-video-options
(cons "--video-rotate=90" ee-mpv-video-options)))
(find-mpv-video fname pos)))
See also this:
(find-mpv-links)
6. Youtube-dl
Videos at Youtube are identified by unique 11-char codes that are
assigned to them when they are uploaded. We will call those 11-char
codes "hashes", even though the term is not totally adequade in this
case, and we will explain the main ideas considering the case of an
imaginary video whose title is just TITLE, and whose hash is
"abcdefghijk". The URL to access that video at Youtube would be this:
http://www.youtube.com/watch?v=abcdefghijk
\---------/
its hash
If we execute this on a shell,
cd /tmp/
youtube-dl -t 'http://www.youtube.com/watch?v=abcdefghijk'
then youtube-dl would download a local copy of the video; due to the
option "-t" ("--title"), the name of the local copy would have both
the title of the video and its hash, and, if the video is in MP4
format, that would be
/tmp/TITLE-abcdefghijk.mp4.part
during the download, and would be renamed to
/tmp/TITLE-abcdefghijk.mp4
as soon as the download is finished.
6.1. Downloading a local copy
Place the point at hash in the URL below,
http://www.youtube.com/watch?v=abcdefghijk
and run `M-x find-youtubedl-links'; `find-youtubedl-links' will use
the hash at point as a default for one of its arguments, will run
something equivalent to this sexp,
(find-youtubedl-links nil nil "abcdefghijk")
and will create a buffer like this:
___________________________________________________________________________
|# (find-youtubedl-links "/tmp/" "{title}" "abcdefghijk" "{ext-}" "{stem}") |
|# (find-youtubedl-links "/tmp/" nil "abcdefghijk" nil "{stem}") |
| |
|# (find-youtubedl-links "~/videos/" nil "abcdefghijk" nil "{stem}") |
|# (find-youtubedl-links "~/videos/tech/" nil "abcdefghijk" nil "{stem}") |
|# (find-youtubedl-links "/tmp/videos/" nil "abcdefghijk" nil "{stem}") |
|# (find-youtubedl-links "/tmp/" nil "abcdefghijk" nil "{stem}") |
|# (find-efunction 'find-youtubedl-links) |
| |
|* (eepitch-shell2) |
|* (eepitch-kill) |
|* (eepitch-shell2) |
|# http://www.youtube.com/watch?v=abcdefghijk |
|# http://www.youtube.com/watch?v=abcdefghijk#t=0m00s |
|# http://www.youtube.com/watch?v=abcdefghijk#t=0h00m00s |
|cd /tmp/ |
|youtube-dl -t 'http://www.youtube.com/watch?v=abcdefghijk' |
| |
|# youtube-dl -t -F 'http://www.youtube.com/watch?v=abcdefghijk' |
|# youtube-dl -t -f 18 'http://www.youtube.com/watch?v=abcdefghijk' |
| |
|# (find-es "video" "youtube-dl") |
|# (find-fline "/tmp/" "abcdefghijk") |
|# (find-fline "/tmp/" "{title}-abcdefghijk") |
|# (find-fline "/tmp/" "{title}-abcdefghijk{ext-}") |
|# (find-video "/tmp/{title}-abcdefghijk{ext-}") |
|# (find-video "/tmp/{title}-abcdefghijk{ext-}.part") |
|# (code-video "{stem}video" "/tmp/{title}-abcdefghijk{ext-}") |
|# (code-video "{stem}video" "/tmp/{title}-abcdefghijk{ext-}.part") |
|# (find-{stem}video) |
|# (find-{stem}video "0:00") |
| |
|# Error messages (for the player): |
|# (find-ebuffer "*Messages*") |
| |
| |
|--:**- *Elisp hyperlinks* All L1 (Fundamental)----------------------|
|___________________________________________________________________________|
which has LOTS of things... the part
* (eepitch-shell2)
* (eepitch-kill)
* (eepitch-shell2)
cd /tmp/
youtube-dl -t 'http://www.youtube.com/watch?v=abcdefghijk'
is obvious: it is an eepitch script that downloads a local copy
of the video from Youtube.
6.2. Guessing the title and extension
Let's simulate what would happen after the eepitch script above -
Execute this:
(find-sh0 "rm -v /tmp/TITLE-abcdefghijk*")
(find-sh0 "echo > /tmp/TITLE-abcdefghijk.mp4.part")
Now use `M-2 M-e' to compare the buffers generated by two calls
to `find-youtubedl-links' below:
(find-youtubedl-links nil nil "abcdefghijk")
(find-youtubedl-links "/tmp/" nil "abcdefghijk")
In the second one we get a buffer where all occurrences
of "{title}" have been substituted by "TITLE", and all
occurrences of "{ext-}" by ".mp4". What happened was that
(ee-youtubedl-guess* "/tmp/" "abcdefghijk")
--> ("/tmp/TITLE-abcdefghijk.mp4.part")
did find files what that hash string in their names in the
directory "/tmp/", and the function `ee-youtubedl-split' has
picked up the first of these file names and has split it into
components:
(ee-youtubedl-split "/tmp/TITLE-abcdefghijk.mp4.part")
--> ("/tmp/" "TITLE" "abcdefghijk" ".mp4" ".mp4.part")
The last of these components is what we will call the "ext" -
the "full extension" - and the previous one is the "ext-" -
the "extension minus its optional `.part'". The first three
components are the "dir", the "title", and the "hash".
6.3. The first lines regenerate the buffer
The arguments to `find-youtubedl-links' are:
(find-youtubedl-links DIR TITLE HASH EXT- STEM)
and we just saw how `ee-youtubedl-guess*' and
`ee-youtubedl-split' can be used to guess TITLE, EXT and EXT-
from DIR and HASH.
All the arguments to `find-youtubedl-links' have defaults,
that are used when the received arguments are nil:
* when HASH is nil, use the youtube hash around point,
or "{hash}" if none;
* when DIR is nil, use the value of `ee-youtubedl-dir',
or "{dir}" if none;
* when TITLE or EXT- are nil use the guessing method described
above, and when they fail use "{title}" or "{ext-}";
* when STEM is nil, use "{stem}".
The first two lines in a `find-youtubedl-links' regenerate the
buffer, and are usually equivalent to one another. In the buffer
generated by:
(find-youtubedl-links "/tmp/" nil "abcdefghijk")
they are:
(find-youtubedl-links "/tmp/" "TITLE" "abcdefghijk" ".mp4" "{stem}")
(find-youtubedl-links "/tmp/" nil "abcdefghijk" nil "{stem}")
The first one has only non-nil arguments - all the rules for
guesses and defaults have been applied - where in the second one
TITLE and EXT- are made nil.
6.4. Selecting a directory
The second block of lines in the `find-youtubedl-links' buffer
are used to let we switch the directory quickly. If we just
execute `M-x find-youtubedl-links' with the point on our example
hash, or, equivalently, if we do this,
(find-youtubedl-links nil nil "abcdefghijk")
you will see that the first two lines will be:
(find-youtubedl-links "~/videos/" "{title}" "abcdefghijk" "{ext-}" "{stem}")
(find-youtubedl-links "~/videos/" nil "abcdefghijk" nil "{stem}")
which means that the guessing process didn't find a downloaded
copy, as TITLE is "{title}" and EXT- is "{ext-}". That's because
we are using "~/videos/" as the DIR, and our file
/tmp/TITLE-abcdefghijk.mp4.part
is elsewhere, and the guessing functions only search in one
directory...
The second block contains these sexps,
(find-youtubedl-links "~/videos/" nil "abcdefghijk" nil "{stem}")
(find-youtubedl-links "~/videos/tech/" nil "abcdefghijk" nil "{stem}")
(find-youtubedl-links "/tmp/videos/" nil "abcdefghijk" nil "{stem}")
(find-youtubedl-links "/tmp/" nil "abcdefghijk" nil "{stem}")
and if we execute the last one we set DIR to "/tmp/".
To change the dir strings "~/videos/", "~/videos/tech/", "/tmp/videos/",
"/tmp/", that appear in the second block of `find-youtubedl-links'
buffers, change the variables `ee-youtubedl-dir', `ee-youtubedl-dir2',
`ee-youtubedl-dir3', `ee-youtubedl-dir4.'
7. `code-psnevideo'
If we execute these two sexps
(code-psnevideo
"punchandjudy"
"http://anggtwu.net/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4"
"K6LmZ0A1s9U")
(find-punchandjudyvideo "1:27")
the `find-punchandjudyvideo' link will work in a way that is
quite different from the one in the demo in section 4.3. It will
open a temporary buffer in which the first line is a sexp - that
calls `find-psnevideo-links' - that regenerates that buffer, and
the second line is a low-level sexp like this, but in a single
line,
(find-video
"$S/http/anggtwu.net/eev-videos/Punch_and_Judy_Mark_Poulton-K6LmZ0A1s9U.mp4"
"1:27")
that will play the local copy of the video starting from 1:27;
this means to to use this sexp to play the video
(find-punchandjudyvideo "1:27")
you have to first execute it with `M-e', then type the <down> key
to go the second line, then type `M-e' again.
The last part of that buffer will either be just a message saying
# Local file found. No need to download it again.
or this message here,
# *** Local file not found! ***
# *** You need to run this: ***
followed by an eepitch block that you can you use to download the
MP4 file, like the one here:
(find-psne-intro "1. Local copies of files from the internet")
The middle of that buffer will have other things, like a link
like this
http://www.youtube.com/watch?v=K6LmZ0A1s9U#t=1m27s
to the video on youtube, and a call to `code-video' that will
redefine `find-punchandjudyvideo' to make it play the video
directly instead of creating a temporary buffer containing a link
to play it.
7.1. `code-eevvideo'
`code-eevvideo' is a variant of `code-psnevideo' that lets us use
shorter sexps. If we call this,
(code-eevvideo "eevnav" "M-x-list-packages-eev-nav")
it will add "http://anggtwu.net/eev-videos/" and ".mp4" to
the string "M-x-list-packages-eev-nav" and then call
`code-psnevideo'. As the third argument was omitted it will be
set to "{youtubeid}". I am using `code-eevvideo' as an
experiment: when I need to send a short screencast to someone who
uses eev I record the video, upload it to
http://anggtwu.net/eev-videos/ - not to youtube - and send to
the person a pair of sexps like these:
(code-eevvideo "eevnav" "M-x-list-packages-eev-nav" "kxBjiUo88_U")
(find-eevnavvideo "0:00")
7.2. `find-eevvideo-links'
It may be simpler to explain `code-eevvideo' in another order,
starting from the function `find-eevvideo-links' - that, as its
name suggests, is a hyperlink to a temporary buffer containing
elisp hyperlinks (plus some parts generated by templates). A sexp
like
(find-eevvideo-links "eev2020" "emacsconf2020" "hOAqBc42Gg8")
generates a temporary buffer whose first line follows the
convention that "the first line regenerates the buffer", and
its second line is a link like
(find-video "$S/http/anggtwu.net/eev-videos/emacsconf2020.mp4")
that plays the local copy of the video (if it exists). That
temporary buffer also contains several "help sexps" that point
to parts of this intro, and also a part like
# URL, local file, and a link to the directory of the local file:
# http://anggtwu.net/eev-videos/emacsconf2020.mp4
# $S/http/anggtwu.net/eev-videos/emacsconf2020.mp4
# (find-fline "$S/http/anggtwu.net/eev-videos/")
# Youtube:
# (kill-new "http://www.youtube.com/watch?v=hOAqBc42Gg8")
# http://www.youtube.com/watch?v=hOAqBc42Gg8
that tries (!) to explain clearly how the URL and the file name
of the local copy were generated from the argument
"emacsconf2020" to `find-eevvideo-links', and how the youtube
URL was generated by the argument "hOAqBc42Gg8"; and the
temporary buffer also contains a last part with a script to
download the .mp4 file, and a help sexp that explains that.
That temporary buffer also contains a pair of sexps like
(code-video "eev2020video" "$S/http/anggtwu.net/eev-videos/emacsconf2020.mp4")
(find-eev2020video)
that are easy to understand - the first one defines
`find-eev2020video' as a short link to play the local copy of the
.mp4 file.
If you compare the temporary buffers generated by these two
sexps,
(find-eevvideo-links "eev2020" "emacsconf2020" "hOAqBc42Gg8")
(find-eevvideo-links "eev2020" "emacsconf2020" "hOAqBc42Gg8" "17:20")
you will see that the second sexp adds a time offset "17:20"s
at several places, and adds a "#t=17m20s"s at the end of each
youtube URL. These sexps and URLs can be used for _communication_
- for example, if I am chatting with someone on an IRC channel I
can say "watch this:", and then send these two lines:
(find-eev2020video "17:20")
http://www.youtube.com/watch?v=hOAqBc42Gg8#t=17m20s
If I take the
(find-eevvideo-links "eev2020" "emacsconf2020" "hOAqBc42Gg8")
and change it to
(code-eevvideo "eev2020" "emacsconf2020" "hOAqBc42Gg8")
this `code-eevvideo' sexps defines, or redefines,
`find-eev2020video', to a "version for communication", such
that
(find-eev2020video "17:20")
runs
(find-eevvideo-links "eev2020" "emacsconf2020" "hOAqBc42Gg8" "17:20")
that generates a temporary buffer with all the stuff described
above, instead of playing the video file right away - to play the
video file you have to execute the sexp
(find-video "$S/http/anggtwu.net/eev-videos/emacsconf2020.mp4" "17:20")
in the second line of the temporary buffer.
There are some examples of `find-eevvideo-links' sexps here:
(find-videos-intro "2. Some `find-eevvideo-links'")
At this moment I don't have variants of `find-eevvideo-links' and
`code-eevvideo' that point to other sides - see the comments
here:
(find-eev "eev-tlinks.el" "hardcoded-paths")