Skip to content

Commit 66373c6

Browse files
Merge pull request #37 from codewithtamim/task/update-images
Update
2 parents 994cbbc + 3a5aa27 commit 66373c6

File tree

14 files changed

+239
-118
lines changed

14 files changed

+239
-118
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
## Screenshots
2222

2323
<p align="left">
24-
<img src="images/image1.png" alt="Screenshot 1" width="200"/>
25-
<img src="images/image2.png" alt="Screenshot 2" width="200"/>
26-
<img src="images/image3.png" alt="Screenshot 3" width="200"/>
27-
<img src="images/image4.png" alt="Screenshot 3" width="200"/>
24+
<img src="art/image1.png" alt="Screenshot 1" width="200"/>
25+
<img src="art/image2.png" alt="Screenshot 2" width="200"/>
26+
<img src="art/image3.png" alt="Screenshot 3" width="200"/>
27+
<img src="art/image4.png" alt="Screenshot 3" width="200"/>
2828
</p>
2929

3030
---

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ android {
1616
minSdk = 21
1717
targetSdk = 36
1818
versionCode = 34
19-
versionName = "1.3.3-prerelease"
19+
versionName = "1.3.3-lts"
2020
multiDexEnabled = true
2121

2222
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

app/src/main/java/com/nasahacker/convertit/data/repository/AudioConverterRepositoryImpl.kt

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.nasahacker.convertit.util.CueParser
2424
import com.nasahacker.convertit.domain.model.CueFile
2525
import com.nasahacker.convertit.domain.model.CueTrack
2626
import dagger.hilt.android.qualifiers.ApplicationContext
27+
import kotlinx.coroutines.CompletableDeferred
2728
import kotlinx.coroutines.Dispatchers
2829
import kotlinx.coroutines.withContext
2930
import java.io.File
@@ -228,6 +229,8 @@ class AudioConverterRepositoryImpl
228229
arrayOf(
229230
"-y",
230231
"-i", inputPath,
232+
"-map", "0:a", // Only map audio streams
233+
"-vn", // Disable video streams
231234
"-ar", "16000",
232235
"-ac", "1",
233236
"-c:a", AudioCodec.fromFormat(outputFormat).codec,
@@ -242,6 +245,8 @@ class AudioConverterRepositoryImpl
242245
arrayOf(
243246
"-y",
244247
"-i", inputPath,
248+
"-map", "0:a",
249+
"-vn",
245250
"-c:a", AudioCodec.fromFormat(outputFormat).codec,
246251
"-b:a", bitrate.bitrate,
247252
"-application", "voip",
@@ -253,6 +258,8 @@ class AudioConverterRepositoryImpl
253258
arrayOf(
254259
"-y",
255260
"-i", inputPath,
261+
"-map", "0:a",
262+
"-vn",
256263
"-c:a", AudioCodec.fromFormat(outputFormat).codec,
257264
"-b:a", bitrate.bitrate,
258265
"-filter:a", "atempo=$playbackSpeed",
@@ -264,6 +271,8 @@ class AudioConverterRepositoryImpl
264271
arrayOf(
265272
"-y",
266273
"-i", inputPath,
274+
"-map", "0:a",
275+
"-vn",
267276
"-c:a", AudioCodec.fromFormat(outputFormat).codec,
268277
"-b:a", bitrate.bitrate,
269278
"-filter:a", "atempo=$playbackSpeed",
@@ -366,18 +375,26 @@ class AudioConverterRepositoryImpl
366375
)
367376

368377
try {
369-
val session = FFmpegKit.executeWithArguments(ffmpegArgs)
378+
val sessionCompleted = CompletableDeferred<Boolean>()
370379

371-
if (ReturnCode.isSuccess(session.returnCode)) {
372-
outputPaths.add(outputFilePath)
373-
processedTracks++
374-
375-
val progress = ((processedTracks.toFloat() / totalTracks) * 100).toInt()
376-
onProgress(progress)
377-
378-
Log.d(TAG, "Successfully converted track ${track.trackNumber}: ${track.title}")
379-
} else {
380-
Log.e(TAG, "Failed to convert track ${track.trackNumber}: ${session.failStackTrace}")
380+
FFmpegKit.executeWithArgumentsAsync(ffmpegArgs, { session ->
381+
if (ReturnCode.isSuccess(session.returnCode)) {
382+
outputPaths.add(outputFilePath)
383+
processedTracks++
384+
385+
val progress = ((processedTracks.toFloat() / totalTracks) * 100).toInt()
386+
onProgress(progress)
387+
388+
Log.d(TAG, "Successfully converted track ${track.trackNumber}: ${track.title}")
389+
sessionCompleted.complete(true)
390+
} else {
391+
Log.e(TAG, "Failed to convert track ${track.trackNumber}: ${session.failStackTrace}")
392+
sessionCompleted.complete(false)
393+
}
394+
})
395+
396+
val success = sessionCompleted.await()
397+
if (!success) {
381398
onFailure("Failed to convert track ${track.trackNumber}: ${track.title}")
382399
tempAudioFile.delete()
383400
return
@@ -407,32 +424,11 @@ class AudioConverterRepositoryImpl
407424

408425
private fun findCueFileForUri(audioUri: Uri): File? {
409426
try {
410-
411427
val fileName = getFileName(context.contentResolver, audioUri)
412-
val fileNameWithoutExt = fileName.substringBeforeLast(".")
413428
val isFlac = fileName.endsWith(".flac", ignoreCase = true)
414429

415-
416-
val possibleLocations = listOf(
417-
context.getExternalFilesDir(null),
418-
context.filesDir,
419-
File("/storage/emulated/0/Download"),
420-
File("/storage/emulated/0/Music")
421-
)
422-
423-
424-
for (dir in possibleLocations) {
425-
if (dir?.exists() == true) {
426-
val cueFile = File(dir, "$fileNameWithoutExt.cue")
427-
if (cueFile.exists()) {
428-
return cueFile
429-
}
430-
}
431-
}
432-
433-
430+
// Only check for embedded CUE in FLAC files since external CUE files are selected via file picker
434431
if (isFlac) {
435-
436432
context.contentResolver.openInputStream(audioUri)?.use { inputStream ->
437433
val tempFlacFile = File(context.cacheDir, "temp_flac_${System.currentTimeMillis()}.flac")
438434
FileOutputStream(tempFlacFile).use { outputStream ->
@@ -469,6 +465,8 @@ class AudioConverterRepositoryImpl
469465
args.addAll(arrayOf("-y", "-i", inputPath))
470466

471467

468+
args.addAll(arrayOf("-map", "0:a", "-vn"))
469+
472470
args.addAll(arrayOf("-ss", CueParser.formatSecondsForFFmpeg(track.startTimeSeconds)))
473471

474472

@@ -508,9 +506,18 @@ class AudioConverterRepositoryImpl
508506
}
509507

510508
private fun sanitizeFileName(fileName: String): String {
511-
return fileName.replace(Regex("[^a-zA-Z0-9._\\-\\s]"), "_")
509+
val invalidChars = Regex("[<>:\"/\\\\|?*\\x00-\\x1f]")
510+
val sanitized = fileName.replace(invalidChars, "_")
512511
.replace(Regex("\\s+"), " ")
513512
.trim()
513+
.trimEnd('.')
514+
515+
val maxLength = 200
516+
return if (sanitized.length > maxLength) {
517+
sanitized.substring(0, maxLength).trimEnd()
518+
} else {
519+
sanitized
520+
}.ifEmpty { "Track" }
514521
}
515522

516523
override suspend fun convertWithManualCue(

0 commit comments

Comments
 (0)