Skip to content

Commit 40b3c8e

Browse files
committed
[Add] WebDAVサーバー楽曲の詳細検索を有効にするかの設定項目を実装
1 parent 79f5e2f commit 40b3c8e

File tree

5 files changed

+55
-23
lines changed

5 files changed

+55
-23
lines changed

constants/Settings.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ export const SETTING_ITEMS: SettingItems = {
2828
SEARCH_ALL_METADATA_FOR_UNCACHED_WEBDAV_TRACK: {
2929
label: "WebDAVの未キャッシュ楽曲の詳細検索を有効にする",
3030
description:
31-
"WebDAVサーバー上にある楽曲を検索する時、ファイル名ではなくメタデータを対象に検索するかどうか"
31+
"WebDAVサーバー上にある楽曲を検索する時、ファイル名だけでなくメタデータも対象に検索するかどうか (検索にかかる時間が長くなります)"
3232
},
3333
DEBUGMODE: {
3434
label: "デバッグモードを有効にする",
3535
description: "デバッグモードを有効にするかどうか"
3636
},
3737
BACKGROUND_OF_QUEUE: {
3838
label: "キューの背景",
39-
description: "そのうち選択肢が増えるかも…?",
39+
description: "そのうち選択肢が増えるかも…?(TODO: 未実装)",
4040
options: ["vercel", "meta"]
4141
}
4242
} as const

hooks/useMergedWebDAVServerData.tsx

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1+
import { useLocalStorage } from "@mantine/hooks"
12
import { useCallback, useState } from "react"
23
import useWebDAVServer from "./useWebDAVServer"
34
import useWebDAVTrackDatabase from "./useWebDAVTrackDatabase"
5+
import { LOCAL_STORAGE_KEYS } from "@/constants/LocalStorageKeys"
6+
import { DEFAULT_SETTING_VALUES } from "@/constants/Settings"
7+
import { SettingValues } from "@/types/DefaultSettings"
48
import { MergedWebDAVSearchResult } from "@/types/MergedWebDAVSearchResult"
59
import { removePathProperty } from "@/types/Track"
10+
import { filterTracksByKeyword } from "@/utils/filterTracksByKeyword"
611

712
const useMergedWebDAVServerData = () => {
13+
const [settings] = useLocalStorage<SettingValues>({
14+
key: LOCAL_STORAGE_KEYS.SETTINGS,
15+
defaultValue: DEFAULT_SETTING_VALUES
16+
})
817
const [mergedSearchResult, setMergedSearchResult] =
918
useState<MergedWebDAVSearchResult>({
1019
status: "IDLE",
@@ -24,6 +33,7 @@ const useMergedWebDAVServerData = () => {
2433
data: []
2534
})
2635

36+
/** IndexedDBにキャッシュ済みのメタデーターを検索 */
2737
const indexedDBTracks = (await searchTracks(keyword)).filter(track =>
2838
folderPaths.some(folderPath => track.path.startsWith(folderPath))
2939
)
@@ -32,23 +42,36 @@ const useMergedWebDAVServerData = () => {
3242
data: indexedDBTracks.map(track => removePathProperty(track))
3343
})
3444

45+
/** WebDAVサーバー上にある楽曲を検索する時、ファイル名ではなくメタデータを対象に検索するかどうか */
46+
const shouldSearchAllMetadata =
47+
settings.SEARCH_ALL_METADATA_FOR_UNCACHED_WEBDAV_TRACK
48+
49+
/** 検索対象となり得る楽曲の絶対パスを列挙する */
3550
const folderTracks = await Promise.all(
36-
folderPaths.map(folderPath => getFolderTracks(folderPath, keyword))
51+
folderPaths.map(folderPath =>
52+
getFolderTracks(folderPath, shouldSearchAllMetadata ? "" : keyword)
53+
)
3754
)
55+
56+
/** IndexedDBに存在しない楽曲ファイルを抽出 */
3857
const filteredFolderTracks = folderTracks
3958
.flat()
4059
.filter(
4160
track =>
4261
!indexedDBTracks.map(track => track.path).includes(track.filename)
4362
)
44-
const folderTracksInfo = await Promise.all(
45-
filteredFolderTracks.map(async fileInfo => {
46-
const trackInfo = await getTrackInfo(fileInfo)
47-
saveTrackInfo(trackInfo)
48-
return trackInfo
49-
})
63+
64+
const keywordFilteredUnCachedTracks = await Promise.all(
65+
filteredFolderTracks.map(fileInfo => getTrackInfo(fileInfo))
5066
)
5167

68+
const folderTracksInfo = shouldSearchAllMetadata
69+
? filterTracksByKeyword(keywordFilteredUnCachedTracks, keyword)
70+
: keywordFilteredUnCachedTracks
71+
72+
/** 新しく取得した楽曲のメタデーターをIndexedDBに保存しておく */
73+
folderTracksInfo.forEach(trackInfo => saveTrackInfo(trackInfo))
74+
5275
// indexedDBの検索結果とwebDAVサーバーの検索結果を結合して、楽曲タイトルの昇順にソートする
5376
const mergedTracks = indexedDBTracks
5477
.concat(folderTracksInfo)
@@ -64,7 +87,7 @@ const useMergedWebDAVServerData = () => {
6487
data: mergedTracks
6588
})
6689
},
67-
[searchTracks, getFolderTracks, getTrackInfo, saveTrackInfo]
90+
[searchTracks, getFolderTracks, getTrackInfo, saveTrackInfo, settings]
6891
)
6992

7093
const resetMergedSearchResult = useCallback(() => {

hooks/useWebDAVServer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ const useWebDAVServer = () => {
180180
[getClient, checkServerConnectionRoutine]
181181
)
182182

183-
const searchTracks = useCallback(
183+
const searchTracksByFilename = useCallback(
184184
async (folderPaths: string[], keyword: string) => {
185185
try {
186186
await checkServerConnectionRoutine()
@@ -216,7 +216,7 @@ const useWebDAVServer = () => {
216216
checkIsFolderExists,
217217
getFolderTracks,
218218
getTrackInfo,
219-
searchTracks
219+
searchTracksByFilename
220220
} as const
221221
}
222222

hooks/useWebDAVTrackDatabase.tsx

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useCallback, useMemo } from "react"
22
import { WebDAVTrackDatabase } from "@/classes/TrackDatabase"
33
import { TrackWithPath } from "@/types/Track"
4+
import { filterTracksByKeyword } from "@/utils/filterTracksByKeyword"
45

56
// WebDAVのトラック取得の際のキャッシュ戦略用のIndexedDBを使用するためのカスタムフック
67
const useWebDAVTrackDatabase = () => {
@@ -29,17 +30,9 @@ const useWebDAVTrackDatabase = () => {
2930
)
3031

3132
const searchTracks = useCallback(
32-
(keyword: string) => {
33-
const lowerKeyword = keyword.toLowerCase()
34-
35-
const filteredTracks = db.tracks.filter(
36-
(track: TrackWithPath) =>
37-
track.title.toLowerCase().includes(lowerKeyword) ||
38-
track.albumTitle.toLowerCase().includes(lowerKeyword) ||
39-
track.artist.toLowerCase().includes(lowerKeyword)
40-
)
41-
42-
return filteredTracks.toArray()
33+
async (keyword: string) => {
34+
const trackWithPathArray = await db.tracks.toArray()
35+
return filterTracksByKeyword(trackWithPathArray, keyword)
4336
},
4437
[db.tracks]
4538
)

utils/filterTracksByKeyword.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { TrackWithPath } from "@/types/Track"
2+
3+
export const filterTracksByKeyword = (
4+
tracks: TrackWithPath[],
5+
keyword: string
6+
) => {
7+
const lowerKeyword = keyword.toLowerCase()
8+
9+
return tracks.filter(
10+
track =>
11+
track.path.toLowerCase().includes(lowerKeyword) ||
12+
track.title.toLowerCase().includes(lowerKeyword) ||
13+
track.albumTitle.toLowerCase().includes(lowerKeyword) ||
14+
track.artist.toLowerCase().includes(lowerKeyword)
15+
)
16+
}

0 commit comments

Comments
 (0)