1
+ import { useLocalStorage } from "@mantine/hooks"
1
2
import { useCallback , useState } from "react"
2
3
import useWebDAVServer from "./useWebDAVServer"
3
4
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"
4
8
import { MergedWebDAVSearchResult } from "@/types/MergedWebDAVSearchResult"
5
9
import { removePathProperty } from "@/types/Track"
10
+ import { filterTracksByKeyword } from "@/utils/filterTracksByKeyword"
6
11
7
12
const useMergedWebDAVServerData = ( ) => {
13
+ const [ settings ] = useLocalStorage < SettingValues > ( {
14
+ key : LOCAL_STORAGE_KEYS . SETTINGS ,
15
+ defaultValue : DEFAULT_SETTING_VALUES
16
+ } )
8
17
const [ mergedSearchResult , setMergedSearchResult ] =
9
18
useState < MergedWebDAVSearchResult > ( {
10
19
status : "IDLE" ,
@@ -24,6 +33,7 @@ const useMergedWebDAVServerData = () => {
24
33
data : [ ]
25
34
} )
26
35
36
+ /** IndexedDBにキャッシュ済みのメタデーターを検索 */
27
37
const indexedDBTracks = ( await searchTracks ( keyword ) ) . filter ( track =>
28
38
folderPaths . some ( folderPath => track . path . startsWith ( folderPath ) )
29
39
)
@@ -32,23 +42,36 @@ const useMergedWebDAVServerData = () => {
32
42
data : indexedDBTracks . map ( track => removePathProperty ( track ) )
33
43
} )
34
44
45
+ /** WebDAVサーバー上にある楽曲を検索する時、ファイル名ではなくメタデータを対象に検索するかどうか */
46
+ const shouldSearchAllMetadata =
47
+ settings . SEARCH_ALL_METADATA_FOR_UNCACHED_WEBDAV_TRACK
48
+
49
+ /** 検索対象となり得る楽曲の絶対パスを列挙する */
35
50
const folderTracks = await Promise . all (
36
- folderPaths . map ( folderPath => getFolderTracks ( folderPath , keyword ) )
51
+ folderPaths . map ( folderPath =>
52
+ getFolderTracks ( folderPath , shouldSearchAllMetadata ? "" : keyword )
53
+ )
37
54
)
55
+
56
+ /** IndexedDBに存在しない楽曲ファイルを抽出 */
38
57
const filteredFolderTracks = folderTracks
39
58
. flat ( )
40
59
. filter (
41
60
track =>
42
61
! indexedDBTracks . map ( track => track . path ) . includes ( track . filename )
43
62
)
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 ) )
50
66
)
51
67
68
+ const folderTracksInfo = shouldSearchAllMetadata
69
+ ? filterTracksByKeyword ( keywordFilteredUnCachedTracks , keyword )
70
+ : keywordFilteredUnCachedTracks
71
+
72
+ /** 新しく取得した楽曲のメタデーターをIndexedDBに保存しておく */
73
+ folderTracksInfo . forEach ( trackInfo => saveTrackInfo ( trackInfo ) )
74
+
52
75
// indexedDBの検索結果とwebDAVサーバーの検索結果を結合して、楽曲タイトルの昇順にソートする
53
76
const mergedTracks = indexedDBTracks
54
77
. concat ( folderTracksInfo )
@@ -64,7 +87,7 @@ const useMergedWebDAVServerData = () => {
64
87
data : mergedTracks
65
88
} )
66
89
} ,
67
- [ searchTracks , getFolderTracks , getTrackInfo , saveTrackInfo ]
90
+ [ searchTracks , getFolderTracks , getTrackInfo , saveTrackInfo , settings ]
68
91
)
69
92
70
93
const resetMergedSearchResult = useCallback ( ( ) => {
0 commit comments