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

Add start/end date filters to actor queries

Wire startDate/endDate through lexicons, PKL defs, TypeScript types, and
xrpc handlers to allow date-range filtering for actor albums, artists,
and songs.

Fix lexicon index mappings: swap artist getArtist/getArtistAlbums
entries, add feed.getFeed method, and reorder imports. Minor formatting
tweaks (scrobble likes filter, PKL whitespace).

+10
apps/api/lexicons/actor/getActorAlbums.json
··· 25 25 "type": "integer", 26 26 "description": "The offset for pagination", 27 27 "minimum": 0 28 + }, 29 + "startDate": { 30 + "type": "string", 31 + "description": "The start date to filter albums from (ISO 8601 format)", 32 + "format": "datetime" 33 + }, 34 + "endDate": { 35 + "type": "string", 36 + "description": "The end date to filter albums to (ISO 8601 format)", 37 + "format": "datetime" 28 38 } 29 39 } 30 40 },
+10
apps/api/lexicons/actor/getActorArtists.json
··· 25 25 "type": "integer", 26 26 "description": "The offset for pagination", 27 27 "minimum": 0 28 + }, 29 + "startDate": { 30 + "type": "string", 31 + "description": "The start date to filter albums from (ISO 8601 format)", 32 + "format": "datetime" 33 + }, 34 + "endDate": { 35 + "type": "string", 36 + "description": "The end date to filter albums to (ISO 8601 format)", 37 + "format": "datetime" 28 38 } 29 39 } 30 40 },
+10
apps/api/lexicons/actor/getActorSongs.json
··· 25 25 "type": "integer", 26 26 "description": "The offset for pagination", 27 27 "minimum": 0 28 + }, 29 + "startDate": { 30 + "type": "string", 31 + "description": "The start date to filter albums from (ISO 8601 format)", 32 + "format": "datetime" 33 + }, 34 + "endDate": { 35 + "type": "string", 36 + "description": "The end date to filter albums to (ISO 8601 format)", 37 + "format": "datetime" 28 38 } 29 39 } 30 40 },
+11 -3
apps/api/pkl/defs/actor/getActorAlbums.pkl
··· 1 - amends "../../schema/lexicon.pkl" 1 + amends "../../schema/lexicon.pkl" 2 2 3 3 lexicon = 1 4 4 id = "app.rocksky.actor.getActorAlbums" ··· 13 13 description = "The DID or handle of the actor" 14 14 format = "at-identifier" 15 15 } 16 - ["limit"] = new IntegerType { 16 + ["limit"] = new IntegerType { 17 17 type = "integer" 18 18 description = "The maximum number of albums to return" 19 19 minimum = 1 ··· 23 23 description = "The offset for pagination" 24 24 minimum = 0 25 25 } 26 + ["startDate"] = new StringType { 27 + description = "The start date to filter albums from (ISO 8601 format)" 28 + format = "datetime" 29 + } 30 + ["endDate"] = new StringType { 31 + description = "The end date to filter albums to (ISO 8601 format)" 32 + format = "datetime" 33 + } 26 34 } 27 35 } 28 36 output { ··· 40 48 } 41 49 } 42 50 } 43 - } 51 + }
+11 -3
apps/api/pkl/defs/actor/getActorArtists.pkl
··· 1 - amends "../../schema/lexicon.pkl" 1 + amends "../../schema/lexicon.pkl" 2 2 3 3 lexicon = 1 4 4 id = "app.rocksky.actor.getActorArtists" ··· 13 13 description = "The DID or handle of the actor" 14 14 format = "at-identifier" 15 15 } 16 - ["limit"] = new IntegerType { 16 + ["limit"] = new IntegerType { 17 17 type = "integer" 18 18 description = "The maximum number of albums to return" 19 19 minimum = 1 ··· 23 23 description = "The offset for pagination" 24 24 minimum = 0 25 25 } 26 + ["startDate"] = new StringType { 27 + description = "The start date to filter albums from (ISO 8601 format)" 28 + format = "datetime" 29 + } 30 + ["endDate"] = new StringType { 31 + description = "The end date to filter albums to (ISO 8601 format)" 32 + format = "datetime" 33 + } 26 34 } 27 35 } 28 36 output { ··· 40 48 } 41 49 } 42 50 } 43 - } 51 + }
+11 -3
apps/api/pkl/defs/actor/getActorSongs.pkl
··· 1 - amends "../../schema/lexicon.pkl" 1 + amends "../../schema/lexicon.pkl" 2 2 3 3 lexicon = 1 4 4 id = "app.rocksky.actor.getActorSongs" ··· 23 23 description = "The offset for pagination" 24 24 minimum = 0 25 25 } 26 + ["startDate"] = new StringType { 27 + description = "The start date to filter albums from (ISO 8601 format)" 28 + format = "datetime" 29 + } 30 + ["endDate"] = new StringType { 31 + description = "The end date to filter albums to (ISO 8601 format)" 32 + format = "datetime" 33 + } 26 34 } 27 35 } 28 - output { 36 + output { 29 37 encoding = "application/json" 30 38 schema = new ObjectType { 31 39 type = "object" ··· 40 48 } 41 49 } 42 50 } 43 - } 51 + }
+33 -33
apps/api/src/lexicon/index.ts
··· 30 30 import type * as AppRockskyApikeyGetApikeys from "./types/app/rocksky/apikey/getApikeys"; 31 31 import type * as AppRockskyApikeyRemoveApikey from "./types/app/rocksky/apikey/removeApikey"; 32 32 import type * as AppRockskyApikeyUpdateApikey from "./types/app/rocksky/apikey/updateApikey"; 33 - import type * as AppRockskyArtistGetArtistAlbums from "./types/app/rocksky/artist/getArtistAlbums"; 34 33 import type * as AppRockskyArtistGetArtist from "./types/app/rocksky/artist/getArtist"; 34 + import type * as AppRockskyArtistGetArtistAlbums from "./types/app/rocksky/artist/getArtistAlbums"; 35 35 import type * as AppRockskyArtistGetArtistListeners from "./types/app/rocksky/artist/getArtistListeners"; 36 36 import type * as AppRockskyArtistGetArtists from "./types/app/rocksky/artist/getArtists"; 37 37 import type * as AppRockskyArtistGetArtistTracks from "./types/app/rocksky/artist/getArtistTracks"; ··· 41 41 import type * as AppRockskyDropboxGetMetadata from "./types/app/rocksky/dropbox/getMetadata"; 42 42 import type * as AppRockskyDropboxGetTemporaryLink from "./types/app/rocksky/dropbox/getTemporaryLink"; 43 43 import type * as AppRockskyFeedDescribeFeedGenerator from "./types/app/rocksky/feed/describeFeedGenerator"; 44 + import type * as AppRockskyFeedGetFeed from "./types/app/rocksky/feed/getFeed"; 44 45 import type * as AppRockskyFeedGetFeedGenerator from "./types/app/rocksky/feed/getFeedGenerator"; 45 46 import type * as AppRockskyFeedGetFeedGenerators from "./types/app/rocksky/feed/getFeedGenerators"; 46 - import type * as AppRockskyFeedGetFeed from "./types/app/rocksky/feed/getFeed"; 47 47 import type * as AppRockskyFeedGetFeedSkeleton from "./types/app/rocksky/feed/getFeedSkeleton"; 48 48 import type * as AppRockskyFeedGetNowPlayings from "./types/app/rocksky/feed/getNowPlayings"; 49 49 import type * as AppRockskyFeedSearch from "./types/app/rocksky/feed/search"; ··· 65 65 import type * as AppRockskyPlayerGetPlaybackQueue from "./types/app/rocksky/player/getPlaybackQueue"; 66 66 import type * as AppRockskyPlayerNext from "./types/app/rocksky/player/next"; 67 67 import type * as AppRockskyPlayerPause from "./types/app/rocksky/player/pause"; 68 + import type * as AppRockskyPlayerPlay from "./types/app/rocksky/player/play"; 68 69 import type * as AppRockskyPlayerPlayDirectory from "./types/app/rocksky/player/playDirectory"; 69 70 import type * as AppRockskyPlayerPlayFile from "./types/app/rocksky/player/playFile"; 70 - import type * as AppRockskyPlayerPlay from "./types/app/rocksky/player/play"; 71 71 import type * as AppRockskyPlayerPrevious from "./types/app/rocksky/player/previous"; 72 72 import type * as AppRockskyPlayerSeek from "./types/app/rocksky/player/seek"; 73 73 import type * as AppRockskyPlaylistCreatePlaylist from "./types/app/rocksky/playlist/createPlaylist"; ··· 483 483 this._server = server; 484 484 } 485 485 486 - getArtistAlbums<AV extends AuthVerifier>( 486 + getArtist<AV extends AuthVerifier>( 487 487 cfg: ConfigOf< 488 488 AV, 489 - AppRockskyArtistGetArtistAlbums.Handler<ExtractAuth<AV>>, 490 - AppRockskyArtistGetArtistAlbums.HandlerReqCtx<ExtractAuth<AV>> 489 + AppRockskyArtistGetArtist.Handler<ExtractAuth<AV>>, 490 + AppRockskyArtistGetArtist.HandlerReqCtx<ExtractAuth<AV>> 491 491 >, 492 492 ) { 493 - const nsid = "app.rocksky.artist.getArtistAlbums"; // @ts-ignore 493 + const nsid = "app.rocksky.artist.getArtist"; // @ts-ignore 494 494 return this._server.xrpc.method(nsid, cfg); 495 495 } 496 496 497 - getArtist<AV extends AuthVerifier>( 497 + getArtistAlbums<AV extends AuthVerifier>( 498 498 cfg: ConfigOf< 499 499 AV, 500 - AppRockskyArtistGetArtist.Handler<ExtractAuth<AV>>, 501 - AppRockskyArtistGetArtist.HandlerReqCtx<ExtractAuth<AV>> 500 + AppRockskyArtistGetArtistAlbums.Handler<ExtractAuth<AV>>, 501 + AppRockskyArtistGetArtistAlbums.HandlerReqCtx<ExtractAuth<AV>> 502 502 >, 503 503 ) { 504 - const nsid = "app.rocksky.artist.getArtist"; // @ts-ignore 504 + const nsid = "app.rocksky.artist.getArtistAlbums"; // @ts-ignore 505 505 return this._server.xrpc.method(nsid, cfg); 506 506 } 507 507 ··· 625 625 >, 626 626 ) { 627 627 const nsid = "app.rocksky.feed.describeFeedGenerator"; // @ts-ignore 628 + return this._server.xrpc.method(nsid, cfg); 629 + } 630 + 631 + getFeed<AV extends AuthVerifier>( 632 + cfg: ConfigOf< 633 + AV, 634 + AppRockskyFeedGetFeed.Handler<ExtractAuth<AV>>, 635 + AppRockskyFeedGetFeed.HandlerReqCtx<ExtractAuth<AV>> 636 + >, 637 + ) { 638 + const nsid = "app.rocksky.feed.getFeed"; // @ts-ignore 628 639 return this._server.xrpc.method(nsid, cfg); 629 640 } 630 641 ··· 650 661 return this._server.xrpc.method(nsid, cfg); 651 662 } 652 663 653 - getFeed<AV extends AuthVerifier>( 654 - cfg: ConfigOf< 655 - AV, 656 - AppRockskyFeedGetFeed.Handler<ExtractAuth<AV>>, 657 - AppRockskyFeedGetFeed.HandlerReqCtx<ExtractAuth<AV>> 658 - >, 659 - ) { 660 - const nsid = "app.rocksky.feed.getFeed"; // @ts-ignore 661 - return this._server.xrpc.method(nsid, cfg); 662 - } 663 - 664 664 getFeedSkeleton<AV extends AuthVerifier>( 665 665 cfg: ConfigOf< 666 666 AV, ··· 924 924 return this._server.xrpc.method(nsid, cfg); 925 925 } 926 926 927 + play<AV extends AuthVerifier>( 928 + cfg: ConfigOf< 929 + AV, 930 + AppRockskyPlayerPlay.Handler<ExtractAuth<AV>>, 931 + AppRockskyPlayerPlay.HandlerReqCtx<ExtractAuth<AV>> 932 + >, 933 + ) { 934 + const nsid = "app.rocksky.player.play"; // @ts-ignore 935 + return this._server.xrpc.method(nsid, cfg); 936 + } 937 + 927 938 playDirectory<AV extends AuthVerifier>( 928 939 cfg: ConfigOf< 929 940 AV, ··· 943 954 >, 944 955 ) { 945 956 const nsid = "app.rocksky.player.playFile"; // @ts-ignore 946 - return this._server.xrpc.method(nsid, cfg); 947 - } 948 - 949 - play<AV extends AuthVerifier>( 950 - cfg: ConfigOf< 951 - AV, 952 - AppRockskyPlayerPlay.Handler<ExtractAuth<AV>>, 953 - AppRockskyPlayerPlay.HandlerReqCtx<ExtractAuth<AV>> 954 - >, 955 - ) { 956 - const nsid = "app.rocksky.player.play"; // @ts-ignore 957 957 return this._server.xrpc.method(nsid, cfg); 958 958 } 959 959
+141 -108
apps/api/src/lexicon/lexicons.ts
··· 798 798 description: "The offset for pagination", 799 799 minimum: 0, 800 800 }, 801 + startDate: { 802 + type: "string", 803 + description: 804 + "The start date to filter albums from (ISO 8601 format)", 805 + format: "datetime", 806 + }, 807 + endDate: { 808 + type: "string", 809 + description: "The end date to filter albums to (ISO 8601 format)", 810 + format: "datetime", 811 + }, 801 812 }, 802 813 }, 803 814 output: { ··· 843 854 type: "integer", 844 855 description: "The offset for pagination", 845 856 minimum: 0, 857 + }, 858 + startDate: { 859 + type: "string", 860 + description: 861 + "The start date to filter albums from (ISO 8601 format)", 862 + format: "datetime", 863 + }, 864 + endDate: { 865 + type: "string", 866 + description: "The end date to filter albums to (ISO 8601 format)", 867 + format: "datetime", 846 868 }, 847 869 }, 848 870 }, ··· 1096 1118 type: "integer", 1097 1119 description: "The offset for pagination", 1098 1120 minimum: 0, 1121 + }, 1122 + startDate: { 1123 + type: "string", 1124 + description: 1125 + "The start date to filter albums from (ISO 8601 format)", 1126 + format: "datetime", 1127 + }, 1128 + endDate: { 1129 + type: "string", 1130 + description: "The end date to filter albums to (ISO 8601 format)", 1131 + format: "datetime", 1099 1132 }, 1100 1133 }, 1101 1134 }, ··· 1912 1945 }, 1913 1946 }, 1914 1947 }, 1915 - AppRockskyArtistGetArtistAlbums: { 1948 + AppRockskyArtistGetArtist: { 1916 1949 lexicon: 1, 1917 - id: "app.rocksky.artist.getArtistAlbums", 1950 + id: "app.rocksky.artist.getArtist", 1918 1951 defs: { 1919 1952 main: { 1920 1953 type: "query", 1921 - description: "Get artist's albums", 1954 + description: "Get artist details", 1922 1955 parameters: { 1923 1956 type: "params", 1924 1957 required: ["uri"], 1925 1958 properties: { 1926 1959 uri: { 1927 1960 type: "string", 1928 - description: "The URI of the artist to retrieve albums from", 1961 + description: "The URI of the artist to retrieve details from", 1929 1962 format: "at-uri", 1930 1963 }, 1931 1964 }, ··· 1933 1966 output: { 1934 1967 encoding: "application/json", 1935 1968 schema: { 1936 - type: "object", 1937 - properties: { 1938 - albums: { 1939 - type: "array", 1940 - items: { 1941 - type: "ref", 1942 - ref: "lex:app.rocksky.album.defs#albumViewBasic", 1943 - }, 1944 - }, 1945 - }, 1969 + type: "ref", 1970 + ref: "lex:app.rocksky.artist.defs#artistViewDetailed", 1946 1971 }, 1947 1972 }, 1948 1973 }, 1949 1974 }, 1950 1975 }, 1951 - AppRockskyArtistGetArtist: { 1976 + AppRockskyArtistGetArtistAlbums: { 1952 1977 lexicon: 1, 1953 - id: "app.rocksky.artist.getArtist", 1978 + id: "app.rocksky.artist.getArtistAlbums", 1954 1979 defs: { 1955 1980 main: { 1956 1981 type: "query", 1957 - description: "Get artist details", 1982 + description: "Get artist's albums", 1958 1983 parameters: { 1959 1984 type: "params", 1960 1985 required: ["uri"], 1961 1986 properties: { 1962 1987 uri: { 1963 1988 type: "string", 1964 - description: "The URI of the artist to retrieve details from", 1989 + description: "The URI of the artist to retrieve albums from", 1965 1990 format: "at-uri", 1966 1991 }, 1967 1992 }, ··· 1969 1994 output: { 1970 1995 encoding: "application/json", 1971 1996 schema: { 1972 - type: "ref", 1973 - ref: "lex:app.rocksky.artist.defs#artistViewDetailed", 1997 + type: "object", 1998 + properties: { 1999 + albums: { 2000 + type: "array", 2001 + items: { 2002 + type: "ref", 2003 + ref: "lex:app.rocksky.album.defs#albumViewBasic", 2004 + }, 2005 + }, 2006 + }, 1974 2007 }, 1975 2008 }, 1976 2009 }, ··· 2603 2636 }, 2604 2637 }, 2605 2638 }, 2606 - AppRockskyFeedGetFeedGenerator: { 2639 + AppRockskyFeedGetFeed: { 2607 2640 lexicon: 1, 2608 - id: "app.rocksky.feed.getFeedGenerator", 2641 + id: "app.rocksky.feed.getFeed", 2609 2642 defs: { 2610 2643 main: { 2611 2644 type: "query", 2612 - description: "Get information about a feed generator", 2645 + description: "Get the feed by uri", 2613 2646 parameters: { 2614 2647 type: "params", 2615 2648 required: ["feed"], 2616 2649 properties: { 2617 2650 feed: { 2618 2651 type: "string", 2619 - description: "AT-URI of the feed generator record.", 2652 + description: "The feed URI.", 2620 2653 format: "at-uri", 2621 2654 }, 2655 + limit: { 2656 + type: "integer", 2657 + description: "The maximum number of scrobbles to return", 2658 + minimum: 1, 2659 + }, 2660 + cursor: { 2661 + type: "string", 2662 + description: "The cursor for pagination", 2663 + }, 2622 2664 }, 2623 2665 }, 2624 2666 output: { 2625 2667 encoding: "application/json", 2626 2668 schema: { 2627 - type: "object", 2628 - properties: { 2629 - view: { 2630 - type: "ref", 2631 - ref: "lex:app.rocksky.feed.defs#feedGeneratorView", 2632 - }, 2633 - }, 2669 + type: "ref", 2670 + ref: "lex:app.rocksky.feed.defs#feedView", 2634 2671 }, 2635 2672 }, 2636 2673 }, 2637 2674 }, 2638 2675 }, 2639 - AppRockskyFeedGetFeedGenerators: { 2676 + AppRockskyFeedGetFeedGenerator: { 2640 2677 lexicon: 1, 2641 - id: "app.rocksky.feed.getFeedGenerators", 2678 + id: "app.rocksky.feed.getFeedGenerator", 2642 2679 defs: { 2643 2680 main: { 2644 2681 type: "query", 2645 - description: "Get all feed generators", 2682 + description: "Get information about a feed generator", 2646 2683 parameters: { 2647 2684 type: "params", 2685 + required: ["feed"], 2648 2686 properties: { 2649 - size: { 2650 - type: "integer", 2651 - description: "The maximum number of feed generators to return.", 2652 - minimum: 1, 2687 + feed: { 2688 + type: "string", 2689 + description: "AT-URI of the feed generator record.", 2690 + format: "at-uri", 2653 2691 }, 2654 2692 }, 2655 2693 }, 2656 2694 output: { 2657 2695 encoding: "application/json", 2658 2696 schema: { 2659 - type: "ref", 2660 - ref: "lex:app.rocksky.feed.defs#feedGeneratorsView", 2697 + type: "object", 2698 + properties: { 2699 + view: { 2700 + type: "ref", 2701 + ref: "lex:app.rocksky.feed.defs#feedGeneratorView", 2702 + }, 2703 + }, 2661 2704 }, 2662 2705 }, 2663 2706 }, 2664 2707 }, 2665 2708 }, 2666 - AppRockskyFeedGetFeed: { 2709 + AppRockskyFeedGetFeedGenerators: { 2667 2710 lexicon: 1, 2668 - id: "app.rocksky.feed.getFeed", 2711 + id: "app.rocksky.feed.getFeedGenerators", 2669 2712 defs: { 2670 2713 main: { 2671 2714 type: "query", 2672 - description: "Get the feed by uri", 2715 + description: "Get all feed generators", 2673 2716 parameters: { 2674 2717 type: "params", 2675 - required: ["feed"], 2676 2718 properties: { 2677 - feed: { 2678 - type: "string", 2679 - description: "The feed URI.", 2680 - format: "at-uri", 2681 - }, 2682 - limit: { 2719 + size: { 2683 2720 type: "integer", 2684 - description: "The maximum number of scrobbles to return", 2721 + description: "The maximum number of feed generators to return.", 2685 2722 minimum: 1, 2686 2723 }, 2687 - cursor: { 2688 - type: "string", 2689 - description: "The cursor for pagination", 2690 - }, 2691 2724 }, 2692 2725 }, 2693 2726 output: { 2694 2727 encoding: "application/json", 2695 2728 schema: { 2696 2729 type: "ref", 2697 - ref: "lex:app.rocksky.feed.defs#feedView", 2730 + ref: "lex:app.rocksky.feed.defs#feedGeneratorsView", 2698 2731 }, 2699 2732 }, 2700 2733 }, ··· 2956 2989 }, 2957 2990 }, 2958 2991 }, 2992 + AppRockskyGraphFollow: { 2993 + lexicon: 1, 2994 + id: "app.rocksky.graph.follow", 2995 + defs: { 2996 + main: { 2997 + type: "record", 2998 + description: 2999 + "Record declaring a social 'follow' relationship of another account.", 3000 + key: "tid", 3001 + record: { 3002 + type: "object", 3003 + required: ["createdAt", "subject"], 3004 + properties: { 3005 + createdAt: { 3006 + type: "string", 3007 + format: "datetime", 3008 + }, 3009 + subject: { 3010 + type: "string", 3011 + format: "did", 3012 + }, 3013 + via: { 3014 + type: "ref", 3015 + ref: "lex:com.atproto.repo.strongRef", 3016 + }, 3017 + }, 3018 + }, 3019 + }, 3020 + }, 3021 + }, 2959 3022 AppRockskyGraphFollowAccount: { 2960 3023 lexicon: 1, 2961 3024 id: "app.rocksky.graph.followAccount", ··· 2996 3059 description: 2997 3060 "A cursor value to pass to subsequent calls to get the next page of results.", 2998 3061 }, 2999 - }, 3000 - }, 3001 - }, 3002 - }, 3003 - }, 3004 - }, 3005 - AppRockskyGraphFollow: { 3006 - lexicon: 1, 3007 - id: "app.rocksky.graph.follow", 3008 - defs: { 3009 - main: { 3010 - type: "record", 3011 - description: 3012 - "Record declaring a social 'follow' relationship of another account.", 3013 - key: "tid", 3014 - record: { 3015 - type: "object", 3016 - required: ["createdAt", "subject"], 3017 - properties: { 3018 - createdAt: { 3019 - type: "string", 3020 - format: "datetime", 3021 - }, 3022 - subject: { 3023 - type: "string", 3024 - format: "did", 3025 - }, 3026 - via: { 3027 - type: "ref", 3028 - ref: "lex:com.atproto.repo.strongRef", 3029 3062 }, 3030 3063 }, 3031 3064 }, ··· 3602 3635 }, 3603 3636 }, 3604 3637 }, 3638 + AppRockskyPlayerPlay: { 3639 + lexicon: 1, 3640 + id: "app.rocksky.player.play", 3641 + defs: { 3642 + main: { 3643 + type: "procedure", 3644 + description: "Resume playback of the currently paused track", 3645 + parameters: { 3646 + type: "params", 3647 + properties: { 3648 + playerId: { 3649 + type: "string", 3650 + }, 3651 + }, 3652 + }, 3653 + }, 3654 + }, 3655 + }, 3605 3656 AppRockskyPlayerPlayDirectory: { 3606 3657 lexicon: 1, 3607 3658 id: "app.rocksky.player.playDirectory", ··· 3648 3699 type: "string", 3649 3700 }, 3650 3701 fileId: { 3651 - type: "string", 3652 - }, 3653 - }, 3654 - }, 3655 - }, 3656 - }, 3657 - }, 3658 - AppRockskyPlayerPlay: { 3659 - lexicon: 1, 3660 - id: "app.rocksky.player.play", 3661 - defs: { 3662 - main: { 3663 - type: "procedure", 3664 - description: "Resume playback of the currently paused track", 3665 - parameters: { 3666 - type: "params", 3667 - properties: { 3668 - playerId: { 3669 3702 type: "string", 3670 3703 }, 3671 3704 }, ··· 5918 5951 AppRockskyApikeyUpdateApikey: "app.rocksky.apikey.updateApikey", 5919 5952 AppRockskyArtist: "app.rocksky.artist", 5920 5953 AppRockskyArtistDefs: "app.rocksky.artist.defs", 5921 - AppRockskyArtistGetArtistAlbums: "app.rocksky.artist.getArtistAlbums", 5922 5954 AppRockskyArtistGetArtist: "app.rocksky.artist.getArtist", 5955 + AppRockskyArtistGetArtistAlbums: "app.rocksky.artist.getArtistAlbums", 5923 5956 AppRockskyArtistGetArtistListeners: "app.rocksky.artist.getArtistListeners", 5924 5957 AppRockskyArtistGetArtists: "app.rocksky.artist.getArtists", 5925 5958 AppRockskyArtistGetArtistTracks: "app.rocksky.artist.getArtistTracks", ··· 5933 5966 AppRockskyFeedDefs: "app.rocksky.feed.defs", 5934 5967 AppRockskyFeedDescribeFeedGenerator: "app.rocksky.feed.describeFeedGenerator", 5935 5968 AppRockskyFeedGenerator: "app.rocksky.feed.generator", 5969 + AppRockskyFeedGetFeed: "app.rocksky.feed.getFeed", 5936 5970 AppRockskyFeedGetFeedGenerator: "app.rocksky.feed.getFeedGenerator", 5937 5971 AppRockskyFeedGetFeedGenerators: "app.rocksky.feed.getFeedGenerators", 5938 - AppRockskyFeedGetFeed: "app.rocksky.feed.getFeed", 5939 5972 AppRockskyFeedGetFeedSkeleton: "app.rocksky.feed.getFeedSkeleton", 5940 5973 AppRockskyFeedGetNowPlayings: "app.rocksky.feed.getNowPlayings", 5941 5974 AppRockskyFeedSearch: "app.rocksky.feed.search", ··· 5944 5977 AppRockskyGoogledriveGetFile: "app.rocksky.googledrive.getFile", 5945 5978 AppRockskyGoogledriveGetFiles: "app.rocksky.googledrive.getFiles", 5946 5979 AppRockskyGraphDefs: "app.rocksky.graph.defs", 5947 - AppRockskyGraphFollowAccount: "app.rocksky.graph.followAccount", 5948 5980 AppRockskyGraphFollow: "app.rocksky.graph.follow", 5981 + AppRockskyGraphFollowAccount: "app.rocksky.graph.followAccount", 5949 5982 AppRockskyGraphGetFollowers: "app.rocksky.graph.getFollowers", 5950 5983 AppRockskyGraphGetFollows: "app.rocksky.graph.getFollows", 5951 5984 AppRockskyGraphGetKnownFollowers: "app.rocksky.graph.getKnownFollowers", ··· 5962 5995 AppRockskyPlayerGetPlaybackQueue: "app.rocksky.player.getPlaybackQueue", 5963 5996 AppRockskyPlayerNext: "app.rocksky.player.next", 5964 5997 AppRockskyPlayerPause: "app.rocksky.player.pause", 5998 + AppRockskyPlayerPlay: "app.rocksky.player.play", 5965 5999 AppRockskyPlayerPlayDirectory: "app.rocksky.player.playDirectory", 5966 6000 AppRockskyPlayerPlayFile: "app.rocksky.player.playFile", 5967 - AppRockskyPlayerPlay: "app.rocksky.player.play", 5968 6001 AppRockskyPlayerPrevious: "app.rocksky.player.previous", 5969 6002 AppRockskyPlayerSeek: "app.rocksky.player.seek", 5970 6003 AppRockskyPlaylistCreatePlaylist: "app.rocksky.playlist.createPlaylist",
+4
apps/api/src/lexicon/types/app/rocksky/actor/getActorAlbums.ts
··· 16 16 limit?: number; 17 17 /** The offset for pagination */ 18 18 offset?: number; 19 + /** The start date to filter albums from (ISO 8601 format) */ 20 + startDate?: string; 21 + /** The end date to filter albums to (ISO 8601 format) */ 22 + endDate?: string; 19 23 } 20 24 21 25 export type InputSchema = undefined;
+4
apps/api/src/lexicon/types/app/rocksky/actor/getActorArtists.ts
··· 16 16 limit?: number; 17 17 /** The offset for pagination */ 18 18 offset?: number; 19 + /** The start date to filter albums from (ISO 8601 format) */ 20 + startDate?: string; 21 + /** The end date to filter albums to (ISO 8601 format) */ 22 + endDate?: string; 19 23 } 20 24 21 25 export type InputSchema = undefined;
+4
apps/api/src/lexicon/types/app/rocksky/actor/getActorSongs.ts
··· 16 16 limit?: number; 17 17 /** The offset for pagination */ 18 18 offset?: number; 19 + /** The start date to filter albums from (ISO 8601 format) */ 20 + startDate?: string; 21 + /** The end date to filter albums to (ISO 8601 format) */ 22 + endDate?: string; 19 23 } 20 24 21 25 export type InputSchema = undefined;
+2
apps/api/src/xrpc/app/rocksky/actor/getActorAlbums.ts
··· 45 45 skip: params.offset || 0, 46 46 take: params.limit || 10, 47 47 }, 48 + start_date: params.startDate, 49 + end_date: params.endDate, 48 50 }), 49 51 catch: (error) => new Error(`Failed to retrieve albums: ${error}`), 50 52 });
+2
apps/api/src/xrpc/app/rocksky/actor/getActorArtists.ts
··· 44 44 skip: params.offset || 0, 45 45 take: params.limit || 10, 46 46 }, 47 + start_date: params.startDate, 48 + end_date: params.endDate, 47 49 }), 48 50 catch: (error) => new Error(`Failed to retrieve artists: ${error}`), 49 51 });
+2
apps/api/src/xrpc/app/rocksky/actor/getActorSongs.ts
··· 44 44 skip: params.offset || 0, 45 45 take: params.limit || 10, 46 46 }, 47 + start_date: params.startDate, 48 + end_date: params.endDate, 47 49 }), 48 50 catch: (error) => new Error(`Failed to retrieve tracks: ${error}`), 49 51 });
+1 -3
apps/api/src/xrpc/app/rocksky/scrobble/getScrobbles.ts
··· 118 118 const likesMap = new Map<string, { count: number; liked: boolean }>(); 119 119 120 120 for (const trackId of trackIds) { 121 - const trackLikes = likes.filter( 122 - (l) => l.loved_tracks.trackId === trackId, 123 - ); 121 + const trackLikes = likes.filter((l) => l.loved_tracks.trackId === trackId); 124 122 likesMap.set(trackId, { 125 123 count: trackLikes.length, 126 124 liked: trackLikes.some((l) => l.users?.did === currentUserDid),