diff options
Diffstat (limited to 'livie-channel.el')
-rw-r--r-- | livie-channel.el | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/livie-channel.el b/livie-channel.el new file mode 100644 index 0000000..ebf0e22 --- /dev/null +++ b/livie-channel.el @@ -0,0 +1,146 @@ +;;; livie-channel.el --- Auxiliary major mode for livie -*- lexical-binding: t; -*- + +;; Copyright (C) 2018 - 2021 + +;;; Authors: + +;; Charlie Ritter <chewzerita@posteo.net> +;; Jesus E. <heckyel@hyperbola.info> +;; Gabriele Rastello <gabriele.rastello@edu.unito.it> +;; Pablo BC <pablo.barraza@protonmail.com> + +;;; Commentary: + +;; livie grabs a list of youtube videos based on a search. +;; the user can then select a video to watch through `livie-player' + +;;; Code: + +(defcustom livie-channel-sort-criterion "newest" + "Sort videos by 'newest', 'oldest', or 'popular', as used by `livie-channel-search'." + :type 'string + :options '("newest" "oldest" "popular") + :group 'livie-channel) + +(defvar livie-channel-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map text-mode-map) + (define-key map "h" #'describe-mode) + (define-key map "q" #'livie--quit-channel-buffer) + (define-key map ">" #'livie-channel-next-page) + (define-key map "<" #'livie-channel-previous-page) + (define-key map (kbd "<tab>") #'next-line) + (define-key map (kbd "<backtab>") #'previous-line) + (define-key map "S" #'livie-channel-sort-videos) + (define-key map (kbd "RET") #'livie-open-entry) + (define-key map "y" #'livie-watch-this-video) + map) + "Keymap for `livie-channel-mode'.") + +(define-derived-mode livie-channel-mode livie-mode + "livie-channel-mode" + "Mode for displaying livie-channel-videos. +\\{livie-channel-mode-map}" + (buffer-disable-undo) + (make-local-variable 'livie-videos) + (make-local-variable 'livie-channel-author) + (setq-local livie-type-of-results "video") + (setf buffer-read-only t)) + +(defun livie--channel-query (uid n sort) + "Query youtube for UID videos, return the Nth page of results, sorted bv SORT." + (let ((videos (livie--API-call (concat "channels/videos/" uid) + `(("page" ,n) + ("sort_by" ,sort) + ("fields" ,livie-default-video-query-fields))))) + (dotimes (i (length videos)) + (let ((v (aref videos i))) + (aset videos i + (livie-video--create :title (assoc-default 'title v) + :author (assoc-default 'author v) + :authorId (assoc-default 'authorId v) + :length (assoc-default 'lengthSeconds v) + :id (assoc-default 'videoId v) + :views (assoc-default 'viewCount v) + :published (assoc-default 'published v))))) + videos)) + +(defun livie-channel () + "Open a buffer for the channel of the current entry." + (let* ((entry (livie-get-current-video)) + (author (funcall (livie--get-author-function entry) entry)) + (authorId (funcall (livie--get-authorId-function entry) entry))) + (get-buffer-create author) + (switch-to-buffer author) + (unless (eq major-mode 'livie-channel-mode) + (livie-channel-mode)) + (setf livie-channel-author author) + (setf livie-search-term authorId) + (livie-channel-get-videos authorId))) + +(defun livie-channel-get-videos (authorId) + "Fetch videos from AUTHORID." + (setf livie-current-page 1) + (setf livie-videos (livie--channel-query authorId livie-current-page livie-channel-sort-criterion)) + (livie--draw-channel-buffer)) + +(defun livie-channel-next-page () + "Fetch videos from AUTHORID." + (interactive) + (setf livie-current-page (1+ livie-current-page)) + (setf livie-videos (livie--channel-query livie-search-term livie-current-page livie-channel-sort-criterion)) + (livie--draw-channel-buffer)) + +(defun livie-channel-previous-page () + "Fetch videos from AUTHORID." + (interactive) + (when (> livie-current-page 1) + (setf livie-current-page (1- livie-current-page)) + (setf livie-videos (livie--channel-query livie-search-term livie-current-page livie-channel-sort-criterion)) + (livie--draw-channel-buffer))) + +(defun livie-channel-sort-videos () + "Sort videos from the current channel, either by newest (default), oldest, or popular." + (interactive) + (setf livie-channel-sort-criterion (completing-read "Sort videos by (default value is newest): " (get 'livie-channel-sort-criterion 'custom-options))) + (setf livie-current-page 1) + (setf livie-videos (livie--channel-query livie-search-term livie-current-page livie-channel-sort-criterion)) + (livie--draw-channel-buffer)) + +(defun livie--insert-channel-video (video) + "Insert VIDEO in the current buffer." + (insert (livie--format-video-published (livie-video-published video)) + " " + (livie--format-title (livie-video-title video)) + " " + (livie--format-video-length (livie-video-length video)) + " " + (livie--format-video-views (livie-video-views video)))) + +(defun livie--draw-channel-buffer () + "Draws the livie channel buffer i.e. clear everything and write down all videos in `livie-videos'." + (let ((inhibit-read-only t) + (current-line (line-number-at-pos))) + (erase-buffer) + (setq header-line-format (concat "Displaying videos from " (propertize livie-channel-author 'face 'livie-parameter-face) + ", page " + (propertize (number-to-string livie-current-page) 'face 'livie-parameter-face) + ", sorted by: " + (propertize livie-channel-sort-criterion 'face 'livie-parameter-face))) + (seq-do (lambda (v) + (livie--insert-channel-video v) + (insert "\n")) + livie-videos) + (goto-char (point-min)))) + +(defun livie--quit-channel-buffer () + "Deletes the current buffer." + (interactive) + (kill-buffer (current-buffer))) + +(provide 'livie-channel) + +;; Local Variables: +;; byte-compile-warnings: (not free-vars) +;; End: +;;; livie-channel.el ends here |