Skip to content

Commit 2a2f2e0

Browse files
committed
chore:parse 代码复用
1 parent 0e28be6 commit 2a2f2e0

File tree

3 files changed

+95
-151
lines changed

3 files changed

+95
-151
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import 'package:dio/dio.dart';
2+
import 'package:simple_live_app/app/constant.dart';
3+
import 'package:simple_live_app/app/log.dart';
4+
import 'package:simple_live_app/app/sites.dart';
5+
6+
class UrlParse {
7+
static UrlParse? _urlParse;
8+
9+
static UrlParse get instance {
10+
_urlParse ??= UrlParse();
11+
return _urlParse!;
12+
}
13+
14+
/// 链接解析工具
15+
Future<List> parse(String url) async {
16+
var id = "";
17+
if (url.contains("bilibili.com")) {
18+
var regExp = RegExp(r"bilibili\.com/([\d|\w]+)");
19+
id = regExp.firstMatch(url)?.group(1) ?? "";
20+
return [id, Sites.allSites[Constant.kBiliBili]!];
21+
}
22+
23+
if (url.contains("b23.tv")) {
24+
var btvReg = RegExp(r"https?:\/\/b23.tv\/[0-9a-z-A-Z]+");
25+
var u = btvReg.firstMatch(url)?.group(0) ?? "";
26+
var location = await _getLocation(u);
27+
28+
return await parse(location);
29+
}
30+
31+
if (url.contains("douyu.com")) {
32+
var regExp = RegExp(r"douyu\.com/([\d|\w]+)");
33+
// 适配 topic_url
34+
if (url.contains("topic")) {
35+
regExp = RegExp(r"[?&]rid=([\d]+)");
36+
}
37+
id = regExp.firstMatch(url)?.group(1) ?? "";
38+
39+
return [id, Sites.allSites[Constant.kDouyu]!];
40+
}
41+
if (url.contains("huya.com")) {
42+
var regExp = RegExp(r"huya\.com/([\d|\w]+)");
43+
id = regExp.firstMatch(url)?.group(1) ?? "";
44+
45+
return [id, Sites.allSites[Constant.kHuya]!];
46+
}
47+
if (url.contains("live.douyin.com")) {
48+
var regExp = RegExp(r"live\.douyin\.com/([\d|\w]+)");
49+
id = regExp.firstMatch(url)?.group(1) ?? "";
50+
51+
return [id, Sites.allSites[Constant.kDouyin]!];
52+
}
53+
if (url.contains("webcast.amemv.com")) {
54+
var regExp = RegExp(r"reflow/(\d+)");
55+
id = regExp.firstMatch(url)?.group(1) ?? "";
56+
return [id, Sites.allSites[Constant.kDouyin]!];
57+
}
58+
if (url.contains("v.douyin.com")) {
59+
var regExp = RegExp(r"http.?://v.douyin.com/[\d\w]+/");
60+
var u = regExp.firstMatch(url)?.group(0) ?? "";
61+
var location = await _getLocation(u);
62+
return await parse(location);
63+
}
64+
65+
return [];
66+
}
67+
68+
Future<String> _getLocation(String url) async {
69+
try {
70+
if (url.isEmpty) return "";
71+
await Dio().get(
72+
url,
73+
options: Options(
74+
followRedirects: false,
75+
),
76+
);
77+
} on DioException catch (e) {
78+
if (e.response!.statusCode == 302) {
79+
var redirectUrl = e.response!.headers.value("Location");
80+
if (redirectUrl != null) {
81+
return redirectUrl;
82+
}
83+
}
84+
} catch (e) {
85+
Log.logPrint(e);
86+
}
87+
return "";
88+
}
89+
}

simple_live_app/lib/modules/follow_user/follow_info_setting/follow_info_controller.dart

Lines changed: 3 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
import 'package:dio/dio.dart';
21
import 'package:flutter/material.dart';
32
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
43
import 'package:get/get.dart';
5-
import 'package:simple_live_app/app/constant.dart';
6-
import 'package:simple_live_app/app/log.dart';
74
import 'package:simple_live_app/app/controller/base_controller.dart';
85
import 'package:simple_live_app/app/sites.dart';
6+
import 'package:simple_live_app/app/utils.dart';
7+
import 'package:simple_live_app/app/utils/url_parse.dart';
98
import 'package:simple_live_app/models/db/follow_user.dart' show FollowUser;
109
import 'package:simple_live_app/models/db/follow_user_tag.dart';
1110
import 'package:simple_live_app/services/db_service.dart';
1211
import 'package:simple_live_app/services/follow_service.dart';
13-
import 'package:simple_live_app/app/utils.dart';
1412
import 'package:simple_live_core/simple_live_core.dart';
1513

1614
class FollowInfoController extends BasePageController<FollowUser> {
@@ -93,7 +91,7 @@ class FollowInfoController extends BasePageController<FollowUser> {
9391
SmartDialog.showToast('链接不能为空');
9492
return;
9593
}
96-
final result = await _parse(url);
94+
final result = await UrlParse.instance.parse(url);
9795
if (result.isEmpty || result.first == '') {
9896
SmartDialog.showToast('无法解析此链接');
9997
return;
@@ -193,70 +191,4 @@ class FollowInfoController extends BasePageController<FollowUser> {
193191
followUser.value = newFollow;
194192
_initMigrationSites();
195193
}
196-
197-
// 解析逻辑:与工具页保持一致
198-
Future<List> _parse(String url) async {
199-
var id = '';
200-
if (url.contains('bilibili.com')) {
201-
var regExp = RegExp(r'bilibili\.com/([\d|\w]+)');
202-
id = regExp.firstMatch(url)?.group(1) ?? '';
203-
return [id, Sites.allSites[Constant.kBiliBili]!];
204-
}
205-
206-
if (url.contains('b23.tv')) {
207-
var btvReg = RegExp(r'https?:\/\/b23.tv\/[0-9a-z-A-Z]+');
208-
var u = btvReg.firstMatch(url)?.group(0) ?? '';
209-
var location = await _getLocation(u);
210-
return await _parse(location);
211-
}
212-
213-
if (url.contains('douyu.com')) {
214-
var regExp = RegExp(r'douyu\.com/([\d|\w]+)');
215-
if (url.contains('topic')) {
216-
regExp = RegExp(r'[?&]rid=([\d]+)');
217-
}
218-
id = regExp.firstMatch(url)?.group(1) ?? '';
219-
return [id, Sites.allSites[Constant.kDouyu]!];
220-
}
221-
if (url.contains('huya.com')) {
222-
var regExp = RegExp(r'huya\.com/([\d|\w]+)');
223-
id = regExp.firstMatch(url)?.group(1) ?? '';
224-
return [id, Sites.allSites[Constant.kHuya]!];
225-
}
226-
if (url.contains('live.douyin.com')) {
227-
var regExp = RegExp(r'live\.douyin\.com/([\d|\w]+)');
228-
id = regExp.firstMatch(url)?.group(1) ?? '';
229-
return [id, Sites.allSites[Constant.kDouyin]!];
230-
}
231-
if (url.contains('webcast.amemv.com')) {
232-
var regExp = RegExp(r'reflow/(\d+)');
233-
id = regExp.firstMatch(url)?.group(1) ?? '';
234-
return [id, Sites.allSites[Constant.kDouyin]!];
235-
}
236-
if (url.contains('v.douyin.com')) {
237-
var regExp = RegExp(r'http.?://v.douyin.com/[\d\w]+/');
238-
var u = regExp.firstMatch(url)?.group(0) ?? '';
239-
var location = await _getLocation(u);
240-
return await _parse(location);
241-
}
242-
243-
return [];
244-
}
245-
246-
Future<String> _getLocation(String url) async {
247-
try {
248-
if (url.isEmpty) return '';
249-
await Dio().get(url, options: Options(followRedirects: false));
250-
} on DioException catch (e) {
251-
if (e.response?.statusCode == 302) {
252-
var redirectUrl = e.response?.headers.value('Location');
253-
if (redirectUrl != null) {
254-
return redirectUrl;
255-
}
256-
}
257-
} catch (e) {
258-
Log.logPrint(e);
259-
}
260-
return '';
261-
}
262194
}
Lines changed: 3 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import 'package:dio/dio.dart';
21
import 'package:flutter/material.dart';
32
import 'package:flutter/services.dart';
43
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
54
import 'package:get/get.dart';
6-
import 'package:simple_live_app/app/constant.dart';
7-
import 'package:simple_live_app/app/log.dart';
85
import 'package:simple_live_app/app/sites.dart';
6+
import 'package:simple_live_app/app/utils/url_parse.dart';
97
import 'package:simple_live_app/routes/app_navigation.dart';
108

119
class ParseController extends GetxController {
@@ -20,7 +18,7 @@ class ParseController extends GetxController {
2018
// 隐藏键盘
2119
FocusManager.instance.primaryFocus?.unfocus();
2220

23-
var parseResult = await parse(e);
21+
var parseResult = await UrlParse.instance.parse(e);
2422
if (parseResult.isEmpty && parseResult.first == "") {
2523
SmartDialog.showToast("无法解析此链接");
2624
return;
@@ -38,7 +36,7 @@ class ParseController extends GetxController {
3836
SmartDialog.showToast("链接不能为空");
3937
return;
4038
}
41-
var parseResult = await parse(e);
39+
var parseResult = await UrlParse.instance.parse(e);
4240
if (parseResult.isEmpty && parseResult.first == "") {
4341
SmartDialog.showToast("无法解析此链接");
4442
return;
@@ -105,79 +103,4 @@ class ParseController extends GetxController {
105103
SmartDialog.dismiss(status: SmartStatus.loading);
106104
}
107105
}
108-
109-
Future<List> parse(String url) async {
110-
var id = "";
111-
if (url.contains("bilibili.com")) {
112-
var regExp = RegExp(r"bilibili\.com/([\d|\w]+)");
113-
id = regExp.firstMatch(url)?.group(1) ?? "";
114-
return [id, Sites.allSites[Constant.kBiliBili]!];
115-
}
116-
117-
if (url.contains("b23.tv")) {
118-
var btvReg = RegExp(r"https?:\/\/b23.tv\/[0-9a-z-A-Z]+");
119-
var u = btvReg.firstMatch(url)?.group(0) ?? "";
120-
var location = await getLocation(u);
121-
122-
return await parse(location);
123-
}
124-
125-
if (url.contains("douyu.com")) {
126-
var regExp = RegExp(r"douyu\.com/([\d|\w]+)");
127-
// 适配 topic_url
128-
if(url.contains("topic")){
129-
regExp = RegExp(r"[?&]rid=([\d]+)");
130-
}
131-
id = regExp.firstMatch(url)?.group(1) ?? "";
132-
133-
return [id, Sites.allSites[Constant.kDouyu]!];
134-
}
135-
if (url.contains("huya.com")) {
136-
var regExp = RegExp(r"huya\.com/([\d|\w]+)");
137-
id = regExp.firstMatch(url)?.group(1) ?? "";
138-
139-
return [id, Sites.allSites[Constant.kHuya]!];
140-
}
141-
if (url.contains("live.douyin.com")) {
142-
var regExp = RegExp(r"live\.douyin\.com/([\d|\w]+)");
143-
id = regExp.firstMatch(url)?.group(1) ?? "";
144-
145-
return [id, Sites.allSites[Constant.kDouyin]!];
146-
}
147-
if (url.contains("webcast.amemv.com")) {
148-
var regExp = RegExp(r"reflow/(\d+)");
149-
id = regExp.firstMatch(url)?.group(1) ?? "";
150-
return [id, Sites.allSites[Constant.kDouyin]!];
151-
}
152-
if (url.contains("v.douyin.com")) {
153-
var regExp = RegExp(r"http.?://v.douyin.com/[\d\w]+/");
154-
var u = regExp.firstMatch(url)?.group(0) ?? "";
155-
var location = await getLocation(u);
156-
return await parse(location);
157-
}
158-
159-
return [];
160-
}
161-
162-
Future<String> getLocation(String url) async {
163-
try {
164-
if (url.isEmpty) return "";
165-
await Dio().get(
166-
url,
167-
options: Options(
168-
followRedirects: false,
169-
),
170-
);
171-
} on DioException catch (e) {
172-
if (e.response!.statusCode == 302) {
173-
var redirectUrl = e.response!.headers.value("Location");
174-
if (redirectUrl != null) {
175-
return redirectUrl;
176-
}
177-
}
178-
} catch (e) {
179-
Log.logPrint(e);
180-
}
181-
return "";
182-
}
183106
}

0 commit comments

Comments
 (0)