mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
tweak (#1325)
* tweak * opt: async * tweak * opt: PopularSeries tile * tweak * opt: sc * mod: more account type * tweak * opt: qrcode * tweak * partial revert: opt: sc * fix * fix * mod: window enqueue
This commit is contained in:
committed by
GitHub
parent
67c25bd130
commit
4ae3bd2845
@@ -77,221 +77,221 @@ class Constants {
|
||||
];
|
||||
|
||||
//内容来自 https://passport.bilibili.com/web/generic/country/list
|
||||
static List<Map<String, dynamic>> get internationalDialingPrefix => [
|
||||
{"id": 1, "cname": "中国大陆", "country_id": "86"},
|
||||
{"id": 5, "cname": "中国香港特别行政区", "country_id": "852"},
|
||||
{"id": 2, "cname": "中国澳门特别行政区", "country_id": "853"},
|
||||
{"id": 3, "cname": "中国台湾", "country_id": "886"},
|
||||
{"id": 4, "cname": "美国", "country_id": "1"},
|
||||
{"id": 6, "cname": "比利时", "country_id": "32"},
|
||||
{"id": 7, "cname": "澳大利亚", "country_id": "61"},
|
||||
{"id": 8, "cname": "法国", "country_id": "33"},
|
||||
{"id": 9, "cname": "加拿大", "country_id": "1"},
|
||||
{"id": 10, "cname": "日本", "country_id": "81"},
|
||||
{"id": 11, "cname": "新加坡", "country_id": "65"},
|
||||
{"id": 12, "cname": "韩国", "country_id": "82"},
|
||||
{"id": 13, "cname": "马来西亚", "country_id": "60"},
|
||||
{"id": 14, "cname": "英国", "country_id": "44"},
|
||||
{"id": 15, "cname": "意大利", "country_id": "39"},
|
||||
{"id": 16, "cname": "德国", "country_id": "49"},
|
||||
{"id": 18, "cname": "俄罗斯", "country_id": "7"},
|
||||
{"id": 19, "cname": "新西兰", "country_id": "64"}, //common:1-19
|
||||
{"id": 153, "cname": "瓦利斯群岛和富图纳群岛", "country_id": "1681"},
|
||||
{"id": 152, "cname": "葡萄牙", "country_id": "351"},
|
||||
{"id": 151, "cname": "帕劳", "country_id": "680"},
|
||||
{"id": 150, "cname": "诺福克岛", "country_id": "672"},
|
||||
{"id": 149, "cname": "挪威", "country_id": "47"},
|
||||
{"id": 148, "cname": "纽埃岛", "country_id": "683"},
|
||||
{"id": 147, "cname": "尼日利亚", "country_id": "234"},
|
||||
{"id": 146, "cname": "尼日尔", "country_id": "227"},
|
||||
{"id": 145, "cname": "尼加拉瓜", "country_id": "505"},
|
||||
{"id": 144, "cname": "尼泊尔", "country_id": "977"},
|
||||
{"id": 143, "cname": "瑙鲁", "country_id": "674"},
|
||||
{"id": 154, "cname": "格鲁吉亚", "country_id": "995"},
|
||||
{"id": 155, "cname": "瑞典", "country_id": "46"},
|
||||
{"id": 165, "cname": "沙特阿拉伯", "country_id": "966"},
|
||||
{"id": 164, "cname": "桑给巴尔岛", "country_id": "259"},
|
||||
{"id": 163, "cname": "塞舌尔共和国", "country_id": "248"},
|
||||
{"id": 162, "cname": "塞浦路斯", "country_id": "357"},
|
||||
{"id": 161, "cname": "塞内加尔", "country_id": "221"},
|
||||
{"id": 160, "cname": "塞拉利昂", "country_id": "232"},
|
||||
{"id": 159, "cname": "萨摩亚,东部", "country_id": "684"},
|
||||
{"id": 158, "cname": "萨摩亚,西部", "country_id": "685"},
|
||||
{"id": 157, "cname": "萨尔瓦多", "country_id": "503"},
|
||||
{"id": 156, "cname": "瑞士", "country_id": "41"},
|
||||
{"id": 166, "cname": "圣多美和普林西比", "country_id": "239"},
|
||||
{"id": 142, "cname": "塞尔维亚", "country_id": "381"},
|
||||
{"id": 141, "cname": "南非", "country_id": "27"},
|
||||
{"id": 128, "cname": "毛里塔尼亚", "country_id": "222"},
|
||||
{"id": 127, "cname": "毛里求斯", "country_id": "230"},
|
||||
{"id": 126, "cname": "马歇尔岛", "country_id": "692"},
|
||||
{"id": 125, "cname": "马提尼克岛", "country_id": "596"},
|
||||
{"id": 124, "cname": "马其顿", "country_id": "389"},
|
||||
{"id": 123, "cname": "马里亚纳岛", "country_id": "1670"},
|
||||
{"id": 122, "cname": "马里", "country_id": "223"},
|
||||
{"id": 121, "cname": "马拉维", "country_id": "265"},
|
||||
{"id": 120, "cname": "马耳他", "country_id": "356"},
|
||||
{"id": 119, "cname": "马尔代夫", "country_id": "960"},
|
||||
{"id": 129, "cname": "蒙古", "country_id": "976"},
|
||||
{"id": 130, "cname": "蒙特塞拉特岛", "country_id": "1664"},
|
||||
{"id": 140, "cname": "纳米比亚", "country_id": "264"},
|
||||
{"id": 139, "cname": "墨西哥", "country_id": "52"},
|
||||
{"id": 138, "cname": "莫桑比克", "country_id": "258"},
|
||||
{"id": 137, "cname": "摩纳哥", "country_id": "377"},
|
||||
{"id": 136, "cname": "摩洛哥", "country_id": "212"},
|
||||
{"id": 135, "cname": "摩尔多瓦", "country_id": "373"},
|
||||
{"id": 134, "cname": "缅甸", "country_id": "95"},
|
||||
{"id": 133, "cname": "密克罗尼西亚", "country_id": "691"},
|
||||
{"id": 132, "cname": "秘鲁", "country_id": "51"},
|
||||
{"id": 131, "cname": "孟加拉国", "country_id": "880"},
|
||||
{"id": 118, "cname": "马达加斯加", "country_id": "261"},
|
||||
{"id": 167, "cname": "圣卢西亚", "country_id": "1784"},
|
||||
{"id": 216, "cname": "智利", "country_id": "56"},
|
||||
{"id": 203, "cname": "牙买加", "country_id": "1876"},
|
||||
{"id": 202, "cname": "叙利亚", "country_id": "963"},
|
||||
{"id": 201, "cname": "匈牙利", "country_id": "36"},
|
||||
{"id": 200, "cname": "科特迪瓦", "country_id": "225"},
|
||||
{"id": 199, "cname": "希腊", "country_id": "30"},
|
||||
{"id": 198, "cname": "西班牙", "country_id": "34"},
|
||||
{"id": 197, "cname": "乌兹别克斯坦", "country_id": "998"},
|
||||
{"id": 196, "cname": "乌拉圭", "country_id": "598"},
|
||||
{"id": 195, "cname": "乌克兰", "country_id": "380"},
|
||||
{"id": 194, "cname": "乌干达", "country_id": "256"},
|
||||
{"id": 204, "cname": "亚美尼亚", "country_id": "374"},
|
||||
{"id": 205, "cname": "也门", "country_id": "967"},
|
||||
{"id": 215, "cname": "直布罗陀", "country_id": "350"},
|
||||
{"id": 214, "cname": "乍得", "country_id": "235"},
|
||||
{"id": 213, "cname": "赞比亚", "country_id": "260"},
|
||||
{"id": 212, "cname": "越南", "country_id": "84"},
|
||||
{"id": 211, "cname": "约旦", "country_id": "962"},
|
||||
{"id": 210, "cname": "印尼", "country_id": "62"},
|
||||
{"id": 209, "cname": "印度", "country_id": "91"},
|
||||
{"id": 208, "cname": "以色列", "country_id": "972"},
|
||||
{"id": 207, "cname": "伊朗", "country_id": "98"},
|
||||
{"id": 206, "cname": "伊拉克", "country_id": "964"},
|
||||
{"id": 193, "cname": "文莱", "country_id": "673"},
|
||||
{"id": 192, "cname": "委内瑞拉", "country_id": "58"},
|
||||
{"id": 191, "cname": "维珍群岛(英属)", "country_id": "1284"},
|
||||
{"id": 178, "cname": "泰国", "country_id": "66"},
|
||||
{"id": 177, "cname": "索马里", "country_id": "252"},
|
||||
{"id": 176, "cname": "所罗门群岛", "country_id": "677"},
|
||||
{"id": 175, "cname": "苏里南", "country_id": "597"},
|
||||
{"id": 174, "cname": "苏丹", "country_id": "249"},
|
||||
{"id": 173, "cname": "斯威士兰", "country_id": "268"},
|
||||
{"id": 172, "cname": "斯洛文尼亚", "country_id": "386"},
|
||||
{"id": 171, "cname": "斯洛伐克", "country_id": "421"},
|
||||
{"id": 170, "cname": "斯里兰卡", "country_id": "94"},
|
||||
{"id": 169, "cname": "圣皮埃尔和密克隆群岛", "country_id": "508"},
|
||||
{"id": 179, "cname": "坦桑尼亚", "country_id": "255"},
|
||||
{"id": 180, "cname": "汤加", "country_id": "676"},
|
||||
{"id": 190, "cname": "维珍群岛(美属)", "country_id": "1340"},
|
||||
{"id": 189, "cname": "瓦努阿图", "country_id": "678"},
|
||||
{"id": 188, "cname": "托克劳岛", "country_id": "690"},
|
||||
{"id": 187, "cname": "土库曼斯坦", "country_id": "993"},
|
||||
{"id": 186, "cname": "土耳其", "country_id": "90"},
|
||||
{"id": 185, "cname": "图瓦卢", "country_id": "688"},
|
||||
{"id": 184, "cname": "突尼斯", "country_id": "216"},
|
||||
{"id": 183, "cname": "阿森松岛", "country_id": "247"},
|
||||
{"id": 182, "cname": "特立尼达和多巴哥", "country_id": "1868"},
|
||||
{"id": 181, "cname": "特克斯和凯科斯", "country_id": "1649"},
|
||||
{"id": 168, "cname": "圣马力诺", "country_id": "378"},
|
||||
{"id": 67, "cname": "法属圭亚那", "country_id": "594"},
|
||||
{"id": 54, "cname": "不丹", "country_id": "975"},
|
||||
{"id": 53, "cname": "博茨瓦纳", "country_id": "267"},
|
||||
{"id": 52, "cname": "伯利兹", "country_id": "501"},
|
||||
{"id": 51, "cname": "玻利维亚", "country_id": "591"},
|
||||
{"id": 50, "cname": "波兰", "country_id": "48"},
|
||||
{"id": 49, "cname": "波黑", "country_id": "387"},
|
||||
{"id": 48, "cname": "波多黎各", "country_id": "1787"},
|
||||
{"id": 47, "cname": "冰岛", "country_id": "354"},
|
||||
{"id": 46, "cname": "贝宁", "country_id": "229"},
|
||||
{"id": 45, "cname": "保加利亚", "country_id": "359"},
|
||||
{"id": 55, "cname": "布基纳法索", "country_id": "226"},
|
||||
{"id": 56, "cname": "布隆迪", "country_id": "257"},
|
||||
{"id": 66, "cname": "法属波利尼西亚", "country_id": "689"},
|
||||
{"id": 65, "cname": "法罗岛", "country_id": "298"},
|
||||
{"id": 64, "cname": "厄立特里亚", "country_id": "291"},
|
||||
{"id": 63, "cname": "厄瓜多尔", "country_id": "593"},
|
||||
{"id": 62, "cname": "多米尼加代表", "country_id": "1809"},
|
||||
{"id": 61, "cname": "多米尼加", "country_id": "1767"},
|
||||
{"id": 60, "cname": "多哥", "country_id": "228"},
|
||||
{"id": 59, "cname": "迪戈加西亚岛", "country_id": "246"},
|
||||
{"id": 58, "cname": "丹麦", "country_id": "45"},
|
||||
{"id": 57, "cname": "赤道几内亚", "country_id": "240"},
|
||||
{"id": 44, "cname": "百慕大群岛", "country_id": "1441"},
|
||||
{"id": 43, "cname": "白俄罗斯", "country_id": "375"},
|
||||
{"id": 42, "cname": "巴西", "country_id": "55"},
|
||||
{"id": 29, "cname": "爱尔兰", "country_id": "353"},
|
||||
{"id": 28, "cname": "埃塞俄比亚", "country_id": "251"},
|
||||
{"id": 27, "cname": "埃及", "country_id": "20"},
|
||||
{"id": 26, "cname": "阿塞拜疆", "country_id": "994"},
|
||||
{"id": 25, "cname": "阿曼", "country_id": "968"},
|
||||
{"id": 24, "cname": "阿联酋", "country_id": "971"},
|
||||
{"id": 23, "cname": "阿根廷", "country_id": "54"},
|
||||
{"id": 22, "cname": "阿富汗", "country_id": "93"},
|
||||
{"id": 21, "cname": "阿尔及利亚", "country_id": "213"},
|
||||
{"id": 20, "cname": "阿尔巴尼亚", "country_id": "355"},
|
||||
{"id": 30, "cname": "爱沙尼亚", "country_id": "372"},
|
||||
{"id": 31, "cname": "安道尔", "country_id": "376"},
|
||||
{"id": 41, "cname": "巴拿马", "country_id": "507"},
|
||||
{"id": 40, "cname": "巴林", "country_id": "973"},
|
||||
{"id": 39, "cname": "巴拉圭", "country_id": "595"},
|
||||
{"id": 38, "cname": "巴基斯坦", "country_id": "92"},
|
||||
{"id": 37, "cname": "巴哈马群岛", "country_id": "1242"},
|
||||
{"id": 36, "cname": "巴布亚新几内亚", "country_id": "675"},
|
||||
{"id": 35, "cname": "巴巴多斯", "country_id": "1246"},
|
||||
{"id": 34, "cname": "奥地利", "country_id": "43"},
|
||||
{"id": 33, "cname": "安提瓜岛和巴布达", "country_id": "1268"},
|
||||
{"id": 32, "cname": "安哥拉", "country_id": "244"},
|
||||
{"id": 68, "cname": "非洲中部", "country_id": "236"},
|
||||
{"id": 117, "cname": "罗马尼亚", "country_id": "40"},
|
||||
{"id": 104, "cname": "科威特", "country_id": "965"},
|
||||
{"id": 103, "cname": "科摩罗", "country_id": "269"},
|
||||
{"id": 102, "cname": "开曼群岛", "country_id": "1345"},
|
||||
{"id": 101, "cname": "卡塔尔", "country_id": "974"},
|
||||
{"id": 100, "cname": "喀麦隆", "country_id": "237"},
|
||||
{"id": 99, "cname": "聚会岛", "country_id": "262"},
|
||||
{"id": 98, "cname": "津巴布韦", "country_id": "263"},
|
||||
{"id": 97, "cname": "捷克", "country_id": "420"},
|
||||
{"id": 96, "cname": "柬埔寨", "country_id": "855"},
|
||||
{"id": 95, "cname": "加蓬", "country_id": "241"},
|
||||
{"id": 105, "cname": "克罗地亚", "country_id": "385"},
|
||||
{"id": 106, "cname": "肯尼亚", "country_id": "254"},
|
||||
{"id": 116, "cname": "卢旺达", "country_id": "250"},
|
||||
{"id": 115, "cname": "卢森堡", "country_id": "352"},
|
||||
{"id": 114, "cname": "利比亚", "country_id": "218"},
|
||||
{"id": 113, "cname": "利比里亚", "country_id": "231"},
|
||||
{"id": 112, "cname": "立陶宛", "country_id": "370"},
|
||||
{"id": 111, "cname": "黎巴嫩", "country_id": "961"},
|
||||
{"id": 110, "cname": "老挝", "country_id": "856"},
|
||||
{"id": 109, "cname": "莱索托", "country_id": "266"},
|
||||
{"id": 108, "cname": "拉脱维亚", "country_id": "371"},
|
||||
{"id": 107, "cname": "库克岛", "country_id": "682"},
|
||||
{"id": 94, "cname": "加纳", "country_id": "233"},
|
||||
{"id": 93, "cname": "几内亚比绍", "country_id": "245"},
|
||||
{"id": 92, "cname": "几内亚", "country_id": "224"},
|
||||
{"id": 79, "cname": "格林纳达", "country_id": "1473"},
|
||||
{"id": 78, "cname": "哥斯达黎加", "country_id": "506"},
|
||||
{"id": 77, "cname": "哥伦比亚", "country_id": "57"},
|
||||
{"id": 76, "cname": "刚果(金)", "country_id": "243"},
|
||||
{"id": 75, "cname": "刚果", "country_id": "242"},
|
||||
{"id": 74, "cname": "冈比亚", "country_id": "220"},
|
||||
{"id": 73, "cname": "福克兰岛", "country_id": "500"},
|
||||
{"id": 72, "cname": "佛得角", "country_id": "238"},
|
||||
{"id": 71, "cname": "芬兰", "country_id": "358"},
|
||||
{"id": 70, "cname": "斐济", "country_id": "679"},
|
||||
{"id": 80, "cname": "格陵兰岛", "country_id": "299"},
|
||||
{"id": 81, "cname": "古巴", "country_id": "53"},
|
||||
{"id": 91, "cname": "吉尔吉斯斯坦", "country_id": "996"},
|
||||
{"id": 90, "cname": "吉布提", "country_id": "253"},
|
||||
{"id": 89, "cname": "基里巴斯", "country_id": "686"},
|
||||
{"id": 88, "cname": "维克岛", "country_id": "1808"},
|
||||
{"id": 87, "cname": "洪都拉斯", "country_id": "504"},
|
||||
{"id": 86, "cname": "荷兰", "country_id": "31"},
|
||||
{"id": 85, "cname": "朝鲜", "country_id": "850"},
|
||||
{"id": 84, "cname": "海地", "country_id": "509"},
|
||||
{"id": 83, "cname": "关岛", "country_id": "1671"},
|
||||
{"id": 82, "cname": "瓜德罗普岛", "country_id": "590"},
|
||||
{"id": 69, "cname": "菲律宾", "country_id": "63"},
|
||||
static const internationalDialingPrefix = [
|
||||
(id: 1, cname: "中国大陆", countryId: 86),
|
||||
(id: 5, cname: "中国香港特别行政区", countryId: 852),
|
||||
(id: 2, cname: "中国澳门特别行政区", countryId: 853),
|
||||
(id: 3, cname: "中国台湾", countryId: 886),
|
||||
(id: 4, cname: "美国", countryId: 1),
|
||||
(id: 6, cname: "比利时", countryId: 32),
|
||||
(id: 7, cname: "澳大利亚", countryId: 61),
|
||||
(id: 8, cname: "法国", countryId: 33),
|
||||
(id: 9, cname: "加拿大", countryId: 1),
|
||||
(id: 10, cname: "日本", countryId: 81),
|
||||
(id: 11, cname: "新加坡", countryId: 65),
|
||||
(id: 12, cname: "韩国", countryId: 82),
|
||||
(id: 13, cname: "马来西亚", countryId: 60),
|
||||
(id: 14, cname: "英国", countryId: 44),
|
||||
(id: 15, cname: "意大利", countryId: 39),
|
||||
(id: 16, cname: "德国", countryId: 49),
|
||||
(id: 18, cname: "俄罗斯", countryId: 7),
|
||||
(id: 19, cname: "新西兰", countryId: 64),
|
||||
(id: 153, cname: "瓦利斯群岛和富图纳群岛", countryId: 1681),
|
||||
(id: 152, cname: "葡萄牙", countryId: 351),
|
||||
(id: 151, cname: "帕劳", countryId: 680),
|
||||
(id: 150, cname: "诺福克岛", countryId: 672),
|
||||
(id: 149, cname: "挪威", countryId: 47),
|
||||
(id: 148, cname: "纽埃岛", countryId: 683),
|
||||
(id: 147, cname: "尼日利亚", countryId: 234),
|
||||
(id: 146, cname: "尼日尔", countryId: 227),
|
||||
(id: 145, cname: "尼加拉瓜", countryId: 505),
|
||||
(id: 144, cname: "尼泊尔", countryId: 977),
|
||||
(id: 143, cname: "瑙鲁", countryId: 674),
|
||||
(id: 154, cname: "格鲁吉亚", countryId: 995),
|
||||
(id: 155, cname: "瑞典", countryId: 46),
|
||||
(id: 165, cname: "沙特阿拉伯", countryId: 966),
|
||||
(id: 164, cname: "桑给巴尔岛", countryId: 259),
|
||||
(id: 163, cname: "塞舌尔共和国", countryId: 248),
|
||||
(id: 162, cname: "塞浦路斯", countryId: 357),
|
||||
(id: 161, cname: "塞内加尔", countryId: 221),
|
||||
(id: 160, cname: "塞拉利昂", countryId: 232),
|
||||
(id: 159, cname: "萨摩亚,东部", countryId: 684),
|
||||
(id: 158, cname: "萨摩亚,西部", countryId: 685),
|
||||
(id: 157, cname: "萨尔瓦多", countryId: 503),
|
||||
(id: 156, cname: "瑞士", countryId: 41),
|
||||
(id: 166, cname: "圣多美和普林西比", countryId: 239),
|
||||
(id: 142, cname: "塞尔维亚", countryId: 381),
|
||||
(id: 141, cname: "南非", countryId: 27),
|
||||
(id: 128, cname: "毛里塔尼亚", countryId: 222),
|
||||
(id: 127, cname: "毛里求斯", countryId: 230),
|
||||
(id: 126, cname: "马歇尔岛", countryId: 692),
|
||||
(id: 125, cname: "马提尼克岛", countryId: 596),
|
||||
(id: 124, cname: "马其顿", countryId: 389),
|
||||
(id: 123, cname: "马里亚纳岛", countryId: 1670),
|
||||
(id: 122, cname: "马里", countryId: 223),
|
||||
(id: 121, cname: "马拉维", countryId: 265),
|
||||
(id: 120, cname: "马耳他", countryId: 356),
|
||||
(id: 119, cname: "马尔代夫", countryId: 960),
|
||||
(id: 129, cname: "蒙古", countryId: 976),
|
||||
(id: 130, cname: "蒙特塞拉特岛", countryId: 1664),
|
||||
(id: 140, cname: "纳米比亚", countryId: 264),
|
||||
(id: 139, cname: "墨西哥", countryId: 52),
|
||||
(id: 138, cname: "莫桑比克", countryId: 258),
|
||||
(id: 137, cname: "摩纳哥", countryId: 377),
|
||||
(id: 136, cname: "摩洛哥", countryId: 212),
|
||||
(id: 135, cname: "摩尔多瓦", countryId: 373),
|
||||
(id: 134, cname: "缅甸", countryId: 95),
|
||||
(id: 133, cname: "密克罗尼西亚", countryId: 691),
|
||||
(id: 132, cname: "秘鲁", countryId: 51),
|
||||
(id: 131, cname: "孟加拉国", countryId: 880),
|
||||
(id: 118, cname: "马达加斯加", countryId: 261),
|
||||
(id: 167, cname: "圣卢西亚", countryId: 1784),
|
||||
(id: 216, cname: "智利", countryId: 56),
|
||||
(id: 203, cname: "牙买加", countryId: 1876),
|
||||
(id: 202, cname: "叙利亚", countryId: 963),
|
||||
(id: 201, cname: "匈牙利", countryId: 36),
|
||||
(id: 200, cname: "科特迪瓦", countryId: 225),
|
||||
(id: 199, cname: "希腊", countryId: 30),
|
||||
(id: 198, cname: "西班牙", countryId: 34),
|
||||
(id: 197, cname: "乌兹别克斯坦", countryId: 998),
|
||||
(id: 196, cname: "乌拉圭", countryId: 598),
|
||||
(id: 195, cname: "乌克兰", countryId: 380),
|
||||
(id: 194, cname: "乌干达", countryId: 256),
|
||||
(id: 204, cname: "亚美尼亚", countryId: 374),
|
||||
(id: 205, cname: "也门", countryId: 967),
|
||||
(id: 215, cname: "直布罗陀", countryId: 350),
|
||||
(id: 214, cname: "乍得", countryId: 235),
|
||||
(id: 213, cname: "赞比亚", countryId: 260),
|
||||
(id: 212, cname: "越南", countryId: 84),
|
||||
(id: 211, cname: "约旦", countryId: 962),
|
||||
(id: 210, cname: "印尼", countryId: 62),
|
||||
(id: 209, cname: "印度", countryId: 91),
|
||||
(id: 208, cname: "以色列", countryId: 972),
|
||||
(id: 207, cname: "伊朗", countryId: 98),
|
||||
(id: 206, cname: "伊拉克", countryId: 964),
|
||||
(id: 193, cname: "文莱", countryId: 673),
|
||||
(id: 192, cname: "委内瑞拉", countryId: 58),
|
||||
(id: 191, cname: "维珍群岛(英属)", countryId: 1284),
|
||||
(id: 178, cname: "泰国", countryId: 66),
|
||||
(id: 177, cname: "索马里", countryId: 252),
|
||||
(id: 176, cname: "所罗门群岛", countryId: 677),
|
||||
(id: 175, cname: "苏里南", countryId: 597),
|
||||
(id: 174, cname: "苏丹", countryId: 249),
|
||||
(id: 173, cname: "斯威士兰", countryId: 268),
|
||||
(id: 172, cname: "斯洛文尼亚", countryId: 386),
|
||||
(id: 171, cname: "斯洛伐克", countryId: 421),
|
||||
(id: 170, cname: "斯里兰卡", countryId: 94),
|
||||
(id: 169, cname: "圣皮埃尔和密克隆群岛", countryId: 508),
|
||||
(id: 179, cname: "坦桑尼亚", countryId: 255),
|
||||
(id: 180, cname: "汤加", countryId: 676),
|
||||
(id: 190, cname: "维珍群岛(美属)", countryId: 1340),
|
||||
(id: 189, cname: "瓦努阿图", countryId: 678),
|
||||
(id: 188, cname: "托克劳岛", countryId: 690),
|
||||
(id: 187, cname: "土库曼斯坦", countryId: 993),
|
||||
(id: 186, cname: "土耳其", countryId: 90),
|
||||
(id: 185, cname: "图瓦卢", countryId: 688),
|
||||
(id: 184, cname: "突尼斯", countryId: 216),
|
||||
(id: 183, cname: "阿森松岛", countryId: 247),
|
||||
(id: 182, cname: "特立尼达和多巴哥", countryId: 1868),
|
||||
(id: 181, cname: "特克斯和凯科斯", countryId: 1649),
|
||||
(id: 168, cname: "圣马力诺", countryId: 378),
|
||||
(id: 67, cname: "法属圭亚那", countryId: 594),
|
||||
(id: 54, cname: "不丹", countryId: 975),
|
||||
(id: 53, cname: "博茨瓦纳", countryId: 267),
|
||||
(id: 52, cname: "伯利兹", countryId: 501),
|
||||
(id: 51, cname: "玻利维亚", countryId: 591),
|
||||
(id: 50, cname: "波兰", countryId: 48),
|
||||
(id: 49, cname: "波黑", countryId: 387),
|
||||
(id: 48, cname: "波多黎各", countryId: 1787),
|
||||
(id: 47, cname: "冰岛", countryId: 354),
|
||||
(id: 46, cname: "贝宁", countryId: 229),
|
||||
(id: 45, cname: "保加利亚", countryId: 359),
|
||||
(id: 55, cname: "布基纳法索", countryId: 226),
|
||||
(id: 56, cname: "布隆迪", countryId: 257),
|
||||
(id: 66, cname: "法属波利尼西亚", countryId: 689),
|
||||
(id: 65, cname: "法罗岛", countryId: 298),
|
||||
(id: 64, cname: "厄立特里亚", countryId: 291),
|
||||
(id: 63, cname: "厄瓜多尔", countryId: 593),
|
||||
(id: 62, cname: "多米尼加代表", countryId: 1809),
|
||||
(id: 61, cname: "多米尼加", countryId: 1767),
|
||||
(id: 60, cname: "多哥", countryId: 228),
|
||||
(id: 59, cname: "迪戈加西亚岛", countryId: 246),
|
||||
(id: 58, cname: "丹麦", countryId: 45),
|
||||
(id: 57, cname: "赤道几内亚", countryId: 240),
|
||||
(id: 44, cname: "百慕大群岛", countryId: 1441),
|
||||
(id: 43, cname: "白俄罗斯", countryId: 375),
|
||||
(id: 42, cname: "巴西", countryId: 55),
|
||||
(id: 29, cname: "爱尔兰", countryId: 353),
|
||||
(id: 28, cname: "埃塞俄比亚", countryId: 251),
|
||||
(id: 27, cname: "埃及", countryId: 20),
|
||||
(id: 26, cname: "阿塞拜疆", countryId: 994),
|
||||
(id: 25, cname: "阿曼", countryId: 968),
|
||||
(id: 24, cname: "阿联酋", countryId: 971),
|
||||
(id: 23, cname: "阿根廷", countryId: 54),
|
||||
(id: 22, cname: "阿富汗", countryId: 93),
|
||||
(id: 21, cname: "阿尔及利亚", countryId: 213),
|
||||
(id: 20, cname: "阿尔巴尼亚", countryId: 355),
|
||||
(id: 30, cname: "爱沙尼亚", countryId: 372),
|
||||
(id: 31, cname: "安道尔", countryId: 376),
|
||||
(id: 41, cname: "巴拿马", countryId: 507),
|
||||
(id: 40, cname: "巴林", countryId: 973),
|
||||
(id: 39, cname: "巴拉圭", countryId: 595),
|
||||
(id: 38, cname: "巴基斯坦", countryId: 92),
|
||||
(id: 37, cname: "巴哈马群岛", countryId: 1242),
|
||||
(id: 36, cname: "巴布亚新几内亚", countryId: 675),
|
||||
(id: 35, cname: "巴巴多斯", countryId: 1246),
|
||||
(id: 34, cname: "奥地利", countryId: 43),
|
||||
(id: 33, cname: "安提瓜岛和巴布达", countryId: 1268),
|
||||
(id: 32, cname: "安哥拉", countryId: 244),
|
||||
(id: 68, cname: "非洲中部", countryId: 236),
|
||||
(id: 117, cname: "罗马尼亚", countryId: 40),
|
||||
(id: 104, cname: "科威特", countryId: 965),
|
||||
(id: 103, cname: "科摩罗", countryId: 269),
|
||||
(id: 102, cname: "开曼群岛", countryId: 1345),
|
||||
(id: 101, cname: "卡塔尔", countryId: 974),
|
||||
(id: 100, cname: "喀麦隆", countryId: 237),
|
||||
(id: 99, cname: "聚会岛", countryId: 262),
|
||||
(id: 98, cname: "津巴布韦", countryId: 263),
|
||||
(id: 97, cname: "捷克", countryId: 420),
|
||||
(id: 96, cname: "柬埔寨", countryId: 855),
|
||||
(id: 95, cname: "加蓬", countryId: 241),
|
||||
(id: 105, cname: "克罗地亚", countryId: 385),
|
||||
(id: 106, cname: "肯尼亚", countryId: 254),
|
||||
(id: 116, cname: "卢旺达", countryId: 250),
|
||||
(id: 115, cname: "卢森堡", countryId: 352),
|
||||
(id: 114, cname: "利比亚", countryId: 218),
|
||||
(id: 113, cname: "利比里亚", countryId: 231),
|
||||
(id: 112, cname: "立陶宛", countryId: 370),
|
||||
(id: 111, cname: "黎巴嫩", countryId: 961),
|
||||
(id: 110, cname: "老挝", countryId: 856),
|
||||
(id: 109, cname: "莱索托", countryId: 266),
|
||||
(id: 108, cname: "拉脱维亚", countryId: 371),
|
||||
(id: 107, cname: "库克岛", countryId: 682),
|
||||
(id: 94, cname: "加纳", countryId: 233),
|
||||
(id: 93, cname: "几内亚比绍", countryId: 245),
|
||||
(id: 92, cname: "几内亚", countryId: 224),
|
||||
(id: 79, cname: "格林纳达", countryId: 1473),
|
||||
(id: 78, cname: "哥斯达黎加", countryId: 506),
|
||||
(id: 77, cname: "哥伦比亚", countryId: 57),
|
||||
(id: 76, cname: "刚果(金)", countryId: 243),
|
||||
(id: 75, cname: "刚果", countryId: 242),
|
||||
(id: 74, cname: "冈比亚", countryId: 220),
|
||||
(id: 73, cname: "福克兰岛", countryId: 500),
|
||||
(id: 72, cname: "佛得角", countryId: 238),
|
||||
(id: 71, cname: "芬兰", countryId: 358),
|
||||
(id: 70, cname: "斐济", countryId: 679),
|
||||
(id: 80, cname: "格陵兰岛", countryId: 299),
|
||||
(id: 81, cname: "古巴", countryId: 53),
|
||||
(id: 91, cname: "吉尔吉斯斯坦", countryId: 996),
|
||||
(id: 90, cname: "吉布提", countryId: 253),
|
||||
(id: 89, cname: "基里巴斯", countryId: 686),
|
||||
(id: 88, cname: "维克岛", countryId: 1808),
|
||||
(id: 87, cname: "洪都拉斯", countryId: 504),
|
||||
(id: 86, cname: "荷兰", countryId: 31),
|
||||
(id: 85, cname: "朝鲜", countryId: 850),
|
||||
(id: 84, cname: "海地", countryId: 509),
|
||||
(id: 83, cname: "关岛", countryId: 1671),
|
||||
(id: 82, cname: "瓜德罗普岛", countryId: 590),
|
||||
(id: 69, cname: "菲律宾", countryId: 63),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
import 'package:PiliPlus/http/api.dart';
|
||||
import 'package:PiliPlus/http/init.dart';
|
||||
|
||||
class CommonHttp {
|
||||
static Future unReadDynamic() async {
|
||||
var res = await Request().get(
|
||||
Api.getUnreadDynamic,
|
||||
queryParameters: {
|
||||
'alltype_offset': 0,
|
||||
'video_offset': 0,
|
||||
'article_offset': 0,
|
||||
},
|
||||
);
|
||||
if (res.data['code'] == 0) {
|
||||
return {
|
||||
'status': true,
|
||||
'data': res.data['data']['update_info']['item']['count'],
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
'status': false,
|
||||
'msg': res.data['message'],
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,8 @@ class LoginHttp {
|
||||
'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
|
||||
};
|
||||
|
||||
static Future<Map<String, dynamic>> getHDcode() async {
|
||||
static Future<LoadingState<({String authCode, String url})>>
|
||||
getHDcode() async {
|
||||
var params = {
|
||||
// 'local_id': 'Y952A395BB157D305D8A8340FC2AAECECE17',
|
||||
'local_id': '0',
|
||||
@@ -42,9 +43,14 @@ class LoginHttp {
|
||||
var res = await Request().post(Api.getTVCode, queryParameters: params);
|
||||
|
||||
if (res.data['code'] == 0) {
|
||||
return {'status': true, 'data': res.data['data']};
|
||||
try {
|
||||
final Map<String, dynamic> data = res.data['data'];
|
||||
return Success((authCode: data['auth_code'], url: data['url']));
|
||||
} catch (e) {
|
||||
return Error(e.toString());
|
||||
}
|
||||
} else {
|
||||
return {'status': false, 'msg': res.data['message']};
|
||||
return Error(res.data['message']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,7 +94,7 @@ class LoginHttp {
|
||||
}
|
||||
|
||||
static Future sendSmsCode({
|
||||
required String cid,
|
||||
required Object cid,
|
||||
required String tel,
|
||||
// String? deviceTouristId,
|
||||
String? geeChallenge,
|
||||
@@ -264,11 +270,11 @@ class LoginHttp {
|
||||
required String captchaKey,
|
||||
required String tel,
|
||||
required String code,
|
||||
required String cid,
|
||||
required Object cid,
|
||||
required String key,
|
||||
}) async {
|
||||
dynamic publicKey = RSAKeyParser().parse(key);
|
||||
Map<String, String> data = {
|
||||
Map<String, Object> data = {
|
||||
'bili_local_id': deviceId,
|
||||
'build': '2001100',
|
||||
'buvid': buvid,
|
||||
@@ -297,7 +303,7 @@ class LoginHttp {
|
||||
's_locale': 'zh_CN',
|
||||
'statistics': Constants.statistics,
|
||||
'tel': tel,
|
||||
'ts': (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(),
|
||||
'ts': DateTime.now().millisecondsSinceEpoch ~/ 1000,
|
||||
};
|
||||
AppSign.appSign(data);
|
||||
var res = await Request().post(
|
||||
|
||||
@@ -45,9 +45,10 @@ void main() async {
|
||||
Get.lazyPut(AccountService.new);
|
||||
HttpOverrides.global = _CustomHttpOverrides();
|
||||
|
||||
await Future.wait([
|
||||
CacheManage.autoClearCache(),
|
||||
if (Utils.isMobile) ...[
|
||||
CacheManage.autoClearCache();
|
||||
|
||||
if (Utils.isMobile) {
|
||||
await Future.wait([
|
||||
SystemChrome.setPreferredOrientations(
|
||||
[
|
||||
DeviceOrientation.portraitUp,
|
||||
@@ -58,8 +59,8 @@ void main() async {
|
||||
],
|
||||
),
|
||||
setupServiceLocator(),
|
||||
],
|
||||
]);
|
||||
]);
|
||||
}
|
||||
|
||||
Request();
|
||||
Request.setCookie();
|
||||
@@ -92,18 +93,8 @@ void main() async {
|
||||
title: Constants.appName,
|
||||
);
|
||||
windowManager.waitUntilReadyToShow(windowOptions, () async {
|
||||
final windowSize = Pref.windowSize;
|
||||
final windowOffset = await Utils.windowOffset;
|
||||
final bounds = Rect.fromLTWH(
|
||||
windowOffset.left,
|
||||
windowOffset.top,
|
||||
windowSize[0],
|
||||
windowSize[1],
|
||||
);
|
||||
await windowManager.setBounds(bounds);
|
||||
if (Pref.isWindowMaximized) {
|
||||
await windowManager.maximize();
|
||||
}
|
||||
await windowManager.setBounds(await Utils.windowOffset & Pref.windowSize);
|
||||
if (Pref.isWindowMaximized) await windowManager.maximize();
|
||||
await windowManager.show();
|
||||
await windowManager.focus();
|
||||
});
|
||||
@@ -171,7 +162,9 @@ class MyApp extends StatelessWidget {
|
||||
late List<DisplayMode> modes;
|
||||
FlutterDisplayMode.supported.then((value) {
|
||||
modes = value;
|
||||
var storageDisplay = GStorage.setting.get(SettingBoxKey.displayMode);
|
||||
final String? storageDisplay = GStorage.setting.get(
|
||||
SettingBoxKey.displayMode,
|
||||
);
|
||||
DisplayMode? displayMode;
|
||||
if (storageDisplay != null) {
|
||||
displayMode = modes.firstWhereOrNull(
|
||||
|
||||
@@ -2,8 +2,8 @@ import 'package:PiliPlus/models_new/live/live_superchat/user_info.dart';
|
||||
import 'package:PiliPlus/utils/utils.dart';
|
||||
|
||||
class SuperChatItem {
|
||||
dynamic id;
|
||||
dynamic uid;
|
||||
int id;
|
||||
int? uid;
|
||||
int? price;
|
||||
String backgroundColor;
|
||||
String backgroundBottomColor;
|
||||
@@ -15,7 +15,7 @@ class SuperChatItem {
|
||||
bool expired = false;
|
||||
|
||||
SuperChatItem({
|
||||
this.id,
|
||||
required this.id,
|
||||
required this.uid,
|
||||
this.price,
|
||||
required this.backgroundColor,
|
||||
@@ -28,7 +28,7 @@ class SuperChatItem {
|
||||
});
|
||||
|
||||
factory SuperChatItem.fromJson(Map<String, dynamic> json) => SuperChatItem(
|
||||
id: json['id'] ?? Utils.generateRandomString(8),
|
||||
id: json['id'] ?? Utils.random.nextInt(2147483647),
|
||||
uid: json['uid'],
|
||||
price: json['price'] as int?,
|
||||
backgroundColor: json['background_color'] ?? '#EDF5FF',
|
||||
|
||||
@@ -105,6 +105,7 @@ class _PlDanmakuState extends State<PlDanmaku> {
|
||||
List<DanmakuElem>? currentDanmakuList = _plDanmakuController
|
||||
.getCurrentDanmaku(currentPosition);
|
||||
if (currentDanmakuList != null) {
|
||||
final blockColorful = playerController.blockColorful;
|
||||
for (DanmakuElem e in currentDanmakuList) {
|
||||
if (e.mode == 7) {
|
||||
try {
|
||||
@@ -120,7 +121,7 @@ class _PlDanmakuState extends State<PlDanmaku> {
|
||||
_controller!.addDanmaku(
|
||||
DanmakuContentItem(
|
||||
e.content,
|
||||
color: playerController.blockColorful
|
||||
color: blockColorful
|
||||
? Colors.white
|
||||
: DmUtils.decimalToColor(e.color),
|
||||
type: DmUtils.getPosition(e.mode),
|
||||
|
||||
@@ -30,8 +30,8 @@ class _LaterPageState extends State<LaterPage>
|
||||
|
||||
LaterController currCtr([int? index]) {
|
||||
final type = LaterViewType.values[index ?? _tabController.index];
|
||||
return Get.put(
|
||||
LaterController(type),
|
||||
return Get.putOrFind(
|
||||
() => LaterController(type),
|
||||
tag: type.type.toString(),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -241,7 +241,7 @@ class LiveRoomController extends GetxController {
|
||||
|
||||
Future<void> getSuperChatMsg() async {
|
||||
final res = await LiveHttp.superChatMsg(roomId);
|
||||
if (res.dataOrNull?.list case List<SuperChatItem> list) {
|
||||
if (res.dataOrNull?.list case final list?) {
|
||||
superChatMsg.addAll(list);
|
||||
}
|
||||
}
|
||||
@@ -377,7 +377,7 @@ class LiveRoomController extends GetxController {
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'SUPER_CHAT_MESSAGE' when (showSuperChat):
|
||||
case 'SUPER_CHAT_MESSAGE' when showSuperChat:
|
||||
final item = SuperChatItem.fromJson(obj['data']);
|
||||
superChatMsg.insert(0, item);
|
||||
if (isFullScreen || plPlayerController.isDesktopPip) {
|
||||
@@ -385,10 +385,8 @@ class LiveRoomController extends GetxController {
|
||||
}
|
||||
break;
|
||||
}
|
||||
} catch (e) {
|
||||
if (kDebugMode) {
|
||||
debugPrint('$e,,$obj');
|
||||
}
|
||||
} catch (_) {
|
||||
if (kDebugMode) rethrow;
|
||||
}
|
||||
})
|
||||
..init();
|
||||
|
||||
@@ -43,9 +43,7 @@ class _SuperChatCardState extends State<SuperChatCard> {
|
||||
}
|
||||
|
||||
void _remove() {
|
||||
WidgetsBinding.instance.addPostFrameCallback(
|
||||
(_) => Future.delayed(const Duration(seconds: 1), _onRemove),
|
||||
);
|
||||
Future.delayed(const Duration(seconds: 1), _onRemove);
|
||||
}
|
||||
|
||||
void _onRemove() {
|
||||
|
||||
@@ -30,10 +30,16 @@ class _SuperChatPanelState extends DebounceStreamState<SuperChatPanel, bool>
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
physics: const ClampingScrollPhysics(),
|
||||
itemCount: widget.controller.superChatMsg.length,
|
||||
findChildIndexCallback: (key) {
|
||||
final index = widget.controller.superChatMsg.indexWhere(
|
||||
(i) => i.id == (key as ValueKey<int>).value,
|
||||
);
|
||||
return index == -1 ? null : index;
|
||||
},
|
||||
itemBuilder: (context, index) {
|
||||
final item = widget.controller.superChatMsg[index];
|
||||
return SuperChatCard(
|
||||
key: Key(item.id.toString()),
|
||||
key: ValueKey(item.id),
|
||||
item: item,
|
||||
onRemove: () => ctr?.add(true),
|
||||
);
|
||||
|
||||
@@ -265,7 +265,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
child: TextButton(
|
||||
onPressed: () {
|
||||
_liveRoomController.fsSC.value = SuperChatItem.fromJson({
|
||||
"id": Utils.generateRandomString(8),
|
||||
"id": Utils.random.nextInt(2147483647),
|
||||
"price": 66,
|
||||
"end_time":
|
||||
DateTime.now().millisecondsSinceEpoch ~/ 1000 + 5,
|
||||
@@ -300,7 +300,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
}
|
||||
try {
|
||||
return SizedBox(
|
||||
key: Key(item.id.toString()),
|
||||
key: ValueKey(item.id),
|
||||
width: 255,
|
||||
child: Stack(
|
||||
clipBehavior: Clip.none,
|
||||
@@ -330,6 +330,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
),
|
||||
);
|
||||
} catch (_) {
|
||||
if (kDebugMode) rethrow;
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
}),
|
||||
@@ -740,7 +741,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
liveRoomController: _liveRoomController,
|
||||
);
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(bottom: 12, top: !isPortrait ? 0 : 12),
|
||||
padding: EdgeInsets.only(bottom: 12, top: isPortrait ? 12 : 0),
|
||||
child: _liveRoomController.showSuperChat
|
||||
? PageView(
|
||||
key: pageKey,
|
||||
|
||||
@@ -87,7 +87,7 @@ class LiveRoomChatPanel extends StatelessWidget {
|
||||
liveRoomController.superChatMsg.insert(
|
||||
0,
|
||||
SuperChatItem.fromJson({
|
||||
"id": Utils.generateRandomString(8),
|
||||
"id": Utils.random.nextInt(2147483647),
|
||||
"price": 66,
|
||||
"end_time":
|
||||
DateTime.now().millisecondsSinceEpoch ~/ 1000 + 5,
|
||||
|
||||
@@ -5,6 +5,7 @@ import 'package:PiliPlus/common/constants.dart';
|
||||
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
|
||||
import 'package:PiliPlus/common/widgets/radio_widget.dart';
|
||||
import 'package:PiliPlus/http/init.dart';
|
||||
import 'package:PiliPlus/http/loading_state.dart';
|
||||
import 'package:PiliPlus/http/login.dart';
|
||||
import 'package:PiliPlus/models/common/account_type.dart';
|
||||
import 'package:PiliPlus/models/login/model.dart';
|
||||
@@ -26,7 +27,8 @@ class LoginPageController extends GetxController
|
||||
final TextEditingController smsCodeTextController = TextEditingController();
|
||||
final TextEditingController cookieTextController = TextEditingController();
|
||||
|
||||
late final RxMap<String, dynamic> codeInfo = RxMap<String, dynamic>({});
|
||||
late final codeInfo =
|
||||
LoadingState<({String authCode, String url})>.loading().obs;
|
||||
|
||||
late final TabController tabController;
|
||||
|
||||
@@ -36,10 +38,7 @@ class LoginPageController extends GetxController
|
||||
late final RxInt qrCodeLeftTime = 180.obs;
|
||||
late final RxString statusQRCode = ''.obs;
|
||||
|
||||
late final List<Map<String, dynamic>> internationalDialingPrefix =
|
||||
Constants.internationalDialingPrefix;
|
||||
late Map<String, dynamic> selectedCountryCodeId =
|
||||
internationalDialingPrefix.first;
|
||||
late var selectedCountryCodeId = Constants.internationalDialingPrefix.first;
|
||||
late String captchaKey = '';
|
||||
late final RxInt smsSendCooldown = 0.obs;
|
||||
late int smsSendTimestamp = 0;
|
||||
@@ -48,6 +47,8 @@ class LoginPageController extends GetxController
|
||||
Timer? qrCodeTimer;
|
||||
Timer? smsSendCooldownTimer;
|
||||
|
||||
bool _isReq = false;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
@@ -70,46 +71,47 @@ class LoginPageController extends GetxController
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
void refreshQRCode() {
|
||||
LoginHttp.getHDcode().then((res) {
|
||||
if (res['status']) {
|
||||
qrCodeTimer?.cancel();
|
||||
codeInfo.addAll(res);
|
||||
qrCodeTimer = Timer.periodic(const Duration(milliseconds: 1000), (t) {
|
||||
qrCodeLeftTime.value = 180 - t.tick;
|
||||
if (qrCodeLeftTime <= 0) {
|
||||
t.cancel();
|
||||
statusQRCode.value = '二维码已过期,请刷新';
|
||||
qrCodeLeftTime.value = 0;
|
||||
return;
|
||||
}
|
||||
Future<void> refreshQRCode() async {
|
||||
final res = await LoginHttp.getHDcode();
|
||||
if (res.isSuccess) {
|
||||
qrCodeTimer?.cancel();
|
||||
codeInfo.value = res;
|
||||
qrCodeTimer = Timer.periodic(const Duration(milliseconds: 1000), (t) {
|
||||
final left = 180 - t.tick;
|
||||
if (left <= 0) {
|
||||
t.cancel();
|
||||
statusQRCode.value = '二维码已过期,请刷新';
|
||||
qrCodeLeftTime.value = 0;
|
||||
return;
|
||||
}
|
||||
qrCodeLeftTime.value = left;
|
||||
if (_isReq || tabController.index != 2) return;
|
||||
|
||||
LoginHttp.codePoll(codeInfo['data']['auth_code']).then((value) async {
|
||||
if (value['status']) {
|
||||
t.cancel();
|
||||
statusQRCode.value = '扫码成功';
|
||||
await setAccount(
|
||||
value['data'],
|
||||
value['data']['cookie_info']['cookies'],
|
||||
);
|
||||
Get.back();
|
||||
} else if (value['code'] == 86038) {
|
||||
t.cancel();
|
||||
qrCodeLeftTime.value = 0;
|
||||
} else {
|
||||
statusQRCode.value = value['msg'];
|
||||
}
|
||||
});
|
||||
_isReq = true;
|
||||
LoginHttp.codePoll(res.data.authCode).then((value) async {
|
||||
_isReq = false;
|
||||
if (value['status']) {
|
||||
t.cancel();
|
||||
statusQRCode.value = '扫码成功';
|
||||
await setAccount(
|
||||
value['data'],
|
||||
value['data']['cookie_info']['cookies'],
|
||||
);
|
||||
Get.back();
|
||||
} else if (value['code'] == 86038) {
|
||||
t.cancel();
|
||||
qrCodeLeftTime.value = 0;
|
||||
} else {
|
||||
statusQRCode.value = value['msg'];
|
||||
}
|
||||
});
|
||||
} else {
|
||||
SmartDialog.showToast(res['msg']);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _handleTabChange() {
|
||||
if (tabController.index == 2) {
|
||||
if (qrCodeTimer == null || qrCodeTimer!.isActive == false) {
|
||||
if (qrCodeTimer == null || !qrCodeTimer!.isActive) {
|
||||
refreshQRCode();
|
||||
}
|
||||
}
|
||||
@@ -545,7 +547,7 @@ class LoginPageController extends GetxController
|
||||
tel: telTextController.text,
|
||||
code: smsCodeTextController.text,
|
||||
captchaKey: captchaKey,
|
||||
cid: selectedCountryCodeId['country_id'],
|
||||
cid: selectedCountryCodeId.countryId,
|
||||
key: key,
|
||||
);
|
||||
if (res['status']) {
|
||||
@@ -608,7 +610,7 @@ class LoginPageController extends GetxController
|
||||
|
||||
var res = await LoginHttp.sendSmsCode(
|
||||
tel: telTextController.text,
|
||||
cid: selectedCountryCodeId['country_id'],
|
||||
cid: selectedCountryCodeId.countryId,
|
||||
// deviceTouristId: guestId,
|
||||
geeValidate: captchaData.validate,
|
||||
geeSeccode: captchaData.seccode,
|
||||
|
||||
@@ -1,17 +1,21 @@
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:PiliPlus/common/constants.dart';
|
||||
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
|
||||
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
|
||||
import 'package:PiliPlus/http/loading_state.dart';
|
||||
import 'package:PiliPlus/pages/login/controller.dart';
|
||||
import 'package:PiliPlus/utils/extension.dart';
|
||||
import 'package:PiliPlus/utils/image_utils.dart';
|
||||
import 'package:PiliPlus/utils/utils.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart' hide ContextExtensionss;
|
||||
import 'package:pretty_qr_code/pretty_qr_code.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
class LoginPage extends StatefulWidget {
|
||||
const LoginPage({super.key});
|
||||
@@ -25,7 +29,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
// 二维码生成时间
|
||||
bool showPassword = false;
|
||||
GlobalKey globalKey = GlobalKey();
|
||||
final isMobile = Utils.isMobile;
|
||||
bool get isMobile => kDebugMode || Utils.isMobile;
|
||||
|
||||
Widget loginByQRCode(ThemeData theme) {
|
||||
return Column(
|
||||
@@ -70,35 +74,48 @@ class _LoginPageState extends State<LoginPage> {
|
||||
icon: const Icon(Icons.save),
|
||||
label: const Text('保存至相册'),
|
||||
),
|
||||
if (isMobile)
|
||||
TextButton.icon(
|
||||
onPressed: () => launchUrl(
|
||||
Uri.parse(_loginPageCtr.codeInfo.value.data.url),
|
||||
mode: LaunchMode.externalNonBrowserApplication,
|
||||
),
|
||||
icon: const Icon(Icons.open_in_browser_outlined),
|
||||
label: const Text('其他应用打开'),
|
||||
),
|
||||
],
|
||||
),
|
||||
RepaintBoundary(
|
||||
key: globalKey,
|
||||
child: Obx(() {
|
||||
if (_loginPageCtr.codeInfo['data']?['url'] == null) {
|
||||
return Container(
|
||||
return switch (_loginPageCtr.codeInfo.value) {
|
||||
Loading() => Container(
|
||||
height: 200,
|
||||
width: 200,
|
||||
alignment: Alignment.center,
|
||||
child: const CircularProgressIndicator(
|
||||
semanticsLabel: '二维码加载中',
|
||||
),
|
||||
);
|
||||
}
|
||||
return Container(
|
||||
width: 200,
|
||||
height: 200,
|
||||
color: Colors.white,
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: PrettyQrView.data(
|
||||
data: _loginPageCtr.codeInfo['data']!['url']!,
|
||||
decoration: const PrettyQrDecoration(
|
||||
shape: PrettyQrSquaresSymbol(
|
||||
color: Colors.black87,
|
||||
),
|
||||
Success(:var response) => Container(
|
||||
width: 200,
|
||||
height: 200,
|
||||
color: Colors.white,
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: PrettyQrView.data(
|
||||
data: response.url,
|
||||
decoration: const PrettyQrDecoration(
|
||||
shape: PrettyQrSquaresSymbol(
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
Error(:var errMsg) => errorWidget(
|
||||
errMsg: errMsg,
|
||||
onReload: _loginPageCtr.refreshQRCode,
|
||||
),
|
||||
};
|
||||
}),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
@@ -109,21 +126,27 @@ class _LoginPageState extends State<LoginPage> {
|
||||
),
|
||||
),
|
||||
Obx(
|
||||
() => GestureDetector(
|
||||
onTap: () => Utils.copyText(
|
||||
_loginPageCtr.codeInfo['data']?['url'] ?? '',
|
||||
toastText: '已复制到剪贴板,可粘贴至已登录的app私信处发送,然后点击已发送的链接打开',
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
|
||||
child: Text(
|
||||
_loginPageCtr.codeInfo['data']?['url'] ?? "",
|
||||
style: theme.textTheme.labelSmall!.copyWith(
|
||||
color: theme.colorScheme.onSurface.withValues(alpha: 0.4),
|
||||
() {
|
||||
final url = _loginPageCtr.codeInfo.value.dataOrNull?.url ?? '';
|
||||
return GestureDetector(
|
||||
onTap: () => Utils.copyText(
|
||||
url,
|
||||
toastText: '已复制到剪贴板,可粘贴至已登录的app私信处发送,然后点击已发送的链接打开',
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 20,
|
||||
vertical: 20,
|
||||
),
|
||||
child: Text(
|
||||
url,
|
||||
style: theme.textTheme.labelSmall!.copyWith(
|
||||
color: theme.colorScheme.onSurface.withValues(alpha: 0.4),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
@@ -349,34 +372,31 @@ class _LoginPageState extends State<LoginPage> {
|
||||
const SizedBox(width: 12),
|
||||
Builder(
|
||||
builder: (context) {
|
||||
return PopupMenuButton<Map<String, dynamic>>(
|
||||
return PopupMenuButton(
|
||||
enabled: isMobile,
|
||||
padding: EdgeInsets.zero,
|
||||
tooltip:
|
||||
'选择国际冠码,'
|
||||
'当前为${_loginPageCtr.selectedCountryCodeId['cname']},'
|
||||
'+${_loginPageCtr.selectedCountryCodeId['country_id']}',
|
||||
onSelected: (Map<String, dynamic> type) {},
|
||||
'当前为${_loginPageCtr.selectedCountryCodeId.cname},'
|
||||
'+${_loginPageCtr.selectedCountryCodeId.countryId}',
|
||||
onSelected: (item) {
|
||||
_loginPageCtr.selectedCountryCodeId = item;
|
||||
(context as Element).markNeedsBuild();
|
||||
},
|
||||
initialValue: _loginPageCtr.selectedCountryCodeId,
|
||||
itemBuilder: (_) => _loginPageCtr
|
||||
.internationalDialingPrefix
|
||||
.map((Map<String, dynamic> item) {
|
||||
return PopupMenuItem<Map<String, dynamic>>(
|
||||
onTap: () {
|
||||
_loginPageCtr.selectedCountryCodeId = item;
|
||||
(context as Element).markNeedsBuild();
|
||||
},
|
||||
itemBuilder: (_) =>
|
||||
Constants.internationalDialingPrefix.map((item) {
|
||||
return PopupMenuItem(
|
||||
value: item,
|
||||
child: Row(
|
||||
children: [
|
||||
Text(item['cname']),
|
||||
Text(item.cname),
|
||||
const Spacer(),
|
||||
Text("+${item['country_id']}"),
|
||||
Text("+${item.countryId}"),
|
||||
],
|
||||
),
|
||||
);
|
||||
})
|
||||
.toList(),
|
||||
}).toList(),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(
|
||||
@@ -385,7 +405,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Text(
|
||||
"+${_loginPageCtr.selectedCountryCodeId['country_id']}",
|
||||
"+${_loginPageCtr.selectedCountryCodeId.countryId}",
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -57,10 +57,10 @@ class _PopularSeriesPageState extends State<PopularSeriesPage> with GridMixin {
|
||||
return gridSkeleton;
|
||||
case Success<List<HotVideoItemModel>?>(:var response):
|
||||
Widget sliver;
|
||||
if (response?.isNotEmpty == true) {
|
||||
if (response != null && response.isNotEmpty == true) {
|
||||
sliver = SliverGrid.builder(
|
||||
gridDelegate: gridDelegate,
|
||||
itemCount: response!.length,
|
||||
itemCount: response.length,
|
||||
itemBuilder: (context, index) {
|
||||
final item = response[index];
|
||||
return VideoCardH(
|
||||
@@ -126,7 +126,6 @@ class _PopularSeriesPageState extends State<PopularSeriesPage> with GridMixin {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
final theme = Theme.of(context);
|
||||
return Dialog(
|
||||
clipBehavior: Clip.hardEdge,
|
||||
child: SizedBox(
|
||||
@@ -140,39 +139,27 @@ class _PopularSeriesPageState extends State<PopularSeriesPage> with GridMixin {
|
||||
itemBuilder: (context, index) {
|
||||
final item = seriesList[index];
|
||||
final isCurr = index == currIndex;
|
||||
Widget child = Text(
|
||||
item.name!,
|
||||
style: const TextStyle(fontSize: 14),
|
||||
);
|
||||
if (isCurr) {
|
||||
child = Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
child,
|
||||
const Icon(Icons.check, size: 18),
|
||||
],
|
||||
);
|
||||
}
|
||||
return Material(
|
||||
color: isCurr ? theme.highlightColor : null,
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
Get.back();
|
||||
if (!isCurr) {
|
||||
_controller
|
||||
..number = item.number!
|
||||
..onReload();
|
||||
}
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsetsGeometry.symmetric(
|
||||
horizontal: 16,
|
||||
),
|
||||
child: Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
return ListTile(
|
||||
dense: true,
|
||||
minTileHeight: 44,
|
||||
selected: isCurr,
|
||||
onTap: () {
|
||||
Get.back();
|
||||
if (!isCurr) {
|
||||
_controller
|
||||
..number = item.number!
|
||||
..onReload();
|
||||
}
|
||||
},
|
||||
title: Text(
|
||||
item.name!,
|
||||
style: const TextStyle(fontSize: 14),
|
||||
),
|
||||
trailing: isCurr
|
||||
? const Icon(Icons.check, size: 18)
|
||||
: null,
|
||||
contentPadding: const EdgeInsetsGeometry.symmetric(
|
||||
horizontal: 16,
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -7,9 +7,8 @@ import 'package:get/get.dart';
|
||||
|
||||
class NoteListPageCtr
|
||||
extends CommonListController<VideoNoteData, VideoNoteItemModel> {
|
||||
NoteListPageCtr({this.oid, this.upperMid});
|
||||
final dynamic oid;
|
||||
final dynamic upperMid;
|
||||
NoteListPageCtr({required this.oid});
|
||||
final int oid;
|
||||
|
||||
RxInt count = (-1).obs;
|
||||
|
||||
@@ -37,7 +36,6 @@ class NoteListPageCtr
|
||||
Future<LoadingState<VideoNoteData>> customGetData() =>
|
||||
VideoHttp.getVideoNoteList(
|
||||
oid: oid,
|
||||
uperMid: upperMid,
|
||||
page: page,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -20,17 +20,15 @@ class NoteListPage extends CommonSlidePage {
|
||||
super.key,
|
||||
super.enableSlide,
|
||||
required this.heroTag,
|
||||
this.oid,
|
||||
this.upperMid,
|
||||
required this.oid,
|
||||
required this.isStein,
|
||||
required this.title,
|
||||
});
|
||||
|
||||
final dynamic heroTag;
|
||||
final dynamic oid;
|
||||
final dynamic upperMid;
|
||||
final String? heroTag;
|
||||
final int oid;
|
||||
final bool isStein;
|
||||
final dynamic title;
|
||||
final String? title;
|
||||
|
||||
@override
|
||||
State<NoteListPage> createState() => _NoteListPageState();
|
||||
@@ -39,7 +37,7 @@ class NoteListPage extends CommonSlidePage {
|
||||
class _NoteListPageState extends State<NoteListPage>
|
||||
with SingleTickerProviderStateMixin, CommonSlideMixin {
|
||||
late final _controller = Get.put(
|
||||
NoteListPageCtr(oid: widget.oid, upperMid: widget.upperMid),
|
||||
NoteListPageCtr(oid: widget.oid),
|
||||
tag: widget.heroTag,
|
||||
);
|
||||
|
||||
|
||||
@@ -343,8 +343,8 @@ class PlPlayerController {
|
||||
late int subtitlePaddingH = Pref.subtitlePaddingH;
|
||||
late int subtitlePaddingB = Pref.subtitlePaddingB;
|
||||
late double subtitleBgOpaticy = Pref.subtitleBgOpaticy;
|
||||
late bool showVipDanmaku = Pref.showVipDanmaku;
|
||||
late bool showSpecialDanmaku = Pref.showSpecialDanmaku;
|
||||
final bool showVipDanmaku = Pref.showVipDanmaku; // loop unswitching
|
||||
final bool showSpecialDanmaku = Pref.showSpecialDanmaku;
|
||||
late double subtitleStrokeWidth = Pref.subtitleStrokeWidth;
|
||||
late int subtitleFontWeight = Pref.subtitleFontWeight;
|
||||
|
||||
|
||||
@@ -55,6 +55,25 @@ class AccountManager extends Interceptor {
|
||||
Api.searchByType,
|
||||
Api.dynSearch,
|
||||
Api.searchArchive,
|
||||
|
||||
// Api.memberInfo,
|
||||
// Api.bgmDetail,
|
||||
// Api.space,
|
||||
// Api.spaceAudio,
|
||||
// Api.spaceComic,
|
||||
// Api.spaceArchive,
|
||||
// Api.spaceChargingArchive,
|
||||
// Api.spaceSeason,
|
||||
// Api.spaceSeries,
|
||||
// Api.spaceBangumi,
|
||||
// Api.spaceOpus,
|
||||
// Api.spaceFav,
|
||||
// Api.seasonSeries,
|
||||
// Api.matchInfo,
|
||||
// Api.articleList,
|
||||
// Api.opusDetail,
|
||||
// Api.articleView,
|
||||
// Api.articleInfo,
|
||||
},
|
||||
AccountType.recommend: {
|
||||
Api.recommendListWeb,
|
||||
@@ -81,6 +100,11 @@ class AccountManager extends Interceptor {
|
||||
Api.liveSecondList,
|
||||
Api.liveRoomAreaList,
|
||||
Api.liveSearch,
|
||||
Api.videoRelation,
|
||||
Api.bgmRecommend,
|
||||
Api.dynTopicRcmd,
|
||||
Api.topicFeed,
|
||||
Api.topicTop,
|
||||
},
|
||||
// progress
|
||||
AccountType.video: {
|
||||
|
||||
@@ -748,12 +748,12 @@ abstract class PiliScheme {
|
||||
return false;
|
||||
case 'video':
|
||||
// if (kDebugMode) debugPrint('投稿');
|
||||
final Map<String, dynamic> map = IdUtils.matchAvorBv(input: path);
|
||||
if (map.isNotEmpty) {
|
||||
final res = IdUtils.matchAvorBv(input: path);
|
||||
if (res.isNotEmpty) {
|
||||
final queryParameters = uri.queryParameters;
|
||||
videoPush(
|
||||
map['AV'],
|
||||
map['BV'],
|
||||
res.av,
|
||||
res.bv,
|
||||
off: off,
|
||||
progress: queryParameters['dm_progress'],
|
||||
part: queryParameters['p'],
|
||||
@@ -910,11 +910,11 @@ abstract class PiliScheme {
|
||||
launchURL();
|
||||
return false;
|
||||
default:
|
||||
Map map = IdUtils.matchAvorBv(input: area?.split('?').first);
|
||||
if (map.isNotEmpty) {
|
||||
final res = IdUtils.matchAvorBv(input: area?.split('?').first);
|
||||
if (res.isNotEmpty) {
|
||||
videoPush(
|
||||
map['AV'],
|
||||
map['BV'],
|
||||
res.av,
|
||||
res.bv,
|
||||
off: off,
|
||||
);
|
||||
return true;
|
||||
|
||||
@@ -8,7 +8,9 @@ import 'package:path_provider/path_provider.dart';
|
||||
|
||||
abstract class CacheManage {
|
||||
// 获取缓存目录
|
||||
static Future<int> loadApplicationCache() async {
|
||||
static Future<int> loadApplicationCache([
|
||||
final num maxSize = double.infinity,
|
||||
]) async {
|
||||
/// clear all of image in memory
|
||||
// clearMemoryImageCache();
|
||||
/// get ImageCache
|
||||
@@ -20,55 +22,39 @@ abstract class CacheManage {
|
||||
if (Utils.isDesktop) {
|
||||
final dir = Directory('${tempDirectory.path}/libCachedImageData');
|
||||
if (dir.existsSync()) {
|
||||
return await getTotalSizeOfFilesInDir(dir);
|
||||
return await getTotalSizeOfFilesInDir(dir, maxSize);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
// get_storage directory
|
||||
Directory docDirectory = await getApplicationDocumentsDirectory();
|
||||
|
||||
int cacheSize = 0;
|
||||
// 获取缓存大小
|
||||
if (tempDirectory.existsSync()) {
|
||||
cacheSize += await getTotalSizeOfFilesInDir(tempDirectory);
|
||||
return await getTotalSizeOfFilesInDir(tempDirectory, maxSize);
|
||||
}
|
||||
|
||||
/// 获取缓存大小 dioCache
|
||||
if (docDirectory.existsSync()) {
|
||||
String dioCacheFileName =
|
||||
'${docDirectory.path}${Platform.pathSeparator}DioCache.db';
|
||||
var dioCacheFile = File(dioCacheFileName);
|
||||
if (dioCacheFile.existsSync()) {
|
||||
cacheSize += await getTotalSizeOfFilesInDir(dioCacheFile);
|
||||
}
|
||||
}
|
||||
|
||||
return cacheSize;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 循环计算文件的大小(递归)
|
||||
// 循环计算文件的大小
|
||||
static Future<int> getTotalSizeOfFilesInDir(
|
||||
final FileSystemEntity file,
|
||||
) async {
|
||||
if (file is File) {
|
||||
int length = await file.length();
|
||||
return int.parse(length.toString());
|
||||
}
|
||||
if (file is Directory) {
|
||||
final List<FileSystemEntity> children = file.listSync();
|
||||
int total = 0;
|
||||
for (final FileSystemEntity child in children) {
|
||||
total += await getTotalSizeOfFilesInDir(child);
|
||||
final Directory file, [
|
||||
final num maxSize = double.infinity,
|
||||
]) async {
|
||||
final children = file.list(recursive: true);
|
||||
int total = 0;
|
||||
await for (final child in children) {
|
||||
if (child is File) {
|
||||
total += await child.length();
|
||||
if (total >= maxSize) break;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
return 0;
|
||||
return total;
|
||||
}
|
||||
|
||||
// 缓存大小格式转换
|
||||
static String formatSize(num value) {
|
||||
List<String> unitArr = const ['B', 'K', 'M', 'G', 'T', 'P'];
|
||||
const unitArr = ['B', 'K', 'M', 'G', 'T', 'P'];
|
||||
int index = 0;
|
||||
while (value >= 1024) {
|
||||
index++;
|
||||
@@ -78,19 +64,6 @@ abstract class CacheManage {
|
||||
return size + unitArr.getOrElse(index, orElse: () => '');
|
||||
}
|
||||
|
||||
/// 清除 Documents 目录下的 DioCache.db
|
||||
static Future<void> clearApplicationCache() async {
|
||||
Directory directory = await getApplicationDocumentsDirectory();
|
||||
if (directory.existsSync()) {
|
||||
String dioCacheFileName =
|
||||
'${directory.path}${Platform.pathSeparator}DioCache.db';
|
||||
var dioCacheFile = File(dioCacheFileName);
|
||||
if (dioCacheFile.existsSync()) {
|
||||
dioCacheFile.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 清除 Library/Caches 目录及文件缓存
|
||||
static Future<void> clearLibraryCache() async {
|
||||
var tempDirectory = await getTemporaryDirectory();
|
||||
@@ -103,33 +76,20 @@ abstract class CacheManage {
|
||||
}
|
||||
if (tempDirectory.existsSync()) {
|
||||
// await appDocDir.delete(recursive: true);
|
||||
final List<FileSystemEntity> children = tempDirectory.listSync(
|
||||
recursive: false,
|
||||
);
|
||||
for (final FileSystemEntity file in children) {
|
||||
final children = tempDirectory.list(recursive: false);
|
||||
await for (final file in children) {
|
||||
await file.delete(recursive: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 递归方式删除目录及文件
|
||||
static Future<void> deleteDirectory(FileSystemEntity file) async {
|
||||
if (file is Directory) {
|
||||
final List<FileSystemEntity> children = file.listSync();
|
||||
for (final FileSystemEntity child in children) {
|
||||
await deleteDirectory(child);
|
||||
}
|
||||
}
|
||||
await file.delete();
|
||||
}
|
||||
|
||||
static Future<void> autoClearCache() async {
|
||||
if (Pref.autoClearCache) {
|
||||
await clearLibraryCache();
|
||||
} else {
|
||||
final maxCacheSize = Pref.maxCacheSize;
|
||||
if (maxCacheSize != 0) {
|
||||
final currCache = await loadApplicationCache();
|
||||
final currCache = await loadApplicationCache(maxCacheSize);
|
||||
if (currCache >= maxCacheSize) {
|
||||
await clearLibraryCache();
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@ abstract class IdUtils {
|
||||
'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf';
|
||||
static final invData = {for (var (i, c) in data.codeUnits.indexed) c: i};
|
||||
|
||||
static final bvRegex = RegExp(r'bv[0-9a-zA-Z]{10}', caseSensitive: false);
|
||||
static final bvRegex = RegExp(r'bv1[0-9a-zA-Z]{9}', caseSensitive: false);
|
||||
static final bvRegexExact = RegExp(
|
||||
r'^bv[0-9a-zA-Z]{10}$',
|
||||
r'^bv1[0-9a-zA-Z]{9}$',
|
||||
caseSensitive: false,
|
||||
);
|
||||
static final avRegex = RegExp(r'av(\d+)', caseSensitive: false);
|
||||
@@ -54,26 +54,25 @@ abstract class IdUtils {
|
||||
swap(bvidArr, 4, 7);
|
||||
|
||||
bvidArr.removeRange(0, 3);
|
||||
int tmp = bvidArr.fold(0, (pre, char) => pre * BASE + invData[char]!);
|
||||
return ((tmp & MASK_CODE) ^ XOR_CODE).toInt();
|
||||
final tmp = bvidArr.fold(0, (pre, char) => pre * BASE + invData[char]!);
|
||||
return (tmp & MASK_CODE) ^ XOR_CODE;
|
||||
}
|
||||
|
||||
// 匹配
|
||||
static Map<String, dynamic> matchAvorBv({String? input}) {
|
||||
final Map<String, dynamic> result = {};
|
||||
static AvBvRes matchAvorBv({String? input}) {
|
||||
if (input == null || input.isEmpty) {
|
||||
return result;
|
||||
return const (av: null, bv: null);
|
||||
}
|
||||
String? bvid = bvRegex.firstMatch(input)?.group(0);
|
||||
|
||||
late String? aid = avRegex.firstMatch(input)?.group(1);
|
||||
|
||||
if (bvid != null) {
|
||||
result['BV'] = bvid;
|
||||
return (av: null, bv: bvid);
|
||||
} else if (aid != null) {
|
||||
result['AV'] = int.parse(aid);
|
||||
return (av: int.parse(aid), bv: null);
|
||||
}
|
||||
return result;
|
||||
return const (av: null, bv: null);
|
||||
}
|
||||
|
||||
static String genBuvid3() {
|
||||
@@ -114,3 +113,9 @@ abstract class IdUtils {
|
||||
return '${randomTraceId.toString()}:${randomTraceId.toString().substring(16, 32)}:0:0';
|
||||
}
|
||||
}
|
||||
|
||||
typedef AvBvRes = ({int? av, String? bv});
|
||||
|
||||
extension AvBvExt on AvBvRes {
|
||||
bool get isNotEmpty => this != const (av: null, bv: null);
|
||||
}
|
||||
|
||||
@@ -24,33 +24,36 @@ abstract class GStorage {
|
||||
final String path = dir.path;
|
||||
await Hive.initFlutter('$path/hive');
|
||||
regAdapter();
|
||||
// 登录用户信息
|
||||
userInfo = await Hive.openBox<UserInfoData>(
|
||||
'userInfo',
|
||||
compactionStrategy: (int entries, int deletedEntries) {
|
||||
return deletedEntries > 2;
|
||||
},
|
||||
);
|
||||
// 本地缓存
|
||||
localCache = await Hive.openBox(
|
||||
'localCache',
|
||||
compactionStrategy: (int entries, int deletedEntries) {
|
||||
return deletedEntries > 4;
|
||||
},
|
||||
);
|
||||
// 设置
|
||||
setting = await Hive.openBox('setting');
|
||||
// 搜索历史
|
||||
historyWord = await Hive.openBox(
|
||||
'historyWord',
|
||||
compactionStrategy: (int entries, int deletedEntries) {
|
||||
return deletedEntries > 10;
|
||||
},
|
||||
);
|
||||
// 视频设置
|
||||
video = await Hive.openBox('video');
|
||||
|
||||
await Accounts.init();
|
||||
await Future.wait([
|
||||
// 登录用户信息
|
||||
Hive.openBox<UserInfoData>(
|
||||
'userInfo',
|
||||
compactionStrategy: (int entries, int deletedEntries) {
|
||||
return deletedEntries > 2;
|
||||
},
|
||||
).then((res) => userInfo = res),
|
||||
// 本地缓存
|
||||
Hive.openBox(
|
||||
'localCache',
|
||||
compactionStrategy: (int entries, int deletedEntries) {
|
||||
return deletedEntries > 4;
|
||||
},
|
||||
).then((res) => localCache = res),
|
||||
// 设置
|
||||
Hive.openBox('setting').then((res) => setting = res),
|
||||
// 搜索历史
|
||||
Hive.openBox(
|
||||
'historyWord',
|
||||
compactionStrategy: (int entries, int deletedEntries) {
|
||||
return deletedEntries > 10;
|
||||
},
|
||||
).then((res) => historyWord = res),
|
||||
// 视频设置
|
||||
Hive.openBox('video').then((res) => video = res),
|
||||
|
||||
Accounts.init(),
|
||||
]);
|
||||
}
|
||||
|
||||
static String exportAllSettings() {
|
||||
|
||||
@@ -819,10 +819,10 @@ abstract class Pref {
|
||||
static bool get minimizeOnExit =>
|
||||
_setting.get(SettingBoxKey.minimizeOnExit, defaultValue: true);
|
||||
|
||||
static List<double> get windowSize => _setting.get(
|
||||
SettingBoxKey.windowSize,
|
||||
defaultValue: const [1180.0, 720.0],
|
||||
);
|
||||
static Size get windowSize {
|
||||
final List<double>? size = _setting.get(SettingBoxKey.windowSize);
|
||||
return size == null ? const Size(1180.0, 720.0) : Size(size[0], size[1]);
|
||||
}
|
||||
|
||||
static List<double>? get windowPosition =>
|
||||
_setting.get(SettingBoxKey.windowPosition);
|
||||
|
||||
@@ -115,9 +115,9 @@ abstract class Update {
|
||||
static Future<void> onDownload(Map data) async {
|
||||
SmartDialog.dismiss();
|
||||
try {
|
||||
void download(plat) {
|
||||
void download(String plat) {
|
||||
if (data['assets'].isNotEmpty) {
|
||||
for (dynamic i in data['assets']) {
|
||||
for (Map<String, dynamic> i in data['assets']) {
|
||||
if (i['name'].contains(plat)) {
|
||||
PageUtils.launchURL(i['browser_download_url']);
|
||||
return;
|
||||
@@ -132,14 +132,8 @@ abstract class Update {
|
||||
AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo;
|
||||
// [arm64-v8a]
|
||||
download(androidInfo.supportedAbis.first);
|
||||
} else if (Platform.isIOS) {
|
||||
download('ios');
|
||||
} else if (Platform.isWindows) {
|
||||
download('windows');
|
||||
} else {
|
||||
throw UnsupportedError(
|
||||
'unsupported platform: ${Platform.operatingSystem}',
|
||||
);
|
||||
download(Platform.operatingSystem);
|
||||
}
|
||||
} catch (e) {
|
||||
if (kDebugMode) debugPrint('download error: $e');
|
||||
|
||||
@@ -44,10 +44,10 @@ abstract class UrlUtils {
|
||||
String pathSegment,
|
||||
String redirectUrl,
|
||||
) async {
|
||||
final Map matchRes = IdUtils.matchAvorBv(input: pathSegment);
|
||||
final matchRes = IdUtils.matchAvorBv(input: pathSegment);
|
||||
if (matchRes.isNotEmpty) {
|
||||
int? aid = matchRes['AV'];
|
||||
String? bvid = matchRes['BV'];
|
||||
final aid = matchRes.av;
|
||||
String? bvid = matchRes.bv;
|
||||
bvid ??= IdUtils.av2bv(aid!);
|
||||
final int? cid = await SearchHttp.ab2c(aid: aid, bvid: bvid);
|
||||
if (cid != null) {
|
||||
|
||||
@@ -28,17 +28,15 @@ abstract class Utils {
|
||||
static final bool isDesktop =
|
||||
Platform.isWindows || Platform.isMacOS || Platform.isLinux;
|
||||
|
||||
static Future<({double left, double top})> get windowOffset async {
|
||||
static Future<Offset> get windowOffset async {
|
||||
final windowPosition = Pref.windowPosition;
|
||||
if (windowPosition != null) {
|
||||
return (left: windowPosition[0], top: windowPosition[1]);
|
||||
return Offset(windowPosition[0], windowPosition[1]);
|
||||
}
|
||||
final Size windowSize = await windowManager.getSize();
|
||||
final Offset position = await calcWindowPosition(
|
||||
windowSize,
|
||||
return await calcWindowPosition(
|
||||
await windowManager.getSize(),
|
||||
Alignment.center,
|
||||
);
|
||||
return (left: position.dx, top: position.dy);
|
||||
}
|
||||
|
||||
static Future<bool> get isWiFi async {
|
||||
|
||||
@@ -1138,8 +1138,8 @@ packages:
|
||||
description:
|
||||
path: "libs/android/media_kit_libs_android_video"
|
||||
ref: "version_1.2.5"
|
||||
resolved-ref: f89452bc27af26324a83961c8286d4f41432a5f9
|
||||
url: "https://github.com/My-Responsitories/media-kit.git"
|
||||
resolved-ref: "902e962556c0bde4d384cd8f72b814598e5dfcf2"
|
||||
url: "https://github.com/bggRGjQaUbCoE/media-kit.git"
|
||||
source: git
|
||||
version: "1.3.7"
|
||||
media_kit_libs_ios_video:
|
||||
|
||||
@@ -245,7 +245,7 @@ dependency_overrides:
|
||||
font_awesome_flutter: 10.9.0
|
||||
media_kit_libs_android_video:
|
||||
git:
|
||||
url: https://github.com/My-Responsitories/media-kit.git
|
||||
url: https://github.com/bggRGjQaUbCoE/media-kit.git
|
||||
path: libs/android/media_kit_libs_android_video
|
||||
ref: version_1.2.5
|
||||
|
||||
|
||||
Reference in New Issue
Block a user