Update README.
Update doc stings.
Enhance formatting functions.
ytel
is an experimental YouTube "frontend" for Emacs. It's goal is to allow the user to collect
the results of a YouTube search in an elfeed-like buffer and then manipulate them with Emacs
Lisp. The gif below shows that ytel
can be used to play videos in an external player, to learn how
to emulate it refer to the usage section below.
This project was inspired by elfeed and Invidious (it does indeed use the Invidious APIs).
This project is on MELPA: you should be able to M-x package-install RET ytel
. Another option is to clone this repository under your load-path
.
ytel
as of version 0.2.0 depends on plz
Once everything is loaded M-x ytel
creates a new buffer and puts it in ytel-mode
. This major
mode has just a few bindings (for now):
key | binding |
---|---|
n | next-line |
p | previous-line |
q | ytel-quit |
s | ytel-search |
> | ytel-search-next-page |
< | ytel-search-previous-page |
Pressing s
will prompt for some search terms and populate the buffer once the results are
available. One can access information about a video via the function ytel-get-current-video
that
returns the video at point. Videos returned by ytel-get-current-video
are cl-structures so you can
access their fields with the ytel-video-*
functions. Currently videos have four fields:
field | description |
---|---|
id |
the video's id |
title |
the video's title |
author |
name of the author of the video |
authorId |
id of the channel that updated the video |
length |
length of the video in seconds |
views |
number of views |
published |
date of publication (unix-style timestamp) |
With this information we can implement a function to stream a video in mpv
(provided you have youtube-dl
installed) as follows:
(defun ytel-watch ()
"Stream video at point in mpv."
(interactive)
(let* ((video (ytel-get-current-video))
(id (ytel-video-id video)))
(start-process "ytel mpv" nil
"mpv"
(concat "https://www.youtube.com/watch?v=" id))
"--ytdl-format=bestvideo[height<=?720]+bestaudio/best")
(message "Starting streaming..."))
And bind it to a key in ytel-mode
with
(define-key ytel-mode-map "y" #'ytel-watch)
This is of course just an example. You can similarly implement functions to:
by relying on the correct external tool.
It is also possible to customize the sorting criterion of the results by setting the variable ytel-sort-criterion
to one of the following symbols relevance
, rating
, upload_date
or view_count
.
The default value is relevance
.
ytel
does not use the official YouTube APIs but relies on the
Invidious APIs (that in turn circumvent YouTube ones). The
variable ytel-invidious-api-url
points to the invidious instance (by default https://invidio.us
)
to use; you might not need to ever touch this, but if invidio.us goes down
keep in mind that you can choose another
instance. Moreover the default Invidious
instance is generally speaking stable, but sometimes your ytel-search
might hang; in that case
C-g
and retry.
Currently some wide unicode characters (such as Chinese/Japanese/Korean characters) are very
likely to mess up the *ytel*
buffer. The messing up is not that bad but things will not be
perfectly aligned. Fixing this problem will most likely require a rewrite of how the ytel buffer is
actually drawn. We're (somewhat) working on it.
There's an extension to browse comments and video information.
Feel free to open an issue or send a pull request. I'm quite new to writing Emacs packages so any help is appreciated.
One can easily subscribe to YouTube channels via an RSS feed and access it in Emacs via elfeed but sometimes I want to search YouTube for videos of people I don't necessarily follow (e.g. for searching a tutorial, or music, or wasting some good time) and being able to do that without switching to a browser is nice.
First of all those packages require you to get a Google API key, while ytel
uses the
Invidious APIs that in turn do not use the official Google
APIs.
Moreover those packages are designed to select a YouTube search result and play it directly in your browser while ytel
is really a way to collect search results in an elfeed
-like buffer and make them accessible to the user via functions such as ytel-get-current-video
so the user gets to decide what to to with them.