Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
#######
#
# E-scripts on YouTube, youtube-dl, etc.
#
# Note 1: use the eev command (defined in eev.el) and the
# ee alias (in my .zshrc) to execute parts of this file.
# Executing this file as a whole makes no sense.
# An introduction to eev can be found here:
#
#   (find-eev-quick-intro)
#   http://angg.twu.net/eev-intros/find-eev-quick-intro.html
#
# Note 2: be VERY careful and make sure you understand what
# you're doing.
#
# Note 3: If you use a shell other than zsh things like |&
# and the for loops may not work.
#
# Note 4: I always run as root.
#
# Note 5: some parts are too old and don't work anymore. Some
# never worked.
#
# Note 6: the definitions for the find-xxxfile commands are on my
# .emacs.
#
# Note 7: if you see a strange command check my .zshrc -- it may
# be defined there as a function or an alias.
#
# Note 8: the sections without dates are always older than the
# sections with dates.
#
# This file is at <http://angg.twu.net/e/youtube.e>
#           or at <http://angg.twu.net/e/youtube.e.html>.
#        See also <http://angg.twu.net/emacs.html>,
#                 <http://angg.twu.net/.emacs[.html]>,
#                 <http://angg.twu.net/.zshrc[.html]>,
#                 <http://angg.twu.net/escripts.html>,
#             and <http://angg.twu.net/>.
#
#######





# «.standard-installation»	(to "standard-installation")
# «.debian»			(to "debian")
# «.restrict-filenames»		(to "restrict-filenames")
# «.youtube-dl-git»		(to "youtube-dl-git")
# «.irc-channel»		(to "irc-channel")
# «.update»			(to "update")
# «.youtube-dl-U»		(to "youtube-dl-U")
# «.upload-date»		(to "upload-date")
# «.splitting-file-names»	(to "splitting-file-names")
# «.thumbnails»			(to "thumbnails")
# «.video-formats»		(to "video-formats")
# «.title-is-deprecated»	(to "title-is-deprecated")
# «.youtube-title»		(to "youtube-title")
# «.username-and-password»	(to "username-and-password")
# «.subtitles»			(to "subtitles")
# «.auto-generated-subtitles»	(to "auto-generated-subtitles")
# «.bug-report»			(to "bug-report")
# «.extract-audio»		(to "extract-audio")
# «.youtube-dl-avconv-warning»	(to "youtube-dl-avconv-warning")
# «.vimeo»			(to "vimeo")
# «.write-auto-sub»		(to "write-auto-sub")
# «.lbry»			(to "lbry")
# «.time-syntax»		(to "time-syntax")
# «.ytdl»			(to "ytdl")
# «.ytel»			(to "ytel")
# «.youtube-sub-extractor.el»	(to "youtube-sub-extractor.el")
# «.ytdious»			(to "ytdious")
# «.editing-captions»		(to "editing-captions")
# «.peertube»			(to "peertube")
# «.wafficus»			(to "wafficus")
# «.kolektiva»			(to "kolektiva")
# «.yewtube»			(to "yewtube")
# «.invidious-git»		(to "invidious-git")
# «.invidious-tampermonkey»	(to "invidious-tampermonkey")
# «.odysee»			(to "odysee")
# «.vagner-aliases»		(to "vagner-aliases")
# «.yt-dlp»			(to "yt-dlp")
# «.toobnix»			(to "toobnix")
# «.sacha-srv-hint»		(to "sacha-srv-hint")
# «.hypervideo»			(to "hypervideo")
# «.transcript-downloader»	(to "transcript-downloader")
# «.slk500-culturevein»		(to "slk500-culturevein")


# (find-esgrep "grep -nH -e youtube-dl *.e")

https://youtube.com/@eduardoochs
https://youtube.com/c/eduardoochs
https://youtube.com/user/eduardoochs
https://support.google.com/youtube/answer/11585688 handles



#####
#
# Standard installation of youtube-dl (from upstream)
# 2018nov11
#
#####

# «standard-installation» (to ".standard-installation")
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
apti  youtube-dl
aptrm youtube-dl
# http://youtube-dl.org/
# http://rg3.github.io/youtube-dl/download.html
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl

# Update:
sudo youtube-dl -U



#####
#
# Debian package
# 2013aug18
#
#####

# «debian» (to ".debian")
# (find-status   "youtube-dl")
# (find-vldifile "youtube-dl.list")
# (find-udfile   "youtube-dl/")
# (find-fline "/usr/share/pyshared/youtube_dl/extractor/")
# (find-fline "/usr/share/pyshared/youtube_dl/extractor/youtube.py")




#####
#
# -restrict-filenames
# 2013aug18
#
#####

# «restrict-filenames» (to ".restrict-filenames")
(code-c-d "ydl"  "/usr/share/pyshared/youtube_dl/")
(code-c-d "ydle" "/usr/share/pyshared/youtube_dl/extractor/")
;; (find-ydlfile "")
;; (find-ydlefile "")

# (find-ydlgrep "grep -nH -e restrict *")
# (find-ydlfile "__init__.py" "'--restrict-filenames'")
# (find-ydlgrep "grep -nrH -e restrictfilenames *")
# (find-ydlgrep "grep -nrH -e restricted *")
# (find-ydlgrep "grep -nrH -e sanitize *")

# (find-ydlfile "utils.py" "def sanitize_filename")



#####
#
# youtube-dl from git
# 2013aug18
#
#####

# «youtube-dl-git» (to ".youtube-dl-git")
# (find-angg ".emacs" "youtube-dl")
# http://rg3.github.io/youtube-dl/
# https://github.com/rg3/youtube-dl
# https://github.com/rg3/youtube-dl.git
# https://yt-dl.org/
# http://youtube-dl.org/
# http://rg3.github.io/youtube-dl/download.html

# (find-git-links "https://github.com/rg3/youtube-dl.git" "youtubedl")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
# rm -Rfv ~/usrc/youtube-dl/
cd      ~/usrc/
git clone https://github.com/rg3/youtube-dl.git
cd      ~/usrc/youtube-dl/

# (code-c-d "youtubedl"   "~/usrc/youtube-dl/")
# (code-c-d "youtubedly"  "~/usrc/youtube-dl/youtube_dl/")
# (code-c-d "youtubedlye" "~/usrc/youtube-dl/youtube_dl/extractor/")
# (find-youtubedlfile "")
# (find-youtubedlsh "find * | sort")

# (find-youtubedlfile "")
# (find-youtubedlyfile "")
# (find-youtubedlyefile "")
# (find-youtubedlyefile "instagram.py")

# (find-sh "youtube-dl")
# (find-sh "youtube-dl -h")
# (find-freenode-links "#youtube-dl")

# From now on, get the binaries from
# http://rg3.github.io/youtube-dl/download.html, not from the git
# repository.

# (find-youtubedlgrep "grep --color -nrH -e update *")
# (find-youtubedlyfile "options.py" "'-U', '--update'")






#####
#
# IRC channel
# 2013aug18
#
#####

# «irc-channel» (to ".irc-channel")
# (find-freenode "#youtube-dl")
# (find-freenode-3a "#youtube-dl")
# (find-fline "~/LOGS/2013aug18.youtube-dl")



#####
#
# update
# 2013oct11
#
#####

# «update» (to ".update")
# «youtube-dl-U» (to ".youtube-dl-U")
# (find-youtubedlgrep "grep -nirH -e update *")
# (find-youtubedlfile "README.md" "-U, --update")
# (find-youtubedlyfile "__init__.py" "'--update'")
# (find-youtubedlyfile "update.py")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
youtube-dl -U

# (find-sh "locate youtube-dl")
# (find-fline "/usr/bin/youtube-dl")
# (find-fline "/usr/local/bin/youtube-dl")




#####
#
# upload date
# 2014apr21
#
#####

# «upload-date» (to ".upload-date")
# (find-youtubedlfile "README.md" "upload_date")
# (find-youtubedlfile "README.md" "-e, --get-title")
# (find-youtubedlfile "README.md" "--get-format")
# (find-youtubedlfile "README.md" "--get-filename")
# (find-youtubedlfile "README.md" "-o, --output TEMPLATE" "%(upload_date)s")
# (find-youtubedlfile "README.md" "The current default template is")
# (find-anggfile "LUA/youtube-db.lua" "yt ()" "youtube-dl -e")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/
youtube-dl --get-format "http://www.youtube.com/watch?v=g5quWjBJMwc"
youtube-dl --get-title "http://www.youtube.com/watch?v=g5quWjBJMwc"
youtube-dl --get-description "http://www.youtube.com/watch?v=g5quWjBJMwc"
youtube-dl --get-filename "http://www.youtube.com/watch?v=g5quWjBJMwc"
youtube-dl --get-filename -o "%(upload_date)s" "http://www.youtube.com/watch?v=g5quWjBJMwc"



#####
#
# Splitting the file name of a video downloaded by youtube-dl
# 2013aug18
#
#####

# «splitting-file-names» (to ".splitting-file-names")
# (find-eevgrep "grep -nH -e tubedl *.el")
# (find-eevgrep "grep -nH -e termpl *.el")
# (find-eev "eev-tlinks.el" "find-youtubedl-links")
# (find-angg ".emacs.templates" "find-youtubedl-links")

(setq re "\\(\\.[A-Za-z0-9]\\{2,5\\}\\)\\{0,2\\}$")
(setq str "foo.bar.plic.ploc.mp4")
(setq str "foo.bar.plich.plocaboo.mp4")
(setq str "plocaboo")
(and (string-match re str) (list (substring str 0 (match-beginning 0)) (match-string 0 str)))

(substring "abcdefgh" 0 1)
(substring "abcdefgh" 0 -2)
(substring "abcdefgh" -4 0)


 (match-string 0 fname))




#####
#
# thumbnails
# 2013sep14
#
#####

# «thumbnails» (to ".thumbnails")

# (find-man "youtube-dl")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/
~/usrc/youtube-dl/youtube-dl --write-thumbnail 'http://www.youtube.com/watch?v=Rx-L8hxrJlg'

cd /tmp/
# Bad char:
# youtube-dl --write-thumbnail 'http://www.youtube.com/watch?v=1_7HV_Vq2CE'




#####
#
# video formats
# 2013sep14
#
#####

# «video-formats» (to ".video-formats")
# (find-es "android" "video-formats")

Available formats:
35	:	flv	[480x854]
44	:	webm	[480x854]
34	:	flv	[360x640]
18	:	mp4	[360x640]
43	:	webm	[360x640]
5	:	flv	[240x400]
17	:	mp4	[144x176]




#####
#
# --title is deprecated
# 2021oct17
#
#####

# «title-is-deprecated»  (to ".title-is-deprecated")
# WARNING: --title is deprecated. Use -o "%(title)s-%(id)s.%(ext)s" instead.



#####
#
# youtube-title
# 2013nov24
#
#####

# «youtube-title» (to ".youtube-title")
# (find-angg ".emacs" "youtube-title")
# (find-es "charsets" "recode")
# (find-sh "recode -l" "HTML")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
youtube-dl -e 'http://www.youtube.com/watch?v=TqoUp0_4aMY'
youtube-dl -e 'http://www.youtube.com/watch?v=TqoUp0_4aMY' | recode h..l1




#####
#
# user and password
# 2014apr23
#
#####

# «username-and-password» (to ".username-and-password")
# (find-sh "youtube-dl" "-u, --username")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/
youtube-dl -u foo@gmail.com -p sikrit \
  'https://www.facebook.com/photo.php?v=658872984184130'




#####
#
# subtitles
# 2014jun05
#
#####

# «subtitles» (to ".subtitles")
# (find-sh "youtube-dl -h" "Subtitle Options:")




#####
#
# auto-generated-subtitles
# 2019nov13
#
#####

# «auto-generated-subtitles» (to ".auto-generated-subtitles")
# https://www.quora.com/How-do-I-download-auto-generated-subtitles-in-YouTube
# https://unix.stackexchange.com/questions/450214/youtube-dl-download-autotranslate-subs
# (find-man "1 youtube-dl")
# (find-man "1 youtube-dl" "--write-auto-sub")
# http://www.youtube.com/watch?v=hOAqBc42Gg8 On why most of the best features in eev look like 5-minute hacks (@ EmacsConf 2020)

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/
lay    *hOAqBc42Gg8*
rv -fv *hOAqBc42Gg8*

youtube-dl \
  -f worst --list-subs \
  "http://www.youtube.com/watch?v=hOAqBc42Gg8"

youtube-dl \
  -f worst --write-auto-sub \
  "http://www.youtube.com/watch?v=hOAqBc42Gg8"

youtube-dl --write-sub --skip-download --sub-lang=en \
  "http://www.youtube.com/watch?v=hOAqBc42Gg8"






#####
#
# The "--write-auto-sub" option
# 2017dez27
#
#####

# «write-auto-sub» (to ".write-auto-sub")
# (find-man "1 youtube-dl")
# (find-man "1 youtube-dl" "--write-auto-sub")
# (find-fline "/tmp/")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/
youtube-dl \
  -f worst --list-subs \
  "https://www.youtube.com/watch?v=VLI09O8bMkU"

youtube-dl \
  -f worst --write-auto-sub \
  "https://www.youtube.com/watch?v=VLI09O8bMkU"

cd /tmp/
cp David_Jay_-_Asexuality-VLI09O8bMkU.en.vtt o.vtt

* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
-- (find-lua51manual "#pdf-string.gmatch")
-- (find-fline "/tmp/o.vtt")
bigstr = ee_readfile "/tmp/o.vtt"
pat = "(%d%d:[^\n]*)\n([^\n]+)\n\n"
for a,b in string.gmatch(bigstr, pat) do
  -- print(b)
  print((b:gsub("<.->", "")))
end


# http://www.youtube.com/watch?v=VLI09O8bMkU
# (find-fline "/tmp/o.vtt")

# (find-davidjayvideo "6:38")
# http://www.youtube.com/watch?v=VLI09O8bMkU
# (find-fline "/tmp/o.vtt")
# (find-fline "/tmp/o.vtt" "5:52")
# (find-fline "/tmp/o.vtt" "15:03" "close")




#####
#
# Bug report: non-ascii chars in -e
# 2014aug06
#
#####

# «bug-report» (to ".bug-report")
# https://github.com/rg3/youtube-dl/issues
# https://github.com/rg3/youtube-dl/issues/3460
# Non-ascii chars in "-e", and a project that uses youtube-dl #3460




#####
#
# extract-audio
# 2015feb15
#
#####

# «extract-audio» (to ".extract-audio")
# http://www.gluglug.org.uk/tutorials/accessing-youtube/#comment-101
# (find-sh "youtube-dl")
# (find-sh "youtube-dl -h")
# (find-sh "youtube-dl -h" "-x, --extract-audio")
# (find-sh "youtube-dl -h" "--audio-format FORMAT")
# (find-sh "youtube-dl -h" "--restrict-filenames")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/
youtube-dl -x --audio-format mp3 "http://www.youtube.com/watch?v=YVXftEvBipI"
youtube-dl -x --audio-format mp3 --restrict-filenames \
  "http://www.youtube.com/watch?v=DbyzmiXnB7o"


# 2015feb14:
# http://www.gluglug.org.uk/tutorials/accessing-youtube/#comment-304




#####
#
# WARNING: Your copy of avconv is outdated and unable to properly mux...
# 2016jan05
#
#####

# «youtube-dl-avconv-warning» (to ".youtube-dl-avconv-warning")
# WARNING: Your copy of avconv is outdated and unable to properly mux
# separate video and audio files, youtube-dl will download single file
# media. Update avconv to version 10-0 or newer to fix this.

# https://github.com/rg3/youtube-dl/issues/4451
# http://askubuntu.com/questions/563245/avconv-warning-while-downloading-youtube-video
https://askubuntu.com/questions/563245/avconv-warning-while-downloading-youtube-video




#####
#
# vimeo
# 2017dez06
#
#####

# «vimeo» (to ".vimeo")
# (find-man "1 youtube-dl" "-f, --format FORMAT")
# (find-man "1 youtube-dl" "-F, --list-formats")
# (find-man "1 youtube-dl" "FORMAT SELECTION")
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
cd /tmp/
youtube-dl -F https://vimeo.com/195735897
youtube-dl -f worst https://vimeo.com/195735897

format code                                        extension  resolution note
dash-akfire_interconnect_quic_sep-audio-656380193  m4a        audio only DASH audio  128k , mp4a.40.2 (48000Hz)
dash-fastly_skyfire_sep-audio-656380193            m4a        audio only DASH audio  128k , mp4a.40.2 (48000Hz)
dash-akfire_interconnect_quic_sep-audio-656380234  m4a        audio only DASH audio  256k , mp4a.40.2 (48000Hz)
dash-fastly_skyfire_sep-audio-656380234            m4a        audio only DASH audio  256k , mp4a.40.2 (48000Hz)
dash-akfire_interconnect_quic_sep-video-656380193  mp4        640x360    DASH video  685k , avc1.4D401E, 30fps, video only
dash-fastly_skyfire_sep-video-656380193            mp4        640x360    DASH video  685k , avc1.4D401E, 30fps, video only
dash-akfire_interconnect_quic_sep-video-656380234  mp4        960x540    DASH video 1926k , avc1.64001F, 30fps, video only
dash-fastly_skyfire_sep-video-656380234            mp4        960x540    DASH video 1926k , avc1.64001F, 30fps, video only
dash-akfire_interconnect_quic_sep-video-656380222  mp4        1280x720   DASH video 3112k , avc1.640020, 30fps, video only
dash-fastly_skyfire_sep-video-656380222            mp4        1280x720   DASH video 3112k , avc1.640020, 30fps, video only
dash-akfire_interconnect_quic_sep-video-656380223  mp4        1920x1080  DASH video 5298k , avc1.640028, 30fps, video only
dash-fastly_skyfire_sep-video-656380223            mp4        1920x1080  DASH video 5298k , avc1.640028, 30fps, video only
http-360p                                          mp4        640x360    30fps
hls-akfire_interconnect_quic-640                   mp4        640x360     640k , avc1.4D401E, 30.0fps, mp4a.40.2
hls-fastly_skyfire-640                             mp4        640x360     640k , avc1.4D401E, 30.0fps, mp4a.40.2
dash-akfire_interconnect_quic-video-656380193      mp4        640x360    DASH video  685k , avc1.4D401E, 30fps, mp4a.40.2 (48000Hz)
dash-fastly_skyfire-video-656380193                mp4        640x360    DASH video  685k , avc1.4D401E, 30fps, mp4a.40.2 (48000Hz)
http-540p                                          mp4        960x540    30fps
hls-akfire_interconnect_quic-1723                  mp4        960x540    1723k , avc1.64001F, 30.0fps, mp4a.40.2
hls-fastly_skyfire-1723                            mp4        960x540    1723k , avc1.64001F, 30.0fps, mp4a.40.2
dash-akfire_interconnect_quic-video-656380234      mp4        960x540    DASH video 1926k , avc1.64001F, 30fps, mp4a.40.2 (48000Hz)
dash-fastly_skyfire-video-656380234                mp4        960x540    DASH video 1926k , avc1.64001F, 30fps, mp4a.40.2 (48000Hz)
http-720p                                          mp4        1280x720   30fps
hls-akfire_interconnect_quic-2653                  mp4        1280x720   2653k , avc1.640020, 30.0fps, mp4a.40.2
hls-fastly_skyfire-2653                            mp4        1280x720   2653k , avc1.640020, 30.0fps, mp4a.40.2
dash-akfire_interconnect_quic-video-656380222      mp4        1280x720   DASH video 3112k , avc1.640020, 30fps, mp4a.40.2 (48000Hz)
dash-fastly_skyfire-video-656380222                mp4        1280x720   DASH video 3112k , avc1.640020, 30fps, mp4a.40.2 (48000Hz)
hls-akfire_interconnect_quic-4760                  mp4        1920x1080  4760k , avc1.640028, 30.0fps, mp4a.40.2
hls-fastly_skyfire-4760                            mp4        1920x1080  4760k , avc1.640028, 30.0fps, mp4a.40.2
dash-akfire_interconnect_quic-video-656380223      mp4        1920x1080  DASH video 5298k , avc1.640028, 30fps, mp4a.40.2 (48000Hz)
dash-fastly_skyfire-video-656380223                mp4        1920x1080  DASH video 5298k , avc1.640028, 30fps, mp4a.40.2 (48000Hz)
Original                                           mp4        1920x1080  549.24MiB (best)

# (find-efunction 'find-youtubedl-links)





#####
#
# lbry
# 2019jun26
#
#####

# «lbry» (to ".lbry")
# https://www.youtube.com/watch?v=ZQuE0wfjzf0



#####
#
# time-syntax - documentation for "&t=16s"
# 2019nov03
#
#####

# «time-syntax» (to ".time-syntax")
# (find-angg "LUA/lua50init.lua" "youtube_make_url")
# (find-angg "LUA/lua50init.lua" "youtube_make_url" "youtube_time =")
# (find-eev "eev-audiovideo.el" "youtube-time")

# http://www.youtube.com/watch?v=86yiRG8YJD0#t=0m00s
# http://www.youtube.com/watch?v=86yiRG8YJD0#t=16m00s
# http://www.youtube.com/watch?v=86yiRG8YJD0#t=0h00m00s

# https://stackoverflow.com/questions/37402749/url-syntax-for-youtube-video-in-fullscreen-and-start-at-time-index
# https://developers.google.com/youtube/player_parameters
# https://developers.google.com/youtube/player_parameters#start

* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
= youtube_make_url("0123456789a", "01:23")
youtube_time = youtube_time_hhmmss
= youtube_make_url("0123456789a", "1:02")
= youtube_make_url("0123456789a", "1:02:03")

* (eepitch-blogme3)
* (eepitch-kill)
* (eepitch-blogme3)
= youtube_make_url("0123456789a", "01:23")




#####
#
# editing-captions
# 2020oct18
#
#####

# «editing-captions»  (to ".editing-captions")
# https://www.google.com/search?q=how+to+i+edit+the+captions+of+a+video+on+youtube
# https://studio.youtube.com/video/86yiRG8YJD0/translations





#####
#
# peertube
# 2021jan13
#
#####

# «peertube»  (to ".peertube")
# https://vidcommons.org/videos/watch/4c9cece6-68dc-45be-a657-7118a5794123?start=1m23s

https://video.hardlimit.com/signup

https://solvespace.com/forum.pl?action=viewthread&parent=3756&tt=1625649760 Video tutorials now on PeerTube
https://peertube.linuxrocks.online/video-channels/homehack/videos




#####
#
# Wafficus: newsboat, channels, etc
# 2021jan13
#
#####

# «wafficus»  (to ".wafficus")
# https://git.musimatic.net/dotfiles/tree/newsboat/.newsboat/urls
# https://commentpicker.com/youtube-channel-id.php



#####
#
# kolektiva
# 2021jun26
#
#####

# «kolektiva»  (to ".kolektiva")
# https://kolektiva.media/videos/local

https://kolektiva.media/videos/watch/5afe8f58-b07a-46e3-bd03-2ee4f5f2884a?start=1m2s



#####
#
# yewtube
# 2021jul03
#
#####

# «yewtube»  (to ".yewtube")
# https://yewtu.be/
# (find-TH "2021projeto-de-ensino")
# (find-angg ".emacs.videos" "testbls")
# (find-eevvideo-links "testbls" "2020-test-blocks" "fpsF_M55W4o")
# (find-eevvideo-links "testbls" "2020-test-blocks" "fpsF_M55W4o" "1:23")
# (find-efunction 'find-eevvideo-links)
# (find-efunction 'ee-time-to-arg)
# (find-efunction 'ee-time-to-youtube-time)
# (find-fline "~/LOGS/2021sep22.invidious")
# (find-fline "~/LOGS/2021sep22.invidious" "autoplay")

(defun ee-find-yewtube-url (hash &optional time &rest rest)
  (format "http://www.yewtu.be/watch?v=%s%s"
          hash (ee-time-to-youtube-time time "&")))

(defun find-yewtube (hash &optional time &rest rest)
  (find-firefox (ee-find-yewtube-url hash time)))

(find-yewtube "fpsF_M55W4o" "1:23")

http://www.youtube.com/watch?v=fpsF_M55W4o#t=1m23s
http://www.yewtu.be/watch?v=fpsF_M55W4o&t=1m23s
http://www.yewtu.be/watch?v=fpsF_M55W4o&t=1m23s&autoplay=1
http://www.yewtu.be/watch?v=fpsF_M55W4o&autoplay=1
https://invidious-us.kavin.rocks/watch?v=fpsF_M55W4o&t=1m23s&autoplay=1




#####
#
# invidious-git
# 2021sep22
#
#####

# «invidious-git»  (to ".invidious-git")
# https://github.com/iv-org/invidious
# (find-git-links "https://github.com/iv-org/invidious" "invidious")
# (code-c-d "invidious" "~/usrc/invidious/")
# (find-invidiousfile "")
# (find-invidiousgrep "grep --color=auto -nRH --null -e autoplay *")
# (find-invidiousgrep "grep --color=auto -nRiH --null -e autoplay *")
# (find-invidiousgrep "grep --color=auto -nRiH --null -e minute *")

&autoplay=1




#####
#
# invidious-tampermonkey
# 2021sep22
#
#####

# «invidious-tampermonkey»  (to ".invidious-tampermonkey")
# https://addons.mozilla.org/en-US/firefox/addon/tampermonkey/

// ==UserScript==
// @description Redirects Youtube URLs to Invidio.us
// @name Invidious Redirect
// @namespace Backend
// @include http://www.youtube.com/*
// @include https://www.youtube.com/*
// @version 1.1
// @run-at document-start
// @grant none
// ==/UserScript==

// invidio instances
// https://instances.invidio.us/
//invidious.snopyta.org  -> off
//invidious.exonip.de
//yewtu.be
//invidious.tube
//invidious.xyz
//invidious.silkky.cloud
//etc...

var a = 0;
setInterval(function () {
 if (a === 0 && window.location.href.indexOf('watch?') > -1 && window.location.href.indexOf('list=WL') < 0) {
  a = '//yewtu.be/watch?' + window.parent.location.href.split('?')[1];
  window.location.replace(a);
 }
}, 10);







#####
#
# odysee
# 2021sep09
#
#####

# «odysee»  (to ".odysee")
https://odysee.com/
https://odysee.com/@freegafo:8/only-here-the-lavender-fields-are-next:5
https://odysee.com/@LittleApostate:5/journalism-is-dead-and-vice-proved-it:7
https://odysee.com/@club_brick:f/lego-stop-motion-contest-champion!-the:f
https://odysee.com/@EarthTitan:0/little-apple-of-death-fruits-you've:5



#####
#
# vagner-aliases
# 2021sep09
#
#####

# «vagner-aliases»  (to ".vagner-aliases")

alias yt='youtube-dl --add-metadata -ic'
alias ytCurl='youtube-dl --external-downloader-args curl -c --newline'
alias ytLsub='youtube-dl --list-subs'
alias ytPfree='youtube-dl -c --prefer-free-formats'
alias ytTitle='youtube-dl -c --restrict-filename -o '\''%(title)s'\'''
alias ytWget='youtube-dl --external-downloader-args wget -c --newline'
alias yta='youtube-dl --add-metadata -xic'
alias ytaufmt='youtube-dl -c --audio-format mp3'
alias ytmp3='youtube-dl -cx'
alias ytnp='youtube-dl -c --no-playlist'
alias ytvF='youtube-dl -F'
alias ytvidfmt='youtube-dl -c --recode-video ogg'




#####
#
# yt-dlp
# 2021sep29
#
#####

# «yt-dlp»  (to ".yt-dlp")
# (find-fline "~/bin/youtube-dl")
# https://news.ycombinator.com/item?id=28289981 Youtube-dl is possibly dead (reddit.com)
# https://old.reddit.com/r/DataHoarder/comments/p9riey/youtubedl_is_possibly_dead/
# https://github.com/yt-dlp/yt-dlp
# (find-git-links "https://github.com/yt-dlp/yt-dlp" "ytdlp")
# (code-c-d "ytdlp" "~/usrc/yt-dlp/")
# (find-ytdlpfile "")
# (find-ytdlpfile "README.md")
# (find-ytdlpfile "README.md" "Use pip+git:")

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
python3 -m pip install --upgrade git+https://github.com/yt-dlp/yt-dlp.git@release

rehash
which yt-dlp

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
yt-dlp
yt-dlp --version
which youtube-dl
youtube-dl
youtube-dl --version


https://gitlab.com/tuedachu/ytdl
https://github.com/grastello/ytel





#####
#
# toobnix
# 2021nov28
#
#####

# «toobnix»  (to ".toobnix")

https://emacsconf.org/2021/talks/test/
https://toobnix.org/w/qRKLj4VdBG8cFN1MEfcRho




#####
#
# sacha-srv-hint
# 2022jan27
#
#####

# «sacha-srv-hint»  (to ".sacha-srv-hint")
# https://mail.google.com/mail/u/0/#inbox/QgrcJHrjCFDVFRMhWpbXFgDjhJbNZdgGWVv

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
rm -Rv /tmp/srv/
mkdir  /tmp/srv/
cd     /tmp/srv/
youtube-dl --write-sub --write-auto-sub --no-warnings --sub-lang en \
  --skip-download --sub-format srv1 -o temp-file \
  "http://www.youtube.com/watch?v=WowDSciGs1A"

# (find-fline "/tmp/srv/")
# (find-fline "/tmp/srv/temp-file.en.srv1")

# pict2e-lua:

youtube-dl --write-sub --write-auto-sub --no-warnings --sub-lang en \
  --skip-download --sub-format vtt -o temp-file \
  "http://www.youtube.com/watch?v=hiHsUhGVLGM"

youtube-dl --write-sub --write-auto-sub --no-warnings --sub-lang en \
  --skip-download --sub-format srv1 -o temp-file \
  "http://www.youtube.com/watch?v=hiHsUhGVLGM"

# (find-pip3-links "pysubs2")
# (find-pip3spfile "pysubs2/")
# https://github.com/tkarabela/pysubs2
# (find-sh "pysubs2 --help")
# (find-sh "pysubs2 --help" "--to srt")

cd /tmp/srv/
pysubs2 --to srt *.vtt

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
# (find-fline "/tmp/edrx-pict2e/")
rm -Rv /tmp/edrx-pict2e/
mkdir  /tmp/edrx-pict2e/
cd     /tmp/edrx-pict2e/

yt-dlp --write-sub --write-auto-sub --skip-download \
  -o 2022-pict2e-lua \
  "http://www.youtube.com/watch?v=hiHsUhGVLGM"

wget http://angg.twu.net/eev-videos/2022-pict2e-lua.mp4

ls -lAF
mpv /tmp/edrx-pict2e/2022-pict2e-lua.mp4

 --no-warnings --sub-lang en \
  --skip-download --sub-format srv1 -o temp-file \




#####
#
# hypervideo
# 2022mar24
#
#####

# «hypervideo»  (to ".hypervideo")
# https://git.conocimientoslibres.ga/software/hypervideo.git
# (find-git-links "https://git.conocimientoslibres.ga/software/hypervideo.git" "hypervideo")
# (code-c-d "hypervideo" "~/usrc/hypervideo/")
# (find-hypervideofile "")



#####
#
# transcript-downloader
# 2022mar29
#
#####

# «transcript-downloader»  (to ".transcript-downloader")
# (find-pip3-links "youtube-transcript-downloader")
# https://github.com/t4skmanag3r/youtube_transcript_downloader
# (find-pip3spfile "youtube_transcript_downloader/")
# (find-pip3spfile "youtube_transcript_downloader/yt_transcript_downloader.py")
# https://github.com/t4skmanag3r/youtube_transcript_downloader
# https://ag91.github.io/blog/2022/03/27/an-elisp-snippet-to-dowload-youtube-videos-transcripts/
# https://ag91.github.io/blog/2022/03/28/something-i-missed-point-free-composition-in-elisp/

* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
# pip3 install youtube_transcript_downloader

(defun get-youtube-transcript (url)
  "Get YouTube transcript of URL."
  (if (s-contains-p "youtube-transcript-downloader" (shell-command-to-string "pip list"))
      (progn (with-temp-file "/tmp/yt-transcr-downloader.py"
               (insert
                (format "
import youtube_transcript_downloader

url = \"%s\"
transcript = youtube_transcript_downloader.get_transcript(url)
print(\"(\")
for key, val in transcript.items():
        print(f\"(:key \\\"{key}\\\" :text \\\"{val}\\\")\")
print(\")\")
" url)))
             (read (shell-command-to-string "python3 /tmp/yt-transcr-downloader.py")))
    (error "Please install youtube_transcript_downloader via pip install youtube_transcript_downloader")))
You can use it like this (get-youtube-transcript "https://www.youtube.com/watch?v=vJ1STks8MUU").


(shell-command-to-string "python3 /tmp/yt-transcr-downloader.py")

(shell-command-to-string "pip list")

# (find-sh "pip3 list" "youtube-transcript-downloader")

<bpalmer> https://developers.google.com/youtube/iframe_api_reference
          -- change the onPlayerReady function to include 'if
          (window.location.hash) { var timestamp =
          window.location.hash.substring(1);  var secs =
          parseInt(timestamp); if (!isNaN(secs)) {
          player.seekTo(secs); } } '   or some such





#####
#
# How slk500's https://culturevein.com/ controls embedded videos
# 2022sep04
#
#####

# «slk500-culturevein»  (to ".slk500-culturevein")
# https://developers.google.com/youtube/iframe_api_reference
# (find-fline "~/LOGS/2022sep04.slk500" "oKsxPW6i3pM")
# (find-fline "/tmp/")
# file:///tmp/play.html


<!DOCTYPE html>
<html>
  <body>
    <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
    <div id="player"></div>

    <script>
      // 2. This code loads the IFrame Player API code asynchronously.
      var tag = document.createElement('script');

      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

      // 3. This function creates an <iframe> (and YouTube player)
      //    after the API code downloads.
      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '390',
          width: '640',
          videoId: 'M7lc1UVf-VE',
          playerVars: {
            'playsinline': 1
          },
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }
        });
      }

      // 4. The API will call this function when the video player is ready.
      function onPlayerReady(event) {
        event.target.playVideo();
      }

      // 5. The API calls this function when the player's state changes.
      //    The function indicates that when playing a video (state=1),
      //    the player should play for six seconds and then stop.
      var done = false;
      function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PLAYING && !done) {
          setTimeout(stopVideo, 6000);
          done = true;
        }
      }
      function stopVideo() {
        player.stopVideo();
      }
    </script>

<a href="" onclick="alert('Hello'); return false;">foo</a>

<a href="" onclick="player.seekTo(100); player.playVideo(); return false;">bar</a>

  </body>
</html>



#####
#
# ytdious
# 2022oct10
#
#####

# «ytdious»  (to ".ytdious")
# (find-epackage-links 'ytdious "ytdious" t)
# (find-epackages      'ytdious)
# (find-epackage       'ytdious)
# (code-c-d "ytdious" "~/.emacs.d/elpa/ytdious-20210228.2111/")
# (find-ytdiousfile "")
 https://github.com/spiderbit/ytdious




#####
#
# ytdl
# 2022oct10
#
#####

# «ytdl»  (to ".ytdl")
# https://www.reddit.com/r/emacs/comments/hxbmda/ytdl_an_emacs_interface_for_youtubedl/
# (find-epackage-links 'ytdl "ytdl" t)
# (find-epackages      'ytdl)
# (find-epackage       'ytdl)
# (code-c-d "ytdl" "~/.emacs.d/elpa/ytdl-20210506.914/")
# (find-ytdlfile "")
# https://gitlab.com/tuedachu/ytdl



#####
#
# ytel
# 2022oct10
#
#####

# «ytel»  (to ".ytel")
# (find-epackage-links 'ytel "ytel" t)
# (find-epackages      'ytel)
# (find-epackage       'ytel)
# (code-c-d "ytel" "~/.emacs.d/elpa/ytel-20200725.1056/")
# (find-ytelfile "")
# https://github.com/grastello/ytel




#####
#
# youtube-sub-extractor.el
# 2022dec05
#
#####

# «youtube-sub-extractor.el»  (to ".youtube-sub-extractor.el")
# (find-es "emacs" "youtube-sub-extractor")
# (find-epackage-links 'youtube-sub-extractor "youtubesubextractor" t)
# (find-epackages      'youtube-sub-extractor)
# (find-epackage       'youtube-sub-extractor)
# (code-c-d "youtubesubextractor" "{d}")
# (find-youtubesubextractorfile "")






https://support.google.com/youtube/answer/7631406?hl=en Keyboard shortcuts for YouTube






cd /tmp/
youtube-dl -v -v -v \
  --write-info-json \
  -e "http://www.youtube.com/watch?v=n72B3zCOLU0" \
  |& tee /tmp/o


# write_youtube_date_into("Pap4N7G2rPM", "/tmp/ydb/Pap4N7G2rPM.date")
# write_youtube_title_into("Pap4N7G2rPM", "/tmp/ydb/Pap4N7G2rPM.title")
# download_youtube_mp4("Pap4N7G2rPM", "/tmp/ydb/videos/")

# (find-sh "youtube-dl -h")
# (find-fline "~/LOGS/2014aug06.youtube-dl")



https://github.com/ytdl-org/youtube-dl/issues/3460



https://mail.google.com/mail/ca/u/0/#inbox/FMfcgxwDrbvswpFDPgfBPfQbvDrqnVjt October Creator Monthly newsletter

https://mspoweruser.com/microsofts-github-removes-open-source-youtube-video-download-code/

NewPipe (Front-end leve para o YouTube):
https://f-droid.org/packages/org.schabi.newpipe

https://lushka.al/posts/youtube-alternatives/

https://www.youtube.com/feed/history

https://www.youtube.com/watch?v=xabq4e-fJaU&pp=sAQA
https://www.youtube.com/watch?v=wNsIpF7g2lQ&pp=sAQA
https://www.youtube.com/watch?v=7Q7c0yvsLRc&pp=sAQA
https://www.youtube.com/watch?v=_AaOFCl2ihc&pp=sAQA
https://www.youtube.com/watch?v=mWfq1daZH8c&pp=sAQA
https://www.youtube.com/watch?v=eN4Lc0Arzww&pp=sAQA
https://www.youtube.com/watch?v=60z_hpEAtD8&pp=sAQA

There is the YouTube option, which I imagine no one would like (me
neither). The only thing in its favor is that Invidious can be used to
watch the videos. BTW, I watch YT videos through Invidious in Emacs,
with the Ytel package and EMMS/MPV.

https://news.ycombinator.com/item?id=34264487 Yark: Advanced and easy YouTube archiver now stable (github.com/owez)





#  Local Variables:
#  modes: (fundamental-mode emacs-lisp-mode)
#  coding:               utf-8-unix
#  End: