mirror of
https://github.com/libre-tube/LibreTube.git
synced 2024-12-14 06:10:31 +05:30
download thumbnail images
This commit is contained in:
parent
206a24ad7d
commit
b8b3159362
@ -1,10 +1,12 @@
|
|||||||
package com.github.libretube.obj
|
package com.github.libretube.obj
|
||||||
|
|
||||||
|
import android.graphics.Bitmap
|
||||||
import com.github.libretube.api.obj.Streams
|
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
|
var metadata: Streams? = null,
|
||||||
|
var thumbnail: Bitmap? = null
|
||||||
)
|
)
|
||||||
|
@ -42,6 +42,8 @@ class DownloadsAdapter(
|
|||||||
" • " + it.uploadDate
|
" • " + it.uploadDate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
thumbnailImage.setImageBitmap(file.thumbnail)
|
||||||
|
|
||||||
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)
|
||||||
|
@ -17,6 +17,7 @@ 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.extensions.sanitize
|
||||||
import com.github.libretube.services.DownloadService
|
import com.github.libretube.services.DownloadService
|
||||||
|
import com.github.libretube.util.ImageHelper
|
||||||
import com.github.libretube.util.MetadataHelper
|
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
|
||||||
@ -137,8 +138,13 @@ class DownloadDialog(
|
|||||||
|
|
||||||
val metadataHelper = MetadataHelper(requireContext())
|
val metadataHelper = MetadataHelper(requireContext())
|
||||||
metadataHelper.createMetadata(fileName, streams)
|
metadataHelper.createMetadata(fileName, streams)
|
||||||
|
streams.thumbnailUrl?.let { thumbnailUrl ->
|
||||||
Log.e("meta", metadataHelper.getMetadata(fileName).toString())
|
ImageHelper.downloadImage(
|
||||||
|
requireContext(),
|
||||||
|
thumbnailUrl,
|
||||||
|
fileName
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val intent = Intent(context, DownloadService::class.java)
|
val intent = Intent(context, DownloadService::class.java)
|
||||||
|
|
||||||
|
@ -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.ImageHelper
|
||||||
import com.github.libretube.util.MetadataHelper
|
import com.github.libretube.util.MetadataHelper
|
||||||
|
|
||||||
class DownloadsFragment : BaseFragment() {
|
class DownloadsFragment : BaseFragment() {
|
||||||
@ -37,6 +38,9 @@ class DownloadsFragment : BaseFragment() {
|
|||||||
metadataHelper.getMetadata(it.name)?.let { streams ->
|
metadataHelper.getMetadata(it.name)?.let { streams ->
|
||||||
it.metadata = streams
|
it.metadata = streams
|
||||||
}
|
}
|
||||||
|
ImageHelper.getDownloadedImage(requireContext(), it.name)?.let { bitmap ->
|
||||||
|
it.thumbnail = bitmap
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.downloadsEmpty.visibility = View.GONE
|
binding.downloadsEmpty.visibility = View.GONE
|
||||||
|
@ -39,6 +39,13 @@ object DownloadHelper {
|
|||||||
).createDir()
|
).createDir()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getThumbnailDir(context: Context): File {
|
||||||
|
return File(
|
||||||
|
getOfflineStorageDir(context),
|
||||||
|
"thumbnail"
|
||||||
|
).createDir()
|
||||||
|
}
|
||||||
|
|
||||||
fun getDownloadedFiles(context: Context): MutableList<DownloadedFile> {
|
fun getDownloadedFiles(context: Context): MutableList<DownloadedFile> {
|
||||||
val videoFiles = getVideoDir(context).listFiles()
|
val videoFiles = getVideoDir(context).listFiles()
|
||||||
val audioFiles = getAudioDir(context).listFiles()?.toMutableList()
|
val audioFiles = getAudioDir(context).listFiles()?.toMutableList()
|
||||||
|
@ -1,12 +1,20 @@
|
|||||||
package com.github.libretube.util
|
package com.github.libretube.util
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
|
import android.graphics.drawable.BitmapDrawable
|
||||||
|
import android.net.Uri
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import coil.disk.DiskCache
|
import coil.disk.DiskCache
|
||||||
import coil.load
|
import coil.load
|
||||||
|
import coil.request.ImageRequest
|
||||||
import com.github.libretube.api.CronetHelper
|
import com.github.libretube.api.CronetHelper
|
||||||
import com.github.libretube.constants.PreferenceKeys
|
import com.github.libretube.constants.PreferenceKeys
|
||||||
|
import okio.use
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileOutputStream
|
||||||
|
|
||||||
object ImageHelper {
|
object ImageHelper {
|
||||||
lateinit var imageLoader: ImageLoader
|
lateinit var imageLoader: ImageLoader
|
||||||
@ -42,4 +50,51 @@ object ImageHelper {
|
|||||||
)
|
)
|
||||||
if (!dataSaverModeEnabled) target.load(url, imageLoader)
|
if (!dataSaverModeEnabled) target.load(url, imageLoader)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun downloadImage(context: Context, url: String, fileName: String) {
|
||||||
|
val request = ImageRequest.Builder(context)
|
||||||
|
.data(url)
|
||||||
|
.target { result ->
|
||||||
|
val bitmap = (result as BitmapDrawable).bitmap
|
||||||
|
saveImage(
|
||||||
|
context,
|
||||||
|
bitmap,
|
||||||
|
Uri.fromFile(
|
||||||
|
File(
|
||||||
|
DownloadHelper.getThumbnailDir(context),
|
||||||
|
fileName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
.build()
|
||||||
|
|
||||||
|
imageLoader.enqueue(request)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getDownloadedImage(context: Context, fileName: String): Bitmap? {
|
||||||
|
return getImage(
|
||||||
|
context,
|
||||||
|
Uri.fromFile(
|
||||||
|
File(
|
||||||
|
DownloadHelper.getThumbnailDir(context),
|
||||||
|
fileName
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
private fun saveImage(context: Context, bitmapImage: Bitmap, imagePath: Uri) {
|
||||||
|
context.contentResolver.openFileDescriptor(imagePath, "w")?.use {
|
||||||
|
FileOutputStream(it.fileDescriptor).use { fos ->
|
||||||
|
bitmapImage.compress(Bitmap.CompressFormat.PNG, 25, fos)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getImage(context: Context, imagePath: Uri): Bitmap? {
|
||||||
|
context.contentResolver.openInputStream(imagePath)?.use {
|
||||||
|
return BitmapFactory.decodeStream(it)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?attr/selectableItemBackground"
|
android:background="?attr/selectableItemBackground"
|
||||||
@ -7,18 +9,35 @@
|
|||||||
android:paddingHorizontal="10dp"
|
android:paddingHorizontal="10dp"
|
||||||
android:paddingVertical="8dp">
|
android:paddingVertical="8dp">
|
||||||
|
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginEnd="15dp"
|
||||||
|
app:cardCornerRadius="8dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/thumbnailImage"
|
||||||
|
android:layout_width="140dp"
|
||||||
|
android:layout_height="80dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
tools:src="@tools:sample/backgrounds/scenic" />
|
||||||
|
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="10dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical">
|
||||||
android:layout_marginEnd="10dp">
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/fileName"
|
android:id="@+id/fileName"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginVertical="2dp"
|
android:layout_marginVertical="2dp"
|
||||||
|
android:maxLines="2"
|
||||||
android:textSize="16sp" />
|
android:textSize="16sp" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
Loading…
Reference in New Issue
Block a user