Browse Source

made everything work

master
wes 12 years ago
parent
commit
dbd042fdac
  1. 2
      config_parser.rkt
  2. 66
      lazyplay.rkt
  3. 5
      lazyplay.sexp

2
config_parser.rkt

@ -9,3 +9,5 @@
(define settings (make-hash))
(update settings parsed)
(provide settings)

66
lazyplay.rkt

@ -3,33 +3,36 @@
(require racket/system)
(require "helpers.rkt")
(require "config_parser.rkt")
(define args (vector->list (current-command-line-arguments)))
; args: filename, mplayer-args
; optional: directory
(define mplcmd (string->path "/usr/bin/mplayer")) ; command used to play files
; output file to /dev/null/
(hash-ref settings "args" "")
(define file-types (make-hash))
(define media-player (string->path (hash-ref settings "player" "/usr/bin/mplayer")))
(define player-args (hash-ref settings "args" ""))
(update file-types (hash-ref settings "file-types" '(("avi" #t))))
(define (file-list) ; list of files in the current working directory
(map path->string ; get the strings from the list of paths
(directory-list (current-directory))))
; check if a filename has a desired suffix
(define (check-suffix suffix)
(define (check-suffix file-types)
(compose
(partial string=? suffix)
(partial hash-has-key? file-types)
(lambda (x)
(let*
((len (string-length x) ))
(substring x (- len 3) len)))))
; filter out filenames without the desired suffix
(define (filter-paths suffix paths)
(filter (check-suffix suffix) paths))
(define (filter-paths file-types paths)
(filter (check-suffix file-types) paths))
(define (play-list)
(sort-paths (filter-paths (first args) (file-list)))) ; first commandline argument is the filename
(sort-paths (filter-paths file-types (file-list)))) ; first commandline argument is the filename
; sortgetter, gets the episode number and converts it to an integer
(define (sortgetter file-name)
@ -56,38 +59,47 @@
; (define (controller pid out)
(define (play-files filenames)
(define (play-files filenames args)
(let* ((nullport
(open-output-file (string->path "/dev/null") #:exists 'append))) ; we don't want any output from the process
(call-with-values
(lambda () (subprocess nullport #f nullport mplcmd (car filenames)))
(lambda () (subprocess nullport #f nullport media-player (car filenames) args))
list))) ; convert the 4 return values into a list
(define (play fnames played)
(define (get-args message)
(cond ((false? message) player-args)
(else message)))
(define (play fnames played args)
(cond ((null? fnames) '())
(else
(let* ((results (play-files fnames))) ; get the pid and the 3 i/o ports
(let* ((results (play-files fnames args))) ; get the pid and the 3 i/o ports
; send the other thread the new pid here
; and the output port for piping input to the process
; (thread-send thd (first results))
; (thread-send controller-thread ((third results) (first results)))
(subprocess-wait (first results))
(close-output-port (third results)))
(let* ((newfs (new-files played (play-list))))
(play (append (cdr fnames) newfs) (update played newfs))))))
(play (play-list) played)
(define (controller)
(let* ((input (read (current-input-port))))
(cond ((eof-object? input))
(play (append (cdr fnames) newfs) (update played newfs) (get-args (thread-try-receive)))))))
(define (controller player-thread)
(cond
((compose not thread-running?) player-thread ; if the thread is not running then return
'()))
(let* ((input (read-line (current-input-port) 'linefeed)))
input
(cond ((eof-object? input) '())
(else
(printf "output: ~A\n" input)
(controller)))))
(thread-send player-thread input)
(controller player-thread)))))
; (define (main)
; (printf "Beginning (main)\n")
; (thread controller))
; (sleep 1000)
(define player-thread (thread (lambda () (play (play-list) played player-args))))
(define controller-thread (thread (lambda () (controller player-thread))))
; check to see if the player is running, and if not then kill the controller
(define (check)
(sleep 20)
(cond (((compose not thread-running?) player-thread) (kill-thread controller-thread))
(else (check))))
; (main)
(check)

5
lazyplay.sexp

@ -1,2 +1,3 @@
(("player" "mplayer")
("filetypes" ("avi" "mp4")))
(("player" "/usr/bin/mplayer")
("filetypes" (("avi" #t) ("mp4" #t)))
("args" "-ss 5000"))