-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathitunes.rkt
76 lines (62 loc) · 2.32 KB
/
itunes.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#lang racket
(require racket/dict)
(require xml/plist)
(require racket/generic)
(define-struct it-track (id name genre album album-artist artist apple-music transfer
spotify-id)
#:mutable)
(define (print-it-track itt)
(printf "iTTrack: \"~a\", \"~a\", \"~a\"\n"
(it-track-name itt)
(it-track-artist itt)
(it-track-album itt)))
(define (pl-track->it-track pl-track)
(it-track (dict-ref pl-track "Track ID" 0)
(dict-ref pl-track "Name" "")
(dict-ref pl-track "Genre" "")
(dict-ref pl-track "Album" "")
(dict-ref pl-track "Album Artist" "")
(dict-ref pl-track "Artist" "")
(dict-ref pl-track "Apple Music" #f)
#t ""))
(define-struct it-playlist (id name description tracks))
(define (pl-playlist->it-playlist pl-playlist)
(define (extract-id track-id-entry)
(dict-ref track-id-entry "Track ID" 0))
(it-playlist (dict-ref pl-playlist "Playlist ID" 0)
(dict-ref pl-playlist "Name" "")
(dict-ref pl-playlist "Description" "")
(map extract-id (dict-ref pl-playlist "Playlist Items" empty))))
(define (read-plist-file file-name)
(define plist-file (open-input-file file-name))
(define plist-data (read-plist plist-file))
(close-input-port plist-file)
plist-data)
(define pl-expr->value
(match-lambda
[(? string? s) s]
[(list 'true) #t]
[(list 'false) #f]
[(list 'integer i) i]
[(list 'real r) r]
[(list 'date s) s] ; treat dates as strings
[(list 'data s) s]
[(list 'array pl-expr ...)
(map pl-expr->value pl-expr)]
[(list 'dict assoc-pair ...)
(define (assoc-pair-add ap dict)
(match-define (list 'assoc-pair string pl-expr) ap)
(dict-set dict string (pl-expr->value pl-expr)))
(foldl assoc-pair-add empty assoc-pair)]))
(define (get-track-dict itdata)
(dict-ref itdata "Tracks" empty))
(define (get-playlist-dict itdata)
(dict-ref itdata "Playlists" empty))
(define (make-ittrack-dict track-dict)
(map (lambda (pl-track-entry)
(define track (pl-track->it-track (cdr pl-track-entry)))
(cons (it-track-id track) track))
track-dict))
(define (make-itplaylist-list pl-playlist-list)
(map pl-playlist->it-playlist pl-playlist-list))
(provide (all-defined-out))