Mercurial Hosting > linkmystyle
diff src/lib/Uploadcare.luan @ 0:8f4df159f06b
start public repo
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 11 Jul 2025 20:57:49 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/Uploadcare.luan Fri Jul 11 20:57:49 2025 -0600 @@ -0,0 +1,109 @@ +local Luan = require "luan:Luan.luan" +local error = Luan.error +local ipairs = Luan.ipairs or error() +local parse = Luan.parse or error() +local stringify = Luan.stringify or error() +local Io = require "luan:Io.luan" +local uri = Io.uri or error() +local Parsers = require "luan:Parsers.luan" +local json_parse = Parsers.json_parse or error() +local Time = require "luan:Time.luan" +local time_now = Time.now or error() +local parse_time = Time.parse or error() +local Utils = require "site:/lib/Utils.luan" +local list_to_set = Utils.list_to_set or error() +local Config = require "site:/private/Config.luan" +local keys = Config.uploadcare or error() +local Logging = require "luan:logging/Logging.luan" +local logger = Logging.logger "Uploadcare" + + +local Uploadcare = {} + +function Uploadcare.url(uuid) + uuid or error() + return "https://ucarecdn.com/"..uuid.."/-/quality/smart/" +end + +function Uploadcare.thumb_url(uuid) + uuid or error() + return "https://ucarecdn.com/"..uuid.."/-/crop/1:1/-/preview/400x400/-/quality/smart/" +end + +local function used_uuids() + local list = {} + + local Pic = require "site:/lib/Pic.luan" + local pics = Pic.search("type:pic") + for _, pic in ipairs(pics) do + list[#list+1] = pic.uuid + end + + local User = require "site:/lib/User.luan" + local users = User.search("type:user") + for _, user in ipairs(users) do + list[#list+1] = user.pic_uuid + local data = user.theme_data + if data ~= nil then + data = parse(data) + list[#list+1] = data.background_img_uuid + end + end + + return list_to_set(list) +end + +local headers = { + Accept = "application/vnd.uploadcare-v0.7+json" + Authorization = "Uploadcare.Simple "..keys.public_key..":"..keys.secret_key +} + +local delete_options = { + method = "DELETE" + headers = headers +} + +local function delete(uuid) + local url = "https://api.uploadcare.com/files/"..uuid.."/storage/" + local result = uri(url,delete_options).read_text() +end + +local options = { + headers = headers +} + +local date_ptn = "yyyy-MM-dd'T'HH:mm:ss" +local day = Time.period{days=1} + +function Uploadcare.gc() + logger.warn "start gc" + local used = used_uuids() + local count = 0 + local url = "https://api.uploadcare.com/files/?limit=1000" + while url ~= nil do + local result = uri(url,options).read_text() + result = json_parse(result) + -- logger.info(stringify(result)) + local results = result.results or error() + local now = time_now() + for _, r in ipairs(results) do + count = count + 1 + local uuid = r.uuid or error() + local datetime_uploaded = r.datetime_uploaded or error() + local date = parse_time( date_ptn, datetime_uploaded, "GMT" ) + if used[uuid] then + -- logger.info(uuid.." is in use") + elseif now - date < day then + logger.info(uuid.." is less than a day old") + else + logger.warn(uuid.." delete") + delete(uuid) + end + end + url = result.next + end + logger.info("count = "..count) + logger.warn "end gc" +end + +return Uploadcare