#lang racket/base (require racket/class racket-audio racket/list racket/path racket/string "base/media-container.rkt" "../misc/utils.rkt") (provide mc-filesystem%) (define mc-filesystem% (class media-container% (init-field library [relative-path '()]) (check/c mc-filesystem% relative-path list?) (define/private (full-path) (send library resolve-path relative-path)) (define/private (music-file-name? path) (let ((file-name (string-downcase (path->string path)))) (for/or ((extension (in-list (audio-known-exts?)))) (string-suffix? file-name (string-append "." extension))))) (define/private (item-kind path) (cond ((directory-exists? path) (let ((name (path->string (file-name-from-path path)))) (and (not (string-prefix? name ".")) 'container))) ((music-file-name? path) 'track) (else #f))) (define/override (get-title) (if (null? relative-path) (send (send library get-cfg) get-name) (path->string (last relative-path)))) (define/override (get-items) (let ((path (full-path))) (if (directory-exists? path) (for*/list ((entry (in-list (sort (directory-list path) path