parent
df310b7fbe
commit
550455084f
@ -1,52 +0,0 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.common; |
||||
|
||||
import androidx.annotation.CheckResult; |
||||
import com.arialyy.aria.core.common.controller.ControllerType; |
||||
import com.arialyy.aria.core.common.controller.FeatureController; |
||||
import com.arialyy.aria.core.inf.AbsTarget; |
||||
import com.arialyy.aria.core.inf.Suggest; |
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; |
||||
import com.arialyy.aria.util.CommonUtil; |
||||
|
||||
public abstract class BaseOption<TARGET extends AbsTarget> { |
||||
protected final String TAG; |
||||
protected TARGET mTarget; |
||||
protected AbsTaskWrapper mWrapper; |
||||
|
||||
public BaseOption(TARGET target, AbsTaskWrapper wrapper) { |
||||
TAG = CommonUtil.getClassName(getClass()); |
||||
mTarget = target; |
||||
mWrapper = wrapper; |
||||
} |
||||
|
||||
protected AbsTaskWrapper getTaskWrapper() { |
||||
return mWrapper; |
||||
} |
||||
|
||||
/** |
||||
* 使用对应等控制器,注意: |
||||
* 1、对于不存在的任务(第一次下载),只能使用{@link ControllerType#CREATE_CONTROLLER} |
||||
* 2、对于已存在的任务,只能使用{@link ControllerType#TASK_CONTROLLER} |
||||
* |
||||
* @param clazz {@link ControllerType#CREATE_CONTROLLER}、{@link ControllerType#TASK_CONTROLLER} |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TASK_CONTROLLER) |
||||
public synchronized <T extends FeatureController> T controller(@ControllerType Class<T> clazz) { |
||||
return FeatureController.newInstance(clazz, getTaskWrapper()); |
||||
} |
||||
} |
@ -1,114 +0,0 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.common; |
||||
|
||||
import android.text.TextUtils; |
||||
import androidx.annotation.CheckResult; |
||||
import com.arialyy.aria.core.FtpUrlEntity; |
||||
import com.arialyy.aria.core.ProtocolType; |
||||
import com.arialyy.aria.core.inf.Suggest; |
||||
import com.arialyy.aria.core.inf.AbsTarget; |
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; |
||||
import com.arialyy.aria.core.inf.IOptionConstant; |
||||
import com.arialyy.aria.util.ALog; |
||||
|
||||
/** |
||||
* D_FTP SSL/TSL 参数委托 |
||||
*/ |
||||
public class FTPSDelegate<TARGET extends AbsTarget> extends BaseOption<TARGET> { |
||||
|
||||
private FtpUrlEntity mUrlEntity; |
||||
|
||||
public FTPSDelegate(TARGET target, AbsTaskWrapper wrapper) { |
||||
super(target, wrapper); |
||||
mUrlEntity = (FtpUrlEntity) getTaskWrapper().getOptionParams() |
||||
.getParam(IOptionConstant.ftpUrlEntity); |
||||
if (mUrlEntity != null) { |
||||
mUrlEntity.isFtps = true; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 设置协议类型 |
||||
* |
||||
* @param protocol {@link ProtocolType} |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FTPSDelegate<TARGET> setProtocol(@ProtocolType String protocol) { |
||||
if (TextUtils.isEmpty(protocol)) { |
||||
ALog.e(TAG, "设置协议失败,协议信息为空"); |
||||
return this; |
||||
} |
||||
mUrlEntity.protocol = protocol; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置证书别名 |
||||
* |
||||
* @param keyAlias 别名 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FTPSDelegate<TARGET> setAlias(String keyAlias) { |
||||
if (TextUtils.isEmpty(keyAlias)) { |
||||
ALog.e(TAG, "设置证书别名失败,证书别名为空"); |
||||
return this; |
||||
} |
||||
mUrlEntity.keyAlias = keyAlias; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置证书密码 |
||||
* |
||||
* @param storePass 私钥密码 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FTPSDelegate<TARGET> setStorePass(String storePass) { |
||||
if (TextUtils.isEmpty(storePass)) { |
||||
ALog.e(TAG, "设置证书密码失败,证书密码为空"); |
||||
return this; |
||||
} |
||||
mUrlEntity.storePass = storePass; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置证书路径 |
||||
* |
||||
* @param storePath 证书路径 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FTPSDelegate<TARGET> setStorePath(String storePath) { |
||||
if (TextUtils.isEmpty(storePath)) { |
||||
ALog.e(TAG, "设置证书路径失败,证书路径为空"); |
||||
return this; |
||||
} |
||||
mUrlEntity.storePath = storePath; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置安全模式,默认true |
||||
* |
||||
* @param isImplicit true 隐式,false 显式 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FTPSDelegate<TARGET> setImplicit(boolean isImplicit) { |
||||
mUrlEntity.isImplicit = isImplicit; |
||||
return this; |
||||
} |
||||
} |
@ -1,99 +0,0 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.common; |
||||
|
||||
import android.text.TextUtils; |
||||
import androidx.annotation.CheckResult; |
||||
import aria.apache.commons.net.ftp.FTPClientConfig; |
||||
import com.arialyy.aria.core.FtpUrlEntity; |
||||
import com.arialyy.aria.core.inf.Suggest; |
||||
import com.arialyy.aria.core.inf.AbsTarget; |
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; |
||||
import com.arialyy.aria.core.inf.IOptionConstant; |
||||
import com.arialyy.aria.util.ALog; |
||||
|
||||
/** |
||||
* Created by laoyuyu on 2018/3/9. |
||||
*/ |
||||
public class FtpDelegate<TARGET extends AbsTarget> extends BaseOption<TARGET> { |
||||
private static final String TAG = "FtpDelegate"; |
||||
|
||||
public FtpDelegate(TARGET target, AbsTaskWrapper wrapper) { |
||||
super(target, wrapper); |
||||
} |
||||
|
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FtpDelegate<TARGET> charSet(String charSet) { |
||||
if (TextUtils.isEmpty(charSet)) { |
||||
throw new NullPointerException("字符编码为空"); |
||||
} |
||||
getTaskWrapper().getOptionParams().setParams(IOptionConstant.charSet, charSet); |
||||
return this; |
||||
} |
||||
|
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FtpDelegate<TARGET> login(String userName, String password) { |
||||
return login(userName, password, null); |
||||
} |
||||
|
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FtpDelegate<TARGET> login(String userName, String password, String account) { |
||||
if (TextUtils.isEmpty(userName)) { |
||||
ALog.e(TAG, "用户名不能为null"); |
||||
return this; |
||||
} else if (TextUtils.isEmpty(password)) { |
||||
ALog.e(TAG, "密码不能为null"); |
||||
return this; |
||||
} |
||||
// urlEntity 不能在构造函数中获取,因为ftp上传时url是后于构造函数的
|
||||
FtpUrlEntity urlEntity = |
||||
(FtpUrlEntity) getTaskWrapper().getOptionParams() |
||||
.getParam(IOptionConstant.ftpUrlEntity); |
||||
if (urlEntity == null) { |
||||
ALog.e(TAG, "设置登陆信息失败,FtpUrlEntity为空"); |
||||
return this; |
||||
} |
||||
urlEntity.needLogin = true; |
||||
urlEntity.user = userName; |
||||
urlEntity.password = password; |
||||
urlEntity.account = account; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 是否是FTPS协议 |
||||
* 如果是FTPS协议,需要使用{@link FTPSDelegate#setStorePath(String)} 、{@link FTPSDelegate#setAlias(String)} |
||||
* 设置证书信息 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FTPSDelegate<TARGET> asFtps() { |
||||
return new FTPSDelegate<>(mTarget, mWrapper); |
||||
} |
||||
|
||||
/** |
||||
* 配置ftp客户端信息 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public FtpDelegate<TARGET> setFtpClentConfig(FTPClientConfig config) { |
||||
getTaskWrapper().getOptionParams().setParams(IOptionConstant.clientConfig, config); |
||||
return this; |
||||
} |
||||
|
||||
//@Override public TARGET setProxy(Proxy proxy) {
|
||||
// mTarget.getTaskWrapper().asFtp().setProxy(proxy);
|
||||
// return mTarget;
|
||||
//}
|
||||
} |
@ -0,0 +1,146 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.common; |
||||
|
||||
import android.text.TextUtils; |
||||
import com.arialyy.aria.core.FtpUrlEntity; |
||||
import com.arialyy.aria.core.ProtocolType; |
||||
import com.arialyy.aria.util.ALog; |
||||
|
||||
/** |
||||
* Created by laoyuyu on 2018/3/9. |
||||
*/ |
||||
public class FtpOption extends BaseOption { |
||||
|
||||
private String charSet, userName, password, account; |
||||
private boolean isNeedLogin = false; |
||||
private FtpUrlEntity ftpUrlEntity; |
||||
private String protocol, keyAlias, storePass, storePath; |
||||
private boolean isImplicit = true; |
||||
|
||||
public FtpOption() { |
||||
super(); |
||||
} |
||||
|
||||
public FtpOption charSet(String charSet) { |
||||
if (TextUtils.isEmpty(charSet)) { |
||||
throw new NullPointerException("字符编码为空"); |
||||
} |
||||
this.charSet = charSet; |
||||
return this; |
||||
} |
||||
|
||||
public FtpOption login(String userName, String password) { |
||||
return login(userName, password, null); |
||||
} |
||||
|
||||
public FtpOption login(String userName, String password, String account) { |
||||
if (TextUtils.isEmpty(userName)) { |
||||
ALog.e(TAG, "用户名不能为null"); |
||||
return this; |
||||
} else if (TextUtils.isEmpty(password)) { |
||||
ALog.e(TAG, "密码不能为null"); |
||||
return this; |
||||
} |
||||
this.userName = userName; |
||||
this.password = password; |
||||
this.account = account; |
||||
isNeedLogin = true; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置协议类型 |
||||
* |
||||
* @param protocol {@link ProtocolType} |
||||
*/ |
||||
public FtpOption setProtocol(@ProtocolType String protocol) { |
||||
if (TextUtils.isEmpty(protocol)) { |
||||
ALog.e(TAG, "设置协议失败,协议信息为空"); |
||||
return this; |
||||
} |
||||
this.protocol = protocol; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置证书别名 |
||||
* |
||||
* @param keyAlias 别名 |
||||
*/ |
||||
public FtpOption setAlias(String keyAlias) { |
||||
if (TextUtils.isEmpty(keyAlias)) { |
||||
ALog.e(TAG, "设置证书别名失败,证书别名为空"); |
||||
return this; |
||||
} |
||||
this.keyAlias = keyAlias; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置证书密码 |
||||
* |
||||
* @param storePass 私钥密码 |
||||
*/ |
||||
public FtpOption setStorePass(String storePass) { |
||||
if (TextUtils.isEmpty(storePass)) { |
||||
ALog.e(TAG, "设置证书密码失败,证书密码为空"); |
||||
return this; |
||||
} |
||||
this.storePass = storePass; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置证书路径 |
||||
* |
||||
* @param storePath 证书路径 |
||||
*/ |
||||
public FtpOption setStorePath(String storePath) { |
||||
if (TextUtils.isEmpty(storePath)) { |
||||
ALog.e(TAG, "设置证书路径失败,证书路径为空"); |
||||
return this; |
||||
} |
||||
this.storePath = storePath; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置安全模式,默认true |
||||
* |
||||
* @param isImplicit true 隐式,false 显式 |
||||
*/ |
||||
public FtpOption setImplicit(boolean isImplicit) { |
||||
this.isImplicit = isImplicit; |
||||
return this; |
||||
} |
||||
|
||||
public void setFtpUrlEntity(FtpUrlEntity ftpUrlEntity) { |
||||
this.ftpUrlEntity = ftpUrlEntity; |
||||
ftpUrlEntity.needLogin = isNeedLogin; |
||||
ftpUrlEntity.user = userName; |
||||
ftpUrlEntity.password = password; |
||||
ftpUrlEntity.account = account; |
||||
if (!TextUtils.isEmpty(storePath)) { |
||||
ftpUrlEntity.isFtps = true; |
||||
ftpUrlEntity.protocol = protocol; |
||||
ftpUrlEntity.keyAlias = keyAlias; |
||||
ftpUrlEntity.storePass = storePass; |
||||
ftpUrlEntity.storePath = storePath; |
||||
ftpUrlEntity.isImplicit = isImplicit; |
||||
} |
||||
} |
||||
} |
@ -1,128 +0,0 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.download.m3u8; |
||||
|
||||
import androidx.annotation.CheckResult; |
||||
import com.arialyy.aria.core.common.BaseOption; |
||||
import com.arialyy.aria.core.download.DTaskWrapper; |
||||
import com.arialyy.aria.core.inf.AbsTarget; |
||||
import com.arialyy.aria.core.inf.IOptionConstant; |
||||
import com.arialyy.aria.core.inf.Suggest; |
||||
import com.arialyy.aria.core.processor.IBandWidthUrlConverter; |
||||
import com.arialyy.aria.core.processor.ITsMergeHandler; |
||||
import com.arialyy.aria.core.processor.IVodTsUrlConverter; |
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; |
||||
import com.arialyy.aria.util.CheckUtil; |
||||
import com.arialyy.aria.util.ComponentUtil; |
||||
|
||||
/** |
||||
* m3u8 委托 |
||||
*/ |
||||
public class M3U8Delegate<TARGET extends AbsTarget> extends BaseOption<TARGET> { |
||||
private DTaskWrapper mTaskWrapper; |
||||
|
||||
public M3U8Delegate(TARGET target, AbsTaskWrapper wrapper) { |
||||
super(target, wrapper); |
||||
ComponentUtil.getInstance().checkComponentExist(ComponentUtil.COMPONENT_TYPE_M3U8); |
||||
mTaskWrapper = (DTaskWrapper) getTaskWrapper(); |
||||
mTaskWrapper.setRequestType(AbsTaskWrapper.M3U8_VOD); |
||||
} |
||||
|
||||
/** |
||||
* 生成m3u8索引文件 |
||||
* 注意:创建索引文件,{@link #merge(boolean)}方法设置与否都不再合并文件 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8Delegate<TARGET> generateIndexFile() { |
||||
mTaskWrapper.getM3U8Params().setParams(IOptionConstant.generateIndexFileTemp, true); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 是否合并ts文件,默认合并ts |
||||
* |
||||
* @param merge {@code true}合并所有ts文件为一个 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8Delegate<TARGET> merge(boolean merge) { |
||||
mTaskWrapper.getM3U8Params().setParams(IOptionConstant.mergeFile, merge); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 如果你希望使用自行处理ts文件的合并,可以使用{@link ITsMergeHandler}处理ts文件的合并 |
||||
* 需要注意的是:只有{@link #merge(boolean)}设置合并ts文件,该方法才会生效 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8Delegate<TARGET> setMergeHandler(ITsMergeHandler handler) { |
||||
CheckUtil.checkMemberClass(handler.getClass()); |
||||
mTaskWrapper.getM3U8Params().setObjs(IOptionConstant.mergeHandler, handler); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* M3U8 ts 文件url转换器,对于某些服务器,返回的ts地址可以是相对地址,也可能是处理过的 |
||||
* 对于这种情况,你需要使用url转换器将地址转换为可正常访问的http地址 |
||||
* |
||||
* @param converter {@link IVodTsUrlConverter} |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8Delegate<TARGET> setTsUrlConvert(IVodTsUrlConverter converter) { |
||||
CheckUtil.checkMemberClass(converter.getClass()); |
||||
mTaskWrapper.getM3U8Params().setObjs(IOptionConstant.vodUrlConverter, converter); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 选择需要下载的码率,默认下载的码率 |
||||
* |
||||
* @param bandWidth 指定的码率 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8Delegate<TARGET> setBandWidth(int bandWidth) { |
||||
mTaskWrapper.getM3U8Params().setParams(IOptionConstant.bandWidth, bandWidth); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* M3U8 bandWidth 码率url转换器,对于某些服务器,返回的ts地址可以是相对地址,也可能是处理过的, |
||||
* 对于这种情况,你需要使用url转换器将地址转换为可正常访问的http地址 |
||||
* |
||||
* @param converter {@link IBandWidthUrlConverter} |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8Delegate<TARGET> setBandWidthUrlConverter(IBandWidthUrlConverter converter) { |
||||
CheckUtil.checkMemberClass(converter.getClass()); |
||||
mTaskWrapper.getM3U8Params().setObjs(IOptionConstant.bandWidthUrlConverter, converter); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 处理点播文件的下载参数 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8VodDelegate<TARGET> asVod() { |
||||
return new M3U8VodDelegate<>(mTarget, mTaskWrapper); |
||||
} |
||||
|
||||
/** |
||||
* 处理直播类的下载 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8LiveDelegate<TARGET> asLive() { |
||||
return new M3U8LiveDelegate<>(mTarget, mTaskWrapper); |
||||
} |
||||
} |
@ -0,0 +1,104 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.download.m3u8; |
||||
|
||||
import com.arialyy.aria.core.common.BaseOption; |
||||
import com.arialyy.aria.core.processor.IBandWidthUrlConverter; |
||||
import com.arialyy.aria.core.processor.ITsMergeHandler; |
||||
import com.arialyy.aria.core.processor.IVodTsUrlConverter; |
||||
import com.arialyy.aria.util.CheckUtil; |
||||
import com.arialyy.aria.util.ComponentUtil; |
||||
|
||||
/** |
||||
* m3u8任务设置 |
||||
*/ |
||||
public class M3U8Option extends BaseOption { |
||||
|
||||
private boolean generateIndexFileTemp = false; |
||||
private boolean mergeFile = false; |
||||
private int bandWidth; |
||||
private ITsMergeHandler mergeHandler; |
||||
private IVodTsUrlConverter vodUrlConverter; |
||||
private IBandWidthUrlConverter bandWidthUrlConverter; |
||||
|
||||
M3U8Option() { |
||||
super(); |
||||
ComponentUtil.getInstance().checkComponentExist(ComponentUtil.COMPONENT_TYPE_M3U8); |
||||
} |
||||
|
||||
/** |
||||
* 生成m3u8索引文件 |
||||
* 注意:创建索引文件,{@link #merge(boolean)}方法设置与否都不再合并文件 |
||||
*/ |
||||
public M3U8Option generateIndexFile() { |
||||
this.generateIndexFileTemp = true; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 是否合并ts文件,默认合并ts |
||||
* |
||||
* @param mergeFile {@code true}合并所有ts文件为一个 |
||||
*/ |
||||
public M3U8Option merge(boolean mergeFile) { |
||||
this.mergeFile = mergeFile; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 如果你希望使用自行处理ts文件的合并,可以使用{@link ITsMergeHandler}处理ts文件的合并 |
||||
* 需要注意的是:只有{@link #merge(boolean)}设置合并ts文件,该方法才会生效 |
||||
*/ |
||||
public M3U8Option setMergeHandler(ITsMergeHandler mergeHandler) { |
||||
CheckUtil.checkMemberClass(mergeHandler.getClass()); |
||||
this.mergeHandler = mergeHandler; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* M3U8 ts 文件url转换器,对于某些服务器,返回的ts地址可以是相对地址,也可能是处理过的 |
||||
* 对于这种情况,你需要使用url转换器将地址转换为可正常访问的http地址 |
||||
* |
||||
* @param vodUrlConverter {@link IVodTsUrlConverter} |
||||
*/ |
||||
public M3U8Option setTsUrlConvert(IVodTsUrlConverter vodUrlConverter) { |
||||
CheckUtil.checkMemberClass(vodUrlConverter.getClass()); |
||||
this.vodUrlConverter = vodUrlConverter; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 选择需要下载的码率,默认下载的码率 |
||||
* |
||||
* @param bandWidth 指定的码率 |
||||
*/ |
||||
public M3U8Option setBandWidth(int bandWidth) { |
||||
this.bandWidth = bandWidth; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* M3U8 bandWidth 码率url转换器,对于某些服务器,返回的ts地址可以是相对地址,也可能是处理过的, |
||||
* 对于这种情况,你需要使用url转换器将地址转换为可正常访问的http地址 |
||||
* |
||||
* @param bandWidthUrlConverter {@link IBandWidthUrlConverter} |
||||
*/ |
||||
public M3U8Option setBandWidthUrlConverter(IBandWidthUrlConverter bandWidthUrlConverter) { |
||||
CheckUtil.checkMemberClass(bandWidthUrlConverter.getClass()); |
||||
this.bandWidthUrlConverter = bandWidthUrlConverter; |
||||
return this; |
||||
} |
||||
} |
@ -1,116 +0,0 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.download.m3u8; |
||||
|
||||
import androidx.annotation.CheckResult; |
||||
import com.arialyy.aria.core.common.BaseOption; |
||||
import com.arialyy.aria.core.inf.Suggest; |
||||
import com.arialyy.aria.core.download.DTaskWrapper; |
||||
import com.arialyy.aria.core.event.EventMsgUtil; |
||||
import com.arialyy.aria.core.event.PeerIndexEvent; |
||||
import com.arialyy.aria.core.inf.AbsTarget; |
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; |
||||
import com.arialyy.aria.core.inf.IOptionConstant; |
||||
import com.arialyy.aria.core.queue.DTaskQueue; |
||||
import com.arialyy.aria.util.ALog; |
||||
|
||||
/** |
||||
* m3u8点播文件参数设置 |
||||
*/ |
||||
public class M3U8VodDelegate<TARGET extends AbsTarget> extends BaseOption<TARGET> { |
||||
private DTaskWrapper mTaskWrapper; |
||||
|
||||
M3U8VodDelegate(TARGET target, AbsTaskWrapper wrapper) { |
||||
super(target, wrapper); |
||||
mTaskWrapper = (DTaskWrapper) getTaskWrapper(); |
||||
mTaskWrapper.setRequestType(AbsTaskWrapper.M3U8_VOD); |
||||
} |
||||
|
||||
/** |
||||
* 由于m3u8协议的特殊性质,无法有效快速获取到正确到文件长度,如果你需要显示文件中长度,你需要自行设置文件长度 |
||||
* |
||||
* @param fileSize 文件长度 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8VodDelegate<TARGET> setFileSize(long fileSize) { |
||||
if (fileSize <= 0) { |
||||
ALog.e(TAG, "文件长度错误"); |
||||
return this; |
||||
} |
||||
mTaskWrapper.getEntity().setFileSize(fileSize); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 默认情况下,对于同一点播文件的下载,最多同时下载4个ts分片,如果你希望增加或减少同时下载的ts分片数量,可以使用该方法设置同时下载的ts分片数量 |
||||
* |
||||
* @param num 同时下载的ts分片数量 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8VodDelegate<TARGET> setMaxTsQueueNum(int num) { |
||||
if (num < 1) { |
||||
ALog.e(TAG, "同时下载的分片数量不能小于1"); |
||||
return this; |
||||
} |
||||
mTaskWrapper.getM3U8Params().setParams(IOptionConstant.maxTsQueueNum, num); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 启动任务时初始化索引位置 |
||||
* |
||||
* 优先下载指定索引后的切片 |
||||
* 如果指定的切片索引大于切片总数,则此操作无效 |
||||
* 如果指定的切片索引小于当前正在下载的切片索引,并且指定索引和当前索引区间内有未下载的切片,则优先下载该区间的切片;否则此操作无效 |
||||
* 如果指定索引后的切片已经全部下载完成,但是索引前有未下载的切片,间会自动下载未下载的切片 |
||||
* |
||||
* @param index 指定的切片位置 |
||||
*/ |
||||
@CheckResult(suggest = Suggest.TO_CONTROLLER) |
||||
public M3U8VodDelegate<TARGET> setPeerIndex(int index) { |
||||
if (index < 1) { |
||||
ALog.e(TAG, "切片索引不能小于1"); |
||||
return this; |
||||
} |
||||
mTaskWrapper.getM3U8Params().setParams(IOptionConstant.jumpIndex, index); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 任务执行中,跳转索引位置 |
||||
* 优先下载指定索引后的切片 |
||||
* 如果指定的切片索引大于切片总数,则此操作无效 |
||||
* 如果指定的切片索引小于当前正在下载的切片索引,并且指定索引和当前索引区间内有未下载的切片,则优先下载该区间的切片;否则此操作无效 |
||||
* 如果指定索引后的切片已经全部下载完成,但是索引前有未下载的切片,间会自动下载未下载的切片 |
||||
* |
||||
* @param index 指定的切片位置 |
||||
*/ |
||||
public void jumPeerIndex(int index) { |
||||
if (index < 1) { |
||||
ALog.e(TAG, "切片索引不能小于1"); |
||||
return; |
||||
} |
||||
|
||||
if (!DTaskQueue.getInstance().taskIsRunning(mTaskWrapper.getKey())) { |
||||
ALog.e(TAG, |
||||
String.format("任务【%s】没有运行,如果你希望在启动任务时初始化索引位置,请调用setPeerIndex(xxx)", |
||||
mTaskWrapper.getKey())); |
||||
return; |
||||
} |
||||
|
||||
EventMsgUtil.getDefault().post(new PeerIndexEvent(mTaskWrapper.getKey(), index)); |
||||
} |
||||
} |
@ -0,0 +1,87 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.download.m3u8; |
||||
|
||||
import com.arialyy.aria.util.ALog; |
||||
|
||||
/** |
||||
* m3u8点播文件参数设置 |
||||
*/ |
||||
public class M3U8VodOption extends M3U8Option { |
||||
private long fileSize; |
||||
private int maxTsQueueNum; |
||||
private int jumpIndex; |
||||
|
||||
public M3U8VodOption() { |
||||
super(); |
||||
} |
||||
|
||||
/** |
||||
* 由于m3u8协议的特殊性质,无法有效快速获取到正确到文件长度,如果你需要显示文件中长度,你需要自行设置文件长度 |
||||
* |
||||
* @param fileSize 文件长度 |
||||
*/ |
||||
public M3U8VodOption setFileSize(long fileSize) { |
||||
if (fileSize <= 0) { |
||||
ALog.e(TAG, "文件长度错误"); |
||||
return this; |
||||
} |
||||
this.fileSize = fileSize; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 默认情况下,对于同一点播文件的下载,最多同时下载4个ts分片,如果你希望增加或减少同时下载的ts分片数量,可以使用该方法设置同时下载的ts分片数量 |
||||
* |
||||
* @param maxTsQueueNum 同时下载的ts分片数量 |
||||
*/ |
||||
public M3U8VodOption setMaxTsQueueNum(int maxTsQueueNum) { |
||||
if (maxTsQueueNum < 1) { |
||||
ALog.e(TAG, "同时下载的分片数量不能小于1"); |
||||
return this; |
||||
} |
||||
|
||||
this.maxTsQueueNum = maxTsQueueNum; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 启动任务时初始化索引位置 |
||||
* |
||||
* 优先下载指定索引后的切片 |
||||
* 如果指定的切片索引大于切片总数,则此操作无效 |
||||
* 如果指定的切片索引小于当前正在下载的切片索引,并且指定索引和当前索引区间内有未下载的切片,则优先下载该区间的切片;否则此操作无效 |
||||
* 如果指定索引后的切片已经全部下载完成,但是索引前有未下载的切片,间会自动下载未下载的切片 |
||||
* |
||||
* @param jumpIndex 指定的切片位置 |
||||
*/ |
||||
public M3U8VodOption setPeerIndex(int jumpIndex) { |
||||
if (jumpIndex < 1) { |
||||
ALog.e(TAG, "切片索引不能小于1"); |
||||
return this; |
||||
} |
||||
this.jumpIndex = jumpIndex; |
||||
return this; |
||||
} |
||||
|
||||
public long getFileSize() { |
||||
return fileSize; |
||||
} |
||||
|
||||
public int getJumpIndex() { |
||||
return jumpIndex; |
||||
} |
||||
} |
@ -0,0 +1,56 @@ |
||||
|
||||
package com.arialyy.aria.core.download.target; |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
import com.arialyy.aria.core.common.AbsNormalTarget; |
||||
import com.arialyy.aria.core.download.DTaskWrapper; |
||||
import com.arialyy.aria.core.event.EventMsgUtil; |
||||
import com.arialyy.aria.core.event.PeerIndexEvent; |
||||
import com.arialyy.aria.core.queue.DTaskQueue; |
||||
import com.arialyy.aria.util.ALog; |
||||
|
||||
public class M3U8NormalTarget extends AbsNormalTarget<M3U8NormalTarget> { |
||||
|
||||
M3U8NormalTarget(DTaskWrapper wrapper) { |
||||
setTaskWrapper(wrapper); |
||||
} |
||||
|
||||
/** |
||||
* 任务执行中,跳转索引位置 |
||||
* 优先下载指定索引后的切片 |
||||
* 如果指定的切片索引大于切片总数,则此操作无效 |
||||
* 如果指定的切片索引小于当前正在下载的切片索引,并且指定索引和当前索引区间内有未下载的切片,则优先下载该区间的切片;否则此操作无效 |
||||
* 如果指定索引后的切片已经全部下载完成,但是索引前有未下载的切片,间会自动下载未下载的切片 |
||||
* |
||||
* @param index 指定的切片位置 |
||||
*/ |
||||
public void jumPeerIndex(int index) { |
||||
if (index < 1) { |
||||
ALog.e(TAG, "切片索引不能小于1"); |
||||
return; |
||||
} |
||||
|
||||
if (!DTaskQueue.getInstance().taskIsRunning(getTaskWrapper().getKey())) { |
||||
ALog.e(TAG, |
||||
String.format("任务【%s】没有运行,如果你希望在启动任务时初始化索引位置,请调用setPeerIndex(xxx)", |
||||
getTaskWrapper().getKey())); |
||||
return; |
||||
} |
||||
|
||||
EventMsgUtil.getDefault().post(new PeerIndexEvent(getTaskWrapper().getKey(), index)); |
||||
} |
||||
} |
@ -0,0 +1,26 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.common; |
||||
|
||||
import com.arialyy.aria.util.CommonUtil; |
||||
|
||||
public abstract class BaseOption { |
||||
protected final String TAG; |
||||
|
||||
public BaseOption() { |
||||
TAG = CommonUtil.getClassName(getClass()); |
||||
} |
||||
} |
Loading…
Reference in new issue