-
Notifications
You must be signed in to change notification settings - Fork 0
/
App.js
148 lines (134 loc) · 5.29 KB
/
App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow
*/
import React, {Component} from 'react';
import {StyleSheet, Text, TextInput, View, TouchableOpacity, Alert, TouchableHighlight} from 'react-native';
import RNFS from "react-native-fs";
import Toast from 'react-native-easy-toast'
import ActionButton from 'react-native-action-button';
import Icon from 'react-native-vector-icons/Ionicons';
type Props = {};
const config = {
"download_path": RNFS.ExternalStorageDirectoryPath,
"host": "http://23ss464660.iok.la",
};
export default class App extends Component<Props> {
constructor(props){
super(props);
this._onEndEditing = this._onEndEditing.bind(this);
this.state = {
showValue:"",
};
}
downloadFile(url, type, headers, title) {
if (type == "" || type == null || type == undefined){
type = "mp4"
}
// todo: 修改目录, 使得文件下载到同一的文件夹
const downloadDest = `${config.download_path}/GetAnything_${title.replace(":", "")}_${Math.random()}.${type}`;
const options = {
headers:headers,
fromUrl: url,
toFile: downloadDest,
background: true,
begin: (res) => {
}
};
try {
const ret = RNFS.downloadFile(options);
ret.promise.then(resp => {
this.refs.toast.show(`文件下载成功, 储存目录:${downloadDest}`, 1000);
}).catch(err => {
if (err.toString().match("such file") != null){
Alert.alert("客户端错误", "请在设置->授权管理->应用权限管理中打开'读写手机存储'权限后重试!")
}
});
}
catch (e) {
this.refs.toast.show(`文件下载出现错误:${e}`, 3000);
}
}
_onEndEditing(event){
//把获取到的内容,设置给showValue
this.setState({showValue:event.nativeEvent.text});
this.getMoviesFromApiAsync()
}
_onChangeText(inputData){
//把获取到的内容,设置给showValue
this.setState({showValue:inputData});
}
getMoviesFromApiAsync() {
if (this.state.showValue.match("http") == null || this.state.showValue.substring(0, 4) != "http"){
Alert.alert("", "输入的URL不合法,正确的URL应该以http或https开头");
return null
}
var fromData = new FormData();
fromData.append("url", this.state.showValue);
return fetch(`${config.host}/GetVideoUrl`, {
method:"POST",
body:fromData
})
.then(response => response.json())
.then(data => {
if (data.code != 0){
Alert.alert("服务器错误", data.msg)
}else{
this.refs.toast.show(`总计${data.data.info.length}个文件,开始下载`,2000);
for (var i = 0; i < data.data.info.length; i++){
this.downloadFile(data.data.info[i].url, data.data.info[i].type, data.data.headers, data.data.info[i].title);
}
}
})
.catch(error => {
var err_string = error.toString();
if (err_string.match("undefined is not an object") != null){
Alert.alert("客户端错误", "检查服务器配置以及本地网络连接!")
}else if (err_string.match("JSON Parse error") != null){
Alert.alert("客户端错误", "检查服务器配置以及本地网络连接!")
}else{
Alert.alert("客户端错误", error)
}
});
}
render() {
return (
<View style={styles.container}>
<Text style={styles.log}>Get anything</Text>
<TextInput style={styles.textInput} underlineColorAndroid={'transparent'} editable={true} onChangeText={this._onChangeText.bind(this)} onEndEditing={this._onEndEditing.bind(this)} placeholder="输入需要下载视频的链接" placeholderTextColor="#6ee6ff" />
<TouchableOpacity style={styles.touchButton} onPress={this.getMoviesFromApiAsync.bind(this)}>
<Text style={styles.touchButtonText}>下载</Text>
</TouchableOpacity>
<Toast //提示
ref="toast"
style={{backgroundColor:'gray'}}
position='center'
positionValue={200}
opacity={0.6}
textStyle={{color:'white'}}
/>
{/* Rest of the app comes ABOVE the action button component !*/}
<ActionButton buttonColor="rgba(231,76,60,1)" offsetX={10} offsetY={50} buttonText="更多" buttonTextStyle={styles.buttonTextStyle}>
<ActionButton.Item buttonColor='#9b59b6' onPress={() => console.log("notes tapped!")}>
<TouchableHighlight
style={{padding: 10}}
onPress={()=>{
this.refs.toast.show('hello worsssld!');
}}>
<Icon name="md-create" style={styles.actionButtonIcon} >已下载</Icon>
</TouchableHighlight>
</ActionButton.Item>
<ActionButton.Item buttonColor='#3498db' onPress={() => {}}>
<Icon name="md-notifications-off" style={styles.actionButtonIcon} >设置</Icon>
</ActionButton.Item>
<ActionButton.Item buttonColor='#1abc9c' onPress={() => {}}>
<Icon name="md-done-all" style={styles.actionButtonIcon} >关于</Icon>
</ActionButton.Item>
</ActionButton>
</View>
);
}
}