add metadata to downloads

This commit is contained in:
Bnyro 2022-10-10 16:58:26 +02:00
parent abc86aabc4
commit 500e56e760
9 changed files with 136 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 package com.github.libretube.obj
import com.github.libretube.api.obj.Streams
data class DownloadedFile( data class DownloadedFile(
val name: String, val name: String,
val size: Long, 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.DOWNLOAD_SUCCESS_NOTIFICATION_ID
import com.github.libretube.constants.DownloadType import com.github.libretube.constants.DownloadType
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.extensions.sanitize
import com.github.libretube.util.DownloadHelper import com.github.libretube.util.DownloadHelper
import java.io.File import java.io.File
@ -37,7 +36,7 @@ class DownloadService : Service() {
} }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
videoName = intent?.getStringExtra("videoName")!!.sanitize() videoName = intent?.getStringExtra("videoName")!!
videoUrl = intent.getStringExtra("videoUrl")!! videoUrl = intent.getStringExtra("videoUrl")!!
audioUrl = intent.getStringExtra("audioUrl")!! audioUrl = intent.getStringExtra("audioUrl")!!
@ -67,10 +66,6 @@ class DownloadService : Service() {
val videoDownloadDir = DownloadHelper.getVideoDir(this) val videoDownloadDir = DownloadHelper.getVideoDir(this)
val audioDownloadDir = DownloadHelper.getAudioDir(this) val audioDownloadDir = DownloadHelper.getAudioDir(this)
listOf(videoDownloadDir, audioDownloadDir).forEach {
if (!it.exists()) it.mkdir()
}
// start download // start download
try { try {
registerReceiver( registerReceiver(

View File

@ -2,12 +2,14 @@ package com.github.libretube.ui.adapters
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.text.format.DateUtils
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.constants.IntentData import com.github.libretube.constants.IntentData
import com.github.libretube.databinding.DownloadedMediaRowBinding import com.github.libretube.databinding.DownloadedMediaRowBinding
import com.github.libretube.extensions.formatShort
import com.github.libretube.obj.DownloadedFile import com.github.libretube.obj.DownloadedFile
import com.github.libretube.ui.activities.OfflinePlayerActivity import com.github.libretube.ui.activities.OfflinePlayerActivity
import com.github.libretube.ui.viewholders.DownloadsViewHolder import com.github.libretube.ui.viewholders.DownloadsViewHolder
@ -34,6 +36,13 @@ class DownloadsAdapter(
fileName.text = file.name fileName.text = file.name
fileSize.text = "${file.size / (1024 * 1024)} MiB" 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 { root.setOnClickListener {
val intent = Intent(root.context, OfflinePlayerActivity::class.java).also { val intent = Intent(root.context, OfflinePlayerActivity::class.java).also {
it.putExtra(IntentData.fileName, file.name) 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.api.obj.Streams
import com.github.libretube.databinding.DialogDownloadBinding import com.github.libretube.databinding.DialogDownloadBinding
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.extensions.sanitize
import com.github.libretube.services.DownloadService import com.github.libretube.services.DownloadService
import com.github.libretube.util.MetadataHelper
import com.github.libretube.util.ThemeHelper import com.github.libretube.util.ThemeHelper
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import retrofit2.HttpException import retrofit2.HttpException
@ -126,11 +128,32 @@ class DownloadDialog(
return@setOnClickListener 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) val intent = Intent(context, DownloadService::class.java)
intent.putExtra("videoName", binding.fileName.text.toString()) intent.putExtra(
intent.putExtra("videoUrl", videoUrl[binding.videoSpinner.selectedItemPosition]) "videoName",
intent.putExtra("audioUrl", audioUrl[binding.audioSpinner.selectedItemPosition]) fileName
)
intent.putExtra(
"videoUrl",
vidUrl
)
intent.putExtra(
"audioUrl",
audUrl
)
context?.startService(intent) context?.startService(intent)
dismiss() 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.adapters.DownloadsAdapter
import com.github.libretube.ui.base.BaseFragment import com.github.libretube.ui.base.BaseFragment
import com.github.libretube.util.DownloadHelper import com.github.libretube.util.DownloadHelper
import com.github.libretube.util.MetadataHelper
class DownloadsFragment : BaseFragment() { class DownloadsFragment : BaseFragment() {
private lateinit var binding: FragmentDownloadsBinding private lateinit var binding: FragmentDownloadsBinding
@ -31,6 +32,13 @@ class DownloadsFragment : BaseFragment() {
if (files.isEmpty()) return 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.downloadsEmpty.visibility = View.GONE
binding.downloads.visibility = View.VISIBLE binding.downloads.visibility = View.VISIBLE

View File

@ -3,6 +3,7 @@ package com.github.libretube.util
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import com.github.libretube.constants.DownloadType import com.github.libretube.constants.DownloadType
import com.github.libretube.extensions.createDir
import com.github.libretube.obj.DownloadedFile import com.github.libretube.obj.DownloadedFile
import java.io.File import java.io.File
@ -21,14 +22,21 @@ object DownloadHelper {
return File( return File(
getOfflineStorageDir(context), getOfflineStorageDir(context),
"video" "video"
) ).createDir()
} }
fun getAudioDir(context: Context): File { fun getAudioDir(context: Context): File {
return File( return File(
getOfflineStorageDir(context), getOfflineStorageDir(context),
"audio" "audio"
) ).createDir()
}
fun getMetadataDir(context: Context): File {
return File(
getOfflineStorageDir(context),
"metadata"
).createDir()
} }
fun getDownloadedFiles(context: Context): MutableList<DownloadedFile> { 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,12 +7,31 @@
android:paddingHorizontal="10dp" android:paddingHorizontal="10dp"
android:paddingVertical="8dp"> android:paddingVertical="8dp">
<TextView <LinearLayout
android:id="@+id/fileName"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:textSize="16sp" /> android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/fileName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp" />
<TextView
android:id="@+id/uploaderName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp" />
<TextView
android:id="@+id/videoInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp" />
</LinearLayout>
<TextView <TextView
android:id="@+id/fileSize" android:id="@+id/fileSize"