diff --git a/app/src/main/java/com/github/libretube/extensions/CreateDir.kt b/app/src/main/java/com/github/libretube/extensions/CreateDir.kt new file mode 100644 index 000000000..5300ff318 --- /dev/null +++ b/app/src/main/java/com/github/libretube/extensions/CreateDir.kt @@ -0,0 +1,7 @@ +package com.github.libretube.extensions + +import java.io.File + +fun File.createDir() = apply { + if (!this.exists()) this.mkdirs() +} diff --git a/app/src/main/java/com/github/libretube/obj/DownloadedFile.kt b/app/src/main/java/com/github/libretube/obj/DownloadedFile.kt index beb9ec185..7b5dc691a 100644 --- a/app/src/main/java/com/github/libretube/obj/DownloadedFile.kt +++ b/app/src/main/java/com/github/libretube/obj/DownloadedFile.kt @@ -1,7 +1,10 @@ package com.github.libretube.obj +import com.github.libretube.api.obj.Streams + data class DownloadedFile( val name: String, val size: Long, - val type: Int + val type: Int, + var metadata: Streams? = null ) diff --git a/app/src/main/java/com/github/libretube/services/DownloadService.kt b/app/src/main/java/com/github/libretube/services/DownloadService.kt index bc52b3532..dc5893993 100644 --- a/app/src/main/java/com/github/libretube/services/DownloadService.kt +++ b/app/src/main/java/com/github/libretube/services/DownloadService.kt @@ -17,7 +17,6 @@ import com.github.libretube.constants.DOWNLOAD_FAILURE_NOTIFICATION_ID import com.github.libretube.constants.DOWNLOAD_SUCCESS_NOTIFICATION_ID import com.github.libretube.constants.DownloadType import com.github.libretube.extensions.TAG -import com.github.libretube.extensions.sanitize import com.github.libretube.util.DownloadHelper import java.io.File @@ -37,7 +36,7 @@ class DownloadService : Service() { } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - videoName = intent?.getStringExtra("videoName")!!.sanitize() + videoName = intent?.getStringExtra("videoName")!! videoUrl = intent.getStringExtra("videoUrl")!! audioUrl = intent.getStringExtra("audioUrl")!! @@ -67,10 +66,6 @@ class DownloadService : Service() { val videoDownloadDir = DownloadHelper.getVideoDir(this) val audioDownloadDir = DownloadHelper.getAudioDir(this) - listOf(videoDownloadDir, audioDownloadDir).forEach { - if (!it.exists()) it.mkdir() - } - // start download try { registerReceiver( diff --git a/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt index bb4e851e7..814cf54bb 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/DownloadsAdapter.kt @@ -2,12 +2,14 @@ package com.github.libretube.ui.adapters import android.annotation.SuppressLint import android.content.Intent +import android.text.format.DateUtils import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.github.libretube.R import com.github.libretube.constants.IntentData import com.github.libretube.databinding.DownloadedMediaRowBinding +import com.github.libretube.extensions.formatShort import com.github.libretube.obj.DownloadedFile import com.github.libretube.ui.activities.OfflinePlayerActivity import com.github.libretube.ui.viewholders.DownloadsViewHolder @@ -34,6 +36,13 @@ class DownloadsAdapter( fileName.text = file.name fileSize.text = "${file.size / (1024 * 1024)} MiB" + file.metadata?.let { + uploaderName.text = it.uploader + it.views.formatShort() + " " + + root.context.getString(R.string.views_placeholder) + + " • " + it.uploadDate + } + root.setOnClickListener { val intent = Intent(root.context, OfflinePlayerActivity::class.java).also { it.putExtra(IntentData.fileName, file.name) diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt index 87430c670..32c5754e3 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt @@ -15,7 +15,9 @@ import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.obj.Streams import com.github.libretube.databinding.DialogDownloadBinding import com.github.libretube.extensions.TAG +import com.github.libretube.extensions.sanitize import com.github.libretube.services.DownloadService +import com.github.libretube.util.MetadataHelper import com.github.libretube.util.ThemeHelper import com.google.android.material.dialog.MaterialAlertDialogBuilder import retrofit2.HttpException @@ -126,11 +128,32 @@ class DownloadDialog( return@setOnClickListener } + val vidUrl = videoUrl[binding.videoSpinner.selectedItemPosition] + val audUrl = audioUrl[binding.audioSpinner.selectedItemPosition] + + if (audUrl == "" && vidUrl == "") return@setOnClickListener + + val fileName = binding.fileName.text.toString().sanitize() + + val metadataHelper = MetadataHelper(requireContext()) + metadataHelper.createMetadata(fileName, streams) + + Log.e("meta", metadataHelper.getMetadata(fileName).toString()) + val intent = Intent(context, DownloadService::class.java) - intent.putExtra("videoName", binding.fileName.text.toString()) - intent.putExtra("videoUrl", videoUrl[binding.videoSpinner.selectedItemPosition]) - intent.putExtra("audioUrl", audioUrl[binding.audioSpinner.selectedItemPosition]) + intent.putExtra( + "videoName", + fileName + ) + intent.putExtra( + "videoUrl", + vidUrl + ) + intent.putExtra( + "audioUrl", + audUrl + ) context?.startService(intent) dismiss() diff --git a/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt index fd96ff270..b2242e5b6 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/DownloadsFragment.kt @@ -11,6 +11,7 @@ import com.github.libretube.databinding.FragmentDownloadsBinding import com.github.libretube.ui.adapters.DownloadsAdapter import com.github.libretube.ui.base.BaseFragment import com.github.libretube.util.DownloadHelper +import com.github.libretube.util.MetadataHelper class DownloadsFragment : BaseFragment() { private lateinit var binding: FragmentDownloadsBinding @@ -31,6 +32,13 @@ class DownloadsFragment : BaseFragment() { if (files.isEmpty()) return + val metadataHelper = MetadataHelper(requireContext()) + files.forEach { + metadataHelper.getMetadata(it.name)?.let { streams -> + it.metadata = streams + } + } + binding.downloadsEmpty.visibility = View.GONE binding.downloads.visibility = View.VISIBLE diff --git a/app/src/main/java/com/github/libretube/util/DownloadHelper.kt b/app/src/main/java/com/github/libretube/util/DownloadHelper.kt index 3633f93c5..1d8af58c3 100644 --- a/app/src/main/java/com/github/libretube/util/DownloadHelper.kt +++ b/app/src/main/java/com/github/libretube/util/DownloadHelper.kt @@ -3,6 +3,7 @@ package com.github.libretube.util import android.content.Context import android.os.Build import com.github.libretube.constants.DownloadType +import com.github.libretube.extensions.createDir import com.github.libretube.obj.DownloadedFile import java.io.File @@ -21,14 +22,21 @@ object DownloadHelper { return File( getOfflineStorageDir(context), "video" - ) + ).createDir() } fun getAudioDir(context: Context): File { return File( getOfflineStorageDir(context), "audio" - ) + ).createDir() + } + + fun getMetadataDir(context: Context): File { + return File( + getOfflineStorageDir(context), + "metadata" + ).createDir() } fun getDownloadedFiles(context: Context): MutableList { diff --git a/app/src/main/java/com/github/libretube/util/MetadataHelper.kt b/app/src/main/java/com/github/libretube/util/MetadataHelper.kt new file mode 100644 index 000000000..0cb6b7172 --- /dev/null +++ b/app/src/main/java/com/github/libretube/util/MetadataHelper.kt @@ -0,0 +1,48 @@ +package com.github.libretube.util + +import android.content.Context +import android.net.Uri +import com.fasterxml.jackson.databind.ObjectMapper +import com.github.libretube.api.obj.Streams +import java.io.File +import java.io.FileOutputStream + +class MetadataHelper( + private val context: Context +) { + private val mapper = ObjectMapper() + private val metadataDir = DownloadHelper.getMetadataDir(context) + + fun createMetadata(fileName: String, streams: Streams) { + val targetFile = File(metadataDir, fileName) + targetFile.createNewFile() + + context.contentResolver.openFileDescriptor( + Uri.fromFile(targetFile), + "w" + )?.use { + FileOutputStream(it.fileDescriptor).use { fileOutputStream -> + fileOutputStream.write( + mapper.writeValueAsBytes( + streams + ) + ) + } + } + } + + fun getMetadata(fileName: String): Streams? { + val sourceFile = File(metadataDir, fileName) + + return try { + val json = context.contentResolver.openInputStream( + Uri.fromFile(sourceFile) + )?.use { + it.bufferedReader().use { reader -> reader.readText() } + } + mapper.readValue(json, Streams::class.java) + } catch (e: Exception) { + return null + } + } +} diff --git a/app/src/main/res/layout/downloaded_media_row.xml b/app/src/main/res/layout/downloaded_media_row.xml index f4c5b6a7c..e5ce30588 100644 --- a/app/src/main/res/layout/downloaded_media_row.xml +++ b/app/src/main/res/layout/downloaded_media_row.xml @@ -7,12 +7,31 @@ android:paddingHorizontal="10dp" android:paddingVertical="8dp"> - + android:layout_height="wrap_content" + android:orientation="vertical"> + + + + + + + +