From cddb4db941e3a476121e6164e4ead5a1c0b3c8f1 Mon Sep 17 00:00:00 2001 From: dreamer Date: Sat, 26 Sep 2020 01:43:34 +0200 Subject: [PATCH] slight improvements and some retrieval endpoints --- code/app.lua | 160 ++-------------------------- code/handlers/splhandler.lua | 175 +++++++++++++++++++++++++++++++ code/handlers/stationhandler.lua | 63 +++++++++++ code/handlers/trackhandler.lua | 56 ++++++++++ code/models/airtimes.lua | 2 +- code/{ => models}/models.lua | 0 6 files changed, 306 insertions(+), 150 deletions(-) create mode 100644 code/handlers/splhandler.lua create mode 100644 code/handlers/stationhandler.lua create mode 100644 code/handlers/trackhandler.lua rename code/{ => models}/models.lua (100%) diff --git a/code/app.lua b/code/app.lua index b6ad9e2..b8a3698 100644 --- a/code/app.lua +++ b/code/app.lua @@ -1,13 +1,14 @@ local lapis = require("lapis") local config = require("lapis.config").get() local to_json = require("lapis.util").to_json +local json_params = require("lapis.application").json_params local db = require("lapis.db") local app = lapis.Application() local autoload = require("lapis.util").autoload local models = autoload("models") - +local handlers = autoload("handlers") app:get("/", function(self) -- return "Welcome to Lapis " .. require("lapis.version") @@ -16,154 +17,15 @@ app:get("/", function(self) end) app:match("/spl/:station", function(self) - -- print( to_json(self.params)) - - -- artist_name=%a& - -- track_name=%t& - -- release_name=%T - -- label=%L& - -- year=%Y& - -- country=%O& - -- info_url=%U1& - -- img_url=%U2& - -- time=%h& - -- date=%d& - - -- artist_name=%a&track_name=%t&release_name=%Tlabel=%L&year=%Y&country=%O&info_url=%U1&img_url=%U2&time=%h&date=%d& - - -- ----- -- - -- setup -- - -- ----- -- - - local station_id = self.params.station - - local station = models.Stations:find({ station = station_id }) - if not station then - print("unknown station: " .. station_id) - else - print("This is: " .. station["name"]) - end - - local artist = nil - local artist_name = self.params.artist_name - - local track = nil - local track_name = self.params.track_name - local track_info_url = self.params.info_url - local track_img_url = self.params.img_url - - local release = nil - local release_name = self.params.release_name - local release_year = self.params.year - local release_country = self.params.country - local release_label = self.params.label - - local airtime = self.params.time - local airdate = self.params.date - - -- we have to split the `hr:min:sec` and `month/day/year` strings from SPL - local function Split(s, delimiter) - local result = {} - for match in (s..delimiter):gmatch("(.-)"..delimiter) do - table.insert(result, match) - end - return result - end - - local split_airtime = Split(airtime, ":") - local airtime_hr, airtime_min, airtime_sec = split_airtime[1], split_airtime[2], split_airtime[3] - local split_airdate = Split(airdate, "/") - local airdate_month, airdate_day, airdate_year = split_airdate[1], split_airdate[2], split_airdate[3] - local airtime_stamp = os.time{year=airdate_year, month=airdate_month, day=airdate_day, hour=airtime_hr, min=airtime_min, sec=airtime_sec} - - - -- ------- -- - -- queries -- - -- ------- -- - - artist = models.Artists:find({ name=artist_name }) - if not artist then - print("new artist: " .. artist_name) - artist = models.Artists:create({ - name = artist_name - }) - else - print("old artist.") - end - - -- make a unique name/identifier for the track using a combination of artist_name and track_name - -- in lower-case and spaces removed - local unique_track_name = artist_name .. track_name -- prepend artist - unique_track_name = unique_track_name:lower() -- all to lowercase - unique_track_name = unique_track_name:gsub("%s+", "") -- remove spaces - - track = models.Tracks:find({ unique_name=unique_track_name }) - if not track then - print("new track: " .. track_name) - track = models.Tracks:create({ - name = track_name, - unique_name = unique_track_name, - year = tonumber(release_year), - info_url = track_info_url, - img_url = track_img_url - }) - else - print("old track.") - end - - -- track_artist - local track_artist = models.Trackartists:find({ track=track["id"], artist=artist["id"] }) - if not track_artist then - print("new track artist") - track_artist = models.Trackartists:create({ - track=track["id"], - artist=artist["id"] - }) - end - - -- airtime - local airtime = models.Airtimes:find({ - airtime = db.format_date(airtime_stamp), - tracks = track["id"], - stations = station["id"] - }) - if not airtime then - airtime = models.Airtimes:create({ - airtime = db.format_date(airtime_stamp), - tracks = track["id"], - stations = station["id"] - }) - else - print("already have this airtime! wtf??") - end - - -- release - if release_name:len() > 0 then - release = models.Releases:find({ name=release_name }) - if not release then - print("new release: " .. release_name) - release = models.Releases:create({ - name = release_name, - year = tonumber(release_year), - country = release_country, - label = release_label - }) - - else - print("old release.") - end - - local track_release = models.Trackreleases:find({ track=track["id"], release=release["id"] }) - if not track_release then - track_release = models.Trackreleases:create({ track=track["id"], release=release["id"] }) - end - - else - print("no release, skipping") - end - - - + return handlers.Splhandler(self) end) +app:match("/station/:station", json_params(function(self) + return handlers.Stationhandler(self) +end)) + +app:match("/track/:track", json_params(function(self) + return handlers.Trackhandler(self) +end)) + return app diff --git a/code/handlers/splhandler.lua b/code/handlers/splhandler.lua new file mode 100644 index 0000000..9559241 --- /dev/null +++ b/code/handlers/splhandler.lua @@ -0,0 +1,175 @@ +local db = require("lapis.db") + +local autoload = require("lapis.util").autoload +local models = autoload("models") + +function Splhandler(self) + -- print( to_json(self.params)) + + -- TODO: add auth-token + + -- artist_name=%a& + -- track_name=%t& + -- release_name=%T + -- label=%L& + -- year=%Y& + -- country=%O& + -- info_url=%U1& + -- img_url=%U2& + -- time=%h& + -- date=%d& + + -- artist_name=%a&track_name=%t&release_name=%Tlabel=%L&year=%Y&country=%O&info_url=%U1&img_url=%U2&time=%h&date=%d& + + -- ----- -- + -- setup -- + -- ----- -- + + local station_id = self.params.station + + local station = models.Stations:find({ station = station_id }) + if not station then + print("unknown station: " .. station_id) + else + print("This is: " .. station["name"]) + end + + local artist = nil + local artist_name = self.params.artist_name -- mandatory + + local track = nil + local track_name = self.params.track_name -- mandatory + local track_info_url = nil + if self.params.info_url then + track_info_url = self.params.info_url + end + local track_img_url = nil + if self.params.img_url then + track_img_url = self.params.img_url + end + + local release = nil + local release_name = nil + if self.params.release_name then + release_name = self.params.release_name + end + local release_year = nil + if self.params.year then + release_year = tonumber(self.params.year) + end + local release_country = nil + if self.params.country then + release_country = self.params.country + end + local release_label = nil + if self.params.label then + release_label = self.params.label + end + + local airtime = self.params.time -- mandatory + local airdate = self.params.date -- mandatory + + -- we have to split the `hr:min:sec` and `month/day/year` strings from SPL + local function Split(s, delimiter) + local result = {} + for match in (s..delimiter):gmatch("(.-)"..delimiter) do + table.insert(result, match) + end + return result + end + + local split_airtime = Split(airtime, ":") + local airtime_hr, airtime_min, airtime_sec = split_airtime[1], split_airtime[2], split_airtime[3] + local split_airdate = Split(airdate, "/") + local airdate_month, airdate_day, airdate_year = split_airdate[1], split_airdate[2], split_airdate[3] + local airtime_stamp = os.time{year=airdate_year, month=airdate_month, day=airdate_day, hour=airtime_hr, min=airtime_min, sec=airtime_sec} + + + -- ------- -- + -- queries -- + -- ------- -- + + artist = models.Artists:find({ name=artist_name }) + if not artist then + print("new artist: " .. artist_name) + artist = models.Artists:create({ + name = artist_name + }) + else + print("old artist.") + end + + -- make a unique name/identifier for the track using a combination of artist_name and track_name + -- in lower-case and spaces removed + local unique_track_name = artist_name .. track_name -- prepend artist + unique_track_name = unique_track_name:lower() -- all to lowercase + unique_track_name = unique_track_name:gsub("%s+", "") -- remove spaces + + track = models.Tracks:find({ unique_name=unique_track_name }) + if not track then + print("new track: " .. track_name) + track = models.Tracks:create({ + name = track_name, + unique_name = unique_track_name, + year = release_year, + info_url = track_info_url, + img_url = track_img_url + }) + else + print("old track.") + end + + -- track_artist + local track_artist = models.Trackartists:find({ track=track["id"], artist=artist["id"] }) + if not track_artist then + print("new track artist") + track_artist = models.Trackartists:create({ + track=track["id"], + artist=artist["id"] + }) + end + + -- airtime + local airtime = models.Airtimes:find({ + airtime = db.format_date(airtime_stamp), + track = track["id"], + station = station["id"] + }) + if not airtime then + airtime = models.Airtimes:create({ + airtime = db.format_date(airtime_stamp), + track = track["id"], + station = station["id"] + }) + else + print("already have this airtime! wtf??") + end + + -- release + if release_name:len() > 0 then + release = models.Releases:find({ name=release_name }) + if not release then + print("new release: " .. release_name) + release = models.Releases:create({ + name = release_name, + year = release_year, + country = release_country, + label = release_label + }) + + else + print("old release.") + end + + local track_release = models.Trackreleases:find({ track=track["id"], release=release["id"] }) + if not track_release then + track_release = models.Trackreleases:create({ track=track["id"], release=release["id"] }) + end + + else + print("no release, skipping") + end + +end + +return Splhandler \ No newline at end of file diff --git a/code/handlers/stationhandler.lua b/code/handlers/stationhandler.lua new file mode 100644 index 0000000..b46cf25 --- /dev/null +++ b/code/handlers/stationhandler.lua @@ -0,0 +1,63 @@ +local db = require("lapis.db") +local to_json = require("lapis.util").to_json +local autoload = require("lapis.util").autoload +local preload = require("lapis.db.model").preload + +local models = autoload("models") + + +function Stationhandler(self) + local station_id = self.params.station + + local station = models.Stations:find({ station = station_id }) + if not station then + print("unknown station: " .. station_id) + else + print("This is: " .. station["name"]) + end + + local artist = nil + local release = nil + local return_dict = {} + local limit = 10 + local offset = 0 + +-- local airtimes = models.Airtimes:paginated("where station = ? order by airtime desc", station["id"], { +-- per_page = 10, +-- fields = "track, station, airtime", +-- prepare_results = function(airtime) +-- models.Tracks:include_in(airtime, { id="track" }) +-- models.Stations:include_in(airtime, { id="station" }) +-- return airtime +-- end +-- }) + +-- airtimes = airtimes:get_page(1) + + local airtimes = db.query([[ + SELECT airtime, track.name AS track, track.year, track.info_url, track.img_url, + artist.name as artist, + release.name AS release, release.country, release.label AS label + FROM airtimes + INNER JOIN + tracks AS track ON (airtimes.track = track.id) + INNER JOIN + track_artists as track_artist ON (track_artist.track = track.id) + INNER JOIN + artists as artist ON (track_artist.artist = artist.id) + INNER JOIN + track_releases as track_release ON (track_release.track = track.id) + INNER JOIN + releases as release ON (track_release.release = release.id) + WHERE station = ? + ORDER BY airtime + DESC LIMIT ? + OFFSET ? + ]], station["id"], limit, offset*limit + ) + + return { json = airtimes } + +end + +return Stationhandler \ No newline at end of file diff --git a/code/handlers/trackhandler.lua b/code/handlers/trackhandler.lua new file mode 100644 index 0000000..0340260 --- /dev/null +++ b/code/handlers/trackhandler.lua @@ -0,0 +1,56 @@ +local db = require("lapis.db") +local to_json = require("lapis.util").to_json +local autoload = require("lapis.util").autoload +local preload = require("lapis.db.model").preload + +local models = autoload("models") + + +function Trackhandler(self) + local track_id = self.params.track + + local track = models.Tracks:find({ id = track_id }) + if not track then + self:write({"Not Found", status = 404}) + end + + local hidden_fields = { + "unique_name", + "created_at", + "updated_at" + } + + for i, field in ipairs(hidden_fields) do + track[field] = nil + end + + local artists = {} + local airtimes = nil + + local artists = db.query([[ + SELECT artist.name AS artist_name + FROM track_artists + INNER JOIN + artists as artist ON (track_artists.artist = artist.id) + WHERE track_artists.track = ? + ]], track["id"]) + + + track["artist"] = artists[1]["artist_name"] + + local airtimes = db.query([[ + SELECT airtime + FROM airtimes + WHERE track = ? + ]], track["id"]) + + track["airtimes"] = {} + for i, airtime in ipairs(airtimes) do + track["airtimes"][i] = airtime.airtime + end + + return { json = track } + +end + +return Trackhandler \ No newline at end of file diff --git a/code/models/airtimes.lua b/code/models/airtimes.lua index 1983150..1792b00 100644 --- a/code/models/airtimes.lua +++ b/code/models/airtimes.lua @@ -7,7 +7,7 @@ local Airtimes = Model:extend("airtimes", { timestamp = true, relations = { {"track", belongs_to = "Tracks"}, - {"stations", has_one = "Stations"} + {"station", has_one = "Stations"} } }) diff --git a/code/models.lua b/code/models/models.lua similarity index 100% rename from code/models.lua rename to code/models/models.lua