diff --git a/app/src/main/java/com/github/libretube/helpers/ImportHelper.kt b/app/src/main/java/com/github/libretube/helpers/ImportHelper.kt index 2643b775b..c9b192941 100644 --- a/app/src/main/java/com/github/libretube/helpers/ImportHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/ImportHelper.kt @@ -201,7 +201,7 @@ object ImportHelper { val playlistName = lines[1].split(",").reversed().getOrNull(2) // the playlist name can be undefined in some cases, e.g. watch later lists - playlist.name = playlistName ?: TextUtils.defaultPlaylistName + playlist.name = playlistName ?: TextUtils.getFileSafeTimeStampNow() // start directly at the beginning if header playlist info such as name is missing val startIndex = if (playlistName == null) { @@ -235,7 +235,7 @@ object ImportHelper { ImportFormat.URLSORIDS -> { activity.contentResolver.openInputStream(uri)?.use { inputStream -> - val playlist = PipedImportPlaylist(name = TextUtils.defaultPlaylistName) + val playlist = PipedImportPlaylist(name = TextUtils.getFileSafeTimeStampNow()) playlist.videos = inputStream.bufferedReader().readLines() .flatMap { it.split(",") } diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadPlaylistDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadPlaylistDialog.kt index a8e0082a0..b626b7518 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadPlaylistDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadPlaylistDialog.kt @@ -26,7 +26,7 @@ class DownloadPlaylistDialog : DialogFragment() { super.onCreate(savedInstanceState) playlistId = requireArguments().getString(IntentData.playlistId)!! - playlistName = requireArguments().getString(IntentData.playlistName) ?: TextUtils.defaultPlaylistName + playlistName = requireArguments().getString(IntentData.playlistName) ?: TextUtils.getFileSafeTimeStampNow() playlistType = requireArguments().serializable(IntentData.playlistType)!! } diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/ImportTempPlaylistDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/ImportTempPlaylistDialog.kt index 502818570..8f0720bf8 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/ImportTempPlaylistDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/ImportTempPlaylistDialog.kt @@ -20,7 +20,7 @@ class ImportTempPlaylistDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val title = arguments?.getString(IntentData.playlistName) ?.takeIf { it.isNotEmpty() } - ?: TextUtils.defaultPlaylistName + ?: TextUtils.getFileSafeTimeStampNow() val videoIds = arguments?.getStringArray(IntentData.videoIds).orEmpty() return MaterialAlertDialogBuilder(requireContext()) diff --git a/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt index d19531a16..5b212a15a 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt @@ -17,17 +17,15 @@ import com.github.libretube.ui.base.BasePreferenceFragment import com.github.libretube.ui.dialogs.BackupDialog import com.github.libretube.ui.dialogs.BackupDialog.Companion.BACKUP_DIALOG_REQUEST_KEY import com.github.libretube.ui.dialogs.RequireRestartDialog +import com.github.libretube.util.TextUtils import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter class BackupRestoreSettings : BasePreferenceFragment() { - private val backupDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm:ss") private var backupFile = BackupFile() private var importFormat: ImportFormat = ImportFormat.NEWPIPE @@ -159,8 +157,8 @@ class BackupRestoreSettings : BasePreferenceFragment() { ) { _, resultBundle -> val encodedBackupFile = resultBundle.getString(IntentData.backupFile)!! backupFile = Json.decodeFromString(encodedBackupFile) - val timestamp = backupDateTimeFormatter.format(LocalDateTime.now()) - createBackupFile.launch("libretube-backup-$timestamp.json") + val timestamp = TextUtils.getFileSafeTimeStampNow() + createBackupFile.launch("libretube-backup-${timestamp}.json") } val advancedBackup = findPreference("backup") advancedBackup?.setOnPreferenceClickListener { diff --git a/app/src/main/java/com/github/libretube/util/TextUtils.kt b/app/src/main/java/com/github/libretube/util/TextUtils.kt index aaef968e5..00466b51f 100644 --- a/app/src/main/java/com/github/libretube/util/TextUtils.kt +++ b/app/src/main/java/com/github/libretube/util/TextUtils.kt @@ -18,7 +18,6 @@ import java.time.ZoneId import java.time.format.DateTimeFormatter import java.time.format.FormatStyle import java.time.temporal.ChronoUnit -import java.util.Date import kotlin.time.Duration import kotlinx.datetime.LocalDate as KotlinLocalDate @@ -38,7 +37,10 @@ object TextUtils { */ private val MEDIUM_DATE_FORMATTER = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM) - val defaultPlaylistName get() = Date().toString() + /** + * Date time formatter which doesn't use any forbidden characters for file names like ':' + */ + private val SAFE_FILENAME_DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH_mm_ss") /** * Localize the date from a date string, using the medium format. @@ -163,4 +165,11 @@ object TextUtils { } return listOfNotNull(uploader, viewsString, uploadDate).joinToString(SEPARATOR) } + + /** + * Timestamp of the current time which doesn't use any forbidden characters for file names like ':' + */ + fun getFileSafeTimeStampNow(): String { + return SAFE_FILENAME_DATETIME_FORMATTER.format(LocalDateTime.now()) + } }