A decentralized music tracking and discovery platform built on AT Protocol 🎵
listenbrainz spotify atproto lastfm musicbrainz scrobbling

Merge branch 'main' into feat/feed-generator

Changed files
+84 -2
apps
+82
apps/api/drizzle/0000_left_swordsman.sql
··· 1 + CREATE SCHEMA xata_private; 2 + 3 + -- 4 + -- Name: xid; Type: DOMAIN; Schema: xata_private; Owner: - 5 + -- 6 + 7 + CREATE DOMAIN xata_private.xid AS character(20) 8 + CONSTRAINT xid_check CHECK ((VALUE ~ '^[a-v0-9]{20}$'::text)); 9 + 10 + CREATE FUNCTION xata_private.xid(_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP) RETURNS xata_private.xid 11 + LANGUAGE plpgsql SECURITY DEFINER 12 + AS $$ 13 + DECLARE 14 + _t INT; 15 + _m INT; 16 + _p INT; 17 + _c INT; 18 + BEGIN 19 + _t := floor(EXTRACT(epoch FROM _at)); 20 + _m := xata_private._xid_machine_id(); 21 + _p := pg_backend_pid(); 22 + _c := nextval('xata_private.xid_serial')::INT; 23 + 24 + return xata_private.xid_encode(ARRAY [ 25 + (_t >> 24) & 255, (_t >> 16) & 255, (_t >> 8) & 255 , _t & 255, 26 + (_m >> 16) & 255, (_m >> 8) & 255 , _m & 255, 27 + (_p >> 8) & 255, _p & 255, 28 + (_c >> 16) & 255, (_c >> 8) & 255 , _c & 255 29 + ]); 30 + END; 31 + $$; 32 + 33 + CREATE FUNCTION xata_private._xid_machine_id() RETURNS integer 34 + LANGUAGE plpgsql IMMUTABLE 35 + AS $$ 36 + BEGIN 37 + RETURN (SELECT system_identifier & 16777215 FROM pg_control_system()); 38 + END; 39 + $$; 40 + 41 + CREATE FUNCTION xata_private.xid_encode(_id integer[]) RETURNS xata_private.xid 42 + LANGUAGE plpgsql 43 + AS $$ 44 + DECLARE 45 + _encoding CHAR(1)[] = '{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v}'; 46 + BEGIN 47 + RETURN _encoding[1 + (_id[1] >> 3)] 48 + || _encoding[1 + ((_id[2] >> 6) & 31 | (_id[1] << 2) & 31)] 49 + || _encoding[1 + ((_id[2] >> 1) & 31)] 50 + || _encoding[1 + ((_id[3] >> 4) & 31 | (_id[2] << 4) & 31)] 51 + || _encoding[1 + (_id[4] >> 7 | (_id[3] << 1) & 31)] 52 + || _encoding[1 + ((_id[4] >> 2) & 31)] 53 + || _encoding[1 + (_id[5] >> 5 | (_id[4] << 3) & 31)] 54 + || _encoding[1 + (_id[5] & 31)] 55 + || _encoding[1 + (_id[6] >> 3)] 56 + || _encoding[1 + ((_id[7] >> 6) & 31 | (_id[6] << 2) & 31)] 57 + || _encoding[1 + ((_id[7] >> 1) & 31)] 58 + || _encoding[1 + ((_id[8] >> 4) & 31 | (_id[7] << 4) & 31)] 59 + || _encoding[1 + (_id[9] >> 7 | (_id[8] << 1) & 31)] 60 + || _encoding[1 + ((_id[9] >> 2) & 31)] 61 + || _encoding[1 + ((_id[10] >> 5) | (_id[9] << 3) & 31)] 62 + || _encoding[1 + (_id[10] & 31)] 63 + || _encoding[1 + (_id[11] >> 3)] 64 + || _encoding[1 + ((_id[12] >> 6) & 31 | (_id[11] << 2) & 31)] 65 + || _encoding[1 + ((_id[12] >> 1) & 31)] 66 + || _encoding[1 + ((_id[12] << 4) & 31)]; 67 + END; 68 + $$; 69 + 70 + CREATE SEQUENCE xata_private.xid_serial 71 + START WITH 0 72 + INCREMENT BY 1 73 + MINVALUE 0 74 + MAXVALUE 16777215 75 + CACHE 1 76 + CYCLE; 77 + 78 + CREATE OR REPLACE FUNCTION xata_id() 79 + RETURNS text AS $$ 80 + SELECT 'rec_' || xata_private.xid(); 81 + $$ LANGUAGE sql IMMUTABLE; 82 + 1 83 CREATE TABLE "album_tracks" ( 2 84 "xata_id" text PRIMARY KEY DEFAULT xata_id(), 3 85 "album_id" text NOT NULL,
+2 -2
compose.yaml
··· 26 26 - meilisearch_data:/data.ms 27 27 28 28 db: 29 - image: tsiry/postgres-xataid:latest 29 + image: postgres:18 30 30 ports: 31 31 - '5433:5432' 32 32 environment: ··· 34 34 POSTGRES_PASSWORD: mysecretpassword 35 35 POSTGRES_DB: rocksky 36 36 volumes: 37 - - pgdata:/var/lib/postgresql/data 37 + - pgdata:/var/lib/postgresql/18/docke 38 38 healthcheck: 39 39 test: ['CMD', 'pg_isready'] 40 40 interval: 10s