Skip to content

Commit 9e57767

Browse files
committed
first commit
0 parents  commit 9e57767

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+5278
-0
lines changed

app/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

app/build.gradle

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
apply plugin: 'com.android.application'
2+
3+
android {
4+
compileSdkVersion 26
5+
buildToolsVersion "26.0.2"
6+
defaultConfig {
7+
applicationId "jaygoo.m3u8downloader"
8+
minSdkVersion 16
9+
targetSdkVersion 26
10+
versionCode 1
11+
versionName "1.0"
12+
multiDexEnabled true
13+
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
14+
}
15+
buildTypes {
16+
release {
17+
minifyEnabled false
18+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
19+
}
20+
}
21+
}
22+
23+
dependencies {
24+
compile fileTree(dir: 'libs', include: ['*.jar'])
25+
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
26+
exclude group: 'com.android.support', module: 'support-annotations'
27+
})
28+
compile 'com.android.support:appcompat-v7:26.+'
29+
compile 'com.android.support:design:26.+'
30+
compile 'com.android.support.constraint:constraint-layout:1.0.2'
31+
testCompile 'junit:junit:4.12'
32+
compile 'com.karumi:dexter:4.2.0'
33+
compile project(path: ':library')
34+
compile 'com.shuyu:GSYVideoPlayer:2.1.1'
35+
36+
}

app/proguard-rules.pro

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Add project specific ProGuard rules here.
2+
# By default, the flags in this file are appended to flags specified
3+
# in /Users/mac/Library/Android/sdk/tools/proguard/proguard-android.txt
4+
# You can edit the include path and order by changing the proguardFiles
5+
# directive in build.gradle.
6+
#
7+
# For more details, see
8+
# http://developer.android.com/guide/developing/tools/proguard.html
9+
10+
# Add any project specific keep options here:
11+
12+
# If your project uses WebView with JS, uncomment the following
13+
# and specify the fully qualified class name to the JavaScript interface
14+
# class:
15+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16+
# public *;
17+
#}
18+
19+
# Uncomment this to preserve the line number information for
20+
# debugging stack traces.
21+
#-keepattributes SourceFile,LineNumberTable
22+
23+
# If you keep the line number information, uncomment this to
24+
# hide the original source file name.
25+
#-renamesourcefileattribute SourceFile

app/src/main/AndroidManifest.xml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
4+
package="jaygoo.m3u8downloader">
5+
<uses-permission android:name="android.permission.INTERNET"/>
6+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
7+
8+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
9+
<application
10+
android:allowBackup="true"
11+
android:icon="@mipmap/ic_launcher"
12+
android:theme="@style/AppTheme">
13+
<activity android:name=".MainActivity">
14+
<intent-filter>
15+
<action android:name="android.intent.action.MAIN"/>
16+
17+
<category android:name="android.intent.category.LAUNCHER"/>
18+
</intent-filter>
19+
</activity>
20+
21+
<activity android:name=".FullScreenActivity"
22+
android:theme="@style/FullScreenTheme"
23+
android:windowSoftInputMode="stateAlwaysHidden">
24+
</activity>
25+
</application>
26+
27+
</manifest>
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package jaygoo.m3u8downloader;
2+
3+
import android.app.Activity;
4+
import android.net.Uri;
5+
import android.os.Bundle;
6+
import android.support.annotation.Nullable;
7+
import android.util.Log;
8+
import android.view.View;
9+
10+
import com.shuyu.gsyvideoplayer.GSYVideoManager;
11+
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
12+
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
13+
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
14+
import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer;
15+
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
19+
import jaygoo.library.m3u8downloader.server.M3u8Server;
20+
import jaygoo.library.m3u8downloader.utils.M3U8Log;
21+
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
22+
23+
/**
24+
* ================================================
25+
* 作 者:JayGoo
26+
* 版 本:
27+
* 创建日期:2017/11/21
28+
* 描 述:
29+
* ================================================
30+
*/
31+
public class FullScreenActivity extends Activity{
32+
33+
private StandardGSYVideoPlayer videoPlayer;
34+
private OrientationUtils orientationUtils;
35+
private String encryptKey = "63F06F99D823D33AAB89A0A93DECFEE0";
36+
@Override
37+
protected void onCreate(@Nullable Bundle savedInstanceState) {
38+
super.onCreate(savedInstanceState);
39+
setContentView(R.layout.activity_fullscreen);
40+
videoPlayer = (StandardGSYVideoPlayer)findViewById(R.id.videoView);
41+
orientationUtils = new OrientationUtils(this, videoPlayer);
42+
orientationUtils.resolveByClick();
43+
videoPlayer.startWindowFullscreen(this,false,false);
44+
List<VideoOptionModel> optionModels = new ArrayList<>();
45+
optionModels.add(new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT,
46+
"protocol_whitelist", "crypto,file,http,https,tcp,tls,udp"));
47+
GSYVideoManager.instance().setOptionModelList(optionModels);
48+
String url = null;
49+
Bundle bundle = getIntent().getExtras();
50+
if (bundle != null){
51+
url = bundle.getString("M3U8_URL");
52+
}
53+
Uri uri = Uri.parse(url);
54+
M3U8Log.d("uri: "+uri);
55+
String scheme = uri.getScheme();
56+
M3U8Log.d("scheme: "+scheme);
57+
String mVideoSource;
58+
if (null != scheme) {
59+
mVideoSource = uri.toString();
60+
} else {
61+
mVideoSource = uri.getPath();
62+
}
63+
M3U8Log.d("mVideoSource: "+mVideoSource);
64+
String mSource = M3u8Server.createLocalUrl(mVideoSource);
65+
M3U8Log.d("mSource: "+mSource);
66+
M3u8Server.execute();
67+
videoPlayer.setUp(mSource,false,"");
68+
videoPlayer.getBackButton().setOnClickListener(new View.OnClickListener() {
69+
@Override
70+
public void onClick(View v) {
71+
finish();
72+
}
73+
});
74+
videoPlayer.startPlayLogic();
75+
76+
}
77+
78+
@Override
79+
protected void onResume() {
80+
super.onResume();
81+
M3u8Server.onResume(encryptKey);
82+
}
83+
84+
@Override
85+
protected void onPause() {
86+
super.onPause();
87+
M3u8Server.onPause(encryptKey);
88+
}
89+
90+
@Override
91+
protected void onDestroy() {
92+
super.onDestroy();
93+
M3u8Server.finish();
94+
//释放所有
95+
videoPlayer.getCurrentPlayer().release();
96+
GSYVideoPlayer.releaseAllVideos();
97+
videoPlayer.setStandardVideoAllCallBack(null);
98+
}
99+
}
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package jaygoo.m3u8downloader;
2+
3+
import android.Manifest;
4+
import android.content.Intent;
5+
import android.os.Bundle;
6+
import android.support.v7.app.AppCompatActivity;
7+
import android.view.View;
8+
import android.widget.AdapterView;
9+
import android.widget.ListView;
10+
import android.widget.Toast;
11+
12+
import com.karumi.dexter.Dexter;
13+
import com.karumi.dexter.MultiplePermissionsReport;
14+
import com.karumi.dexter.PermissionToken;
15+
import com.karumi.dexter.listener.PermissionRequest;
16+
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
17+
18+
import java.util.List;
19+
20+
import jaygoo.library.m3u8downloader.M3U8Downloader;
21+
import jaygoo.library.m3u8downloader.M3U8DownloaderConfig;
22+
import jaygoo.library.m3u8downloader.OnM3U8DownloadListener;
23+
import jaygoo.library.m3u8downloader.bean.M3U8Task;
24+
import jaygoo.library.m3u8downloader.utils.AES128Utils;
25+
import jaygoo.library.m3u8downloader.utils.M3U8Log;
26+
27+
public class MainActivity extends AppCompatActivity {
28+
static final String[] PERMISSIONS = new String[]{
29+
Manifest.permission.WRITE_EXTERNAL_STORAGE,
30+
Manifest.permission.READ_EXTERNAL_STORAGE,
31+
};
32+
33+
M3U8Task[] taskList = new M3U8Task[6];
34+
private VideoListAdapter adapter;
35+
private String dirPath;
36+
private String encryptKey = "63F06F99D823D33AAB89A0A93DECFEE0";
37+
@Override
38+
protected void onCreate(Bundle savedInstanceState) {
39+
super.onCreate(savedInstanceState);
40+
setContentView(R.layout.activity_main);
41+
requestAppPermissions();
42+
try {
43+
M3U8Log.d("AES BASE64 Random Key:"+AES128Utils.getAESKey() );
44+
} catch (Exception e) {
45+
e.printStackTrace();
46+
}
47+
48+
}
49+
50+
private void initView() {
51+
dirPath = StorageUtils.getCacheDirectory(this).getPath()+"/m3u8Downloader";
52+
//common config !
53+
M3U8DownloaderConfig
54+
.build(getApplicationContext())
55+
.setSaveDir(dirPath)
56+
.setDebugMode(true)
57+
;
58+
59+
// add listener
60+
M3U8Downloader.getInstance().setOnM3U8DownloadListener(onM3U8DownloadListener);
61+
M3U8Downloader.getInstance().setEncryptKey(encryptKey);
62+
initData();
63+
adapter = new VideoListAdapter(this, R.layout.list_item, taskList);
64+
ListView listView = (ListView) findViewById(R.id.list_view);
65+
listView.setAdapter(adapter);
66+
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
67+
@Override
68+
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
69+
String url = taskList[position].getUrl();
70+
if (M3U8Downloader.getInstance().checkM3U8IsExist(url)){
71+
Toast.makeText(getApplicationContext(),"本地文件已下载,正在播放中!!!", Toast.LENGTH_SHORT).show();
72+
Intent intent = new Intent(MainActivity.this,FullScreenActivity.class);
73+
intent.putExtra("M3U8_URL",M3U8Downloader.getInstance().getM3U8Path(url));
74+
startActivity(intent);
75+
}else {
76+
if (M3U8Downloader.getInstance().isTaskDownloading(url)) {
77+
M3U8Downloader.getInstance().pause(url);
78+
} else {
79+
M3U8Downloader.getInstance().download(url);
80+
}
81+
}
82+
}
83+
});
84+
}
85+
86+
private void initData(){
87+
// MUtils.clearDir(new File(dirPath));
88+
M3U8Task bean0 = new M3U8Task("https://media6.smartstudy.com/52/9c/10732/4/dest.m3u8");
89+
M3U8Task bean1 = new M3U8Task("https://media6.smartstudy.com/b2/75/2475/4/dest.m3u8");
90+
M3U8Task bean2 = new M3U8Task("https://media6.smartstudy.com/ae/07/3997/2/dest.m3u8");
91+
M3U8Task bean3 = new M3U8Task("http://hls.ciguang.tv/hdtv/video.m3u8");
92+
M3U8Task bean4 = new M3U8Task("http://hcjs2ra2rytd8v8np1q.exp.bcevod.com/mda-hegtjx8n5e8jt9zv/mda-hegtjx8n5e8jt9zv.m3u8");
93+
M3U8Task bean5 = new M3U8Task("https://media6.smartstudy.com/55/34/2542/4/dest.m3u8");
94+
taskList[0] = bean0;
95+
taskList[1] = bean1;
96+
taskList[2] = bean2;
97+
taskList[3] = bean3;
98+
taskList[4] = bean4;
99+
taskList[5] = bean5;
100+
}
101+
102+
private OnM3U8DownloadListener onM3U8DownloadListener = new OnM3U8DownloadListener() {
103+
104+
@Override
105+
public void onDownloadSuccess(M3U8Task task) {
106+
super.onDownloadSuccess(task);
107+
adapter.notifyChanged(taskList, task);
108+
}
109+
110+
@Override
111+
public void onDownloadPending(M3U8Task task) {
112+
super.onDownloadPending(task);
113+
adapter.notifyChanged(taskList, task);
114+
}
115+
116+
@Override
117+
public void onDownloadPause(M3U8Task task) {
118+
super.onDownloadPause(task);
119+
adapter.notifyChanged(taskList, task);
120+
}
121+
122+
@Override
123+
public void onDownloadProgress(final M3U8Task task) {
124+
super.onDownloadProgress(task);
125+
runOnUiThread(new Runnable() {
126+
@Override
127+
public void run() {
128+
adapter.notifyChanged(taskList, task);
129+
}
130+
});
131+
132+
}
133+
134+
@Override
135+
public void onDownloadPrepare(final M3U8Task task) {
136+
super.onDownloadPrepare(task);
137+
runOnUiThread(new Runnable() {
138+
@Override
139+
public void run() {
140+
adapter.notifyChanged(taskList, task);
141+
}
142+
});
143+
}
144+
145+
@Override
146+
public void onDownloadError(M3U8Task task, Throwable errorMsg) {
147+
super.onDownloadError(task, errorMsg);
148+
adapter.notifyChanged(taskList, task);
149+
}
150+
151+
@Override
152+
public void onAllTaskComplete() {
153+
super.onAllTaskComplete();
154+
Toast.makeText(getApplicationContext(),"文件全部下载完成!!!!", Toast.LENGTH_LONG).show();
155+
156+
}
157+
};
158+
159+
private void requestAppPermissions() {
160+
Dexter.withActivity(this)
161+
.withPermissions(PERMISSIONS)
162+
.withListener(new MultiplePermissionsListener() {
163+
@Override
164+
public void onPermissionsChecked(MultiplePermissionsReport report) {
165+
if (report.areAllPermissionsGranted()) {
166+
initView();
167+
Toast.makeText(getApplicationContext(),"权限获取成功",Toast.LENGTH_LONG).show();
168+
}else {
169+
Toast.makeText(getApplicationContext(),"权限获取失败",Toast.LENGTH_LONG).show();
170+
}
171+
}
172+
173+
@Override
174+
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
175+
}
176+
})
177+
.check();
178+
}
179+
}

0 commit comments

Comments
 (0)