98 lines
1.9 KiB
Racket
98 lines
1.9 KiB
Racket
#lang racket/base
|
|
|
|
(require net/url
|
|
racket/class
|
|
racket/string
|
|
"../../misc/utils.rkt")
|
|
|
|
(provide media-resource%
|
|
media-resource-file%)
|
|
|
|
(define media-resource%
|
|
(class object%
|
|
(init-field
|
|
uri
|
|
mime-type
|
|
protocol-info
|
|
seekable?)
|
|
|
|
(check/c* media-resource%
|
|
(uri string?)
|
|
(mime-type (or/c #f string?))
|
|
(protocol-info (or/c #f string?))
|
|
(seekable? boolean?))
|
|
|
|
(define/public (get-uri)
|
|
uri)
|
|
|
|
(define/public (get-mime-type)
|
|
mime-type)
|
|
|
|
(define/public (get-protocol-info)
|
|
protocol-info)
|
|
|
|
(define/public (is-seekable?)
|
|
seekable?)
|
|
|
|
(define/public (get-file)
|
|
#f)
|
|
|
|
(super-new)))
|
|
|
|
(define media-resource-file%
|
|
(class media-resource%
|
|
(init
|
|
file
|
|
mime-type
|
|
[seekable? #t])
|
|
|
|
(check/c media-resource-file%
|
|
file
|
|
(or/c path? string?))
|
|
|
|
(define resource-file
|
|
(normal-case-path
|
|
(path->complete-path file)))
|
|
|
|
(define/override (get-file)
|
|
resource-file)
|
|
|
|
(super-new
|
|
[uri
|
|
(url->string
|
|
(path->url resource-file))]
|
|
[mime-type mime-type]
|
|
[protocol-info
|
|
(and mime-type
|
|
(format "file:*:~a:*" mime-type))]
|
|
[seekable? seekable?])))
|
|
|
|
(module+ test
|
|
(require rackunit)
|
|
|
|
(define resource
|
|
(new media-resource-file%
|
|
[file
|
|
(build-path
|
|
(find-system-path 'temp-dir)
|
|
"track.flac")]
|
|
[mime-type "audio/flac"]))
|
|
|
|
(check-true
|
|
(is-a? resource media-resource%))
|
|
(check-true
|
|
(is-a? resource media-resource-file%))
|
|
(check-true
|
|
(path? (send resource get-file)))
|
|
(check-true
|
|
(string-prefix? (send resource get-uri)
|
|
"file:"))
|
|
(check-equal?
|
|
(send resource get-mime-type)
|
|
"audio/flac")
|
|
(check-equal?
|
|
(send resource get-protocol-info)
|
|
"file:*:audio/flac:*")
|
|
(check-true
|
|
(send resource is-seekable?)))
|