diff options
Diffstat (limited to 'challenge-103/paulo-custodio/lua/ch-2.lua')
| -rw-r--r-- | challenge-103/paulo-custodio/lua/ch-2.lua | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/challenge-103/paulo-custodio/lua/ch-2.lua b/challenge-103/paulo-custodio/lua/ch-2.lua new file mode 100644 index 0000000000..955beca20e --- /dev/null +++ b/challenge-103/paulo-custodio/lua/ch-2.lua @@ -0,0 +1,97 @@ +#!/usr/bin/env lua + +--[[ +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 +--]] + +start_secs = tonumber(arg[1]) +current_secs = tonumber(arg[2]) +playlist_file = arg[3] + +-- read playlist +playlist = {} +playlist_total_secs = 0 +for line in io.lines(playlist_file) do + local ms, title = line:match('%s*(.-),%s*"(.-)"') + local secs = math.floor(tonumber(ms)/1000+0.5) + table.insert(playlist, { secs, title }) + playlist_total_secs = playlist_total_secs + secs +end + +-- compute location +total_secs = current_secs - start_secs +playlist_secs = total_secs % playlist_total_secs + +-- find current track +for k, v in pairs(playlist) do + local secs, title = v[1], v[2] + if playlist_secs < secs then -- playing this title + io.write(title, "\n") + + local hh = math.floor(playlist_secs / 3600) + playlist_secs = playlist_secs % 3600 + local mm = math.floor(playlist_secs / 60) + playlist_secs = playlist_secs % 60 + local ss = playlist_secs + + io.write(string.format("%02d:%02d:%02d", hh, mm, ss), "\n") + break + else + playlist_secs = playlist_secs - secs + end +end |
