aboutsummaryrefslogtreecommitdiff
path: root/challenge-103/paulo-custodio/basic/ch-2.bas
blob: 18a8167af6b181bd18f73a4d09ed7af51a945a50 (plain)
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
' Challenge 103
'
' TASK #2 � What�s playing?
' Submitted by: Albert Croft
' Working from home, you decided that on occasion you wanted some background
' noise while working. You threw together a network streamer to continuously
' loop through the files and launched it in a tmux (or screen) session, giving
' it a directory tree of files to play. During the day, you connected an audio
' player to the stream, listening through the workday, closing it when done.
'
' For weeks you connect to the stream daily, slowly noticing a gradual drift of
' the media. After several weeks, you take vacation. When you return, you are
' pleasantly surprised to find the streamer still running. Before connecting,
' however, if you consider the puzzle of determining which track is playing.
'
' After looking at a few modules to read info regarding the media, a quick bit
' of coding gave you a file list. The file list is in a simple CSV format, each
' line containing two fields: the first the number of milliseconds in length,
' the latter the media�s title (this example is of several episodes available
' from the MercuryTheatre.info):
'
'     1709363,"Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)"
'     1723781,"Les Miserables Episode 2: Javert (broadcast date: 1937-07-30)"
'     1723781,"Les Miserables Episode 3: The Trial (broadcast date: 1937-08-06)"
'     1678356,"Les Miserables Episode 4: Cosette (broadcast date: 1937-08-13)"
'     1646043,"Les Miserables Episode 5: The Grave (broadcast date: 1937-08-20)"
'     1714640,"Les Miserables Episode 6: The Barricade (broadcast date: 1937-08-27)"
'     1714640,"Les Miserables Episode 7: Conclusion (broadcast date: 1937-09-03)"
' For this script, you can assume to be provided the following information:
'
'     * the value of $^T ($BASETIME) of the streamer script,
'     * the value of time(), and
'     * a CSV file containing the media to play consisting of the length in
' milliseconds and an identifier for the media (title, filename, or other).
' Write a program to output which file is currently playing. For purposes of
' this script, you may assume gapless playback, and format the output as you
' see fit.
'
' Optional: Also display the current position in the media as a time-like value.
'
' Example:
'
' Input: 3 command line parameters: start time, current time, file name
'
'     # Streamer start time: Tue Nov 23 12:22:03 2020
'     1606134123
'
'     # Current time:        Mon Mar  1 09:34:36 2021
'     1614591276
'
'     # filelist.csv
'
' Output:
'
'     "Les Miserables Episode 1: The Bishop (broadcast date: 1937-07-23)"
'     00:17:33

type TrackType
    secs as integer
    title as string
end type

redim shared tracks(1) as TrackType

sub read_tracks(filename as string)
    dim fn as integer, text as string, i as integer, p1 as integer, p2 as integer

    fn=FreeFile
    open filename for input as #fn
    do while not eof(fn)
        line input #fn, text
        if i>ubound(tracks) then redim preserve tracks(i)
        tracks(i).secs=val(text)/1000
        p1=instr(text,""""): p2=instr(p1+1,text,"""")
        tracks(i).title=mid(text,p1+1,p2-p1-1)
        i=i+1
    loop
end sub

function tracks_secs() as integer
    dim i as integer, secs as integer

    for i=0 to ubound(tracks)
        secs=secs+tracks(i).secs
    next
    tracks_secs=secs
end function

sub show_track(secs as integer)
    dim i as integer, hh as integer, mm as integer, ss as integer

    secs=secs mod tracks_secs()
    for i=0 to ubound(tracks)
        if secs<tracks(i).secs then     ' playing this title
            hh=int(secs/3600): secs=secs mod 3600
            mm=int(secs/60): secs=secs mod 60
            ss=secs

            print tracks(i).title
            print right("00"+trim(str(hh)),2);":";
            print right("00"+trim(str(mm)),2);":";
            print right("00"+trim(str(ss)),2)
            exit sub
        else
            secs=secs-tracks(i).secs
        end if
    next
end sub

' main
dim start_secs as integer, current_secs as integer, filename as string
start_secs=val(command(1))
current_secs=val(command(2))
filename=command(3)

read_tracks filename
show_track current_secs-start_secs