mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-04 18:18:36 +02:00
fix(download): complete quality variants reliably
This commit is contained in:
@@ -157,6 +157,24 @@ internal object NativeFinalizationPolicy {
|
||||
return "$stem - $qualityLabel$extension"
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the user-facing name that a deferred SAF download was assigned
|
||||
* before its audio was materialized in the app cache. Container and
|
||||
* decryption passes may replace [currentFileName] with a temporary
|
||||
* `native_saf_work_*` name, which must never become the published name.
|
||||
*/
|
||||
fun logicalOutputFileName(
|
||||
deferredSafPublish: Boolean,
|
||||
resultSafFileName: String?,
|
||||
requestSafFileName: String?,
|
||||
currentFileName: String,
|
||||
): String {
|
||||
if (!deferredSafPublish) return currentFileName
|
||||
return normalizeOptional(resultSafFileName)
|
||||
?: normalizeOptional(requestSafFileName)
|
||||
?: currentFileName
|
||||
}
|
||||
|
||||
fun resolvePreferredDecryptionExtension(
|
||||
inputPath: String,
|
||||
requested: String,
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.zarz.spotiflac.NativeFinalizationPolicy.displayAudioQuality
|
||||
import com.zarz.spotiflac.NativeFinalizationPolicy.formatIndexTag
|
||||
import com.zarz.spotiflac.NativeFinalizationPolicy.isLosslessAudioCodec
|
||||
import com.zarz.spotiflac.NativeFinalizationPolicy.isLossyAudioCodec
|
||||
import com.zarz.spotiflac.NativeFinalizationPolicy.logicalOutputFileName
|
||||
import com.zarz.spotiflac.NativeFinalizationPolicy.normalizeAudioCodec
|
||||
import com.zarz.spotiflac.NativeFinalizationPolicy.resolvePreferredDecryptionExtension
|
||||
import gobackend.Gobackend
|
||||
@@ -61,12 +62,18 @@ internal fun NativeDownloadFinalizer.finalizeQualityVariantFilename(
|
||||
return
|
||||
}
|
||||
|
||||
val logicalFileName = logicalOutputFileName(
|
||||
deferredSafPublish = isDeferredSafPublish(input),
|
||||
resultSafFileName = input.result.optString("saf_final_file_name", ""),
|
||||
requestSafFileName = input.request.optString("saf_file_name", ""),
|
||||
currentFileName = state.fileName,
|
||||
)
|
||||
val preferredName = applyQualityVariantFilenameLabel(
|
||||
fileName = state.fileName,
|
||||
fileName = logicalFileName,
|
||||
stagingLabel = stagingLabel,
|
||||
qualityLabel = qualityLabel,
|
||||
)
|
||||
if (preferredName == state.fileName) return
|
||||
if (preferredName == logicalFileName && preferredName == state.fileName) return
|
||||
input.result.put("quality_variant_file_name", preferredName)
|
||||
if (isDeferredSafPublish(input)) {
|
||||
state.fileName = preferredName
|
||||
|
||||
@@ -150,6 +150,38 @@ class NativeFinalizationPolicyTest {
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun deferredSafNamingNeverPublishesTheNativeCacheName() {
|
||||
val logicalName = NativeFinalizationPolicy.logicalOutputFileName(
|
||||
deferredSafPublish = true,
|
||||
resultSafFileName = "Sunidhi Chauhan - Aisa Jadoo - qv_ab12cd34.flac",
|
||||
requestSafFileName = "fallback.flac",
|
||||
currentFileName = "native_saf_work_603020549715656640.m4a",
|
||||
)
|
||||
|
||||
assertEquals(
|
||||
"Sunidhi Chauhan - Aisa Jadoo - 16bit-44.1kHz.flac",
|
||||
NativeFinalizationPolicy.applyQualityVariantFilenameLabel(
|
||||
fileName = logicalName,
|
||||
stagingLabel = "qv_ab12cd34",
|
||||
qualityLabel = "16bit-44.1kHz",
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun nonSafNamingStillFollowsTheCurrentConvertedFile() {
|
||||
assertEquals(
|
||||
"converted.flac",
|
||||
NativeFinalizationPolicy.logicalOutputFileName(
|
||||
deferredSafPublish = false,
|
||||
resultSafFileName = "ignored.flac",
|
||||
requestSafFileName = "ignored-too.flac",
|
||||
currentFileName = "converted.flac",
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun decryptionExtensionAndIndexTagsHaveStableFallbacks() {
|
||||
assertEquals(
|
||||
|
||||
Reference in New Issue
Block a user