├── Airtable-Book ├── README.md ├── assets │ ├── Airtable-Book.box │ └── icon.png ├── config.json ├── main.js ├── scripts │ └── airtable.js └── strings │ ├── en.strings │ └── zh-Hans.strings ├── Airtable-Movie ├── README.md ├── assets │ ├── Airtable-Movie.box │ └── icon.png ├── config.json ├── main.js ├── scripts │ └── airtable.js └── strings │ ├── en.strings │ └── zh-Hans.strings ├── Airtable-douban ├── README.md ├── assets │ └── icon.png ├── config.json ├── main.js ├── scripts │ └── airtable.js └── strings │ ├── en.strings │ └── zh-Hans.strings ├── Avgle ├── Avgle List.js ├── Avgle.js ├── alert └── updateInfo ├── Google Translate.js ├── HList ├── HList.js └── updateInfo ├── Instagram Browser.js ├── JavBus ├── JavBus es6.js ├── JavBus.js ├── Readme.txt ├── bika.js ├── updateInfo └── wechat.jpg ├── LICENSE ├── Mtime Movie.js ├── Pushbullet.js ├── PushbulletPublic.js ├── README.md ├── SM.MS.js ├── Xvideos ├── Xvideos.js └── updateInfo ├── send file.js ├── tokenSetting.js ├── 尤物社区1.0.js ├── 欲望清单.js └── 秀美眉.js /Airtable-Book/README.md: -------------------------------------------------------------------------------- 1 | ### 本脚本用于记录想要读的书目 2 | 3 | 数据源采用豆瓣图书,记录采用airtable 4 | 5 | 使用前需要建立 airtable 相应的表格,配置 api key 6 | 7 | 脚本通过 safari 启动 -------------------------------------------------------------------------------- /Airtable-Book/assets/Airtable-Book.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZBrettonYe/Otaku_JSBox/cdf82bed6f38e3157830a847b92fee236b362ac5/Airtable-Book/assets/Airtable-Book.box -------------------------------------------------------------------------------- /Airtable-Book/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZBrettonYe/Otaku_JSBox/cdf82bed6f38e3157830a847b92fee236b362ac5/Airtable-Book/assets/icon.png -------------------------------------------------------------------------------- /Airtable-Book/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "widget" : { 3 | "height" : 0, 4 | "tintColor" : "", 5 | "iconColor" : "" 6 | }, 7 | "info" : { 8 | "url" : "", 9 | "author" : "", 10 | "types" : 15, 11 | "website" : "", 12 | "name" : "Airtable-Book", 13 | "version" : "1.0.0" 14 | }, 15 | "settings" : { 16 | "minOSVer" : "10.0.0", 17 | "minSDKVer" : "1.0.0", 18 | "rotateDisabled" : false, 19 | "autoKeyboardEnabled" : false, 20 | "keyboardToolbarEnabled" : false, 21 | "idleTimerDisabled" : false 22 | } 23 | } -------------------------------------------------------------------------------- /Airtable-Book/main.js: -------------------------------------------------------------------------------- 1 | var airtable = require('scripts/airtable'); 2 | var apiUrl = "https://api.douban.com/v2/book/" 3 | 4 | if (!$cache.get("apiKey")) { 5 | $input.text({ 6 | type: $kbType.default, 7 | placeholder: "Input Api Key", 8 | handler: function(text) { 9 | $cache.set("apiKey", text) 10 | $ui.alert($l10n("START")) 11 | } 12 | }) 13 | } else { 14 | if ($app.env !== $env.safari) { 15 | $ui.toast($l10n("LOAD"),10) 16 | let links = $detector.link($clipboard.text) 17 | if(links.length){ 18 | if(!/\/(\d{5,8})\//g.test(links[0])) wrong(); 19 | else getBook(links[0]); 20 | }else{ 21 | $ui.toast("",.1) 22 | $ui.alert($l10n("START")) 23 | } 24 | }else { 25 | $ui.toast($l10n("LOAD"),10) 26 | let item = $safari.items 27 | if(!/\/(\d{5,8})\//g.test(item.baseURI)) wrong(); 28 | else getBook(item.baseURI); 29 | } 30 | } 31 | 32 | function getBook(url){ 33 | let id = /\/(\d{5,8})\//g.exec(url)[1] 34 | $http.get({ 35 | url: apiUrl + id, 36 | handler: function(resp) { 37 | if (!resp.response) $ui.alert($l10n("DBERROR")) 38 | let data = resp.data 39 | let content = { 40 | "fields": { 41 | "Title": data.title, 42 | "Author": data.author.join(), 43 | "Translator": data.translator.join(), 44 | "Publish Time": data.pubdate, 45 | "Pages": data.pages, 46 | "Price": data.price, 47 | "Public Score": data.rating.average, 48 | // "My Score": "", 49 | "Read": false, 50 | "Douban Link": data.alt, 51 | "Sub Title": data.subtitle, 52 | "Publisher": data.publisher, 53 | "Author Intro": data.author_intro, 54 | "Summary": data.summary, 55 | "Cover": [{ 56 | "url": data.images.large 57 | }] 58 | } 59 | } 60 | $console.log(content) 61 | airtable.post(content) 62 | } 63 | }) 64 | } 65 | 66 | function wrong(){ 67 | $ui.toast("",.1) 68 | $ui.alert($l10n("WRONG")) 69 | return 70 | } 71 | 72 | -------------------------------------------------------------------------------- /Airtable-Book/scripts/airtable.js: -------------------------------------------------------------------------------- 1 | function getAirtable(){ 2 | $http.get({ 3 | url: 'https://api.airtable.com/v0/appJJmTgbDFTEnJxz/Books?maxRecords=3&view=Grid%20view', 4 | header: {"Authorization": "Bearer "+$cache.get("apiKey")}, 5 | handler: function(resp){ 6 | var data = resp.data 7 | $console.log(data) 8 | } 9 | }) 10 | } 11 | 12 | function postAirtable(datas){ 13 | $ui.loading = true 14 | $http.post({ 15 | url: 'https://api.airtable.com/v0/appJJmTgbDFTEnJxz/Books', 16 | header: { 17 | "Authorization": "Bearer "+$cache.get("apiKey"), 18 | }, 19 | body: datas, 20 | timeout:3, 21 | handler: function(resp){ 22 | $ui.loading = false 23 | var data = resp.data 24 | $console.log(data) 25 | if(data.id)$ui.toast($l10n("SUCCEED")); 26 | else $ui.alert($l10n("ERROR")); 27 | } 28 | }) 29 | } 30 | 31 | module.exports = { 32 | post: postAirtable, 33 | get: getAirtable 34 | } -------------------------------------------------------------------------------- /Airtable-Book/strings/en.strings: -------------------------------------------------------------------------------- 1 | "OK" = "OK"; 2 | "DONE" = "Done"; 3 | "HELLO_WORLD" = "Hello, World!"; 4 | "START" = "Please run in Safari"; 5 | "SUCCEED" = "Succeed!"; 6 | "ERROR" = "Error ❌"; 7 | "DBERROR" = "Douban Book URL Error ❌"; 8 | "LOAD" = "Loading..."; -------------------------------------------------------------------------------- /Airtable-Book/strings/zh-Hans.strings: -------------------------------------------------------------------------------- 1 | "OK" = "好的"; 2 | "DONE" = "完成"; 3 | "HELLO_WORLD" = "你好,世界!"; 4 | "START" = "请从 Safari 启动"; 5 | "SUCCEED" = "成功!"; 6 | "ERROR" = "失败 ❌"; 7 | "DBERROR" = "豆瓣图书 URL 错误 ❌"; 8 | "LOAD" = "载入中..."; -------------------------------------------------------------------------------- /Airtable-Movie/README.md: -------------------------------------------------------------------------------- 1 | ### 本脚本用于记录想要读的书目 2 | 3 | 数据源采用豆瓣图书,记录采用airtable 4 | 5 | 使用前需要建立 airtable 相应的表格,配置 api key 6 | 7 | 脚本通过 safari 启动 -------------------------------------------------------------------------------- /Airtable-Movie/assets/Airtable-Movie.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZBrettonYe/Otaku_JSBox/cdf82bed6f38e3157830a847b92fee236b362ac5/Airtable-Movie/assets/Airtable-Movie.box -------------------------------------------------------------------------------- /Airtable-Movie/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZBrettonYe/Otaku_JSBox/cdf82bed6f38e3157830a847b92fee236b362ac5/Airtable-Movie/assets/icon.png -------------------------------------------------------------------------------- /Airtable-Movie/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings" : { 3 | "minOSVer" : "10.0.0", 4 | "minSDKVer" : "1.0.0", 5 | "idleTimerDisabled" : false, 6 | "autoKeyboardEnabled" : false, 7 | "keyboardToolbarEnabled" : false, 8 | "rotateDisabled" : false 9 | }, 10 | "info" : { 11 | "version" : "1.0.0", 12 | "author" : "", 13 | "types" : 15, 14 | "url" : "", 15 | "website" : "", 16 | "name" : "Airtable-Book" 17 | }, 18 | "widget" : { 19 | "tintColor" : "", 20 | "iconColor" : "", 21 | "height" : 0 22 | } 23 | } -------------------------------------------------------------------------------- /Airtable-Movie/main.js: -------------------------------------------------------------------------------- 1 | var airtable = require('scripts/airtable'); 2 | var apiUrl = "https://api.douban.com/v2/movie/subject/" 3 | 4 | if (!$cache.get("apiKey")) { 5 | $input.text({ 6 | type: $kbType.default, 7 | placeholder: "Input Api Key", 8 | handler: function(text) { 9 | $cache.set("apiKey", text) 10 | $ui.alert($l10n("START")) 11 | } 12 | }) 13 | } else { 14 | if ($app.env !== $env.safari) { 15 | $ui.toast($l10n("LOAD"),10) 16 | let links = $detector.link($clipboard.text) 17 | if(links.length){ 18 | if(!/\/(\d{5,8})\//g.test(links[0])) wrong(); 19 | else getMovie(links[0]); 20 | }else{ 21 | $ui.toast("",.1) 22 | $ui.alert($l10n("START")) 23 | } 24 | }else { 25 | $ui.toast($l10n("LOAD"),10) 26 | let item = $safari.items 27 | if(!/\/(\d{5,8})\//g.test(item.baseURI)) wrong(); 28 | else getMovie(item.baseURI); 29 | } 30 | } 31 | 32 | function getMovie(url) { 33 | let id = /\/(\d{5,8})\//g.exec(url)[1] 34 | $http.get({ 35 | url: apiUrl + id, 36 | handler: function(resp) { 37 | if (!resp.response) $ui.alert($l10n("DBERROR")) 38 | let data = resp.data 39 | let content = { 40 | "fields": { 41 | "Title": data.title, 42 | "Original Title": data.original_title, 43 | "Year": data.year, 44 | "Director": data.directors.map(i=>i.name).join(), 45 | "Cast": data.casts.map(i=>i.name).join(), 46 | "Genre": data.genres.join(), 47 | "Country": data.countries.join(), 48 | "Douban Link": data.alt, 49 | "Aka": data.aka.join(), 50 | "Summary": data.summary, 51 | "Douban Rating":data.rating.average, 52 | "Subtype": data.subtype, 53 | "Cover": [{ 54 | "url": data.images.large 55 | }] 56 | } 57 | } 58 | $console.log(content) 59 | airtable.post(content) 60 | } 61 | }) 62 | } 63 | 64 | function wrong(){ 65 | $ui.toast("",.1) 66 | $ui.alert($l10n("WRONG")) 67 | return 68 | } -------------------------------------------------------------------------------- /Airtable-Movie/scripts/airtable.js: -------------------------------------------------------------------------------- 1 | function getAirtable(){ 2 | $http.get({ 3 | url: 'https://api.airtable.com/v0/appJJmTgbDFTEnJxz/Movies?maxRecords=3&view=Grid%20view', 4 | header: {"Authorization": "Bearer "+ $cache.get("apiKey")}, 5 | handler: function(resp){ 6 | var data = resp.data 7 | $console.log(data) 8 | } 9 | }) 10 | } 11 | 12 | function postAirtable(datas){ 13 | $ui.loading = true 14 | $http.post({ 15 | url: 'https://api.airtable.com/v0/appJJmTgbDFTEnJxz/Movies', 16 | header: { 17 | "Authorization": "Bearer " + $cache.get("apiKey"), 18 | }, 19 | body: datas, 20 | timeout:3, 21 | handler: function(resp){ 22 | $ui.loading = false 23 | var data = resp.data 24 | $console.log(data) 25 | if(data.id)$ui.toast($l10n("SUCCEED")); 26 | else $ui.alert($l10n("ERROR")); 27 | } 28 | }) 29 | } 30 | 31 | module.exports = { 32 | post: postAirtable, 33 | get: getAirtable 34 | } -------------------------------------------------------------------------------- /Airtable-Movie/strings/en.strings: -------------------------------------------------------------------------------- 1 | "OK" = "OK"; 2 | "DONE" = "Done"; 3 | "HELLO_WORLD" = "Hello, World!"; 4 | "START" = "Please run in Safari"; 5 | "SUCCEED" = "Succeed!"; 6 | "ERROR" = "Error ❌"; 7 | "DBERROR" = "Douban Book URL Error ❌"; 8 | "LOAD" = "Loading..."; -------------------------------------------------------------------------------- /Airtable-Movie/strings/zh-Hans.strings: -------------------------------------------------------------------------------- 1 | "OK" = "好的"; 2 | "DONE" = "完成"; 3 | "HELLO_WORLD" = "你好,世界!"; 4 | "START" = "请从 Safari 启动"; 5 | "SUCCEED" = "成功!"; 6 | "ERROR" = "失败 ❌"; 7 | "DBERROR" = "豆瓣图书 URL 错误 ❌"; 8 | "LOAD" = "载入中..."; -------------------------------------------------------------------------------- /Airtable-douban/README.md: -------------------------------------------------------------------------------- 1 | ### 本脚本用于记录想要读的书目 2 | 3 | 数据源采用豆瓣图书,记录采用airtable 4 | 5 | 使用前需要建立 airtable 相应的表格,配置 api key 6 | 7 | 脚本通过 safari 启动 -------------------------------------------------------------------------------- /Airtable-douban/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZBrettonYe/Otaku_JSBox/cdf82bed6f38e3157830a847b92fee236b362ac5/Airtable-douban/assets/icon.png -------------------------------------------------------------------------------- /Airtable-douban/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "widget" : { 3 | "tintColor" : "", 4 | "iconColor" : "", 5 | "height" : 0 6 | }, 7 | "info" : { 8 | "website" : "", 9 | "author" : "", 10 | "types" : 15, 11 | "name" : "Airtable-Book", 12 | "url" : "", 13 | "version" : "1.0.0" 14 | }, 15 | "settings" : { 16 | "minOSVer" : "10.0.0", 17 | "minSDKVer" : "1.0.0", 18 | "rotateDisabled" : false, 19 | "autoKeyboardEnabled" : false, 20 | "keyboardToolbarEnabled" : false, 21 | "idleTimerDisabled" : false 22 | } 23 | } -------------------------------------------------------------------------------- /Airtable-douban/main.js: -------------------------------------------------------------------------------- 1 | var airtable = require('scripts/airtable'); 2 | 3 | if (!$cache.get("apiKey")) { 4 | $input.text({ 5 | type: $kbType.default, 6 | placeholder: "Input Api Key", 7 | handler: function(text) { 8 | $cache.set("apiKey", text) 9 | $ui.alert($l10n("START")) 10 | } 11 | }) 12 | } else { 13 | if ($app.env !== $env.safari) { 14 | $ui.toast($l10n("LOAD"),10) 15 | let links = $detector.link($clipboard.text) 16 | if(links.length){ 17 | if(!/\/(\d{5,8})\//g.test(links[0])) wrong(); 18 | else postData(links[0]); 19 | }else{ 20 | $ui.toast("",.1) 21 | $ui.alert($l10n("START")) 22 | } 23 | }else { 24 | $ui.toast($l10n("LOAD"),10) 25 | let item = $safari.items 26 | if(!/\/(\d{5,8})\//g.test(item.baseURI)) wrong(); 27 | else postData(item.baseURI); 28 | } 29 | } 30 | 31 | function postData(url){ 32 | let id = /\/(\d{5,8})\//g.exec(url)[1] 33 | if(/.*movie.*/.test(url)){ //获取 type 34 | data = airtable.postMovieData(url,id) 35 | } else{ 36 | data = airtable.postBookData(url,id) 37 | } 38 | } 39 | 40 | function wrong(){ 41 | $ui.toast("",.1) 42 | $ui.alert($l10n("WRONG")) 43 | return 44 | } 45 | 46 | -------------------------------------------------------------------------------- /Airtable-douban/scripts/airtable.js: -------------------------------------------------------------------------------- 1 | function getAirtable(){ 2 | $http.get({ 3 | url: 'https://api.airtable.com/v0/appJJmTgbDFTEnJxz/Books?maxRecords=3&view=Grid%20view', 4 | header: {"Authorization": "Bearer "+$cache.get("apiKey")}, 5 | handler: function(resp){ 6 | var data = resp.data 7 | $console.log(data) 8 | } 9 | }) 10 | } 11 | 12 | function postAirtable(datas,type){ 13 | $ui.loading = true 14 | $http.post({ 15 | url: 'https://api.airtable.com/v0/appJJmTgbDFTEnJxz/' + type + 's', 16 | header: { 17 | "Authorization": "Bearer "+$cache.get("apiKey"), 18 | }, 19 | body: datas, 20 | timeout:3, 21 | handler: function(resp){ 22 | $ui.loading = false 23 | var data = resp.data 24 | // $console.log(data) 25 | if(data.id)$ui.toast($l10n("SUCCEED")); 26 | else $ui.alert($l10n("ERROR")); 27 | } 28 | }) 29 | } 30 | 31 | function postMovieData(url, id){ 32 | let apiUrl = "https://api.douban.com/v2/movie/subject/" 33 | $http.get({ 34 | url: apiUrl + id, 35 | handler: function(resp) { 36 | if (!resp.response) $ui.alert($l10n("DBERROR")) 37 | let data = resp.data 38 | let content = { 39 | "fields": { 40 | "Title": data.title, 41 | "Original Title": data.original_title, 42 | "Year": data.year, 43 | "Director": data.directors.map(i=>i.name).join(","), 44 | "Cast": data.casts.map(i=>i.name).join(","), 45 | "Genre": data.genres.join(","), 46 | "Country": data.countries.join(","), 47 | "Douban Link": data.alt, 48 | "Aka": data.aka.join(","), 49 | "Summary": data.summary, 50 | "Douban Rating":data.rating.average, 51 | "Subtype": data.subtype, 52 | "Cover": [{ 53 | "url": data.images.large 54 | }] 55 | } 56 | } 57 | $console.log(content) 58 | postAirtable(content,"Movie") 59 | } 60 | }) 61 | } 62 | 63 | function postBookData(url, id){ 64 | let apiUrl = "https://api.douban.com/v2/book/" 65 | $http.get({ 66 | url: apiUrl + id, 67 | handler: function(resp) { 68 | if (!resp.response) $ui.alert($l10n("DBERROR")) 69 | let data = resp.data 70 | let content = { 71 | "fields": { 72 | "Title": data.title, 73 | "Author": data.author.join(","), 74 | "Translator": data.translator.join(","), 75 | "Publish Time": data.pubdate, 76 | "Pages": data.pages, 77 | "Price": data.price, 78 | "Douban Rating": data.rating.average, 79 | // "My Score": "", 80 | "Read": false, 81 | "Douban Link": data.alt, 82 | "Sub Title": data.subtitle, 83 | "Publisher": data.publisher, 84 | "Author Intro": data.author_intro, 85 | "Summary": data.summary, 86 | "Cover": [{ 87 | "url": data.images.large 88 | }] 89 | } 90 | } 91 | $console.log(content) 92 | postAirtable(content,"Book") 93 | } 94 | }) 95 | } 96 | 97 | module.exports = { 98 | post: postAirtable, 99 | get: getAirtable, 100 | postMovieData:postMovieData, 101 | postBookData:postBookData 102 | } -------------------------------------------------------------------------------- /Airtable-douban/strings/en.strings: -------------------------------------------------------------------------------- 1 | "OK" = "OK"; 2 | "DONE" = "Done"; 3 | "HELLO_WORLD" = "Hello, World!"; 4 | "START" = "Please run in Safari or copy link"; 5 | "SUCCEED" = "Succeed!"; 6 | "ERROR" = "Error ❌"; 7 | "DBERROR" = "Douban URL Error ❌"; 8 | "LOAD" = "Loading..."; 9 | "WRONG" = "Cannot Detect ID ❌"; -------------------------------------------------------------------------------- /Airtable-douban/strings/zh-Hans.strings: -------------------------------------------------------------------------------- 1 | "OK" = "好的"; 2 | "DONE" = "完成"; 3 | "HELLO_WORLD" = "你好,世界!"; 4 | "START" = "请从 Safari 启动或复制链接启动"; 5 | "SUCCEED" = "成功!"; 6 | "ERROR" = "失败 ❌"; 7 | "DBERROR" = "豆瓣 URL 错误 ❌"; 8 | "LOAD" = "载入中..."; 9 | "WRONG" = "未检测到 id ❌"; -------------------------------------------------------------------------------- /Avgle/Avgle List.js: -------------------------------------------------------------------------------- 1 | /* 2 | Avgle X JSBox 3 | 4 | 你口袋里的观影利器。 5 | 6 | 庞大的在线片源库: 7 | 8 | 骑兵、步兵、日韩、欧美,近9万部影片日日更新。 9 | 10 | 脚本特点: 11 | 12 | 1.无广告困扰,想看就看; 13 | 14 | 2.基本还原官网功能,方便省心; 15 | 16 | 3.支持收藏,方便巩固温习。 17 | 18 | 作者联系:https://t.me/nicked 19 | 20 | */ 21 | 22 | version = 1.5 23 | const filters = { 24 | "Time": { 25 | "全部视频": "a", 26 | "今日新增": "t", 27 | "本周新增": "w", 28 | "本月新增": "m" 29 | }, 30 | "View": { 31 | "最新添加": "mr", 32 | "最多观看": "mv", 33 | "最多评论": "md", 34 | "最多喜欢": "tf" 35 | } 36 | } 37 | const filterName = { 38 | "a": "共计", 39 | "t": "今日新增", 40 | "w": "本周新增", 41 | "m": "本月新增", 42 | "mr": "Most Recent", 43 | "mv": "Most Viewed", 44 | "md": "Most Commented", 45 | "tr": "Top Rated", 46 | "tf": "Top Favorites" 47 | } 48 | 49 | 50 | const content = ["影片", "合集", "分类", "收藏夹"] 51 | 52 | const favColor = $color("#e2e9ff") 53 | 54 | const filterView = { 55 | type: "view", 56 | props: { 57 | id: "filterView", 58 | radius: 7, 59 | bgcolor: $color("white"), 60 | borderWidth: 1, 61 | borderColor: $color("#5c98f9") 62 | }, 63 | views: [{ 64 | type: "list", 65 | props: { 66 | id: "filtersT", 67 | //separatorHidden: true, 68 | rowHeight: 30, 69 | bgcolor: $color("white"), 70 | template: [{ 71 | type: "label", 72 | props: { 73 | id: "filterLabel", 74 | bgcolor: $color("white"), 75 | font: $font(15), 76 | align: $align.center 77 | }, 78 | layout: $layout.fill 79 | 80 | }], 81 | 82 | scrollEnabled: false 83 | }, 84 | events: { 85 | didSelect(sender, indexPath, data) { 86 | if ($("player")) { 87 | $("player").stopLoading(); 88 | $("player").remove() 89 | }; 90 | $device.taptic(0); 91 | cacheFilters.Time = filters.Time[data.filterLabel.text]; 92 | $("filterView").remove(); 93 | filterExist = false; 94 | $("videos").contentOffset = $point(0, 0); 95 | $cache.set("cacheFilters", cacheFilters); 96 | page = -1; 97 | $("videos").data = []; 98 | if(mode == "Cat"){ 99 | getVideoData(); 100 | } else if (mode == "Search"){ 101 | getVideoData(); 102 | }else{ 103 | $("search").text = ""; 104 | mode = "Videos"; 105 | getVideoData(); 106 | } 107 | }, 108 | 109 | }, 110 | layout: function(make, view) { 111 | make.top.inset(0) 112 | make.left.inset(0) 113 | make.width.equalTo(100) 114 | make.height.equalTo(145) 115 | } 116 | }, { 117 | type: "list", 118 | props: { 119 | id: "filtersV", 120 | //separatorHidden: true, 121 | rowHeight: 30, 122 | bgcolor: $color("white"), 123 | template: [{ 124 | type: "label", 125 | props: { 126 | id: "filterLabel", 127 | bgcolor: $color("white"), 128 | font: $font(15), 129 | align: $align.center 130 | }, 131 | layout: $layout.fill 132 | 133 | }], 134 | 135 | scrollEnabled: false 136 | }, 137 | events: { 138 | didSelect(sender, indexPath, data) { 139 | if ($("player")) { 140 | $("player").stopLoading(); 141 | $("player").remove() 142 | }; 143 | $device.taptic(0); 144 | $("filterView").remove(); 145 | filterExist = false; 146 | cacheFilters.View = filters.View[data.filterLabel.text]; 147 | $cache.set("cacheFilters", cacheFilters); 148 | if(contentMode == "Collections"){ 149 | page = -1 150 | $("CCList").contentOffset = $point(0, 0); 151 | getCollectionData() 152 | return 153 | } 154 | $("videos").contentOffset = $point(0, 0); 155 | page = -1; 156 | $("videos").data = []; 157 | if(mode == "Cat"){ 158 | getVideoData(); 159 | } else if (mode == "Search"){ 160 | getVideoData(); 161 | }else { 162 | $("search").text = ""; 163 | mode = "Videos"; 164 | getVideoData(); 165 | } 166 | }, 167 | 168 | }, 169 | layout: function(make, view) { 170 | make.top.inset(0) 171 | make.left.equalTo($("filtersT").right) 172 | make.right.inset(0) 173 | make.height.equalTo(145) 174 | } 175 | }], 176 | layout: function(make, view) { 177 | make.top.inset(45) 178 | make.left.inset(15) 179 | make.width.equalTo(200) 180 | make.height.equalTo(0) 181 | } 182 | } 183 | 184 | const contentView = { 185 | type: "view", 186 | props: { 187 | id: "contentView", 188 | radius: 7, 189 | bgcolor: $color("white"), 190 | borderWidth: 1, 191 | borderColor: $color("#5c98f9") 192 | }, 193 | views: [{ 194 | type: "list", 195 | props: { 196 | id: "contentList", 197 | //separatorHidden: true, 198 | rowHeight: 30, 199 | bgcolor: $color("white"), 200 | scrollEnabled: false, 201 | template: [{ 202 | type: "label", 203 | props: { 204 | id: "contentLabel", 205 | bgcolor: $color("white"), 206 | font: $font(15), 207 | align: $align.center 208 | }, 209 | layout: $layout.fill 210 | }], 211 | }, 212 | events: { 213 | didSelect(sender, indexPath, data) { 214 | $device.taptic(0); 215 | $("searchResult").text = "" 216 | $("contentView").remove(); 217 | contentExist = false; 218 | if ($("player")) { 219 | $("player").stopLoading(); 220 | $("player").remove() 221 | }; 222 | $("search").text = ""; 223 | var c = data.contentLabel.text; 224 | if (c == "影片") { 225 | cacheContent = "影片"; 226 | $cache.set("cacheContent", cacheContent); 227 | contentMode = "Videos"; 228 | if (CCExist == true) { 229 | CCExist = false; 230 | $("CCView").remove() 231 | VFExist = true; 232 | $("Avgle").add(VFView); 233 | } 234 | if (FExist == true) { 235 | FExist = false; 236 | $("FView").remove() 237 | VFExist = true; 238 | $("Avgle").add(VFView); 239 | } 240 | mode = "Videos"; 241 | $("videos").contentOffset = $point(0, 0); 242 | $("videos").data = []; 243 | page = -1; 244 | getVideoData(); 245 | } else if (c == "合集") { 246 | cacheContent = "合集"; 247 | $cache.set("cacheContent", cacheContent); 248 | cacheFilters.View = "bw"; 249 | $cache.set("cacheFiltes",cacheFilters) 250 | contentMode = "Collections"; 251 | if (VFExist == true) { 252 | VFExist = false; 253 | $("VFView").remove() 254 | CCExist = true; 255 | $("Avgle").add(CCView) 256 | } 257 | if (FExist == true) { 258 | FExist = false; 259 | $("FView").remove() 260 | CCExist = true; 261 | $("Avgle").add(CCView) 262 | } 263 | $("CCList").contentOffset = $point(0, 0); 264 | page = -1; 265 | $("CCList").data = [] 266 | getCollectionData() 267 | } else if (c == "分类") { 268 | cacheContent = "分类"; 269 | $cache.set("cacheContent", cacheContent); 270 | contentMode = "Categories" 271 | if (VFExist == true) { 272 | VFExist = false; 273 | $("VFView").remove() 274 | CCExist = true; 275 | $("Avgle").add(CCView) 276 | } 277 | if (FExist == true) { 278 | FExist = false; 279 | $("FView").remove() 280 | CCExist = true; 281 | $("Avgle").add(CCView) 282 | } 283 | $("CCList").contentOffset = $point(0, 0); 284 | getCategoryData() 285 | } else if (c == "收藏夹") { 286 | cacheContent = "收藏夹"; 287 | $cache.set("cacheContent", cacheContent); 288 | contentMode = "Favorites" 289 | if (CCExist == true) { 290 | CCExist = false; 291 | $("CCView").remove() 292 | FExist = true; 293 | $("Avgle").add(FView); 294 | } 295 | if(VFExist == true){ 296 | $("VFView").remove() 297 | VFExist = false 298 | FExist = true; 299 | $("Avgle").add(FView); 300 | } 301 | $("search").text = ""; 302 | $device.taptic(0); 303 | sender.super.remove(); 304 | contentExist = false; 305 | if (LocalFavList.length == 0) { 306 | cacheContent = "影片", 307 | $cache.set("cacheContent",cacheContent); 308 | contentMode = "Videos"; 309 | VFExist = true; 310 | $("Avgle").add(VFView); 311 | mode = "Videos"; 312 | page = -1; 313 | getVideoData(); 314 | $ui.alert({ 315 | title: "❌ 收藏夹为空!", 316 | message:"\n提示: 试试左滑" 317 | }) 318 | return 319 | } 320 | $("search").placeholder = "共计 " + LocalFavList.length + " 个收藏" 321 | $("searchResult").text = ""; 322 | $("fvideos").data = []; 323 | LocalData.favorite.map(function(i) { 324 | $("fvideos").data = $("fvideos").data.concat({ 325 | videosBg:{ 326 | bgcolor:$color("white") 327 | }, 328 | interface: { 329 | src: i.image 330 | }, 331 | title: { 332 | text: i.title 333 | }, 334 | time: { 335 | text: i.time 336 | }, 337 | duration: { 338 | text: i.duration 339 | }, 340 | like: { 341 | text: i.like, 342 | alpha: 0.7 343 | }, 344 | hd: { 345 | hidden: i.hd 346 | }, 347 | share: i.vid 348 | }); 349 | }); 350 | 351 | } 352 | } 353 | }, 354 | layout: function(make, view) { 355 | make.top.inset(0) 356 | make.left.inset(0) 357 | make.width.equalTo(100) 358 | make.height.equalTo(200) 359 | } 360 | }], 361 | layout: function(make, view) { 362 | make.top.inset(45) 363 | make.right.inset(15) 364 | make.width.equalTo(100) 365 | make.height.equalTo(0) 366 | } 367 | } 368 | 369 | 370 | const template = [{ // Video and Favorite 371 | type: "view", 372 | props: { 373 | bgcolor: $color("#dddddd"), 374 | }, 375 | views: [{ 376 | type:"view", 377 | props:{ 378 | id:"videosBg", 379 | bgcolor:$color("white"), 380 | radius:7 381 | }, 382 | layout: function(make,view){ 383 | make.left.right.inset(15) 384 | make.top.inset(5) 385 | make.bottom.inset(5) 386 | }, 387 | views:[{ 388 | type: "image", 389 | props: { 390 | id: "interface", 391 | radius: 5 392 | }, 393 | layout: function(make, view) { 394 | var scale = 16 / 9; 395 | make.top.left.right.inset(10) 396 | make.height.equalTo(view.width).dividedBy(scale) 397 | //make.bottom.inset(55) 398 | } 399 | }, { 400 | type: "label", 401 | props: { 402 | id: "title", 403 | textColor: $color("#5c98f9"), 404 | font: $font(15) 405 | }, 406 | layout: function(make, view) { 407 | make.top.equalTo($("interface").bottom).offset(5) 408 | make.left.right.inset(10) 409 | } 410 | }, { 411 | type: "label", 412 | props: { 413 | id: "time", 414 | textColor: $color("black"), 415 | font: $font(13) 416 | }, 417 | layout: function(make, view) { 418 | make.bottom.inset(10) 419 | make.left.inset(10) 420 | } 421 | }, { 422 | type: "label", 423 | props: { 424 | id: "like", 425 | textColor: $color("black"), 426 | font: $font(12), 427 | }, 428 | layout: function(make, view) { 429 | make.bottom.inset(10) 430 | make.right.inset(10) 431 | } 432 | }, { 433 | type: "text", 434 | props: { 435 | id: "duration", 436 | textColor: $color("white"), 437 | bgcolor: $color("black"), 438 | alpha: 0.5, 439 | font: $font(12), 440 | radius: 3, 441 | align: $align.left, 442 | editable: false, 443 | scrollEnabled: false, 444 | insets: $insets(1, 1, 2, 1) 445 | }, 446 | layout: function(make, view) { 447 | make.top.equalTo($("interface").bottom).offset(-23) 448 | make.right.equalTo($("interface").right).offset(-5) 449 | } 450 | }, { 451 | type: "text", 452 | props: { 453 | id: "hd", 454 | textColor: $color("black"), 455 | bgcolor: $color("#fcbc05"), 456 | text: "HD", 457 | alpha: 0.8, 458 | font: $font("bold", 12), 459 | radius: 3, 460 | align: $align.center, 461 | editable: false, 462 | scrollEnabled: false, 463 | insets: $insets(0, 0, 0, 0) 464 | }, 465 | layout: function(make, view) { 466 | make.top.equalTo($("interface").top).offset(5) 467 | make.right.equalTo($("interface").right).offset(-5) 468 | } 469 | }, ] 470 | }], 471 | layout: $layout.fill 472 | }] 473 | 474 | const templateC = [{ // Catagory and Collection 475 | type: "view", 476 | props: { 477 | bgcolor: $color("#dddddd"), 478 | }, 479 | views: [{ 480 | type:"view", 481 | props:{ 482 | bgcolor:$color("clear"), 483 | radius:7 484 | }, 485 | layout: function(make,view){ 486 | make.left.right.inset(15) 487 | make.top.inset(10) 488 | make.bottom.inset(0) 489 | }, 490 | views:[{ 491 | type: "image", 492 | props: { 493 | id: "interface", 494 | radius: 5, 495 | bgcolor: $color("white") 496 | }, 497 | layout: function(make, view) { 498 | var scale = 16 / 9; 499 | make.top.left.right.inset(0) 500 | make.height.equalTo(view.width).dividedBy(scale) 501 | //make.bottom.inset(55) 502 | } 503 | }, { 504 | type: "label", 505 | props: { 506 | id: "bottomLayer", 507 | textColor: $color("white"), 508 | bgcolor: $color("black"), 509 | alpha: 0.5, 510 | }, 511 | layout: function(make, view) { 512 | make.left.right.bottom.inset(0) 513 | make.height.equalTo(30) 514 | } 515 | }, { 516 | type: "label", 517 | props: { 518 | id: "CCName", 519 | textColor: $color("white"), 520 | font: $font(16), 521 | alpha: 1, 522 | }, 523 | layout: function(make, view) { 524 | make.bottom.inset(5) 525 | make.left.inset(10) 526 | } 527 | }, { 528 | type: "text", 529 | props: { 530 | id: "totalVideos", 531 | editable: "false", 532 | textColor: $color("white"), 533 | bgcolor: $color("#5c98f9"), 534 | font: $font("bold", 13), 535 | align: $align.center, 536 | scrollEnabled: false, 537 | lines: 1, 538 | insets: $insets(2, 2, 2, 2), 539 | radius: 10 540 | }, 541 | layout: function(make, view) { 542 | make.bottom.inset(5) 543 | make.right.inset(10) 544 | } 545 | }, { 546 | type: "text", 547 | props: { 548 | id: "totalViews", 549 | editable: "false", 550 | textColor: $color("white"), 551 | bgcolor: $color("#5c98f9"), 552 | font: $font("bold", 13), 553 | align: $align.center, 554 | scrollEnabled: false, 555 | lines: 1, 556 | insets: $insets(2, 0, 2, 15), 557 | radius: 3, 558 | }, 559 | layout: function(make, view) { 560 | make.top.inset(5) 561 | make.left.inset(10) 562 | } 563 | }, { 564 | type: "button", 565 | props: { 566 | id: "playButton", 567 | bgcolor: $color("clear"), 568 | icon: $icon("049", $color("white"), $size(15, 15)), 569 | alpha: 1, 570 | }, 571 | layout: function(make, view) { 572 | make.top.inset(4) 573 | make.left.equalTo($("totalViews").right).offset(-18) 574 | }, 575 | events: { 576 | tapped(sender) { 577 | $share.sheet(sender.info) 578 | } 579 | } 580 | }] 581 | }], 582 | layout: $layout.fill 583 | }] 584 | 585 | 586 | const info = { 587 | type: "view", 588 | props: { 589 | id: "preinfo", 590 | bgcolor: $color("#dddddd") 591 | }, 592 | views: [{ 593 | type: "text", 594 | props: { 595 | text: "Created by Nicked.\n\nSource from Avgle.\n\nhttps://t.me/nicked", 596 | bgcolor: $color("#dddddd"), 597 | textColor: $color("#aaaaaa"), 598 | font: $font(10), 599 | align: $align.center 600 | }, 601 | 602 | layout: function(make, view) { 603 | make.top.inset(50) 604 | make.height.equalTo(100) 605 | make.width.equalTo($device.info.screen.width) 606 | } 607 | }, { 608 | type: "image", 609 | props: { 610 | src: "https://i.loli.net/2017/11/06/59ffebf2eb071.jpeg", 611 | radius: 25, 612 | bgcolor: $color("#dddddd"), 613 | alpha: 0.8, 614 | align: $align.center, 615 | }, 616 | layout: function(make, view) { 617 | make.size.equalTo($size(50, 50)) 618 | make.top.inset(130) 619 | make.left.inset(130) 620 | } 621 | 622 | }, { 623 | type: "image", 624 | props: { 625 | src: "https://i.loli.net/2017/12/22/5a3cd0ff0b781.jpeg", 626 | radius: 25, 627 | bgcolor: $color("#dddddd"), 628 | alpha: 0.8, 629 | align: $align.center, 630 | }, 631 | layout: function(make, view) { 632 | make.size.equalTo($size(50, 50)) 633 | make.top.inset(130) 634 | make.right.inset(130) 635 | } 636 | 637 | },], 638 | layout:function(make,view){ 639 | make.top.equalTo($("search").bottom) 640 | make.left.right.bottom.inset(0) 641 | } 642 | } 643 | 644 | const statusView = { 645 | type: "view", 646 | props: { 647 | bgcolor: $color("#dddddd"), 648 | id: "statusView", 649 | }, 650 | views: [{ 651 | type: "input", 652 | props: { 653 | id: "search", 654 | bgcolor: $color("#fdfdfd"), 655 | placeholder: "搜索", 656 | font: $font(15) 657 | }, 658 | layout: function(make, view) { 659 | make.top.inset(10) 660 | make.height.equalTo(30) 661 | make.left.inset(75) 662 | make.right.inset(45) 663 | }, 664 | events: { 665 | didBeginEditing: function(sender) { 666 | if (filterExist) { 667 | $("filterView").remove(); 668 | filterExist = false; 669 | } 670 | 671 | if (contentExist) { 672 | $("contentView").remove(); 673 | contentExist = false; 674 | } 675 | 676 | }, 677 | changed(sender) { 678 | if (filterExist) { 679 | $("filterView").remove(); 680 | filterExist = false; 681 | } 682 | if (contentExist) { 683 | $("contentView").remove(); 684 | contentExist = false; 685 | } 686 | }, 687 | returned(sender) { 688 | sender.blur(); 689 | if (sender.text) { 690 | if ($("player")) { 691 | $("player").stopLoading(); 692 | $("player").remove() 693 | }; 694 | mode = "Search"; 695 | var code = codeCorrectify(sender.text); 696 | if (code !== "none") { 697 | keyword = code; 698 | $("search").text = code 699 | } else { 700 | keyword = sender.text; 701 | } 702 | if(CCExist){ 703 | $("CCView").remove(); 704 | CCExist = false; 705 | $("Avgle").add(VFView); 706 | VFExist = true; 707 | $("search").text = keyword 708 | }else if (FExist){ 709 | $("FView").remove() 710 | FExist = false; 711 | $("Avgle").add(VFView); 712 | VFExist = true; 713 | $("search").text = keyword 714 | } 715 | cacheContent = "影片"; 716 | $cache.set("cacheContent",cacheContent) 717 | 718 | $("videos").contentOffset = $point(0, 0); 719 | $("videos").data = []; 720 | page = -1; 721 | cacheFilters.Time = "a"; 722 | cacheFilters.View = "bw" 723 | $cache.set("cacheFilters",cacheFilters) 724 | getVideoData() 725 | } else { 726 | mode = "Videos"; 727 | $("videos").contentOffset = $point(0, 0); 728 | $("videos").data = []; 729 | cacheContent = "影片"; 730 | $cache.set("cacheContent",cacheContent) 731 | page = -1; 732 | cacheFilters.Time = "a"; 733 | cacheFilters.View = "bw"; 734 | $cache.set("cacheFilters",cacheFilters) 735 | getVideoData(); 736 | } 737 | } 738 | } 739 | }, { 740 | type: "button", 741 | props: { 742 | id: "filterButton", 743 | bgcolor: $color("#dddddd"), 744 | src: "https://avgle.com/images/logo/logo.png" 745 | }, 746 | layout: function(make, view) { 747 | make.top.inset(12) 748 | make.height.equalTo(25) 749 | make.width.equalTo(55) 750 | make.left.inset(14) 751 | }, 752 | events: { 753 | tapped(sender) { 754 | $device.taptic(0) 755 | if (contentExist) { 756 | $("contentView").remove(); 757 | contentExist = false 758 | } 759 | if (filterExist) { 760 | $("filterView").remove() 761 | filterExist = false; 762 | return 763 | } 764 | if (contentMode !== "Videos") { 765 | if (CCExist) { 766 | $("CCView").remove(); 767 | CCExist = false 768 | $("Avgle").add(VFView); 769 | VFExist = true; 770 | } 771 | if (FExist) { 772 | $("FView").remove(); 773 | CCExist = false 774 | $("Avgle").add(VFView); 775 | VFExist = true; 776 | } 777 | contentMode = "Videos"; 778 | cacheContent = "影片"; 779 | $cache.set("cacheContent", cacheContent); 780 | mode = "Videos" 781 | page = -1; 782 | $("videos").data = []; 783 | $ui.toast("载入中...", 10); 784 | getVideoData(); 785 | $("videos").contentOffset = $point(0, 0); 786 | $ui.toast("", 0.1) 787 | return 788 | } 789 | $("Avgle").add(filterView); 790 | var data = [] 791 | Object.keys(filters.Time).map(function(i) { 792 | data.push({ 793 | filterLabel: { 794 | text: i, 795 | textColor: cacheFilters.Time == filters.Time[i] ? $color("white") : $color("black"), 796 | bgcolor: cacheFilters.Time == filters.Time[i] ? $color("#5c98f9") : $color("white") 797 | } 798 | }) 799 | }) 800 | $("filtersT").data = [{title:" 时间线",rows:data}] 801 | data = [] 802 | Object.keys(filters.View).map(function(i) { 803 | data.push({ 804 | filterLabel: { 805 | text: i, 806 | textColor: cacheFilters.View == filters.View[i] ? $color("white") : $color("balck"), 807 | bgcolor: cacheFilters.View == filters.View[i] ? $color("#5c98f9") : $color("white") 808 | } 809 | }) 810 | }) 811 | $("filtersV").data = [{title:" 影片类型",rows:data}] 812 | filterExist = true; 813 | $("filterView").updateLayout(function(make) { 814 | make.height.equalTo(145) 815 | }); 816 | } 817 | } 818 | 819 | }, { 820 | type: "button", 821 | props: { 822 | id: "contentButton", 823 | bgcolor: $color("#dddddd"), 824 | icon: $icon("067", $color("#ffffff")) 825 | }, 826 | layout: function(make, view) { 827 | make.top.inset(12) 828 | make.height.equalTo(25) 829 | make.width.equalTo(26) 830 | make.right.inset(14) 831 | }, 832 | events: { 833 | tapped(sender) { 834 | $device.taptic(0) 835 | if (filterExist) { 836 | $("filterView").remove(); 837 | filterExist = false; 838 | } 839 | if (contentExist) { 840 | $("contentView").remove(); 841 | contentExist = false 842 | return 843 | } 844 | $("Avgle").add(contentView); 845 | var data = [] 846 | content.map(function(i) { 847 | data.push({ 848 | contentLabel: { 849 | text: i, 850 | textColor: cacheContent == i ? $color("white") : $color("balck"), 851 | bgcolor: cacheContent == i ? $color("#5c98f9") : $color("white") 852 | } 853 | }) 854 | }) 855 | $("contentList").data = data; 856 | contentExist = true 857 | //$ui.action(data) 858 | $("contentView").updateLayout(function(make) { 859 | make.height.equalTo(120) 860 | }); 861 | } 862 | } 863 | 864 | }, { 865 | type: "label", 866 | props: { 867 | id: "searchResult", 868 | font: $font(14), 869 | textColor: $color("#cccccc"), 870 | text: "" 871 | }, 872 | layout: function(make, view) { 873 | make.right.equalTo($("search").right).offset(-5) 874 | make.top.equalTo(17) 875 | } 876 | 877 | }], 878 | layout: function(make, view) { 879 | make.left.right.top.inset(0); 880 | make.height.equalTo(45) 881 | } 882 | 883 | } 884 | 885 | const VFView = { // Video and Favorite 886 | type: "view", 887 | props: { 888 | id: "VFView", 889 | bgcolor: $color("clear"), 890 | }, 891 | views: [statusView,info,{ 892 | type: "list", 893 | props: { 894 | id: "videos", 895 | rowHeight: 265, 896 | bgcolor: $color("clear"), 897 | separatorHidden:true, 898 | template: template, 899 | actions: [{ 900 | title: contentMode = "收藏", 901 | handler: function(sender, indexPath) { 902 | $device.taptic(0) 903 | if ($("player")) { 904 | $("player").stopLoading(); 905 | $("player").remove() 906 | }; 907 | var info = $("videos").data[indexPath.row].info 908 | if(LocalFavList.indexOf(info.vid)>-1){ 909 | $ui.toast("❌ 已在收藏列表!",1) 910 | }else{ 911 | LocalData.favorite.push(info); 912 | LocalFavList.push(info.vid) 913 | writeCache(); 914 | $ui.toast("😍 已收藏!", 1) 915 | var data = $("videos").data 916 | data[indexPath.row].videosBg.bgcolor = favColor 917 | $("videos").data = data 918 | } 919 | } 920 | }, { 921 | title: "分享", 922 | handler: function(sender, indexPath) { 923 | $device.taptic(0); 924 | $share.sheet("https://avgle.com/video/" + $("videos").data[indexPath.row].share.info) 925 | } 926 | }], 927 | footer: { 928 | type: "label", 929 | props: { 930 | id: "footer", 931 | height: 40, 932 | text: "Loading...", 933 | font:$font(15), 934 | align: $align.center, 935 | textColor: $color("#aaaaaa") 936 | } 937 | }, 938 | }, 939 | layout: function(make, view) { 940 | make.left.right.bottom.inset(0) 941 | make.top.equalTo($("statusView").bottom).offset(0) 942 | }, 943 | events: { 944 | didSelect(sender, indexPath, data) { 945 | if (filterExist) { 946 | $("filterView").remove(); 947 | filterExist = false; 948 | } 949 | if (contentExist) { 950 | $("contentView").remove(); 951 | contentExist = false; 952 | } 953 | var url = "https://avgle.com/video/" + data.share.info; 954 | play(url, indexPath, data.interface.src) 955 | 956 | }, 957 | didReachBottom(sender) { 958 | sender.endFetchingMore(); 959 | if (contentMode == "Favorites") { 960 | return 961 | } 962 | if (mode == "Search") { 963 | getVideoData() 964 | } else { 965 | getVideoData(); 966 | } 967 | }, 968 | pulled(sender) { 969 | if (filterExist) { 970 | $("filterView").remove() 971 | filterExist = false; 972 | } 973 | if (contentExist) { 974 | $("contentView").remove(); 975 | contentExist = false; 976 | } 977 | page = -1 978 | $("videos").data = []; 979 | getVideoData(); 980 | $("videos").endRefreshing(); 981 | $ui.toast("更新成功!",0.1) 982 | 983 | }, 984 | willBeginDragging(sender) { 985 | startY = sender.contentOffset.y; 986 | 987 | }, 988 | didEndDragging(sender) { 989 | endY = sender.contentOffset.y; 990 | if (Math.abs(endY - startY) > 150) { 991 | if (filterExist) { 992 | $("filterView").remove(); 993 | filterExist = false 994 | } 995 | if (contentExist) { 996 | $("contentView").remove(); 997 | contentExist = false; 998 | } 999 | if ($("player")) { 1000 | $("player").stopLoading(); 1001 | $("player").remove() 1002 | } 1003 | } 1004 | } 1005 | 1006 | } 1007 | }, ], 1008 | layout:$layout.fill 1009 | } 1010 | 1011 | const FView = { // Favorite 1012 | type: "view", 1013 | props: { 1014 | id: "FView", 1015 | bgcolor: $color("clear"), 1016 | }, 1017 | views: [statusView,info,{ 1018 | type: "list", 1019 | props: { 1020 | id: "fvideos", 1021 | rowHeight: 265, 1022 | bgcolor: $color("clear"), 1023 | separatorHidden:true, 1024 | template: template, 1025 | actions: [{ 1026 | title: contentMode = "delete", 1027 | handler: function(sender, indexPath) { 1028 | $device.taptic(0) 1029 | if ($("player")) { 1030 | $("player").stopLoading(); 1031 | $("player").remove() 1032 | }; 1033 | idx = indexPath.row 1034 | LocalFavList.splice(idx, 1); 1035 | LocalData.favorite.splice(idx, 1); 1036 | writeCache(); 1037 | $ui.toast("🤔 已删除!", 1) 1038 | $("search").placeholder = "共计 "+LocalFavList.length + " 个收藏"; 1039 | } 1040 | }, { 1041 | title: "分享", 1042 | handler: function(sender, indexPath) { 1043 | $ui.action($("fvideos").data[indexPath.row].share) 1044 | $device.taptic(0); 1045 | $share.sheet("https://avgle.com/video/" + $("fvideos").data[indexPath.row].share) 1046 | } 1047 | }], 1048 | }, 1049 | layout: function(make, view) { 1050 | make.left.right.bottom.inset(0) 1051 | make.top.equalTo($("statusView").bottom).offset(0) 1052 | }, 1053 | events: { 1054 | didSelect(sender, indexPath, data) { 1055 | if (filterExist) { 1056 | $("filterView").remove(); 1057 | filterExist = false; 1058 | } 1059 | if (contentExist) { 1060 | $("contentView").remove(); 1061 | contentExist = false; 1062 | } 1063 | var url = "https://avgle.com/video/" + data.share.info; 1064 | play(url, indexPath, data.interface.src) 1065 | 1066 | }, 1067 | didReachBottom(sender) { 1068 | sender.endFetchingMore(); 1069 | }, 1070 | pulled(sender) { 1071 | if (filterExist) { 1072 | $("filterView").remove() 1073 | filterExist = false; 1074 | } 1075 | if (contentExist) { 1076 | $("contentView").remove(); 1077 | contentExist = false; 1078 | } 1079 | $("search").text = ""; 1080 | page = -1 1081 | $("fvideos").data = []; 1082 | mode = "Videos"; 1083 | $("search").placeholder = "共计 " + LocalData.favorite.length + " 个收藏"; 1084 | $("searchResult").text = ""; 1085 | var temp = LocalFavList; 1086 | tempList = []; 1087 | tempData = { "favorite": [] }; 1088 | temp.map(function(i) { 1089 | getFavoriteData(i) 1090 | }); 1091 | 1092 | $("fvideos").endRefreshing(); 1093 | $ui.toast("更新成功!",0.1) 1094 | 1095 | }, 1096 | willBeginDragging(sender) { 1097 | startY = sender.contentOffset.y; 1098 | 1099 | }, 1100 | didEndDragging(sender) { 1101 | endY = sender.contentOffset.y; 1102 | if (Math.abs(endY - startY) > 150) { 1103 | if (filterExist) { 1104 | $("filterView").remove(); 1105 | filterExist = false 1106 | } 1107 | if (contentExist) { 1108 | $("contentView").remove(); 1109 | contentExist = false; 1110 | } 1111 | if ($("player")) { 1112 | $("player").stopLoading(); 1113 | $("player").remove() 1114 | } 1115 | } 1116 | } 1117 | 1118 | } 1119 | }, ], 1120 | layout:$layout.fill 1121 | } 1122 | 1123 | 1124 | const CCView = { // category and collection 1125 | type: "view", 1126 | props: { 1127 | id: "CCView", 1128 | bgcolor: $color("#dddddd"), 1129 | }, 1130 | views: [statusView,info,{ 1131 | type: "list", 1132 | props: { 1133 | id: "CCList", 1134 | rowHeight: 205, 1135 | bgcolor: $color("clear"), 1136 | template: templateC, 1137 | separatorHidden:true, 1138 | footer: { 1139 | type: "label", 1140 | props: { 1141 | id: "footer", 1142 | height: 40, 1143 | text: "Loading...", 1144 | font:$font(15), 1145 | align: $align.center, 1146 | textColor: $color("#aaaaaa") 1147 | } 1148 | }, 1149 | }, 1150 | layout: function(make, view) { 1151 | make.left.right.bottom.inset(0) 1152 | make.top.equalTo($("statusView").bottom).offset(0) 1153 | }, 1154 | events: { 1155 | didSelect(sender, indexPath, data) { 1156 | if (filterExist) { 1157 | $("filterView").remove(); 1158 | filterExist = false; 1159 | } 1160 | if (contentExist) { 1161 | $("contentView").remove(); 1162 | contentExist = false; 1163 | } 1164 | $("CCView").remove() 1165 | CCExist = false 1166 | $("Avgle").add(VFView); 1167 | VFExist = true; 1168 | page = -1; 1169 | $("videos").data = []; 1170 | $("videos").contentOffset = $point(0,0); 1171 | cacheFilters.Time = "a" 1172 | cacheFilters.View = "mr" 1173 | $cache.set("cacheFilters",cacheFilters) 1174 | if(contentMode == "Categories"){ 1175 | contentMode = "Videos"; 1176 | mode = "Cat" 1177 | CHID = data.info 1178 | getVideoData() 1179 | }else if(contentMode == "Collections"){ 1180 | contentMode = "Videos"; 1181 | mode = "Search" 1182 | keyword = data.info 1183 | $("search").text = data.info 1184 | getVideoData() 1185 | } 1186 | 1187 | }, 1188 | didReachBottom(sender) { 1189 | sender.endFetchingMore(); 1190 | if (contentMode == "Collections") { 1191 | getCollectionData() 1192 | }else{ 1193 | $("footer").text = "" 1194 | } 1195 | }, 1196 | pulled(sender) { 1197 | if (filterExist) { 1198 | $("filterView").remove() 1199 | filterExist = false; 1200 | } 1201 | if (contentExist) { 1202 | $("contentView").remove(); 1203 | contentExist = false; 1204 | } 1205 | $("search").text = ""; 1206 | if(contentMode == "Categories"){ 1207 | $("CCList").data = [] 1208 | page = -1 1209 | getCategoryData() 1210 | }else if (contentMode == "Collections"){ 1211 | $("CCList").data = [] 1212 | page = -1 1213 | getCollectionData() 1214 | } 1215 | $ui.toast("更新成功!",0.1) 1216 | 1217 | $("CCList").endRefreshing() 1218 | 1219 | }, 1220 | willBeginDragging(sender) { 1221 | startY = sender.contentOffset.y; 1222 | 1223 | }, 1224 | didEndDragging(sender) { 1225 | endY = sender.contentOffset.y; 1226 | if (Math.abs(endY - startY) > 150) { 1227 | if (filterExist) { 1228 | $("filterView").remove(); 1229 | filterExist = false 1230 | } 1231 | if (contentExist) { 1232 | $("contentView").remove(); 1233 | contentExist = false; 1234 | } 1235 | if ($("player")) { 1236 | $("player").stopLoading(); 1237 | $("player").remove() 1238 | } 1239 | } 1240 | } 1241 | 1242 | } 1243 | }, ], 1244 | layout: $layout.fill 1245 | } 1246 | 1247 | $ui.render({ 1248 | props: { 1249 | title: "Avgle", 1250 | bgcolor: $color("#dddddd"), 1251 | id: "Avgle" 1252 | }, 1253 | views: [], 1254 | layout: $layout.fill 1255 | }) 1256 | 1257 | function getVideoData() { 1258 | $ui.loading(true) 1259 | page++; 1260 | if(mode == "Cat"){ 1261 | url = "https://api.avgle.com/v1/videos/"+page+"?limit=10&c="+CHID+"&t="+ cacheFilters.Time + "&o=" +cacheFilters.View; 1262 | }else{ 1263 | if (mode == "Search") { 1264 | $("footer").text = "" 1265 | url = "https://api.avgle.com/v1/search/" + encodeURI(keyword) + "/" + page + "?limit=10&t=" + cacheFilters.Time + "&o=" +cacheFilters.View 1266 | } else { 1267 | url = "https://api.avgle.com/v1/videos/" + page + "?limit=10&t=" + cacheFilters.Time + "&o=" + cacheFilters.View; 1268 | } 1269 | } 1270 | $http.request({ 1271 | url: url, 1272 | timeout: 5, 1273 | handler: function(resp) { 1274 | //$ui.action(resp.err) 1275 | var success = resp.data.success; 1276 | if (!success || !resp.response) { 1277 | $ui.alert("❌ 网络连接出错!"); 1278 | //$ui.toast("",0.1) 1279 | return 1280 | } 1281 | var video_num = resp.data.response.total_videos 1282 | if (video_num == 0) { 1283 | $ui.alert("❌ 没有搜索结果!"); 1284 | $ui.loading(false); 1285 | return 1286 | } 1287 | if (!resp.data.response.has_more && page > 0) { 1288 | $ui.toast("🙈 已经到底了", 1); 1289 | $ui.loading(false); 1290 | $("footer").text = "" 1291 | return 1292 | } 1293 | var infos = resp.data.response.videos; 1294 | //$ui.action(infos) 1295 | infos.map(function(i) { 1296 | $("videos").data = $("videos").data.concat({ 1297 | videosBg:{ 1298 | bgcolor:LocalFavList.indexOf(i.vid) > -1 ? favColor:$color("white") 1299 | }, 1300 | interface: { 1301 | src: i.preview_url 1302 | }, 1303 | title: { 1304 | text: i.title 1305 | }, 1306 | time: { 1307 | text: formatTime(i.addtime) 1308 | }, 1309 | duration: { 1310 | text: formatDuration(i.duration) 1311 | }, 1312 | like: { 1313 | text: "❤️ " + i.likes + " 🖤 " + i.dislikes + " ▶️ " + i.viewnumber, 1314 | alpha: 0.7 1315 | }, 1316 | hd: { 1317 | hidden: i.hd == true ? false : true 1318 | }, 1319 | share: { 1320 | info: i.vid 1321 | }, 1322 | info:{ 1323 | title: i.title, 1324 | image: i.preview_url, 1325 | time: formatTime(i.addtime), 1326 | duration: formatDuration(i.duration), 1327 | like: "❤️ " + i.likes + " 🖤 " + i.dislikes + " ▶️ " + i.viewnumber, 1328 | hd: i.hd == true ? false : true, 1329 | vid: i.vid 1330 | } 1331 | }) 1332 | }) 1333 | //$ui.toast("", 0.1); 1334 | $ui.loading(false); 1335 | if (mode == "Search") { 1336 | $("searchResult").text = filterName[cacheFilters.Time]+"找到 " + video_num + " 个视频"; 1337 | $("search").placeholder = ""; 1338 | } else { 1339 | if(mode == "Cat"){ 1340 | $("search").placeholder = "该分类"+filterName[cacheFilters.Time] + " " + video_num + " 个视频 "; 1341 | }else{ 1342 | $("search").placeholder = filterName[cacheFilters.Time] + " " + video_num + " 个视频 "; 1343 | } 1344 | $("searchResult").text = ""; 1345 | } 1346 | 1347 | } 1348 | }) 1349 | } 1350 | 1351 | function getFavoriteData(vid) { 1352 | url = "https://api.avgle.com/v1/video/" + vid; 1353 | $("searchResult").text = ""; 1354 | $http.request({ 1355 | url: url, 1356 | handler: function(resp) { 1357 | var success = resp.data.success; 1358 | if (!success || !resp.response) { 1359 | $ui.alert("❌ 网络连接出错!"); 1360 | return 1361 | } 1362 | var i = resp.data.response.video; 1363 | var info = { 1364 | title: i.title, 1365 | image: i.preview_url, 1366 | time: formatTime(i.addtime), 1367 | duration: formatDuration(i.duration), 1368 | like: "❤️ " + i.likes + " 🖤 " + i.dislikes + " ▶️ " + i.viewnumber, 1369 | hd: i.hd == true ? false : true, 1370 | vid: i.vid 1371 | } 1372 | $("fvideos").data = $("fvideos").data.concat({ 1373 | videosBg:{ 1374 | bgcolor:$color("white") 1375 | }, 1376 | interface: { 1377 | src: i.preview_url 1378 | }, 1379 | title: { 1380 | text: i.title 1381 | }, 1382 | time: { 1383 | text: formatTime(i.addtime) 1384 | }, 1385 | duration: { 1386 | text: formatDuration(i.duration) 1387 | }, 1388 | like: { 1389 | text: "❤️ " + i.likes + " 🖤 " + i.dislikes + " ▶️ " + i.viewnumber, 1390 | alpha: 0.7 1391 | }, 1392 | hd: { 1393 | hidden: i.hd == true ? false : true 1394 | }, 1395 | share: i.vid 1396 | }); 1397 | if (contentMode == "Favorites") { 1398 | tempList.push(i.vid); 1399 | tempData.favorite.push(info) 1400 | if (tempList.length == LocalFavList.length) { 1401 | LocalFavList = tempList; 1402 | LocalData = tempData; 1403 | writeCache(); 1404 | } 1405 | }; 1406 | 1407 | } 1408 | }) 1409 | } 1410 | 1411 | function getCollectionData() { 1412 | $ui.loading(true) 1413 | $("searchResult").text = ""; 1414 | page++; 1415 | $http.request({ 1416 | url: "https://api.avgle.com/v1/collections/" + page + "?limit=10", 1417 | timeout: 5, 1418 | handler: function(resp) { 1419 | var success = resp.data.success; 1420 | if (!success || !resp.response) { 1421 | $ui.alert("❌ 网络连接出错!"); 1422 | return 1423 | } 1424 | if (!resp.data.response.has_more && page > 0) { 1425 | $ui.toast("🙈 已经到底了", 1); 1426 | $ui.loading(false); 1427 | return 1428 | } 1429 | var collections = resp.data.response.collections; 1430 | collections.map(function(i) { 1431 | $("CCList").data = $("CCList").data.concat({ 1432 | interface: { 1433 | src: i.cover_url 1434 | }, 1435 | CCName: { 1436 | text: i.title 1437 | }, 1438 | totalVideos: { 1439 | text: i.video_count.toString() 1440 | }, 1441 | totalViews: { 1442 | text: formatNum(i.total_views), 1443 | hidden: false, 1444 | }, 1445 | playButton: { 1446 | hidden: false, 1447 | info: i.collection_url 1448 | }, 1449 | info: i.keyword 1450 | 1451 | }) 1452 | }) 1453 | $("search").text = "" 1454 | $("search").placeholder = "共计 " + resp.data.response.total_collections + " 个合集" 1455 | $ui.loading(false) 1456 | 1457 | } 1458 | }) 1459 | } 1460 | 1461 | function getCategoryData() { // category and collection 1462 | $ui.loading(true) 1463 | $("searchResult").text = ""; 1464 | url = "https://api.avgle.com/v1/categories" 1465 | $http.request({ 1466 | url: url, 1467 | timeout: 5, 1468 | handler: function(resp) { 1469 | var success = resp.data.success; 1470 | if (!success || !resp.response) { 1471 | $ui.alert("❌ 网络连接出错!"); 1472 | return 1473 | } 1474 | var categories = resp.data.response.categories 1475 | 1476 | $("CCList").data = [] 1477 | categories.map(function(i) { 1478 | $("CCList").data = $("CCList").data.concat({ 1479 | interface: { 1480 | src: i.cover_url 1481 | }, 1482 | CCName: { 1483 | text: i.name 1484 | }, 1485 | totalVideos: { 1486 | text: formatNum(i.total_videos) 1487 | }, 1488 | totalViews: { 1489 | 1490 | hidden: true, 1491 | }, 1492 | playButton: { 1493 | hidden: true 1494 | }, 1495 | info: i.CHID 1496 | }) 1497 | }) 1498 | $("search").text = "" 1499 | $("search").placeholder = "搜索" 1500 | $ui.loading(false) 1501 | } 1502 | }) 1503 | } 1504 | 1505 | function formatDuration(ns) { 1506 | var mins = Math.floor(ns / 60) 1507 | var hours = mins > 60 ? Math.floor(mins / 60) : 0 1508 | var seconds = Math.floor(((ns / 60) - mins) * 60) 1509 | if (hours > 0) { 1510 | mins = mins - 60 * hours 1511 | } 1512 | mins = mins.toString().length > 1 ? mins : `0${mins}` 1513 | hours = hours.toString().length > 1 ? hours : `0${hours}` 1514 | seconds = seconds.toString().length > 1 ? seconds : `0${seconds}` 1515 | if (hours == "00") { 1516 | return `${mins}:${seconds}` 1517 | } else { 1518 | return `${hours}:${mins}:${seconds}` 1519 | } 1520 | 1521 | } 1522 | 1523 | function formatTime(ns) { 1524 | var myTime = Math.floor(new Date() / 1000); 1525 | var timeDiff = myTime - ns 1526 | if (timeDiff / 60 < 60) { 1527 | return Math.floor(timeDiff / 60) + " 分钟前" 1528 | } else if (timeDiff / 3600 < 24) { 1529 | return Math.floor(timeDiff / 3600) + " 小时前" 1530 | } else { 1531 | return Math.floor(timeDiff / 3600 / 25) + " 天前" 1532 | } 1533 | 1534 | } 1535 | 1536 | function formatNum(num) { 1537 | var num = (num || 0).toString(), 1538 | result = ''; 1539 | while (num.length > 3) { 1540 | result = ',' + num.slice(-3) + result; 1541 | num = num.slice(0, num.length - 3); 1542 | } 1543 | if (num) { result = num + result; } 1544 | return result; 1545 | } 1546 | 1547 | function writeCache() { 1548 | $file.write({ 1549 | data: $data({ string: JSON.stringify(LocalData) }), 1550 | path: LocalDataPath 1551 | }) 1552 | } 1553 | 1554 | function clipboardDetect(){ 1555 | var str = $clipboard.text 1556 | if (!str) { 1557 | return "none" 1558 | }else{ 1559 | var reg = /[sS][nN][iI][sS][\s\-]?\d{3}|[aA][bB][pP][\s\-]?\d{3}|[iI][pP][zZ][\s\-]?\d{3}|[sS][wW][\s\-]?\d{3}|[jJ][uU][xX][\s\-]?\d{3}|[mM][iI][aA][dD][\s\-]?\d{3}|[mM][iI][dD][eE][\s\-]?\d{3}|[mM][iI][dD][dD][\s\-]?\d{3}|[pP][gG][dD][\s\-]?\d{3}|[sS][tT][aA][rR][\s\-]?\d{3}|[eE][bB][oO][dD][\s\-]?\d{3}|[iI][pP][tT][dD][\s\-]?\d{3}|[cC][hH][nN][\s\-]?\d{3}/g; 1560 | var match = str.match(reg); 1561 | if(match){ 1562 | var detect = /([a-zA-Z]{3,5})[\s\-]?(\d{3})/g.exec(match[0]) 1563 | return detect[1]+"-"+detect[2] 1564 | }else{ 1565 | return "none" 1566 | } 1567 | } 1568 | } 1569 | 1570 | function codeCorrectify(detect) { 1571 | if (!detect) { 1572 | return "none" 1573 | } else { 1574 | var s = /([a-zA-Z]{3,5})[\s\-]?(\d{3})/g.exec(detect) 1575 | if (s) { 1576 | return s[1] + "-" + s[2] 1577 | } else { 1578 | return detect 1579 | } 1580 | } 1581 | 1582 | } 1583 | 1584 | function play(url, indexPath, poster) { 1585 | $ui.loading(true); 1586 | $ui.toast("正在加载视频…", 10); 1587 | $http.request({ 1588 | url: url, 1589 | handler: function(resp) { 1590 | $ui.loading(false); 1591 | $ui.toast("", 0.1); 1592 | var reg = /