diff --git a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt index cecc487..55b76fc 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt @@ -1,6 +1,7 @@ package org.libre.agosto.p2play import android.annotation.SuppressLint +import android.app.DownloadManager import android.content.Intent import android.content.pm.ActivityInfo import android.graphics.Bitmap @@ -34,6 +35,7 @@ import org.libre.agosto.p2play.ajax.Videos import org.libre.agosto.p2play.databinding.ActivityReproductorBinding import org.libre.agosto.p2play.helpers.setFullscreen import org.libre.agosto.p2play.models.CommentaryModel +import org.libre.agosto.p2play.models.DownloadFiles import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.singletons.PlaybackSingleton @@ -127,6 +129,8 @@ class ReproductorActivity : AppCompatActivity() { binding.reportLayout.setOnClickListener { reportIntent() } fullscreenButton.setOnClickListener { toggleFullscreen() } fullscreenButton2.setOnClickListener { toggleFullscreen() } + binding.downloadLayout!!.setOnClickListener { downloadVideo() } + binding.userImg.setOnClickListener { val intent = Intent(this, ChannelActivity::class.java) @@ -444,6 +448,31 @@ class ReproductorActivity : AppCompatActivity() { } } + private fun downloadVideo() { + val downloadFile = videoPlayback.streamingData?.downloadFiles?.first() + if (downloadFile != null) { + val manager = getSystemService(DOWNLOAD_SERVICE) as DownloadManager + val request = DownloadManager.Request(Uri.parse(downloadFile.url)) + val fileName = "${videoPlayback.name}-${downloadFile.resolution}.${downloadFile.url.split('.').last()}" + try { + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) + .setTitle(fileName) + .setDescription(getString(R.string.downloadText)) + .setDestinationInExternalPublicDir( + android.os.Environment.DIRECTORY_DOWNLOADS, + fileName + ) + manager.enqueue(request) + ManagerSingleton.toast(getString(R.string.downloadStarted), this) + } catch (_: Exception) { + ManagerSingleton.toast(getString(R.string.downloadFailed), this) + } + } else { + ManagerSingleton.toast(getString(R.string.downloadFailed), this) + } + + } + override fun onDestroy() { if (!player.isPlaying) { PlaybackSingleton.release() diff --git a/app/src/main/java/org/libre/agosto/p2play/models/StreamingModel.kt b/app/src/main/java/org/libre/agosto/p2play/models/StreamingModel.kt index c726763..02e26b6 100644 --- a/app/src/main/java/org/libre/agosto/p2play/models/StreamingModel.kt +++ b/app/src/main/java/org/libre/agosto/p2play/models/StreamingModel.kt @@ -2,10 +2,15 @@ package org.libre.agosto.p2play.models import android.util.JsonReader +class DownloadFiles( + var resolution: String = "", + var url: String = "" +) + class StreamingModel( var playlistUrl: String = "", var segmentsSha256Url: String = "", - // TODO: Download Files + var downloadFiles: ArrayList = arrayListOf() ) { fun parse(data: JsonReader) { data.beginObject() @@ -18,6 +23,37 @@ class StreamingModel( "segmentsSha256Url" -> { this.segmentsSha256Url = data.nextString() } + "files" -> { + data.beginArray() + if (data.hasNext()) { + data.beginObject() + val downloadFile = DownloadFiles() + while (data.hasNext()) { + val key2 = data.nextName() + when (key2.toString()) { + "fileDownloadUrl" -> downloadFile.url = data.nextString() + "resolution" -> { + data.beginObject() + while(data.hasNext()) { + val keyRes = data.nextName() + when (keyRes!!) { + "label" -> downloadFile.resolution = data.nextString() + else -> data.skipValue() + } + } + data.endObject() + } + else -> data.skipValue() + } + } + this.downloadFiles.add(downloadFile) + data.endObject() + } + while (data.hasNext()) { + data.skipValue() + } + data.endArray() + } else -> data.skipValue() } } diff --git a/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt b/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt index 8bc594e..64db408 100644 --- a/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt +++ b/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt @@ -77,13 +77,27 @@ class VideoModel( data.beginObject() while (data.hasNext()) { val key2 = data.nextName() + streamingData = StreamingModel() + val downloadFile = DownloadFiles() when (key2.toString()) { "fileUrl" -> { - streamingData = StreamingModel() streamingData!!.playlistUrl = data.nextString() } + "fileDownloadUrl" -> downloadFile.url = data.nextString() + "resolution" -> { + data.beginObject() + while(data.hasNext()) { + val keyRes = data.nextName() + when (keyRes!!) { + "label" -> downloadFile.resolution = data.nextString() + else -> data.skipValue() + } + } + data.endObject() + } else -> data.skipValue() } + streamingData!!.downloadFiles.add(downloadFile) } data.endObject() } diff --git a/app/src/main/res/drawable/ic_outline_cloud_download_24.xml b/app/src/main/res/drawable/ic_outline_cloud_download_24.xml new file mode 100644 index 0000000..8df4139 --- /dev/null +++ b/app/src/main/res/drawable/ic_outline_cloud_download_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_reproductor.xml b/app/src/main/res/layout/activity_reproductor.xml index e3c5017..2e212a7 100644 --- a/app/src/main/res/layout/activity_reproductor.xml +++ b/app/src/main/res/layout/activity_reproductor.xml @@ -160,6 +160,35 @@ android:textAlignment="center" /> + + + + + + + @@ -188,6 +217,7 @@ android:textAlignment="center" /> + + + Bientôt disponible ! + Chargement… + + + + + À propos de P2Play + P2Play est une application Android non officielle pour PeerTube. Vous pouvez regarder et contribuer avec le code sur GitLab : + Vous pouvez suivre notre blog : + Licence GNU GPLv3 + À propos de l\'instance + Vous pouvez voir les termes et plus sur le web : + + + Sélectionnez votre instance + Accepter + Erreur, réessayez + Hôte enregistré + Instance + + + Connectez-vous ou créez un nouveau compte + Nom d\'utilisateur : + + Mot de passe : + + Connectez-vous maintenant + Créer un nouveau compte + Code à deux facteurs + + Vous êtes maintenant connecté + Une erreur est survenue + Identifiants invalides + Vous êtes maintenant enregistré + Une erreur est survenue + Données invalides + + Inscrivez-vous maintenant + E-mail : + user@mail.com + + + Abonnements + Récent + Populaire + Tendance + Vidéos locales + Mes vidéos + vues + secondes + minutes + heures + Se connecter + En direct + + Vous êtes maintenant déconnecté + + + Abonnements + Populaire + Tendance + Récent + Local + À propos + Historique + Ma bibliothèque + Vidéos + Plus + Les plus aimés + + + Paramètres + Se connecter + Déconnexion + + + Description : + Commentaires : + Faire un commentaire + + S\'abonner + J\'aime + Je n\'aime pas + Partager + Signaler + Se désabonner + Commentaire + Afficher plus + + Répondre + Voir les réponses (%1$d) + + Vous êtes abonné à cette chaîne + Vous avez évalué la vidéo + Vous vous êtes désabonné de cette chaîne + Vous avez commenté cette vidéo + Une erreur est survenue, réessayez + Veuillez d\'abord faire un commentaire + + + Paramètres + + Général + Contenu NFSW + Quand activé, cela peut afficher du contenu adulte et sensible. + Instance Peertube + - + Redémarrez l\'application pour appliquer les changements + Vidéos par page + + + Abonnés : + Hôte : + Nom du compte : + + + Raison pour signaler cette vidéo : + Vous avez signalé la vidéo + + Bonjour fragment vide + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 81a9a5d..98e2a28 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,6 +105,9 @@ You have commented on this video An error has occurred, try again Please make a comment first + Download + Download as started + Unable to download this video Settings diff --git a/build.gradle b/build.gradle index 3d6ea4f..fb9fd8a 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,6 @@ allprojects { } } -task clean(type: Delete) { +tasks.register('clean', Delete) { delete rootProject.buildDir }