Merge pull request #1533 from Bnyro/master

Add metadata to downloads
This commit is contained in:
Bnyro 2022-10-10 17:04:06 +02:00 committed by GitHub
commit bc3f609842
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 140 additions and 16 deletions

View File

@ -0,0 +1,7 @@
package com.github.libretube.extensions
import java.io.File
fun File.createDir() = apply {
if (!this.exists()) this.mkdirs()
}

View File

@ -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
)

View File

@ -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(

View File

@ -8,6 +8,7 @@ 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 +35,13 @@ class DownloadsAdapter(
fileName.text = file.name
fileSize.text = "${file.size / (1024 * 1024)} MiB"
file.metadata?.let {
uploaderName.text = it.uploader
videoInfo.text = 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)

View File

@ -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()

View File

@ -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

View File

@ -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<DownloadedFile> {

View File

@ -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
}
}
}

View File

@ -7,16 +7,40 @@
android:paddingHorizontal="10dp"
android:paddingVertical="8dp">
<TextView
android:id="@+id/fileName"
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="16sp" />
android:orientation="vertical"
android:layout_marginEnd="10dp">
<TextView
android:id="@+id/fileName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="2dp"
android:textSize="16sp" />
<TextView
android:id="@+id/uploaderName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="2dp"
android:textSize="12sp" />
<TextView
android:id="@+id/videoInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="2dp"
android:textSize="12sp" />
</LinearLayout>
<TextView
android:id="@+id/fileSize"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>