@@ -9,23 +9,51 @@ import {
9
9
Text ,
10
10
} from "@mantine/core" ;
11
11
import { ColumnDef } from "@tanstack/react-table" ;
12
+ import {
13
+ useEpisodeSubtitleModification ,
14
+ useMovieSubtitleModification ,
15
+ } from "@/apis/hooks" ;
12
16
import Language from "@/components/bazarr/Language" ;
13
17
import SubtitleToolsMenu from "@/components/SubtitleToolsMenu" ;
14
18
import SimpleTable from "@/components/tables/SimpleTable" ;
15
- import { withModal } from "@/modules/modals" ;
16
- import { isMovie } from "@/utilities" ;
19
+ import { useModals , withModal } from "@/modules/modals" ;
20
+ import { task , TaskGroup } from "@/modules/task" ;
21
+ import { fromPython , isMovie , toPython } from "@/utilities" ;
17
22
18
23
type SupportType = Item . Episode | Item . Movie ;
19
24
20
25
type TableColumnType = FormType . ModifySubtitle & {
21
26
raw_language : Language . Info ;
27
+ seriesId : number ;
28
+ name : string ;
29
+ isMovie : boolean ;
30
+ } ;
31
+
32
+ type LocalisedType = {
33
+ id : number ;
34
+ seriesId : number ;
35
+ type : "movie" | "episode" ;
36
+ name : string ;
37
+ isMovie : boolean ;
22
38
} ;
23
39
24
- function getIdAndType ( item : SupportType ) : [ number , "episode" | "movie" ] {
40
+ function getLocalisedValues ( item : SupportType ) : LocalisedType {
25
41
if ( isMovie ( item ) ) {
26
- return [ item . radarrId , "movie" ] ;
42
+ return {
43
+ seriesId : 0 ,
44
+ id : item . radarrId ,
45
+ type : "movie" ,
46
+ name : item . title ,
47
+ isMovie : true ,
48
+ } ;
27
49
} else {
28
- return [ item . sonarrEpisodeId , "episode" ] ;
50
+ return {
51
+ seriesId : item . sonarrSeriesId ,
52
+ id : item . sonarrEpisodeId ,
53
+ type : "episode" ,
54
+ name : item . title ,
55
+ isMovie : false ,
56
+ } ;
29
57
}
30
58
}
31
59
@@ -41,6 +69,11 @@ const SubtitleToolView: FunctionComponent<SubtitleToolViewProps> = ({
41
69
payload,
42
70
} ) => {
43
71
const [ selections , setSelections ] = useState < TableColumnType [ ] > ( [ ] ) ;
72
+ const { remove : removeEpisode , download : downloadEpisode } =
73
+ useEpisodeSubtitleModification ( ) ;
74
+ const { download : downloadMovie , remove : removeMovie } =
75
+ useMovieSubtitleModification ( ) ;
76
+ const modals = useModals ( ) ;
44
77
45
78
const columns = useMemo < ColumnDef < TableColumnType > [ ] > (
46
79
( ) => [
@@ -109,17 +142,22 @@ const SubtitleToolView: FunctionComponent<SubtitleToolViewProps> = ({
109
142
const data = useMemo < TableColumnType [ ] > (
110
143
( ) =>
111
144
payload . flatMap ( ( item ) => {
112
- const [ id , type ] = getIdAndType ( item ) ;
145
+ const { seriesId , id, type, name , isMovie } = getLocalisedValues ( item ) ;
113
146
return item . subtitles . flatMap ( ( v ) => {
114
147
if ( v . path ) {
115
148
return [
116
149
{
117
150
id,
151
+ seriesId,
118
152
type,
119
153
language : v . code2 ,
120
154
path : v . path ,
121
155
// eslint-disable-next-line camelcase
122
156
raw_language : v ,
157
+ name,
158
+ hi : toPython ( v . forced ) ,
159
+ forced : toPython ( v . hi ) ,
160
+ isMovie,
123
161
} ,
124
162
] ;
125
163
} else {
@@ -143,7 +181,51 @@ const SubtitleToolView: FunctionComponent<SubtitleToolViewProps> = ({
143
181
> </ SimpleTable >
144
182
< Divider > </ Divider >
145
183
< Group >
146
- < SubtitleToolsMenu selections = { selections } >
184
+ < SubtitleToolsMenu
185
+ selections = { selections }
186
+ onAction = { ( action ) => {
187
+ selections . forEach ( ( selection ) => {
188
+ const actionPayload = {
189
+ form : {
190
+ language : selection . language ,
191
+ hi : fromPython ( selection . hi ) ,
192
+ forced : fromPython ( selection . forced ) ,
193
+ path : selection . path ,
194
+ } ,
195
+ radarrId : 0 ,
196
+ seriesId : 0 ,
197
+ episodeId : 0 ,
198
+ } ;
199
+ if ( selection . isMovie ) {
200
+ actionPayload . radarrId = selection . id ;
201
+ } else {
202
+ actionPayload . seriesId = selection . seriesId ;
203
+ actionPayload . episodeId = selection . id ;
204
+ }
205
+ const download = selection . isMovie
206
+ ? downloadMovie
207
+ : downloadEpisode ;
208
+ const remove = selection . isMovie ? removeMovie : removeEpisode ;
209
+
210
+ if ( action === "search" ) {
211
+ task . create (
212
+ selection . name ,
213
+ TaskGroup . SearchSubtitle ,
214
+ download . mutateAsync ,
215
+ actionPayload ,
216
+ ) ;
217
+ } else if ( action === "delete" && selection . path ) {
218
+ task . create (
219
+ selection . name ,
220
+ TaskGroup . DeleteSubtitle ,
221
+ remove . mutateAsync ,
222
+ actionPayload ,
223
+ ) ;
224
+ }
225
+ } ) ;
226
+ modals . closeAll ( ) ;
227
+ } }
228
+ >
147
229
< Button disabled = { selections . length === 0 } variant = "light" >
148
230
Select Action
149
231
</ Button >
0 commit comments