Expanded date fields (#2276)

* added missing date/year fields for other song references

* added year table column & sorting

* added navidrome track date view for grid, detail & table.

* update table column config

* Displays date & release date using formatPartialIsoDateUTC, and displays respective year field if no date present
added releaseYear player filter
Made fullscreen player show formatted date
fixed minor year/release year value mismatches
added subsonic date/year field to enable the fields in folder view for navidrome using subsonic year field

---------

Co-authored-by: Jeff <42182408+jeffvli@users.noreply.github.com>
This commit is contained in:
ermmmwafle
2026-08-03 19:54:16 -07:00
committed by GitHub
parent fd9380a149
commit 64dc3c1bc2
30 changed files with 418 additions and 81 deletions
+119 -8
View File
@@ -95,10 +95,12 @@ const PlayerItemSchema = z.enum([
'sample_rate',
'track_number',
'codec',
'date',
'release_year',
'release_type',
'release_date',
'genres',
'year',
]);
const ArtistItemSchema = z.enum([
@@ -650,6 +652,7 @@ const PlayerFilterFieldSchema = z.enum([
'duration',
'genre',
'year',
'releaseYear',
'note',
'path',
'playCount',
@@ -967,6 +970,7 @@ export enum PlayerItem {
BIT_RATE = 'bit_rate',
BPM = 'bpm',
CODEC = 'codec',
DATE = 'date',
DISC_NUMBER = 'disc_number',
GENRES = 'genres',
RELEASE_DATE = 'release_date',
@@ -974,6 +978,7 @@ export enum PlayerItem {
RELEASE_YEAR = 'release_year',
SAMPLE_RATE = 'sample_rate',
TRACK_NUMBER = 'track_number',
YEAR = 'year',
}
export enum PlaylistTarget {
@@ -1080,6 +1085,10 @@ export const playerItems: SortableItem<PlayerItem>[] = [
disabled: false,
id: PlayerItem.CODEC,
},
{
disabled: true,
id: PlayerItem.DATE,
},
{
disabled: true,
id: PlayerItem.DISC_NUMBER,
@@ -1108,6 +1117,10 @@ export const playerItems: SortableItem<PlayerItem>[] = [
disabled: true,
id: PlayerItem.TRACK_NUMBER,
},
{
disabled: false,
id: PlayerItem.YEAR,
},
];
export const sidebarItems: SidebarItemType[] = [
@@ -1522,10 +1535,14 @@ const initialState: SettingsState = {
alignLeftColumns: [
TableColumn.TITLE,
TableColumn.ALBUM_ARTIST,
TableColumn.YEAR,
TableColumn.RELEASE_YEAR,
],
columns: ALBUM_TABLE_COLUMNS,
enabledColumns: [TableColumn.TITLE, TableColumn.ALBUM_ARTIST, TableColumn.YEAR],
enabledColumns: [
TableColumn.TITLE,
TableColumn.ALBUM_ARTIST,
TableColumn.RELEASE_YEAR,
],
pickColumns: [
TableColumn.TITLE,
TableColumn.DURATION,
@@ -1537,8 +1554,8 @@ const initialState: SettingsState = {
TableColumn.PLAY_COUNT,
TableColumn.SONG_COUNT,
TableColumn.RELEASE_DATE,
TableColumn.RELEASE_YEAR,
TableColumn.LAST_PLAYED,
TableColumn.YEAR,
],
}),
size: 'default',
@@ -1599,10 +1616,14 @@ const initialState: SettingsState = {
alignLeftColumns: [
TableColumn.TITLE,
TableColumn.ALBUM_ARTIST,
TableColumn.YEAR,
TableColumn.RELEASE_YEAR,
],
columns: ALBUM_TABLE_COLUMNS,
enabledColumns: [TableColumn.TITLE, TableColumn.ALBUM_ARTIST, TableColumn.YEAR],
enabledColumns: [
TableColumn.TITLE,
TableColumn.ALBUM_ARTIST,
TableColumn.RELEASE_YEAR,
],
pickColumns: [
TableColumn.TITLE,
TableColumn.DURATION,
@@ -1614,8 +1635,8 @@ const initialState: SettingsState = {
TableColumn.PLAY_COUNT,
TableColumn.SONG_COUNT,
TableColumn.RELEASE_DATE,
TableColumn.RELEASE_YEAR,
TableColumn.LAST_PLAYED,
TableColumn.YEAR,
],
}),
size: 'default',
@@ -1823,15 +1844,17 @@ const initialState: SettingsState = {
TableColumn.TITLE,
TableColumn.ARTIST,
TableColumn.DURATION,
TableColumn.YEAR,
TableColumn.BIT_RATE,
TableColumn.BPM,
TableColumn.CODEC,
TableColumn.DATE,
TableColumn.DATE_ADDED,
TableColumn.GENRE,
TableColumn.LAST_PLAYED,
TableColumn.RELEASE_DATE,
TableColumn.RELEASE_YEAR,
TableColumn.TRACK_NUMBER,
TableColumn.YEAR,
],
}),
size: 'default',
@@ -1899,15 +1922,17 @@ const initialState: SettingsState = {
TableColumn.TITLE,
TableColumn.ARTIST,
TableColumn.DURATION,
TableColumn.YEAR,
TableColumn.BIT_RATE,
TableColumn.BPM,
TableColumn.CODEC,
TableColumn.DATE,
TableColumn.DATE_ADDED,
TableColumn.GENRE,
TableColumn.LAST_PLAYED,
TableColumn.RELEASE_DATE,
TableColumn.RELEASE_YEAR,
TableColumn.TRACK_NUMBER,
TableColumn.YEAR,
],
}),
size: 'default',
@@ -2714,6 +2739,92 @@ export const useSettingsStore = createWithEqualityFn<SettingsSlice>()(
);
}
if (version < 29) {
const dateColumn: ItemTableListColumnConfig = {
align: 'center',
autoSize: false,
id: TableColumn.DATE,
isEnabled: false,
pinned: null,
width: 240,
};
const yearColumn: ItemTableListColumnConfig = {
align: 'center',
autoSize: false,
id: TableColumn.YEAR,
isEnabled: false,
pinned: null,
width: 200,
};
const listKeysToUpdate: ItemListKey[] = [
ItemListKey.SONG,
ItemListKey.ALBUM_DETAIL,
ItemListKey.FOLDER,
ItemListKey.PLAYLIST_SONG,
ItemListKey.ALBUM_ARTIST_SONG,
ItemListKey.GENRE_SONG,
ItemListKey.QUEUE_SONG,
ItemListKey.FULL_SCREEN,
ItemListKey.SIDE_QUEUE,
];
listKeysToUpdate.forEach((listKey) => {
const listConfig = state.lists[listKey];
if (listConfig?.table?.columns) {
const columns = listConfig.table.columns;
const hasYear = columns.some((col) => col.id === TableColumn.YEAR);
if (!hasYear) {
const releaseYearIndex = columns.findIndex(
(col) => col.id === TableColumn.RELEASE_YEAR,
);
if (releaseYearIndex >= 0) {
columns.splice(releaseYearIndex, 0, yearColumn);
} else {
columns.push(yearColumn);
}
}
const hasDate = columns.some((col) => col.id === TableColumn.DATE);
if (!hasDate) {
const releaseDateIndex = columns.findIndex(
(col) => col.id === TableColumn.RELEASE_DATE,
);
if (releaseDateIndex >= 0) {
columns.splice(releaseDateIndex, 0, dateColumn);
} else {
columns.push(dateColumn);
}
}
}
});
const listConfig = state.lists[ItemListKey.ALBUM];
if (listConfig?.detail?.columns) {
const columns = listConfig.detail.columns;
const hasYear = columns.some((col) => col.id === TableColumn.YEAR);
if (!hasYear) {
const releaseYearIndex = columns.findIndex(
(col) => col.id === TableColumn.RELEASE_YEAR,
);
if (releaseYearIndex >= 0) {
columns.splice(releaseYearIndex, 0, yearColumn);
} else {
columns.push(yearColumn);
}
}
const hasDate = columns.some((col) => col.id === TableColumn.DATE);
if (!hasDate) {
const releaseDateIndex = columns.findIndex(
(col) => col.id === TableColumn.RELEASE_DATE,
);
if (releaseDateIndex >= 0) {
columns.splice(releaseDateIndex, 0, dateColumn);
} else {
columns.push(dateColumn);
}
}
}
}
if (version < 30) {
for (const [key, displaySettings] of Object.entries(state.lyricsDisplay)) {
const legacySettings = displaySettings as typeof displaySettings & {