summaryrefslogblamecommitdiffstats
path: root/emacsconf-stream.el
blob: 26f62e60e34ed66189dbcbc05f860c99da4ba930 (plain) (tree)





































































                                                                                                          

                                              













































                                                                                                                                
;;; emacsconf-stream.el --- Play files and update streaming information  -*- lexical-binding: t; -*-

;; Copyright (C) 2022  Sacha Chua

;; Author: Sacha Chua <sacha@sachachua.com>
;; Keywords: multimedia

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <https://www.gnu.org/licenses/>.

;;; Commentary:

;; 

;;; Code:

(defvar emacsconf-stream-dir "/data/emacsconf/stream/"
  "Directory where the stream versions are.
Files should be in YEAR/video-slug--main.webm and video-slug--main.vtt.")
(defvar emacsconf-stream-host "res.emacsconf.org")

(defun emacsconf-stream-track-login (track)
  "Return user@host for the track."
  (when (plist-get track :track)
    (setq track (emacsconf-get-track (plist-get track :track))))
  (concat emacsconf-id "-" (plist-get track :id) "@" emacsconf-stream-host))

(defvar emacsconf-stream-bottom-limit 80
  "Number of characters for bottom text.")

(defun emacsconf-stream-write-news (track message)
  (interactive (list (emacsconf-complete-track) (read-string "Message: ")))
  (with-temp-file (expand-file-name "news.txt" (concat "/ssh:" (emacsconf-stream-track-login track) ":~"))
    (insert message)))

(defun emacsconf-stream-broadcast (message)
  (interactive (list (read-string "Message: ")))
  (mapc (lambda (track) (emacsconf-stream-write-news track message)) emacsconf-tracks))

(defun emacsconf-stream-clear-talk-info (track)
  (interactive (list (emacsconf-complete-track)))
  (emacsconf-stream-set-talk-info-from-strings track "" ""))

(defun emacsconf-stream-clear-track (track)
  (interactive (list (emacsconf-complete-track)))
  (emacsconf-stream-set-talk-info-from-strings track "" "")
  (emacsconf-stream-write-news track ""))

(defun emacsconf-stream-clear-all ()
  (interactive)
  (mapc #'emacsconf-stream-clear-track emacsconf-tracks))

(defun emacsconf-stream-set-talk-info-from-strings (track url bottom)
  (interactive (list (emacsconf-complete-track) (read-string "URL: ") (read-string "Bottom: ")))
  (let* ((home (concat "/ssh:" (emacsconf-stream-track-login track) ":~")))
    (with-temp-file (expand-file-name "url.txt" home) (insert url))
    (with-temp-file (expand-file-name "bottom.txt" home) (insert bottom))))

(defun emacsconf-stream-set-talk-info (talk)
  (interactive (list (emacsconf-complete-talk-info)))
  (emacsconf-stream-set-talk-info-from-strings
   (emacsconf-get-track talk)
   (concat (replace-regexp-in-string "^.*//" "" emacsconf-base-url)
           (plist-get talk :url))
   (concat (cond
        ((or (null (plist-get talk :pronouns)) (string= (plist-get talk :pronouns) "nil"))
         (plist-get talk :speakers))
        ((string-match ", " (plist-get talk :pronouns))
         (plist-get talk :pronouns))
        (t (format "%s (%s)"
                   (plist-get talk :speakers)
                   (plist-get talk :pronouns))))    
       "\n"    
       (cond
        ((string-match "live" (plist-get talk :q-and-a))
         "Q&A: live - see talk page for URL")
        ((string-match "irc" (plist-get talk :q-and-a))
         (format "Q&A: IRC (#%s) - speaker nick: %s"
                 (plist-get track :channel)
                 (plist-get talk :irc)))
        (t "")))))

(defun emacsconf-stream-update-talk-info-org-after-todo-state-change ()
  "Update talk info."
  (when (string= org-state "PLAYING")
    (emacsconf-stream-write-talk-info (emacsconf-get-talk-info-for-subtree))))

(defun emacsconf-stream-play-talk-org-after-todo-state-change ()
  "Play the talk."
  (when (string= org-state "PLAYING")
    (emacsconf-stream-play-video (emacsconf-get-talk-info-for-subtree))))

(defun emacsconf-stream-get-filename (talk)
  "Return the local filename for the video file for TALK.
Final files should be stored in /data/emacsconf/stream/YEAR/video-slug--main.webm."
  (expand-file-name
   (concat (plist-get talk :video-slug) "--main.webm")
   (expand-file-name emacsconf-year
                     emacsconf-stream-dir)))

(defun emacsconf-stream-play-video (talk)
  (interactive (list (emacsconf-complete-talk-info)))
  (start-process (concat "mpv-" (plist-get talk :slug))
                 "test"
                 "ssh" (emacsconf-stream-track-login talk) "nohup" "~/bin/track-mpv" (emacsconf-stream-get-filename talk)  "&"))

(provide 'emacsconf-stream)
;;; emacsconf-stream.el ends here