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
|
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
|
||||||
)
|
)
|
||||||
|
@ -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(
|
||||||
|
@ -8,6 +8,7 @@ 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 +35,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
|
||||||
|
videoInfo.text = 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)
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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> {
|
||||||
|
@ -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: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_height="wrap_content"
|
||||||
android:layout_weight="1"
|
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
|
<TextView
|
||||||
android:id="@+id/fileSize"
|
android:id="@+id/fileSize"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
Loading…
x
Reference in New Issue
Block a user