mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-27 23:40:33 +05:30
commit
bc3f609842
@ -0,0 +1,7 @@
|
||||
package com.github.libretube.extensions
|
||||
|
||||
import java.io.File
|
||||
|
||||
fun File.createDir() = apply {
|
||||
if (!this.exists()) this.mkdirs()
|
||||
}
|
@ -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
|
||||
)
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
||||
|
@ -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> {
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
@ -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: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>
|
Loading…
x
Reference in New Issue
Block a user