Complete refactoring for rktplayer, in order to make it play on DLNA renderers and also use UpNP media server resources.
This commit is contained in:
@@ -0,0 +1,205 @@
|
||||
#lang racket/base
|
||||
|
||||
(require racket/class
|
||||
"booklet-provider.rkt"
|
||||
"image-provider.rkt"
|
||||
"media-item.rkt"
|
||||
"media-resource.rkt"
|
||||
"tag-data-provider.rkt"
|
||||
"../track-tag-data.rkt"
|
||||
"../../misc/utils.rkt")
|
||||
|
||||
(provide track<%>
|
||||
track%)
|
||||
|
||||
(define track<%>
|
||||
(interface ((class->interface media-item%))
|
||||
get-title
|
||||
get-artist
|
||||
get-album
|
||||
get-number
|
||||
get-length
|
||||
get-resource
|
||||
get-music-library-factory-id
|
||||
get-track-factory-id
|
||||
get-track-relive-info
|
||||
has-image?
|
||||
image->file
|
||||
image->mimetype
|
||||
has-booklet?
|
||||
booklet-file
|
||||
track<
|
||||
->log))
|
||||
|
||||
(define next-track-id
|
||||
0)
|
||||
|
||||
(define (new-track-id)
|
||||
(set! next-track-id (+ next-track-id 1))
|
||||
(when (> next-track-id 10000000)
|
||||
(set! next-track-id 1))
|
||||
next-track-id)
|
||||
|
||||
(define track%
|
||||
(class* media-item% (track<%>)
|
||||
(init
|
||||
tag-data-provider
|
||||
image-provider
|
||||
booklet-provider
|
||||
resource
|
||||
[id #f]
|
||||
[music-library-factory-id #f]
|
||||
[track-factory-id #f]
|
||||
[track-relive-info #f])
|
||||
|
||||
(check/c* track%
|
||||
(tag-data-provider
|
||||
(is-a?/c tag-data-provider%))
|
||||
(image-provider
|
||||
(is-a?/c image-provider%))
|
||||
(booklet-provider
|
||||
(is-a?/c booklet-provider%))
|
||||
(resource
|
||||
(is-a?/c media-resource%)))
|
||||
|
||||
(define the-tag-data-provider
|
||||
tag-data-provider)
|
||||
|
||||
(define the-image-provider
|
||||
image-provider)
|
||||
|
||||
(define the-booklet-provider
|
||||
booklet-provider)
|
||||
|
||||
(define the-resource
|
||||
resource)
|
||||
|
||||
(define the-music-library-factory-id
|
||||
music-library-factory-id)
|
||||
|
||||
(define the-track-factory-id
|
||||
track-factory-id)
|
||||
|
||||
(define the-track-relive-info
|
||||
track-relive-info)
|
||||
|
||||
(define/private (get-tag-data)
|
||||
(send the-tag-data-provider get-tag-data))
|
||||
|
||||
(define/public (get-title)
|
||||
(track-tag-data-title (get-tag-data)))
|
||||
|
||||
(define/public (get-artist)
|
||||
(track-tag-data-artist (get-tag-data)))
|
||||
|
||||
(define/public (get-album)
|
||||
(track-tag-data-album (get-tag-data)))
|
||||
|
||||
(define/public (get-number)
|
||||
(track-tag-data-number (get-tag-data)))
|
||||
|
||||
(define/public (get-length)
|
||||
(track-tag-data-length (get-tag-data)))
|
||||
|
||||
(define/public (get-resource)
|
||||
the-resource)
|
||||
|
||||
(define/public (get-music-library-factory-id)
|
||||
the-music-library-factory-id)
|
||||
|
||||
(define/public (get-track-factory-id)
|
||||
the-track-factory-id)
|
||||
|
||||
(define/public (get-track-relive-info)
|
||||
the-track-relive-info)
|
||||
|
||||
(define/public (has-image?)
|
||||
(send the-image-provider has-image?))
|
||||
|
||||
(define/public (image->file target-file)
|
||||
(send the-image-provider image->file target-file))
|
||||
|
||||
(define/public (image->mimetype)
|
||||
(send the-image-provider image->mimetype))
|
||||
|
||||
(define/public (has-booklet?)
|
||||
(send the-booklet-provider has-booklet?))
|
||||
|
||||
(define/public (booklet-file)
|
||||
(send the-booklet-provider booklet-file))
|
||||
|
||||
(define/public (track< other-track)
|
||||
(if (string-ci<? (send this get-album)
|
||||
(send other-track get-album))
|
||||
#t
|
||||
(and (string-ci=? (send this get-album)
|
||||
(send other-track get-album))
|
||||
(< (send this get-number)
|
||||
(send other-track get-number)))))
|
||||
|
||||
(define/public (->log)
|
||||
(info-rktplayer "~a - ~a - ~a - ~a"
|
||||
(send this get-number)
|
||||
(send this get-title)
|
||||
(send this get-album)
|
||||
(send this get-length)))
|
||||
|
||||
(super-new
|
||||
[id (if id id (new-track-id))]
|
||||
[kind 'track])))
|
||||
|
||||
(module+ test
|
||||
(require rackunit)
|
||||
|
||||
(define test-tag-data-provider%
|
||||
(class tag-data-provider%
|
||||
(define/override (get-tag-data)
|
||||
(track-tag-data
|
||||
"Title"
|
||||
"Artist"
|
||||
"Album"
|
||||
2
|
||||
120))
|
||||
(super-new)))
|
||||
|
||||
(define test-image-provider%
|
||||
(class image-provider%
|
||||
(define/override (has-image?) #f)
|
||||
(define/override (image->file target-file) #f)
|
||||
(define/override (image->mimetype) 'no-mimetype)
|
||||
(super-new)))
|
||||
|
||||
(define test-booklet-provider%
|
||||
(class booklet-provider%
|
||||
(define/override (has-booklet?) #f)
|
||||
(define/override (booklet-file) #f)
|
||||
(super-new)))
|
||||
|
||||
(define resource
|
||||
(new media-resource%
|
||||
[uri "https://example.com/track.flac"]
|
||||
[mime-type "audio/flac"]
|
||||
[protocol-info "http-get:*:audio/flac:*"]
|
||||
[seekable? #t]))
|
||||
|
||||
(define track
|
||||
(new track%
|
||||
[resource resource]
|
||||
[tag-data-provider
|
||||
(new test-tag-data-provider%)]
|
||||
[image-provider
|
||||
(new test-image-provider%)]
|
||||
[booklet-provider
|
||||
(new test-booklet-provider%)]))
|
||||
|
||||
(check-true (is-a? track track%))
|
||||
(check-true (is-a? track track<%>))
|
||||
(check-equal? (send track get-kind) 'track)
|
||||
(check-equal? (send track get-title) "Title")
|
||||
(check-equal? (send track get-artist) "Artist")
|
||||
(check-equal? (send track get-album) "Album")
|
||||
(check-equal? (send track get-number) 2)
|
||||
(check-equal? (send track get-length) 120)
|
||||
(check-eq? (send track get-resource) resource)
|
||||
(check-false (send track has-image?))
|
||||
(check-false (send track has-booklet?)))
|
||||
Reference in New Issue
Block a user