1
1
package com.junkfood.seal.ui.page.download
2
2
3
3
import android.content.Intent
4
- import android.util.Log
5
4
import androidx.compose.animation.AnimatedVisibility
6
5
import androidx.compose.animation.core.spring
7
6
import androidx.compose.animation.fadeOut
@@ -94,6 +93,9 @@ import com.junkfood.seal.util.EXTRACT_AUDIO
94
93
import com.junkfood.seal.util.Format
95
94
import com.junkfood.seal.util.MERGE_MULTI_AUDIO_STREAM
96
95
import com.junkfood.seal.util.PreferenceUtil.getBoolean
96
+ import com.junkfood.seal.util.PreferenceUtil.getString
97
+ import com.junkfood.seal.util.PreferenceUtil.updateString
98
+ import com.junkfood.seal.util.SUBTITLE_LANGUAGE
97
99
import com.junkfood.seal.util.SubtitleFormat
98
100
import com.junkfood.seal.util.VIDEO_CLIP
99
101
import com.junkfood.seal.util.VideoClip
@@ -111,24 +113,63 @@ fun FormatPage(downloadViewModel: DownloadViewModel, onBackPressed: () -> Unit =
111
113
if (videoInfo.formats.isNullOrEmpty()) return
112
114
val audioOnly = EXTRACT_AUDIO .getBoolean()
113
115
val mergeAudioStream = MERGE_MULTI_AUDIO_STREAM .getBoolean()
116
+ val subtitleLanguageRegex = SUBTITLE_LANGUAGE .getString()
117
+ val initialSelectedSubtitles =
118
+ videoInfo.run { subtitles.keys + automaticCaptions.keys }
119
+ .filterWithRegex(subtitleLanguageRegex)
120
+
121
+ var showUpdateSubtitleDialog by remember { mutableStateOf(false ) }
122
+
123
+ var diffSubtitleLanguages by remember { mutableStateOf(emptySet<String >()) }
124
+
114
125
FormatPageImpl (
115
126
videoInfo = videoInfo,
116
127
onBackPressed = onBackPressed,
117
128
audioOnly = audioOnly,
118
129
mergeAudioStream = ! audioOnly && mergeAudioStream,
130
+ selectedSubtitleCodes = initialSelectedSubtitles,
119
131
isClippingAvailable = VIDEO_CLIP .getBoolean() && (videoInfo.duration ? : .0 ) >= 0
120
- ) { formatList, videoClips, splitByChapter, title, subtitleLanguages ->
121
- Log .d(TAG , formatList.toString())
132
+ ) { formatList, videoClips, splitByChapter, title, selectedSubtitleCodes ->
133
+
134
+ diffSubtitleLanguages = selectedSubtitleCodes.run {
135
+ this - this .filterWithRegex(subtitleLanguageRegex)
136
+ }.toSet()
137
+
122
138
Downloader .downloadVideoWithConfigurations(
123
139
videoInfo = videoInfo,
124
140
formatList = formatList,
125
141
videoClips = videoClips,
126
142
splitByChapter = splitByChapter,
127
143
newTitle = title,
128
- selectedSubtitleLang = subtitleLanguages,
144
+ selectedSubtitleCodes = selectedSubtitleCodes,
145
+ )
146
+
147
+ if (diffSubtitleLanguages.isNotEmpty()) {
148
+ showUpdateSubtitleDialog = true
149
+ } else {
150
+ onBackPressed()
151
+ }
152
+ }
153
+
154
+ if (showUpdateSubtitleDialog) {
155
+ UpdateSubtitleLanguageDialog (
156
+ modifier = Modifier ,
157
+ languages = diffSubtitleLanguages,
158
+ onDismissRequest = {
159
+ showUpdateSubtitleDialog = false
160
+ onBackPressed()
161
+ },
162
+ onConfirm = {
163
+ SUBTITLE_LANGUAGE .updateString(
164
+ (diffSubtitleLanguages + subtitleLanguageRegex).joinToString(
165
+ separator = " ," ,
166
+ ) { it })
167
+ showUpdateSubtitleDialog = false
168
+ onBackPressed()
169
+ }
129
170
)
130
- onBackPressed()
131
171
}
172
+
132
173
}
133
174
134
175
@@ -137,32 +178,44 @@ private const val NOT_SELECTED = -1
137
178
@Preview
138
179
@Composable
139
180
private fun FormatPagePreview () {
140
- val captionsMap = buildMap {
141
- repeat(4 ) {
142
- put(
143
- " translated-$it " , listOf (
144
- SubtitleFormat (
145
- ext = " ass" ,
146
- url = " " ,
147
- name = " Translated"
148
- )
149
- )
181
+ val captionsMap = mapOf (
182
+ " en-en" to listOf (SubtitleFormat (ext = " " , url = " " , name = " English from English" )),
183
+ " ja-en" to listOf (SubtitleFormat (ext = " " , url = " " , name = " Japanese from English" )),
184
+ " zh-Hans-en" to listOf (
185
+ SubtitleFormat (
186
+ ext = " " ,
187
+ url = " " ,
188
+ name = " Chinese (Simplified) from English"
150
189
)
151
- }
152
- }
190
+ ),
191
+ " zh-Hant-en" to listOf (
192
+ SubtitleFormat (
193
+ ext = " " ,
194
+ url = " " ,
195
+ name = " Chinese (Traditional) from English"
196
+ )
197
+ ),
198
+ )
153
199
154
200
val subMap = buildMap {
155
- repeat(3 ) {
156
- put(
157
- " en$it " , listOf (
158
- SubtitleFormat (
159
- ext = " ass" ,
160
- url = " " ,
161
- name = " English"
162
- )
201
+ put(
202
+ " en" , listOf (
203
+ SubtitleFormat (
204
+ ext = " ass" ,
205
+ url = " " ,
206
+ name = " English"
163
207
)
164
208
)
165
- }
209
+ )
210
+ put(
211
+ " ja" , listOf (
212
+ SubtitleFormat (
213
+ ext = " ass" ,
214
+ url = " " ,
215
+ name = " Japanese"
216
+ )
217
+ )
218
+ )
166
219
}
167
220
val videoInfo =
168
221
VideoInfo (
@@ -201,7 +254,12 @@ private fun FormatPagePreview() {
201
254
duration = 100000.0
202
255
)
203
256
SealTheme {
204
- FormatPageImpl (videoInfo = videoInfo, isClippingAvailable = true , mergeAudioStream = true )
257
+ FormatPageImpl (
258
+ videoInfo = videoInfo,
259
+ isClippingAvailable = true ,
260
+ mergeAudioStream = true ,
261
+ selectedSubtitleCodes = setOf (" en" , " ja-en" )
262
+ )
205
263
}
206
264
}
207
265
@@ -212,6 +270,7 @@ fun FormatPageImpl(
212
270
audioOnly : Boolean = false,
213
271
mergeAudioStream : Boolean = false,
214
272
isClippingAvailable : Boolean = false,
273
+ selectedSubtitleCodes : Set <String >,
215
274
onBackPressed : () -> Unit = {},
216
275
onDownloadPressed : (List <Format >, List <VideoClip >, Boolean , String , List <String >) -> Unit = { _, _, _, _, _ -> }
217
276
) {
@@ -286,7 +345,8 @@ fun FormatPageImpl(
286
345
}
287
346
288
347
289
- val selectedLanguageList = remember { mutableStateListOf<String >() }
348
+ val selectedLanguageList =
349
+ remember { mutableStateListOf<String >().apply { addAll(selectedSubtitleCodes) } }
290
350
291
351
Scaffold (modifier = Modifier
292
352
.fillMaxSize()
@@ -932,16 +992,31 @@ private fun ClickableTextAction(
932
992
}
933
993
}
934
994
995
+ fun <T : Collection <String >> T.filterWithRegex (subtitleLanguageRegex : String ): Set <String > {
996
+ val regexGroup = subtitleLanguageRegex.split(' ,' )
997
+ return filter { language ->
998
+ regexGroup.any {
999
+ language.contains(Regex (it))
1000
+ }
1001
+ }.toSet()
1002
+ }
935
1003
936
1004
@OptIn(ExperimentalLayoutApi ::class )
937
1005
@Composable
938
1006
@Preview
939
- fun RememberSubtitleChoiceDialog (
1007
+ fun UpdateSubtitleLanguageDialog (
940
1008
modifier : Modifier = Modifier ,
941
- languages : List <String > = listOf("en", "ja", "zh-Hant ", "ar", "zh-Hans ")
1009
+ languages : Set <String > = setOf("en", "ja"),
1010
+ onDismissRequest : () -> Unit = {},
1011
+ onConfirm : () -> Unit = {}
942
1012
) {
943
- AlertDialog (onDismissRequest = { /* TODO*/ },
944
- title = { Text (text = " Update subtitle languages?" , textAlign = TextAlign .Center ) },
1013
+ AlertDialog (onDismissRequest = onDismissRequest,
1014
+ title = {
1015
+ Text (
1016
+ text = stringResource(R .string.update_subtitle_languages),
1017
+ textAlign = TextAlign .Center
1018
+ )
1019
+ },
945
1020
icon = {
946
1021
Icon (
947
1022
imageVector = Icons .Filled .Subtitles ,
@@ -950,14 +1025,15 @@ fun RememberSubtitleChoiceDialog(
950
1025
},
951
1026
text = {
952
1027
Column {
953
- Text (text = " The following languages will be added to your preference for future downloads:" )
954
- Spacer (modifier = Modifier .height(16 .dp))
1028
+ Text (text = stringResource(R .string.update_language_msg))
1029
+
1030
+ Spacer (modifier = Modifier .height(24 .dp))
955
1031
956
1032
FlowRow (
957
1033
horizontalArrangement = Arrangement .spacedBy(20 .dp),
958
1034
verticalArrangement = Arrangement .spacedBy(12 .dp)
959
1035
) {
960
- ( languages) .forEach {
1036
+ languages.forEach {
961
1037
Row (
962
1038
modifier = Modifier ,
963
1039
verticalAlignment = Alignment .CenterVertically ,
@@ -981,15 +1057,16 @@ fun RememberSubtitleChoiceDialog(
981
1057
}
982
1058
}
983
1059
}
1060
+ Spacer (modifier = Modifier .height(8 .dp))
984
1061
}
985
1062
},
986
1063
confirmButton = {
987
- Button (onClick = {} ) {
1064
+ Button (onClick = onConfirm ) {
988
1065
Text (text = stringResource(id = R .string.okay))
989
1066
}
990
1067
},
991
1068
dismissButton = {
992
- OutlinedButton (onClick = { } ) {
1069
+ OutlinedButton (onClick = onDismissRequest ) {
993
1070
Text (text = stringResource(id = R .string.no_thanks))
994
1071
}
995
1072
})
0 commit comments