From 9886ede48466efd3e1b226d1cfd07a65b4c85e36 Mon Sep 17 00:00:00 2001 From: enjoyeetime Date: Mon, 13 Feb 2023 10:05:10 +0800 Subject: [PATCH] update --- "\345\200\222\350\256\241\346\227\245.js" | 4 +- "\346\250\241\346\235\277.js" | 403 ++++++++++------------ "\347\224\265\344\277\241.js" | 8 +- "\350\201\224\351\200\232.js" | 8 +- 4 files changed, 183 insertions(+), 240 deletions(-) diff --git "a/\345\200\222\350\256\241\346\227\245.js" "b/\345\200\222\350\256\241\346\227\245.js" index 1208172..f97e4ba 100644 --- "a/\345\200\222\350\256\241\346\227\245.js" +++ "b/\345\200\222\350\256\241\346\227\245.js" @@ -3,7 +3,7 @@ // icon-color: deep-green; icon-glyph: clock; /** * Author:LSP -* Date:2023-02-04 +* Date:2023-02-13 */ // ------------------------------------------------------- // 是否是开发环境,配合手机端调试使用,正式发布设置为false @@ -314,7 +314,7 @@ class Widget extends BaseWidget { // ---------------------------------------- let hStack = stack.addStack(); hStack.addSpacer(); - let textSpan = hStack.addText(`${this.prefixTitle()}❝${this.countDownName()}❞ ${isOverdue ? timeInterval + 1 : timeInterval}周年`); + let textSpan = hStack.addText(`${this.prefixTitle()}❝${this.countDownName()}❞ ${timeInterval + 1}周年`); textSpan.textColor = this.dynamicColor(this.titleDayColor(), this.titleNightColor()); textSpan.font = Font.mediumSystemFont(this.titleFontSize()); hStack.addSpacer(); diff --git "a/\346\250\241\346\235\277.js" "b/\346\250\241\346\235\277.js" index 575f508..860e33f 100644 --- "a/\346\250\241\346\235\277.js" +++ "b/\346\250\241\346\235\277.js" @@ -1,16 +1,20 @@ // Variables used by Scriptable. // These must be at the very top of the file. Do not edit. -// icon-color: red; icon-glyph: user-astronaut; +// icon-color: deep-blue; icon-glyph: film; /** * Author:LSP -* Date:2022-12-05 +* Date:2023-02-04 */ - // ------------------------------------------------------- // 是否是开发环境,配合手机端调试使用,正式发布设置为false -const isDev = true; -console.log(`开发环境 👉👉👉 ${isDev ? 'DEV' : 'RELEASE'}`); +const isDev = false; +const dependencyLSP = '20230204'; +console.log(`当前环境 👉👉👉👉👉 ${isDev ? 'DEV' : 'RELEASE'}`); console.log(`----------------------------------------`); +// 分支 +const branch = 'master'; +// 仓库根目录 +const remoteRoot = `https://gitcode.net/enoyee/scriptable/-/raw/${branch}`; // 依赖包目录 const fm = FileManager.local(); const rootDir = fm.documentsDirectory(); @@ -21,253 +25,172 @@ await downloadLSPDependency(); // ------------------------------------------------------- if (typeof require === 'undefined') require = importModule // 引入相关方法 -const { - writeWidgetSetting, - generateAlert, - generateInputAlert, - presentSheet, - readWidgetSetting, - drawTextWithCustomFont, - httpGet, - getDateStr, - getImageByUrl, - presentViewInApp, -} = require(dependencyFileName); +const { BaseWidget } = require(dependencyFileName); +// @定义小组件 +class Widget extends BaseWidget { -// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓START↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -//=========================组件默认配置========================= -const defaultPreference = { - caiyun: 'UR8ASaplvIwavDfR', -}; + constructor(scriptName) { + super(scriptName); + this.domain = 'https://www.cikeee.com'; + this.defaultConfig.refreshInterval = `${2 * 60}`; + this.backgroundColor = '#f0f0f4,#161823'; + this.defaultConfig.bgType = '2'; + this.titleColor = Color.dynamic(new Color('#222222'), new Color('#AAAAAA')); + this.descColor = Color.dynamic(new Color('#FFFFFF'), new Color('#EEEEEE')); + this.subTitleColor = Color.dynamic(new Color('#555555'), new Color('#AAAAAA')); + } -const getValueByKey = (key) => readWidgetSetting()[key] ?? defaultPreference[key]; -const caiyun = () => getValueByKey('caiyun'); + async getAppViewOptions() { + return { + widgetProvider: { + small: true, // 是否提供小号组件 + medium: false, // 是否提供中号组件 + large: false, // 是否提供大号组件 + }, + // 预览界面的组件设置item + settingItems: [ + { + name: 'pic', + label: '选择图片', + type: 'cell', + icon: { name: 'tag', color: '#7678ed', }, + showDesc: false, + needLoading: true, + }, + ], + // cell类型的item点击回调 + onItemClick: async (item) => { + let widgetSetting = this.readWidgetSetting(); + let insertDesc = ''; + switch (item.name) { + case 'pic': + try { + let image = await Photos.fromLibrary(); + this.useFileManager().writeImgCache('pic', image); + } catch (error) { + } + break; + } + // 写入更新配置 + this.writeWidgetSetting(widgetSetting); + return { + desc: { value: insertDesc }, + }; + }, + }; + } -// --------------------------NET START-------------------------- + async render({ widgetSetting, family }) { + return await this.provideLargeWidget(); + } -// --------------------------NET END-------------------------- + async provideLargeWidget() { + // ---------------------------------------- + const widgetSize = this.getWidgetSize('小号'); + console.log(JSON.stringify(widgetSize, null, 2)); // + //================================= + const widget = new ListWidget(); + //================================= + let stack = widget.addStack(); + stack.size = new Size(widgetSize.width - 12, widgetSize.height - 12); + let image = await this.getImageByUrl("https://s1.ax1x.com/2023/02/09/pSWWFeO.png"); + stack.backgroundImage = this.useFileManager().readImgCache('pic') + stack.centerAlignContent() -// Widget创建 -const createWidget = async (widgetSetting, family) => { - //================================= - const widget = new ListWidget(); - widget.setPadding(0, 0, 0, 0); - //================================= - let stack = widget.addStack(); - stack.layoutHorizontally(); - //--------------------------------- - const localQuickConfigs = widgetSetting.quickStart; - const quickConfigJSON = localQuickConfigs ? localQuickConfigs : JSON.stringify(defaultPreference.quickConfigs); - const quickConfigArr = JSON.parse(quickConfigJSON); - await quickStack(stack, quickConfigArr); - //--------------------------------- - let rightStack = stack.addStack(); - rightStack.layoutVertically(); - rightStack.addSpacer(); - await loadWeatherStack(rightStack); - rightStack.addSpacer(); - //================================= - stack.addSpacer(); - return widget; -} + let picStack = stack.addStack(); + picStack.size = new Size(widgetSize.width - 4, widgetSize.height - 4); + picStack.backgroundImage = image + // let imgSpan = stack.addImage(image) + // imgSpan.centerAlignImage(); + // imgSpan.applyFillingContentMode(); + //================================= + return widget; + } -//=========================配置界面========================= -await presentViewInApp({ - widgetProvider: { - small: false, // 是否提供小号组件 - medium: true, // 是否提供中号组件 - large: false, // 是否提供大号组件 - }, - // 预览界面的组件设置item - settingItems: [ - { - name: 'otherSetting', - label: '其他设置', - type: 'cell', - icon: 'https://gitcode.net/4qiao/framework/raw/master/img/icon/setting.gif', - needLoading: true, - childItems: [ - { - name: 'quickFontSize', - label: '启动文字大小', - type: 'cell', - icon: { name: 'pencil.and.outline', color: '#7743DB', }, - needLoading: false, - alert: { - title: '启动文字大小', - options: [ - { - key: 'quickFontSize', - hint: '请输入字号', - } - ] - }, - default: quickFontSize(), - }, - { - name: 'quickFontColor', - label: '启动文字颜色', - type: 'color', - icon: { name: 'pencil.and.outline', color: '#7743DB', }, - needLoading: false, - default: quickFontColor(), - }, - { - name: 'temperatureFontSize', - label: '温度文字大小', - type: 'cell', - icon: { name: 'thermometer.medium', color: '#E0144C', }, - needLoading: false, - alert: { - title: '温度文字大小', - options: [ - { - key: 'temperatureFontSize', - hint: '请输入字号', - } - ] - }, - default: temperatureFontSize(), - }, - { - name: 'temperatureFontColor', - label: '温度文字颜色', - type: 'color', - icon: { name: 'thermometer.medium', color: '#E0144C', }, - needLoading: false, - default: temperatureFontColor(), - }, - { - name: 'dateFontSize', - label: '日期文字大小', - type: 'cell', - icon: 'https://s3.uuu.ovh/imgs/2022/12/05/ac2c5b8843ff2719.gif', - needLoading: false, - alert: { - title: '日期文字大小', - options: [ - { - key: 'dateFontSize', - hint: '请输入字号', - } - ] - }, - default: dateFontSize(), - }, - { - name: 'dateFontColor', - label: '日期文字颜色', - type: 'color', - icon: 'https://s3.uuu.ovh/imgs/2022/12/05/ac2c5b8843ff2719.gif', - needLoading: false, - default: dateFontColor(), - }, - { - name: 'weatherFontSize', - label: '天气文字大小', - type: 'cell', - icon: 'https://s3.uuu.ovh/imgs/2022/12/05/a95f9edce36891d9.gif', - needLoading: false, - alert: { - title: '天气文字大小', - options: [ - { - key: 'weatherFontSize', - hint: '请输入字号', - } - ] - }, - default: weatherFontSize(), - }, - { - name: 'weatherFontColor', - label: '天气文字颜色', - type: 'color', - icon: 'https://s3.uuu.ovh/imgs/2022/12/05/a95f9edce36891d9.gif', - needLoading: false, - default: weatherFontColor(), - }, - { - name: 'covFontSize', - label: '疫情文字大小', - type: 'cell', - icon: 'https://s3.uuu.ovh/imgs/2022/12/05/2cd3dee47cd0824f.png', - needLoading: false, - alert: { - title: '疫情文字大小', - options: [ - { - key: 'covFontSize', - hint: '请输入字号', - } - ] - }, - default: covFontSize(), - }, - { - name: 'covFontColor', - label: '疫情文字颜色', - type: 'color', - icon: 'https://s3.uuu.ovh/imgs/2022/12/05/2cd3dee47cd0824f.png', - needLoading: false, - default: covFontColor(), - }, - ] - }, - ], - // cell类型的item点击回调 - onItemClick: async (item) => { - let widgetSetting = readWidgetSetting(); - let insertDesc; - switch (item.name) { - case '': - break - } - // 写入更新配置 - writeWidgetSetting(widgetSetting); - return { - desc: { value: insertDesc }, + // --------------------------NET START-------------------------- + async loadHTML(url) { + let req = new Request(url); + req.headers = { + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36", }; - }, - // UI渲染 - render: async ({ widgetSetting, family }) => { - Object.assign(defaultPreference, widgetSetting); + let html = await req.loadString(); + return html.replace(/(\r\n|\n|\r)/gm, ""); + } + + async loadMovieCalendar() { + const link = this.domain; + let response = undefined; try { - return await createWidget(defaultPreference, family); - } catch (e) { - if (config.runsInApp) { - await generateAlert({ - title: '❌运行错误', - message: `${e}`, - options: ['确定'] - }); + const ufm = this.useFileManager(); + const webview = new WebView(); + const cacheFileName = this.md5(link); + const lastCacheTime = ufm.getCacheModifyDate(cacheFileName); + const timeInterval = Math.floor((this.getCurrentTimeStamp() - lastCacheTime) / 60); + // 读取本地缓存 + const localCache = ufm.readStringCache(cacheFileName); + const canUseCache = localCache != null && localCache.length > 0; + // 过时且有本地缓存则直接返回本地缓存数据 + const { refreshInterval = '0' } = this.readWidgetSetting(); + const shouldLoadCache = timeInterval <= Number(refreshInterval) && canUseCache; + let html = undefined; + if (!shouldLoadCache) { + console.log(`-->>在线加载网页数据:${link}`); + html = await this.loadHTML(link); + ufm.writeStringCache(cacheFileName, html); + } else { + html = ufm.readStringCache(cacheFileName); + console.log(`-->>加载缓存网页数据:${link}`); + } + await webview.loadHTML(html); + const getData = + ` + function getData() { + let movieImg = document.getElementById('movie-img').src; + let movieDesc = document.querySelector('span#movie-text').textContent; + let movieName = document.querySelector('a#movie-name').textContent.replaceAll('——', ''); + let movieInformation = document.querySelector('a#movie-information').textContent; + let movieRating = movieInformation.slice(0, 3); + movieInformation = movieInformation.slice(5); + let movieLink = document.querySelector('a#movie-img-a').href; + return { movieImg, movieDesc, movieName, movieInformation, movieRating, movieLink }; + } + getData() + ` + // 热榜数据 + response = await webview.evaluateJavaScript(getData, false); + if (response.titleArr?.length > 0) { + this.useFileManager().writeStringCache('movieCalendar', JSON.stringify(response)); } - console.error(e); + } catch (error) { + console.error(`🚫 请求数据出错了=>${error}`); + response = JSON.parse(this.useFileManager().readStringCache('movieCalendar')); } + return response; } -}); + // --------------------------NET END-------------------------- + +} + +await new Widget(Script.name()).run(); -// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑END↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ // ================================================================================= // ================================================================================= async function downloadLSPDependency() { let fm = FileManager.local(); - const dependencyURL = "https://gitee.com/enjoyee/scriptable/raw/develop/_LSP.js"; + const dependencyURL = `${remoteRoot}/_LSP.js`; + const update = needUpdateDependency(); if (isDev) { const iCloudPath = FileManager.iCloud().documentsDirectory(); const localIcloudDependencyExit = fm.isFileStoredIniCloud(`${iCloudPath}/_LSP.js`); const localDependencyExit = fm.fileExists(`${rootDir}/_LSP.js`); const fileExist = localIcloudDependencyExit || localDependencyExit; console.log(`🚀 DEV开发依赖文件${fileExist ? '已存在 ✅' : '不存在 🚫'}`); - if (!fileExist) { - console.log(`🤖 DEV 开始下载依赖~`); + if (!fileExist || update) { + console.log(`🤖 DEV 开始${update ? '更新' + dependencyLSP : '下载'}依赖~`); + keySave('VERSION', dependencyLSP); await downloadFile2Scriptable('_LSP', dependencyURL); } return @@ -277,20 +200,20 @@ async function downloadLSPDependency() { console.log(`----------------------------------------`); const remoteDependencyExit = fm.fileExists(`${cacheDir}/_LSP.js`); console.log(`🚀 RELEASE依赖文件${remoteDependencyExit ? '已存在 ✅' : '不存在 🚫'}`); - console.log(`----------------------------------------`); // ------------------------------ - if (!remoteDependencyExit) { // 下载依赖 + if (!remoteDependencyExit || update) { // 下载依赖 // 创建根目录 if (!fm.fileExists(cacheDir)) { fm.createDirectory(cacheDir, true); } // 下载 - console.log('🤖 RELEASE开始下载依赖~'); + console.log(`🤖 RELEASE开始${update ? '更新' : '下载'}依赖~`); console.log(`----------------------------------------`); const req = new Request(dependencyURL); const moduleJs = await req.load(); if (moduleJs) { fm.write(fm.joinPath(cacheDir, '/_LSP.js'), moduleJs); + keySave('VERSION', dependencyLSP); console.log('✅ LSP远程依赖环境下载成功!'); console.log(`----------------------------------------`); } else { @@ -340,5 +263,25 @@ async function downloadFile2Scriptable(moduleName, url) { return saveFile2Scriptable(`${moduleName}`, content); }; +/** + * 是否需要更新依赖版本 + */ +function needUpdateDependency() { + return dependencyLSP != keyGet('VERSION'); +}; + +function keySave(cacheKey, cache) { + if (cache) { + Keychain.set(Script.name() + cacheKey, cache); + } +} + +function keyGet(cacheKey, defaultValue = '') { + if (Keychain.contains(Script.name() + cacheKey)) { + return Keychain.get(Script.name() + cacheKey); + } else { + return defaultValue; + } +} // ================================================================================= // ================================================================================= \ No newline at end of file diff --git "a/\347\224\265\344\277\241.js" "b/\347\224\265\344\277\241.js" index 8036b54..b8ecd19 100644 --- "a/\347\224\265\344\277\241.js" +++ "b/\347\224\265\344\277\241.js" @@ -3,7 +3,7 @@ // icon-color: blue; icon-glyph: mobile-alt; /** * Author:LSP -* Date:2023-02-04 +* Date:2023-02-13 */ // ------------------------------------------------------- // 是否是开发环境,配合手机端调试使用,正式发布设置为false @@ -264,7 +264,7 @@ class Widget extends BaseWidget { let displayStack = stack.addStack(); displayStack.centerAlignContent(); displayStack.addSpacer(descLeftSpacer); - textSpan = displayStack.addText(`${voiceBalance ? `${this.fee.balance}${this.fee.unit}` : 'NAN'}`); + textSpan = displayStack.addText(`${this.fee.balance}${this.fee.unit}`); textSpan.textColor = descTextColor; textSpan.font = infoFont; displayStack.addSpacer(); @@ -278,7 +278,7 @@ class Widget extends BaseWidget { displayStack = stack.addStack(); displayStack.centerAlignContent(); displayStack.addSpacer(descLeftSpacer); - textSpan = displayStack.addText(`${voiceBalance ? `${voiceBalance}${this.voice.unit}` : 'NAN'} `); + textSpan = displayStack.addText(`${voiceBalance}${this.voice.unit}`); textSpan.textColor = descTextColor; textSpan.font = infoFont; displayStack.addSpacer(); @@ -292,7 +292,7 @@ class Widget extends BaseWidget { displayStack = stack.addStack(); displayStack.centerAlignContent(); displayStack.addSpacer(descLeftSpacer); - textSpan = displayStack.addText(`${voiceBalance ? `${this.flow.balance}${this.flow.unit}` : 'NAN'} `); + textSpan = displayStack.addText(`${this.flow.balance}${this.flow.unit}`); textSpan.textColor = descTextColor; textSpan.font = infoFont; displayStack.addSpacer(); diff --git "a/\350\201\224\351\200\232.js" "b/\350\201\224\351\200\232.js" index 47bd1e2..14e4250 100644 --- "a/\350\201\224\351\200\232.js" +++ "b/\350\201\224\351\200\232.js" @@ -3,7 +3,7 @@ // icon-color: red; icon-glyph: mobile-alt; /** * Author:LSP -* Date:2023-02-04 +* Date:2023-02-13 */ // ------------------------------------------------------- // 是否是开发环境,配合手机端调试使用,正式发布设置为false @@ -241,7 +241,7 @@ class Widget extends BaseWidget { let displayStack = stack.addStack(); displayStack.centerAlignContent(); displayStack.addSpacer(descLeftSpacer); - textSpan = displayStack.addText(`${voiceBalance ? `${this.fee.balance}${this.fee.unit}` : 'NAN'}`); + textSpan = displayStack.addText(`${this.fee.balance}${this.fee.unit}`); textSpan.textColor = descTextColor textSpan.font = infoFont displayStack.addSpacer(); @@ -255,7 +255,7 @@ class Widget extends BaseWidget { displayStack = stack.addStack(); displayStack.centerAlignContent(); displayStack.addSpacer(descLeftSpacer); - textSpan = displayStack.addText(`${voiceBalance ? `${voiceBalance}${this.voice.unit}` : 'NAN'}`); + textSpan = displayStack.addText(`${voiceBalance}${this.voice.unit}`); textSpan.textColor = descTextColor textSpan.font = infoFont displayStack.addSpacer(); @@ -269,7 +269,7 @@ class Widget extends BaseWidget { displayStack = stack.addStack(); displayStack.centerAlignContent(); displayStack.addSpacer(descLeftSpacer); - textSpan = displayStack.addText(`${voiceBalance ? `${this.flow.balance}${this.flow.unit}` : 'NAN'}`); + textSpan = displayStack.addText(`${this.flow.balance}${this.flow.unit}`); textSpan.textColor = descTextColor textSpan.font = infoFont displayStack.addSpacer(); -- GitLab