SYMBOL INDEX (340 symbols across 67 files) FILE: cmd/main.go function main (line 18) | func main() { function shutdown (line 43) | func shutdown(log *slog.Logger, store storage.Storage) { FILE: internal/config/config.go constant minSecretLength (line 12) | minSecretLength = 10 type Config (line 14) | type Config struct function Load (line 27) | func Load() *Config { function getEnv (line 44) | func getEnv(key, defaultValue string) string { function getEnvBool (line 51) | func getEnvBool(key string, defaultValue bool) bool { function getSecret (line 61) | func getSecret(key string) string { FILE: internal/http/consts.go constant eventPlay (line 4) | eventPlay = "play" constant eventPause (line 5) | eventPause = "pause" constant eventNewTrack (line 6) | eventNewTrack = "new_track" constant eventLoadedTracks (line 7) | eventLoadedTracks = "loaded_tracks" constant eventCountListeners (line 8) | eventCountListeners = "count_listeners" constant eventChangeTheme (line 9) | eventChangeTheme = "change_theme" FILE: internal/http/handlers.go constant multipartChunkLimit (line 21) | multipartChunkLimit = 64 * 1024 * 1024 constant copyBufferSize (line 22) | copyBufferSize = 256 * 1024 method handleHLSPlaylist (line 24) | func (s *Server) handleHLSPlaylist(w http.ResponseWriter, r *http.Reques... method handleEvents (line 32) | func (s *Server) handleEvents(w http.ResponseWriter, r *http.Request) { method handleLogin (line 63) | func (s *Server) handleLogin(w http.ResponseWriter, r *http.Request) { method handleTracks (line 107) | func (s *Server) handleTracks(w http.ResponseWriter, r *http.Request) { method handleTracksUpload (line 124) | func (s *Server) handleTracksUpload(w http.ResponseWriter, r *http.Reque... method handleDeleteTracks (line 151) | func (s *Server) handleDeleteTracks(w http.ResponseWriter, r *http.Reque... method handleQueue (line 168) | func (s *Server) handleQueue(w http.ResponseWriter, _ *http.Request) { method handleAddToQueue (line 179) | func (s *Server) handleAddToQueue(w http.ResponseWriter, r *http.Request) { method handleReorderQueue (line 206) | func (s *Server) handleReorderQueue(w http.ResponseWriter, r *http.Reque... method handleRemoveFromQueue (line 227) | func (s *Server) handleRemoveFromQueue(w http.ResponseWriter, r *http.Re... method handlePlaybackState (line 255) | func (s *Server) handlePlaybackState(w http.ResponseWriter, _ *http.Requ... method handlePausePlayback (line 259) | func (s *Server) handlePausePlayback(w http.ResponseWriter, _ *http.Requ... method handlePlayPlayback (line 264) | func (s *Server) handlePlayPlayback(w http.ResponseWriter, _ *http.Reque... method handlePlaybackHistory (line 274) | func (s *Server) handlePlaybackHistory(w http.ResponseWriter, r *http.Re... method handleAddPlaylist (line 287) | func (s *Server) handleAddPlaylist(w http.ResponseWriter, r *http.Reques... method handlePlaylists (line 307) | func (s *Server) handlePlaylists(w http.ResponseWriter, r *http.Request) { method handlePlaylist (line 316) | func (s *Server) handlePlaylist(w http.ResponseWriter, r *http.Request) { method handleEditPlaylist (line 327) | func (s *Server) handleEditPlaylist(w http.ResponseWriter, r *http.Reque... method handleDeletePlaylist (line 349) | func (s *Server) handleDeletePlaylist(w http.ResponseWriter, r *http.Req... method handleStaticDir (line 360) | func (s *Server) handleStaticDir(prefix string, path string) http.Handler { method handleStaticDirWithoutCache (line 364) | func (s *Server) handleStaticDirWithoutCache(prefix string, path string)... method handleStationInfo (line 373) | func (s *Server) handleStationInfo(w http.ResponseWriter, _ *http.Reques... method handleEditStationInfo (line 383) | func (s *Server) handleEditStationInfo(w http.ResponseWriter, r *http.Re... method saveFile (line 401) | func (s *Server) saveFile(fileHeader *multipart.FileHeader) (string, err... FILE: internal/http/messages.go type Message (line 8) | type Message struct function jsonResponse (line 12) | func jsonResponse(w http.ResponseWriter, data interface{}) { function jsonMessage (line 20) | func jsonMessage(w http.ResponseWriter, code int, body string) { function jsonOK (line 27) | func jsonOK(w http.ResponseWriter, body string) { function jsonBadRequest (line 31) | func jsonBadRequest(w http.ResponseWriter, body string) { function jsonUnauthorized (line 35) | func jsonUnauthorized(w http.ResponseWriter, body string) { function jsonForbidden (line 39) | func jsonForbidden(w http.ResponseWriter, body string) { function jsonInternalError (line 43) | func jsonInternalError(w http.ResponseWriter, body string) { FILE: internal/http/middlewares.go method jwtAuth (line 10) | func (s *Server) jwtAuth(next http.Handler) http.Handler { FILE: internal/http/parser.go function parseIntQuery (line 12) | func parseIntQuery(queries url.Values, key string, defaultValue int) int { function parseJSONBody (line 22) | func parseJSONBody[T any](r *http.Request) (*T, error) { FILE: internal/http/server.go type Server (line 23) | type Server struct method Run (line 59) | func (s *Server) Run() { method registerMP2TMimeType (line 110) | func (s *Server) registerMP2TMimeType() { method countListeners (line 117) | func (s *Server) countListeners() *sse.Event { method listenEvents (line 122) | func (s *Server) listenEvents() { function NewServer (line 36) | func NewServer(store storage.Storage, conf *config.Config, logger *slog.... FILE: internal/logger/logger.go type logEntry (line 14) | type logEntry struct type customJSONHandler (line 22) | type customJSONHandler struct method Enabled (line 29) | func (h *customJSONHandler) Enabled(ctx context.Context, level slog.Le... method Handle (line 36) | func (h *customJSONHandler) Handle(ctx context.Context, r slog.Record)... method WithAttrs (line 88) | func (h *customJSONHandler) WithAttrs(attrs []slog.Attr) slog.Handler { method WithGroup (line 101) | func (h *customJSONHandler) WithGroup(name string) slog.Handler { function jsonEscape (line 83) | func jsonEscape(s string) string { function newCustomJSONHandler (line 110) | func newCustomJSONHandler(w io.Writer, opts *slog.HandlerOptions) *custo... function New (line 118) | func New() *slog.Logger { FILE: internal/pkg/ffmpeg/const.go constant ffmpegBin (line 5) | ffmpegBin = "ffmpeg" constant ffprobeBin (line 6) | ffprobeBin = "ffprobe" FILE: internal/pkg/ffmpeg/ffmpeg.go type CLI (line 18) | type CLI struct method MakeHLSPlaylist (line 36) | func (cli *CLI) MakeHLSPlaylist(trackPath, outDir, segName string, seg... method AudioMetadata (line 76) | func (cli *CLI) AudioMetadata(filePath string) (AudioMetadata, error) { method PadAudio (line 148) | func (cli *CLI) PadAudio(filePath string, padDuration float64, meta Au... method TrimAudio (line 194) | func (cli *CLI) TrimAudio(filePath string, totalDuration float64) error { method ConvertAudioToAAC (line 236) | func (cli *CLI) ConvertAudioToAAC(inputPath, outputPath string, bitRat... method generateSilence (line 257) | func (cli *CLI) generateSilence(duration float64, bitRate, sampleRate,... function NewCLI (line 21) | func NewCLI() *CLI { FILE: internal/pkg/ffmpeg/types.go type AudioMetadata (line 4) | type AudioMetadata struct type rawAudioMetadata (line 13) | type rawAudioMetadata struct FILE: internal/pkg/fs/fs.go function MustDir (line 10) | func MustDir(dirPath string) { function FileExists (line 17) | func FileExists(filePath string) error { function DeleteFile (line 30) | func DeleteFile(filePath string) error { function DeleteDirIfExists (line 39) | func DeleteDirIfExists(path string) error { function RenameFile (line 55) | func RenameFile(oldPath, newPath string) error { function ListFilesFromDir (line 64) | func ListFilesFromDir(dirPath, fileExt string) ([]string, error) { FILE: internal/pkg/hls/const.go constant SegmentExtension (line 3) | SegmentExtension = ".ts" constant timeFormat (line 4) | timeFormat = "2006-01-02T15:04:05.000Z" constant DefaultMaxSegmentDuration (line 7) | DefaultMaxSegmentDuration = 5 constant DefaultLiveSegmentsAmount (line 8) | DefaultLiveSegmentsAmount = 3 FILE: internal/pkg/hls/playlist.go type Playlist (line 11) | type Playlist struct method Generate (line 58) | func (p *Playlist) Generate(elapsedTime float64) string { method Next (line 85) | func (p *Playlist) Next(next []*Segment) { method ChangeNext (line 94) | func (p *Playlist) ChangeNext(next []*Segment) { method AddSegments (line 102) | func (p *Playlist) AddSegments(segments []*Segment) { method SetMediaSequence (line 107) | func (p *Playlist) SetMediaSequence(sequence int64) { method UpdateDisconSequence (line 115) | func (p *Playlist) UpdateDisconSequence(elapsedTime float64) { method FirstNextTrackSegment (line 131) | func (p *Playlist) FirstNextTrackSegment() *Segment { method currentSegments (line 140) | func (p *Playlist) currentSegments(elapsedTime float64) []*Segment { method calcCurrentSegmentIndex (line 161) | func (p *Playlist) calcCurrentSegmentIndex(elapsedTime float64) int { function NewPlaylist (line 33) | func NewPlaylist(cur, next []*Segment) *Playlist { function hlsHeader (line 166) | func hlsHeader(dur int, mediaSeq, disconSeq int64, offset float64) string { function hlsSegment (line 178) | func hlsSegment(dur float64, path string, isDiscon bool) string { FILE: internal/pkg/hls/playlist_test.go function TestNewPlaylist (line 9) | func TestNewPlaylist(t *testing.T) { function TestGenerate (line 31) | func TestGenerate(t *testing.T) { function TestNext (line 140) | func TestNext(t *testing.T) { function TestAddSegments (line 162) | func TestAddSegments(t *testing.T) { function TestCollectLiveSegments (line 182) | func TestCollectLiveSegments(t *testing.T) { function TestHlsHeader (line 320) | func TestHlsHeader(t *testing.T) { function TestHlsSegment (line 405) | func TestHlsSegment(t *testing.T) { FILE: internal/pkg/hls/segment.go type Segment (line 10) | type Segment struct function NewSegment (line 25) | func NewSegment(duration float64, path string, isFirst bool) *Segment { function GenerateSegments (line 44) | func GenerateSegments(trackDuration float64, segmentDuration int, trackI... FILE: internal/pkg/hls/segment_test.go function TestNewSegment (line 7) | func TestNewSegment(t *testing.T) { function TestGenerateSegments (line 78) | func TestGenerateSegments(t *testing.T) { FILE: internal/pkg/sql/sql.go function BuildInClause (line 9) | func BuildInClause(column string, num int) string { function ColumnExists (line 19) | func ColumnExists(db *sql.DB, tableName, columnName string) (bool, error) { function TableExists (line 35) | func TableExists(db *sql.DB, tableName string) (bool, error) { FILE: internal/pkg/sse/emitter.go type Emitter (line 8) | type Emitter struct method RegisterEvent (line 26) | func (ee *Emitter) RegisterEvent(name, data string) { method CountSubscribers (line 39) | func (ee *Emitter) CountSubscribers() int { method Subscribe (line 52) | func (ee *Emitter) Subscribe(eventChan chan *Event) { method Unsubscribe (line 60) | func (ee *Emitter) Unsubscribe(eventChan chan *Event) { function NewEmitter (line 16) | func NewEmitter() *Emitter { FILE: internal/pkg/sse/event.go type Event (line 11) | type Event struct method Stringify (line 37) | func (e *Event) Stringify() string { function NewEvent (line 24) | func NewEvent(name, data string) *Event { FILE: internal/pkg/ulid/ulid.go constant Length (line 13) | Length = ulid.EncodedSize type generator (line 20) | type generator struct function New (line 25) | func New() string { function Verify (line 31) | func Verify(s string) error { function initGenerator (line 39) | func initGenerator() *generator { FILE: internal/playback/service.go type Service (line 8) | type Service struct method AddPlaybackHistory (line 23) | func (s *Service) AddPlaybackHistory(trackName string) { method RecentPlaybackHistory (line 37) | func (s *Service) RecentPlaybackHistory(limit int) ([]*History, error) { method DeleteOldPlaybackHistory (line 43) | func (s *Service) DeleteOldPlaybackHistory() { function NewService (line 13) | func NewService(store Store) *Service { FILE: internal/playback/state.go type State (line 22) | type State struct method Run (line 72) | func (s *State) Run() { method Play (line 102) | func (s *State) Play() error { method Pause (line 131) | func (s *State) Pause() { method Reload (line 145) | func (s *State) Reload() error { method initHLSPlaylist (line 180) | func (s *State) initHLSPlaylist(current, next *track.Track) error { method loadNextTrack (line 200) | func (s *State) loadNextTrack() error { method makeHLSSegments (line 224) | func (s *State) makeHLSSegments(track *track.Track, dir string) ([]*hl... function NewState (line 48) | func NewState(ts *track.Service, qs *queue.Service, ps *Service, tmpDir ... FILE: internal/playback/types.go type History (line 3) | type History struct type Store (line 9) | type Store interface FILE: internal/playlist/consts.go constant minNameLen (line 4) | minNameLen = 3 constant maxNameLen (line 5) | maxNameLen = 128 constant maxDescrLen (line 6) | maxDescrLen = 4096 constant maxTracks (line 7) | maxTracks = 100 FILE: internal/playlist/service.go type Service (line 8) | type Service struct method AddPlaylist (line 18) | func (s *Service) AddPlaylist(name, description string, trackIDs []str... method Playlists (line 46) | func (s *Service) Playlists() ([]*Playlist, error) { method Playlist (line 51) | func (s *Service) Playlist(id string) (*Playlist, error) { method EditPlaylist (line 56) | func (s *Service) EditPlaylist(id, name, description string, trackIDs ... method DeletePlaylist (line 76) | func (s *Service) DeletePlaylist(id string) error { function NewService (line 12) | func NewService(store Store) *Service { function validateName (line 81) | func validateName(name string) error { function validateDescr (line 91) | func validateDescr(descr string) error { function validateTracks (line 98) | func validateTracks(trackIDs []string) error { FILE: internal/playlist/types.go type Playlist (line 5) | type Playlist struct type Store (line 13) | type Store interface FILE: internal/queue/service.go type Service (line 13) | type Service struct method Queue (line 27) | func (s *Service) Queue() ([]*track.Track, error) { method AddToQueue (line 39) | func (s *Service) AddToQueue(tracks []*track.Track) error { method ReorderQueue (line 51) | func (s *Service) ReorderQueue(ids []string) error { method RemoveFromQueue (line 63) | func (s *Service) RemoveFromQueue(ids []string) error { method SpinQueue (line 72) | func (s *Service) SpinQueue() error { method CurrentAndNextTrack (line 81) | func (s *Service) CurrentAndNextTrack() (*track.Track, *track.Track, e... method CleanupHLSPlaylists (line 93) | func (s *Service) CleanupHLSPlaylists(dirPath string) error { function NewService (line 17) | func NewService(store Store) *Service { FILE: internal/queue/types.go type Store (line 5) | type Store interface FILE: internal/station/const.go constant propName (line 4) | propName = "name" constant propDescription (line 5) | propDescription = "description" constant propFaviconURL (line 6) | propFaviconURL = "faviconURL" constant propLogoURL (line 7) | propLogoURL = "logoURL" constant propLocation (line 8) | propLocation = "location" constant propTimezone (line 9) | propTimezone = "timezone" constant propLinks (line 10) | propLinks = "links" constant propTheme (line 11) | propTheme = "theme" FILE: internal/station/service.go type Service (line 3) | type Service struct method Info (line 13) | func (s *Service) Info() (*Info, error) { method EditInfo (line 45) | func (s *Service) EditInfo(editedInfo *Info) (*Info, error) { function NewService (line 7) | func NewService(store Store) *Service { FILE: internal/station/types.go type Info (line 3) | type Info struct type Property (line 14) | type Property struct type Store (line 19) | type Store interface FILE: internal/storage/sqlite/migrations/migrations.go type Migration (line 8) | type Migration struct FILE: internal/storage/sqlite/migrations/runner.go function RunMigrations (line 11) | func RunMigrations(db *sql.DB, log *slog.Logger) error { FILE: internal/storage/sqlite/playback.go type PlaybackStore (line 11) | type PlaybackStore struct method AddPlaybackHistory (line 23) | func (ps *PlaybackStore) AddPlaybackHistory(playedAt int64, trackName ... method RecentPlaybackHistory (line 37) | func (ps *PlaybackStore) RecentPlaybackHistory(limit int) ([]*playback... method DeleteOldPlaybackHistory (line 65) | func (ps *PlaybackStore) DeleteOldPlaybackHistory() (int64, error) { function NewPlaybackStore (line 16) | func NewPlaybackStore(db *sql.DB, mutex *sync.Mutex) PlaybackStore { FILE: internal/storage/sqlite/playlist.go type PlaylistStore (line 13) | type PlaylistStore struct method AddPlaylist (line 26) | func (ps *PlaylistStore) AddPlaylist(name, description string, trackID... method Playlists (line 56) | func (ps *PlaylistStore) Playlists() ([]*playlist.Playlist, error) { method Playlist (line 86) | func (ps *PlaylistStore) Playlist(id string) (*playlist.Playlist, erro... method IsPlaylistExists (line 122) | func (ps *PlaylistStore) IsPlaylistExists(name string) (bool, error) { method EditPlaylist (line 139) | func (ps *PlaylistStore) EditPlaylist(id, name, description string, tr... method DeletePlaylist (line 171) | func (ps *PlaylistStore) DeletePlaylist(id string) error { function NewPlaylistStore (line 18) | func NewPlaylistStore(db *sql.DB, mutex *sync.Mutex) PlaylistStore { FILE: internal/storage/sqlite/queue.go type QueueStore (line 12) | type QueueStore struct method Queue (line 24) | func (qs *QueueStore) Queue() ([]*track.Track, error) { method AddToQueue (line 57) | func (qs *QueueStore) AddToQueue(tracks []*track.Track) error { method RemoveFromQueue (line 77) | func (qs *QueueStore) RemoveFromQueue(trackIDs []string) error { method ReorderQueue (line 92) | func (qs *QueueStore) ReorderQueue(trackIDs []string) error { method CurrentAndNextTrack (line 112) | func (qs *QueueStore) CurrentAndNextTrack() (*track.Track, *track.Trac... method SpinQueue (line 159) | func (qs *QueueStore) SpinQueue() error { function NewQueueStore (line 17) | func NewQueueStore(db *sql.DB, mutex *sync.Mutex) QueueStore { FILE: internal/storage/sqlite/sqlite.go type Instance (line 13) | type Instance struct method Close (line 61) | func (ins *Instance) Close() error { function New (line 25) | func New(dbPath string, log *slog.Logger) (*Instance, error) { FILE: internal/storage/sqlite/station.go type StationStore (line 11) | type StationStore struct method StationProperties (line 23) | func (ss *StationStore) StationProperties() ([]*station.Property, erro... method UpsertStationProperty (line 52) | func (ss *StationStore) UpsertStationProperty(key, value string) (*sta... method DeleteStationProperty (line 73) | func (ss *StationStore) DeleteStationProperty(key string) error { function NewStationStore (line 16) | func NewStationStore(db *sql.DB, mutex *sync.Mutex) StationStore { FILE: internal/storage/sqlite/track.go type TrackStore (line 15) | type TrackStore struct method Tracks (line 27) | func (ts *TrackStore) Tracks(page, limit int, search, sortBy, sortOrde... method AddTrack (line 83) | func (ts *TrackStore) AddTrack(name, path string, duration float64, bi... method DeleteTracks (line 105) | func (ts *TrackStore) DeleteTracks(IDs []string) error { method EditTrack (line 120) | func (ts *TrackStore) EditTrack(track *track.Track) (*track.Track, err... method TrackByID (line 139) | func (ts *TrackStore) TrackByID(ID string) (*track.Track, error) { method TracksByIDs (line 158) | func (ts *TrackStore) TracksByIDs(IDs []string) ([]*track.Track, error) { function NewTrackStore (line 20) | func NewTrackStore(db *sql.DB, mutex *sync.Mutex) TrackStore { FILE: internal/storage/storage.go type Storage (line 11) | type Storage interface FILE: internal/track/consts.go constant minAllowedTrackDuration (line 6) | minAllowedTrackDuration = hls.DefaultMaxSegmentDuration * hls.DefaultLiv... constant maxAllowedTrackDuration (line 7) | maxAllowedTrackDuration = 36000 constant defaultAudioBitRate (line 8) | defaultAudioBitRate = 192 constant m4aExtension (line 12) | m4aExtension = "m4a" constant mp3Extension (line 13) | mp3Extension = "mp3" constant aacExtension (line 14) | aacExtension = "aac" constant wavExtension (line 15) | wavExtension = "wav" constant flacExtension (line 16) | flacExtension = "flac" FILE: internal/track/service.go type Service (line 17) | type Service struct method AddTrack (line 51) | func (s *Service) AddTrack(name, path string) (*Track, error) { method PrepareTrack (line 87) | func (s *Service) PrepareTrack(filePath string) (string, error) { method Tracks (line 108) | func (s *Service) Tracks(page, limit int, search, sortBy, sortOrder st... method DeleteTracks (line 137) | func (s *Service) DeleteTracks(ids []string) error { method FindTracks (line 165) | func (s *Service) FindTracks(ids []string) ([]*Track, error) { method MakeHLSPlaylist (line 180) | func (s *Service) MakeHLSPlaylist(trackPath string, outDir string, seg... method LoadTracksFromDisk (line 193) | func (s *Service) LoadTracksFromDisk(tracksDir string) ([]*Track, erro... method modifyTrackDuration (line 253) | func (s *Service) modifyTrackDuration(path string, metadata ffmpeg.Aud... function NewService (line 33) | func NewService(store Store, ffmpegCLI *ffmpeg.CLI, log *slog.Logger) *S... function roundDuration (line 265) | func roundDuration(trackDuration, segmentDuration float64) float64 { function defineTrackName (line 278) | func defineTrackName(fileName, metaName string) string { function replaceExtension (line 292) | func replaceExtension(path string, newExt string) string { FILE: internal/track/types.go type Track (line 4) | type Track struct type Store (line 12) | type Store interface type Page (line 22) | type Page struct type BodyWithIDs (line 29) | type BodyWithIDs struct FILE: web/player/src/api/index.ts constant API_HOST (line 4) | const API_HOST = ""; constant API_PREFIX (line 5) | const API_PREFIX = "/api/v1"; class AirstationAPI (line 7) | class AirstationAPI { method constructor (line 12) | constructor(host: string, prefix: string) { method getPlayback (line 18) | async getPlayback() { method getPlaybackHistory (line 23) | async getPlaybackHistory(limit?: number) { method getStationInfo (line 29) | async getStationInfo() { method makeRequest (line 34) | private async makeRequest(url: string, params: RequestInit = {}): P... FILE: web/player/src/api/types.ts type Track (line 1) | interface Track { type PlaybackState (line 9) | interface PlaybackState { type PlaybackHistory (line 15) | interface PlaybackHistory { type StationInfo (line 21) | interface StationInfo { type ResponseErr (line 32) | interface ResponseErr { type ResponseOK (line 36) | interface ResponseOK { FILE: web/player/src/const.ts constant DESKTOP_WIDTH (line 1) | const DESKTOP_WIDTH = 1100; constant MAX_HISTORY_LIMIT (line 2) | const MAX_HISTORY_LIMIT = 500; FILE: web/player/src/page/RadioButton.tsx constant STREAM_SOURCE (line 11) | const STREAM_SOURCE = "/stream"; FILE: web/player/src/store/events.ts constant EVENT_SOURCE_URL (line 4) | const EVENT_SOURCE_URL = API_HOST + API_PREFIX + "/events"; constant EVENTS (line 5) | const EVENTS = { FILE: web/player/src/utils/color.ts function getHueFromHex (line 1) | function getHueFromHex(hex: string) { function isValidHexColor (line 29) | function isValidHexColor(hex: string) { FILE: web/studio/src/api/index.ts constant API_HOST (line 4) | const API_HOST = ""; constant API_PREFIX (line 5) | const API_PREFIX = "/api/v1"; class AirstationAPI (line 7) | class AirstationAPI { method constructor (line 12) | constructor(host: string, prefix: string) { method login (line 18) | async login(secret: string) { method getPlayback (line 23) | async getPlayback() { method pausePlayback (line 28) | async pausePlayback() { method playPlayback (line 33) | async playPlayback() { method getTracks (line 38) | async getTracks(page: number, limit: number, search: string, sortBy: k... method uploadTracks (line 49) | async uploadTracks(files: File[]) { method deleteTracks (line 63) | async deleteTracks(ids: string[]) { method getQueue (line 68) | async getQueue() { method addToQueue (line 73) | async addToQueue(trackIDs: string[]) { method updateQueue (line 78) | async updateQueue(trackIDs: string[]) { method removeFromQueue (line 83) | async removeFromQueue(trackIDs: string[]) { method addPlaylist (line 88) | async addPlaylist(name: string, trackIDs: string[], description?: stri... method getPlaylists (line 93) | async getPlaylists() { method getPlaylist (line 98) | async getPlaylist(id: string) { method editPlaylist (line 103) | async editPlaylist(id: string, name: string, trackIDs: string[], descr... method deletePlaylist (line 108) | async deletePlaylist(id: string) { method getStationInfo (line 113) | async getStationInfo() { method editStationInfo (line 118) | async editStationInfo(info: StationInfo) { method makeRequest (line 123) | private async makeRequest(url: string, params: RequestInit = {}): P... FILE: web/studio/src/api/types.ts type Track (line 1) | interface Track { type TracksPage (line 9) | interface TracksPage { type PlaybackState (line 16) | interface PlaybackState { type ResponseErr (line 23) | interface ResponseErr { type ResponseOK (line 27) | interface ResponseOK { type Playlist (line 31) | interface Playlist { type StationInfo (line 39) | interface StationInfo { FILE: web/studio/src/components/AudioPlayer.tsx type AudioPlayerProps (line 10) | interface AudioPlayerProps { FILE: web/studio/src/components/AuthGuard.tsx constant MIN_SECRET_LENGTH (line 54) | const MIN_SECRET_LENGTH = 10; FILE: web/studio/src/hooks/useIsMobile.ts constant MAX_MOBILE_WIDTH (line 3) | const MAX_MOBILE_WIDTH = 800; FILE: web/studio/src/hooks/useThemeBlackColor.ts function useThemeBlackColor (line 3) | function useThemeBlackColor() { FILE: web/studio/src/icons/types.ts type IconProps (line 1) | interface IconProps extends React.ComponentPropsWithoutRef<"svg"> { FILE: web/studio/src/page/MobileBar.tsx type MobileBarProps (line 4) | interface MobileBarProps { constant MOBILE_BARS (line 9) | const MOBILE_BARS = ["Playback", "Queue", "Tracks"]; FILE: web/studio/src/page/TracksLibrary.tsx constant PAGE_LIMIT (line 33) | const PAGE_LIMIT = 20; FILE: web/studio/src/store/events.ts constant EVENT_SOURCE_URL (line 4) | const EVENT_SOURCE_URL = API_HOST + API_PREFIX + "/events"; constant EVENTS (line 5) | const EVENTS = { type EventHandler (line 11) | type EventHandler = (event: MessageEvent) => void; type EventSourceStore (line 13) | interface EventSourceStore { FILE: web/studio/src/store/playback.ts type PlaybackStore (line 7) | interface PlaybackStore { method setPlayback (line 19) | setPlayback(pb) { method fetchPlayback (line 24) | async fetchPlayback() { method play (line 35) | async play() { method pause (line 41) | async pause() { method syncElapsedTime (line 47) | syncElapsedTime() { FILE: web/studio/src/store/playlists.ts type PlaylistStore (line 5) | interface PlaylistStore { method setPlaylists (line 18) | setPlaylists(p) { method fetchPlaylists (line 22) | async fetchPlaylists() { method addPlaylist (line 27) | async addPlaylist(name, trackIDs, description) { method editPlaylist (line 33) | async editPlaylist(id: string, name: string, trackIDs: string[], descrip... method deletePlaylist (line 52) | async deletePlaylist(id) { FILE: web/studio/src/store/settings.ts type SettingsStore (line 4) | interface SettingsStore { FILE: web/studio/src/store/track-queue.ts type TrackQueueStore (line 5) | interface TrackQueueStore { method fetchQueue (line 17) | async fetchQueue() { method updateQueue (line 22) | async updateQueue(tracks) { method addToQueue (line 27) | async addToQueue(trackIDs: string[]) { method removeFromQueue (line 34) | async removeFromQueue(trackIDs: string[]) { method rotateQueue (line 41) | rotateQueue() { FILE: web/studio/src/store/tracks.ts type TracksStore (line 5) | interface TracksStore { method setTracks (line 19) | setTracks(q) { method fetchTracks (line 23) | async fetchTracks(p: number, l: number, s: string, sb: keyof Track, so: ... method uploadTracks (line 42) | async uploadTracks(files: File[]) { method deleteTracks (line 47) | async deleteTracks(trackIDs: string[]) { FILE: web/studio/src/types/index.ts type DisclosureHandler (line 1) | interface DisclosureHandler {