You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.1 KiB
106 lines
3.1 KiB
#! /usr/bin/env racket
|
|
#lang racket
|
|
|
|
(require racket/system)
|
|
|
|
(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/
|
|
|
|
(define (partial f x)
|
|
(lambda (y) (f x y)))
|
|
|
|
(define (flip f)
|
|
(lambda (y x) (f x y)))
|
|
|
|
(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)
|
|
(compose
|
|
(partial string=? suffix)
|
|
(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 (play-list)
|
|
(sort-paths (filter-paths (first args) (file-list)))) ; first commandline argument is the filename
|
|
|
|
; sortgetter, gets the episode number and converts it to an integer
|
|
(define (sortgetter file-name)
|
|
(string->number
|
|
(second (regexp-match #rx"E([0-9])*" file-name))))
|
|
|
|
; sort the paths
|
|
(define (sort-paths paths)
|
|
(sort paths <
|
|
#:key sortgetter))
|
|
|
|
; abusing hash tables to be sets
|
|
(define played
|
|
(let* ((table (make-hash)))
|
|
(map (lambda (fname)
|
|
(hash-set! table fname #t)) (play-list))
|
|
table))
|
|
|
|
; updates a hashtable with a bunch of filenames
|
|
; (update played (list "one" "two"))
|
|
(define (update htable fnames)
|
|
(cond ((null? fnames) htable)
|
|
(else (map (lambda (fname)
|
|
(hash-set! htable fname #f)) fnames)
|
|
htable)))
|
|
|
|
; list of new files that have been seen
|
|
(define (new-files sett files)
|
|
(filter
|
|
(compose not (partial hash-has-key? played))
|
|
files))
|
|
|
|
; (define (controller pid out)
|
|
|
|
(define (play-files filenames)
|
|
(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)))
|
|
list))) ; convert the 4 return values into a list
|
|
|
|
(define (play fnames played)
|
|
(cond ((null? fnames) '())
|
|
(else
|
|
(let* ((results (play-files fnames))) ; 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))
|
|
(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))
|
|
(else
|
|
(printf "output: ~A\n" input)
|
|
(controller)))))
|
|
|
|
|
|
; (define (main)
|
|
; (printf "Beginning (main)\n")
|
|
; (thread controller))
|
|
; (sleep 1000)
|
|
|
|
|
|
; (main)
|
|
|