Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
ebd20d7
Basic engine idea
Mar 16, 2026
f44e6a5
Audio
Mar 16, 2026
9034992
Library and Storage
Mar 16, 2026
a5e4d58
So much moreeeeeee
Mar 16, 2026
838ffec
A few things that needed to be fixed
Mar 16, 2026
88690dd
more fixes
Mar 16, 2026
ffa6e91
Movement
Mar 17, 2026
b4c5ed6
owwwwwwwww
Mar 19, 2026
4a5abec
More stuff
Mar 20, 2026
59458ae
Helpers go bye byeeeeee (most of em)
Mar 20, 2026
5f488ed
one more fileeee (hook time)
Mar 20, 2026
918be77
make-pretty
Mar 20, 2026
9c81a2d
hooks
Mar 20, 2026
f0d9542
Tiny stuff
Mar 20, 2026
7e2c1d6
more stuff
Mar 20, 2026
0902010
move
Mar 28, 2026
2298d76
bunch of changes
Mar 29, 2026
e269acc
SATORIII
Mar 29, 2026
27df322
bunch of stuff (i forgot to commit this from a week ago oops)
Mar 31, 2026
62e90ea
Some tiny state fixes
Apr 8, 2026
cdae3fd
Gasp i almost deleted this folder I thought I'd commited these
NellowTCS Sep 14, 2026
d72f153
Visualizers
NellowTCS Sep 21, 2026
4fc6545
Cursor
NellowTCS Sep 22, 2026
c5454ae
Various fixes
NellowTCS Sep 23, 2026
c3140f0
Visualizers
NellowTCS Sep 23, 2026
7d50977
Updates
NellowTCS Sep 23, 2026
3e60188
Fix
NellowTCS Sep 23, 2026
bf5721e
Many changes
NellowTCS Sep 25, 2026
b3fa7db
More fixes
NellowTCS Sep 25, 2026
c9042e0
Massive changes to everything
NellowTCS Sep 28, 2026
7a85b8d
Fixes
NellowTCS Sep 29, 2026
54fafed
Review comments and changes
NellowTCS Sep 30, 2026
5a0dc42
Review comments
NellowTCS Oct 1, 2026
d52c8e0
WASM stuff and fixes
NellowTCS Oct 2, 2026
89d56c1
Many changes
NellowTCS Oct 5, 2026
1843396
temporary vendor of music-metadata = CAF working (also the other dura…
NellowTCS Oct 6, 2026
39055db
netlify
NellowTCS Oct 6, 2026
2788279
oop
NellowTCS Oct 6, 2026
4b7279d
Fix CI
NellowTCS Oct 6, 2026
18521ed
Enable everything on safari to see what breaks
NellowTCS Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Review comments and changes
  • Loading branch information
NellowTCS committed Sep 30, 2026
commit 54fafede72912cf801ec2bf237ca9e83d54c6598
7 changes: 0 additions & 7 deletions BUGS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

- [ ] when the visualizer is open, something UI bugs out and transparency and it flickers sometimes
- [ ] switching from Home to All Songs and vice versa has a white flash
- [ ] same for flo stuff we should consolidate where we can and it doesn't create large files
- [ ] use a proper equalizer component from the web or NPM that works with redux rather than that thing as it's... not a equalizer
- [ ] so like keeping track of state when user repeatedly does actions (like for example switching songs fast) does nothing and like weirds out state (the eternal problem with this appppppp ugh)
- [ ] Crossfade doesn't work
Expand All @@ -15,9 +14,6 @@
- [ ] Compact mode
- [ ] Show Lyrics
- [ ] Show Album Art
- [X] Toggle Lyrics
- [X] Toggle Visualizer

- [ ] Lessen delays while reordering

- [ ] Use List Virtualization for song list so that having larger libraries doesn't cause lag on all songs
Expand All @@ -38,9 +34,6 @@
- [ ] fix some themes' visibility issues
- light mode mostly fixed, re-check all

- [ ] proper pitch manipulation
- [PitchShift](https://tonejs.github.io/docs/15.1.22/classes/PitchShift.html)?

- [ ] some missed text that's supposed to be in i18n
- Run `npm run i18n-check` or `node i18n-izer.cjs -I "visualizers" --ignore-console`

Expand Down
18 changes: 9 additions & 9 deletions Build/eslint.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ module.exports = [
rules: {
"react/jsx-uses-react": "off",
"react/react-in-jsx-scope": "off",
"react/jsx-uses-vars": "warn",
"react/jsx-uses-vars": "error",
"react/prop-types": "off",
"react/display-name": "off",
"react/no-unescaped-entities": "warn",
"react/jsx-key": "warn",
"react/no-unescaped-entities": "error",
"react/jsx-key": "error",
},
settings: {
react: {
Expand All @@ -48,23 +48,23 @@ module.exports = [
},
rules: {
"@typescript-eslint/no-unused-vars": [
"warn",
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
caughtErrorsIgnorePattern: "^_",
ignoreRestSiblings: true,
},
],
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/consistent-type-definitions": ["warn", "interface"],
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/consistent-type-definitions": ["error", "interface"],
"react/jsx-uses-react": "off",
"react/react-in-jsx-scope": "off",
"react/jsx-uses-vars": "warn",
"react/jsx-uses-vars": "error",
"react/prop-types": "off",
"react/display-name": "off",
"react/no-unescaped-entities": "warn",
"react/jsx-key": "warn",
"react/no-unescaped-entities": "error",
"react/jsx-key": "error",
},
settings: {
react: {
Expand Down
2 changes: 0 additions & 2 deletions Build/jest.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ module.exports = {
"^.+\\.tsx?$": ["ts-jest", { useESM: true }],
},
moduleNameMapper: {
"^@core/(.*)$": "<rootDir>/src/core/$1",
"^@platform/(.*)$": "<rootDir>/src/platform/$1",
"^.*/platform/visualizers$": "<rootDir>/tests/mocks/platformVisualizers.ts",
"^@audiflo/libflo$": "<rootDir>/tests/mocks/audifloLibflo.ts",
"StreamingDecoderBackend$": "<rootDir>/tests/mocks/streamingDecoderBackend.ts",
Expand Down
42 changes: 23 additions & 19 deletions Build/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 4 additions & 6 deletions Build/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
"build:wasm": "wasm-pack build ../crates/symphonia-wasm --target web --out-dir ../../Build/src/platform/audio/wasm/symphonia --out-name symphonia --release",
"test:watch": "jest --watch",
"lint": "eslint 'src/**/*.ts' 'src/**/*.tsx'",
"eject": "react-scripts eject",
"make-pretty": "prettier --write 'src/**/*.{ts,tsx,js,jsx,json,css,scss,md,html,cjs}'",
"count-lines": "cloc . --exclude-dir=node_modules,build,dist --exclude-ext=lock,json",
"i18n-check": "node i18n-izer.cjs --ignore-console",
Expand All @@ -31,7 +30,6 @@
"@audiflo/libflo": "^0.1.3",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@fontsource/caveat": "^5.3.0",
"@fontsource/inter": "^5.3.0",
"@fontsource/jetbrains-mono": "^5.3.0",
Expand Down Expand Up @@ -60,12 +58,13 @@
"@zag-js/marquee": "^1.44.0",
"@zag-js/react": "^1.44.0",
"dompurify": "^3.4.15",
"dsssp": "^0.8.0",
"gsap": "^3.15.0",
"i18next": "^26.4.2",
"i18next-browser-languagedetector": "^8.2.1",
"i18next-http-backend": "^4.0.2",
"lodash": "^4.18.1",
"lucide-react": "^0.577.0",
"m3u-parser-generator": "^5.0.2",
"music-metadata": "^11.16.0",
"react": "^19.3.0",
"react-dom": "^19.3.0",
Expand All @@ -79,9 +78,7 @@
"devDependencies": {
"@babel/plugin-transform-runtime": "^7.29.0",
"@tauri-apps/cli": "^2.11.5",
"@types/jasmine": "^6.0.0",
"@types/jest": "^30.0.0",
"@types/lodash": "^4.17.25",
"@types/node": "^26.6.2",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
Expand All @@ -101,7 +98,8 @@
"vite": "^8.3.0",
"vite-plugin-pwa": "^1.3.0",
"vite-plugin-wasm": "^3.6.0",
"workbox-window": "^7.4.1"
"workbox-precaching": "^7.4.1",
"workbox-routing": "^7.4.1"
},
"eslintConfig": {
"extends": [
Expand Down
5 changes: 5 additions & 0 deletions Build/src/core/engine/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export type TrackSourceKind = "opfs" | "folderHandle";

export interface Track {
id: string;
title: string;
Expand All @@ -7,6 +9,9 @@ export interface Track {
url: string;
mimeType?: string;
hasStoredAudio?: boolean;
sourceKind?: TrackSourceKind;
sourceId?: string;
path?: string;
albumArt?: string;
hasAlbumArt?: boolean;
embeddedLyrics?: EmbeddedLyrics[];
Expand Down
11 changes: 7 additions & 4 deletions Build/src/global.css
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,11 @@ html {
}
}

::view-transition-old(root),
::view-transition-new(root) {
background: var(--themegradient);
}

html[data-vt-direction="forward"]::view-transition-old(root) {
--vt-slide-offset: -60px;
animation:
Expand All @@ -146,8 +151,7 @@ html[data-vt-direction="forward"]::view-transition-old(root) {
html[data-vt-direction="forward"]::view-transition-new(root) {
--vt-slide-offset: 60px;
animation:
var(--animation-duration-fast) ease-out var(--animation-duration-fast) both
vtFade,
var(--animation-duration-fast) ease-out both vtFade,
var(--animation-duration-normal) ease-in-out both vtSlide;
}

Expand All @@ -161,8 +165,7 @@ html[data-vt-direction="back"]::view-transition-old(root) {
html[data-vt-direction="back"]::view-transition-new(root) {
--vt-slide-offset: -60px;
animation:
var(--animation-duration-fast) ease-out var(--animation-duration-fast) both
vtFade,
var(--animation-duration-fast) ease-out both vtFade,
var(--animation-duration-normal) ease-in-out both vtSlide;
}

Expand Down
41 changes: 38 additions & 3 deletions Build/src/helpers/addSong.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,48 @@
import type { Track } from "../core/engine/types";
import type { Track, TrackSourceKind } from "../core/engine/types";
import { saveAudio } from "../platform/storage/opfs";
import { trackStorage } from "../platform/storage/trackStorage";

export interface ImportContext {
sourceKind?: TrackSourceKind;
sourceId?: string;
path?: string;
}

export async function prepareAndStoreSong(
song: Track,
file: File,
): Promise<Track> {
song.url = URL.createObjectURL(file);
song.hasStoredAudio = true;
const arrayBuffer = await file.arrayBuffer();
await trackStorage.saveTrack(song, arrayBuffer);
await saveAudio(song.id, file);
await trackStorage.saveTrack(song);
return song;
}

export async function storeImportedSong(
song: Track,
file: File,
context?: ImportContext,
): Promise<Track> {
const sourcePath = context?.path ?? song.path;
if (
context?.sourceKind === "folderHandle" &&
context.sourceId &&
sourcePath
) {
song.sourceKind = context.sourceKind;
song.sourceId = context.sourceId;
song.path = sourcePath;
song.hasStoredAudio = true;
song.url = "";
await trackStorage.saveTrack(song);
return song;
}
return prepareAndStoreSong(song, file);
}

export async function storeRemoteSong(song: Track): Promise<Track> {
song.hasStoredAudio = false;
await trackStorage.saveTrack(song);
return song;
}
Loading
Loading