mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	download resume and stuff
This commit is contained in:
		
							parent
							
								
									3ef14b93fb
								
							
						
					
					
						commit
						576377e4bb
					
				
					 5 changed files with 136 additions and 24 deletions
				
			
		|  | @ -33,6 +33,19 @@ | |||
|             </intent-filter> | ||||
|         </activity> | ||||
| 
 | ||||
| 
 | ||||
|         <receiver | ||||
|                 android:name=".recivers.VideoDownloadRestartReceiver" | ||||
|                 android:enabled="true" | ||||
|                 android:exported="true"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="restart_service" /> | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|         <service | ||||
|                 android:name=".services.VideoDownloadKeepAliveService" | ||||
|                 android:enabled="true" > | ||||
|         </service> | ||||
|         <service | ||||
|                 android:name=".services.VideoDownloadService" | ||||
|                 android:enabled="true" | ||||
|  |  | |||
|  | @ -1,39 +1,28 @@ | |||
| package com.lagradost.cloudstream3 | ||||
| 
 | ||||
| import android.Manifest | ||||
| import android.app.PictureInPictureParams | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.content.pm.PackageManager | ||||
| import android.net.Uri | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.widget.Toast | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import androidx.documentfile.provider.DocumentFile | ||||
| import androidx.navigation.findNavController | ||||
| import androidx.navigation.ui.AppBarConfiguration | ||||
| import androidx.navigation.ui.setupWithNavController | ||||
| import com.anggrayudi.storage.SimpleStorage | ||||
| import com.anggrayudi.storage.callback.StorageAccessCallback | ||||
| import com.anggrayudi.storage.file.StorageId | ||||
| import com.anggrayudi.storage.file.StorageType | ||||
| import com.anggrayudi.storage.file.getStorageId | ||||
| import com.google.android.gms.cast.ApplicationMetadata | ||||
| import com.google.android.gms.cast.Cast | ||||
| import com.google.android.gms.cast.LaunchOptions | ||||
| import com.google.android.gms.cast.framework.CastButtonFactory | ||||
| import com.google.android.gms.cast.framework.CastContext | ||||
| import com.google.android.gms.cast.framework.CastSession | ||||
| import com.google.android.gms.cast.framework.SessionManagerListener | ||||
| import com.google.android.material.bottomnavigation.BottomNavigationView | ||||
| import com.karumi.dexter.Dexter | ||||
| import com.karumi.dexter.MultiplePermissionsReport | ||||
| import com.karumi.dexter.listener.multi.BaseMultiplePermissionsListener | ||||
| import com.lagradost.cloudstream3.UIHelper.checkWrite | ||||
| import com.lagradost.cloudstream3.UIHelper.hasPIPPermission | ||||
| import com.lagradost.cloudstream3.UIHelper.requestRW | ||||
| import com.lagradost.cloudstream3.UIHelper.shouldShowPIPMode | ||||
| import com.lagradost.cloudstream3.recivers.VideoDownloadRestartReceiver | ||||
| import com.lagradost.cloudstream3.services.RESTART_ALL_DOWNLOADS_AND_QUEUE | ||||
| import com.lagradost.cloudstream3.services.RESTART_NONE | ||||
| import com.lagradost.cloudstream3.services.START_VALUE_KEY | ||||
| import com.lagradost.cloudstream3.services.VideoDownloadKeepAliveService | ||||
| import com.lagradost.cloudstream3.utils.VideoDownloadManager | ||||
| import kotlinx.android.synthetic.main.fragment_result.* | ||||
| 
 | ||||
| 
 | ||||
|  | @ -125,6 +114,14 @@ class MainActivity : AppCompatActivity() { | |||
|         storage.onRestoreInstanceState(savedInstanceState) | ||||
|     } | ||||
| 
 | ||||
|     override fun onDestroy() { | ||||
|         val broadcastIntent = Intent() | ||||
|         broadcastIntent.action = "restart_service" | ||||
|         broadcastIntent.setClass(this, VideoDownloadRestartReceiver::class.java) | ||||
|         this.sendBroadcast(broadcastIntent) | ||||
|         super.onDestroy() | ||||
|     } | ||||
| 
 | ||||
|     override fun onCreate(savedInstanceState: Bundle?) { | ||||
|         super.onCreate(savedInstanceState) | ||||
|         mainContext = this | ||||
|  | @ -161,6 +158,12 @@ class MainActivity : AppCompatActivity() { | |||
|         } | ||||
|         CastButtonFactory.setUpMediaRouteButton(this, media_route_button) | ||||
| 
 | ||||
|         if (!VideoDownloadManager.isMyServiceRunning(this, VideoDownloadKeepAliveService::class.java)) { | ||||
|             val mYourService = VideoDownloadKeepAliveService() | ||||
|             val mServiceIntent = Intent(this, mYourService::class.java).putExtra(START_VALUE_KEY, RESTART_ALL_DOWNLOADS_AND_QUEUE) | ||||
|             this.startService(mServiceIntent) | ||||
|         } | ||||
| 
 | ||||
|         /* | ||||
|         val castContext = CastContext.getSharedInstance(applicationContext) | ||||
|          fun buildMediaQueueItem(video: String): MediaQueueItem { | ||||
|  |  | |||
|  | @ -0,0 +1,23 @@ | |||
| package com.lagradost.cloudstream3.recivers | ||||
| 
 | ||||
| import android.content.BroadcastReceiver | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.os.Build | ||||
| import android.util.Log | ||||
| import com.lagradost.cloudstream3.services.RESTART_ALL_DOWNLOADS_AND_QUEUE | ||||
| import com.lagradost.cloudstream3.services.START_VALUE_KEY | ||||
| import com.lagradost.cloudstream3.services.VideoDownloadKeepAliveService | ||||
| 
 | ||||
| 
 | ||||
| class VideoDownloadRestartReceiver : BroadcastReceiver() { | ||||
|     override fun onReceive(context: Context?, intent: Intent?) { | ||||
|         Log.i("Broadcast Listened", "Service tried to stop") | ||||
| 
 | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | ||||
|             context?.startForegroundService(Intent(context, VideoDownloadKeepAliveService::class.java).putExtra(START_VALUE_KEY, RESTART_ALL_DOWNLOADS_AND_QUEUE)) | ||||
|         } else { | ||||
|             context?.startService(Intent(context, VideoDownloadKeepAliveService::class.java).putExtra(START_VALUE_KEY, RESTART_ALL_DOWNLOADS_AND_QUEUE)) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,51 @@ | |||
| package com.lagradost.cloudstream3.services | ||||
| 
 | ||||
| import android.app.Service | ||||
| import android.content.Intent | ||||
| import android.os.IBinder | ||||
| import com.lagradost.cloudstream3.recivers.VideoDownloadRestartReceiver | ||||
| import com.lagradost.cloudstream3.utils.DataStore.getKey | ||||
| import com.lagradost.cloudstream3.utils.DataStore.getKeys | ||||
| import com.lagradost.cloudstream3.utils.VideoDownloadManager | ||||
| 
 | ||||
| const val RESTART_ALL_DOWNLOADS_AND_QUEUE = 1 | ||||
| const val RESTART_NONE = 0 | ||||
| const val START_VALUE_KEY = "start_value" | ||||
| 
 | ||||
| class VideoDownloadKeepAliveService : Service() { | ||||
|     override fun onBind(p0: Intent?): IBinder? { | ||||
|         return null | ||||
|     } | ||||
| 
 | ||||
|     override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { | ||||
|         val startValue = intent?.getIntExtra(START_VALUE_KEY, RESTART_NONE) ?: RESTART_NONE | ||||
|         if (startValue == RESTART_ALL_DOWNLOADS_AND_QUEUE) { | ||||
|             val keys = this.getKeys(VideoDownloadManager.KEY_RESUME_PACKAGES) | ||||
|             val resumePkg = keys.mapNotNull { k -> this.getKey<VideoDownloadManager.DownloadResumePackage>(k) } | ||||
| 
 | ||||
|             for (pkg in resumePkg) { // ADD ALL CURRENT DOWNLOADS | ||||
|                 VideoDownloadManager.downloadFromResume(this, pkg) | ||||
|             } | ||||
| 
 | ||||
|             // ADD QUEUE | ||||
|             val resumeQueue = | ||||
|                 this.getKey<List<VideoDownloadManager.DownloadQueueResumePackage>>(VideoDownloadManager.KEY_RESUME_QUEUE_PACKAGES) | ||||
|             if (resumeQueue != null && resumeQueue.isNotEmpty()) { | ||||
|                 val sorted = resumeQueue.sortedBy { item -> item.index } | ||||
|                 for (queueItem in sorted) { | ||||
|                     VideoDownloadManager.downloadFromResume(this, queueItem.pkg) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return START_STICKY//super.onStartCommand(intent, flags, startId) | ||||
|     } | ||||
| 
 | ||||
|     override fun onDestroy() { | ||||
|         val broadcastIntent = Intent() | ||||
|         broadcastIntent.action = "restart_service" | ||||
|         broadcastIntent.setClass(this, VideoDownloadRestartReceiver::class.java) | ||||
|         this.sendBroadcast(broadcastIntent) | ||||
|         super.onDestroy() | ||||
|     } | ||||
| } | ||||
|  | @ -1,5 +1,6 @@ | |||
| package com.lagradost.cloudstream3.utils | ||||
| 
 | ||||
| import android.app.ActivityManager | ||||
| import android.app.NotificationChannel | ||||
| import android.app.NotificationManager | ||||
| import android.app.PendingIntent | ||||
|  | @ -20,6 +21,9 @@ import com.lagradost.cloudstream3.R | |||
| import com.lagradost.cloudstream3.UIHelper.colorFromAttribute | ||||
| import com.lagradost.cloudstream3.mvvm.logError | ||||
| import com.lagradost.cloudstream3.mvvm.normalSafeApiCall | ||||
| import com.lagradost.cloudstream3.services.RESTART_NONE | ||||
| import com.lagradost.cloudstream3.services.START_VALUE_KEY | ||||
| import com.lagradost.cloudstream3.services.VideoDownloadKeepAliveService | ||||
| import com.lagradost.cloudstream3.services.VideoDownloadService | ||||
| import com.lagradost.cloudstream3.utils.Coroutines.main | ||||
| import com.lagradost.cloudstream3.utils.DataStore.getKey | ||||
|  | @ -33,8 +37,7 @@ import java.lang.Thread.sleep | |||
| import java.net.URL | ||||
| import java.net.URLConnection | ||||
| import java.util.* | ||||
| import kotlin.collections.ArrayList | ||||
| import kotlin.collections.HashMap | ||||
| 
 | ||||
| 
 | ||||
| const val DOWNLOAD_CHANNEL_ID = "cloudstream3.general" | ||||
| const val DOWNLOAD_CHANNEL_NAME = "Downloads" | ||||
|  | @ -119,6 +122,11 @@ object VideoDownloadManager { | |||
|         val path: Uri, | ||||
|     ) | ||||
| 
 | ||||
|     data class DownloadQueueResumePackage( | ||||
|         val index: Int, | ||||
|         val pkg: DownloadResumePackage, | ||||
|     ) | ||||
| 
 | ||||
|     private const val SUCCESS_DOWNLOAD_DONE = 1 | ||||
|     private const val SUCCESS_STOPPED = 2 | ||||
|     private const val ERROR_DELETING_FILE = -1 | ||||
|  | @ -131,8 +139,9 @@ object VideoDownloadManager { | |||
|     private const val ERROR_CONTENT_RESOLVER_CANT_OPEN_STREAM = -8 | ||||
|     private const val ERROR_CONTENT_RESOLVER_NOT_FOUND = -9 | ||||
| 
 | ||||
|     private const val KEY_RESUME_PACKAGES = "download_resume" | ||||
|     private const val KEY_DOWNLOAD_INFO = "download_info" | ||||
|     const val KEY_RESUME_PACKAGES = "download_resume" | ||||
|     const val KEY_DOWNLOAD_INFO = "download_info" | ||||
|     const val KEY_RESUME_QUEUE_PACKAGES = "download_q_resume" | ||||
| 
 | ||||
|     val downloadStatus = HashMap<Int, DownloadType>() | ||||
|     val downloadStatusEvent = Event<Pair<Int, DownloadType>>() | ||||
|  | @ -249,7 +258,7 @@ object VideoDownloadManager { | |||
|                     } else if (state == DownloadType.IsDone) { | ||||
|                         "Download Done - $rowTwo" | ||||
|                     } else { | ||||
|                         "Download Stopped - $rowTwo" | ||||
|                         "Download Canceled - $rowTwo" | ||||
|                     } | ||||
| 
 | ||||
|                 val bodyStyle = NotificationCompat.BigTextStyle() | ||||
|  | @ -263,7 +272,7 @@ object VideoDownloadManager { | |||
|                 } else if (state == DownloadType.IsDone) { | ||||
|                     "Download Done - $rowTwo" | ||||
|                 } else { | ||||
|                     "Download Stopped - $rowTwo" | ||||
|                     "Download Canceled - $rowTwo" | ||||
|                 } | ||||
| 
 | ||||
|                 builder.setContentText(txt) | ||||
|  | @ -312,7 +321,7 @@ object VideoDownloadManager { | |||
|                             }, when (i) { | ||||
|                                 DownloadActionType.Resume -> "Resume" | ||||
|                                 DownloadActionType.Pause -> "Pause" | ||||
|                                 DownloadActionType.Stop -> "Stop" | ||||
|                                 DownloadActionType.Stop -> "Cancel" | ||||
|                             }, pending | ||||
|                         ) | ||||
|                     ) | ||||
|  | @ -628,6 +637,9 @@ object VideoDownloadManager { | |||
|                 downloadEvent.invoke(Pair(id, DownloadActionType.Resume)) | ||||
|                 return | ||||
|             } | ||||
| 
 | ||||
|             val dQueue = downloadQueue.toList().mapIndexed { index, any -> DownloadQueueResumePackage(index, any) } | ||||
|             context.setKey(KEY_RESUME_QUEUE_PACKAGES, dQueue) | ||||
|             currentDownloads.add(id) | ||||
| 
 | ||||
|             main { | ||||
|  | @ -722,6 +734,16 @@ object VideoDownloadManager { | |||
|         downloadCheck(context) | ||||
|     } | ||||
| 
 | ||||
|     fun isMyServiceRunning(context: Context, serviceClass: Class<*>): Boolean { | ||||
|         val manager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager? | ||||
|         for (service in manager!!.getRunningServices(Int.MAX_VALUE)) { | ||||
|             if (serviceClass.name == service.service.className) { | ||||
|                 return true | ||||
|             } | ||||
|         } | ||||
|         return false | ||||
|     } | ||||
| 
 | ||||
|     fun downloadEpisode( | ||||
|         context: Context, | ||||
|         source: String?, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue