#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-cilog) (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?)))