电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf

一个项目高星还是有其道理的

我怎么记得它只有一个WPF版本

原来还有Vue 和 Android

Android就是电视机盒子的大屏幕版本

或者平板电脑版本

javascript 复制代码
npm error code ENOTFOUND
npm error syscall getaddrinfo
npm error errno ENOTFOUND
npm error network request to https://registry.nlark.com/y18n/download/y18n-5.0.8.tgz failed, reason: getaddrinfo ENOTFOUND registry.nlark.com
npm error network This is a problem related to network connectivity.
npm error network In most cases you are behind a proxy or have bad network settings.

查看npm镜像

cpp 复制代码
npm config get registry

切官方(不是必须)

cpp 复制代码
npm config set registry https://registry.npmjs.org/

或者换用淘宝镜像(有时候更稳定):(不是必须)

cpp 复制代码
npm config set registry https://registry.npmmirror.com

清除(更不是必须)

css 复制代码
npm cache clean --force
npm install

nlark 连不上的问题

这会打印出谁依赖了 y18n(比如可能是 gulp、webpack、jest 或其他构建工具的子依赖)。

另外你的日志里还出现了两个 deprecated 警告:

  • node-sass@4.14.1 --- 这个包已经很老了,官方建议换成 sass(Dart Sass)
  • core-js@2.6.12 --- 这通常是 node-sass 或其他老包间接依赖的

如果你跑 npm ls y18n 把结果贴出来,我可以帮你精确定位到是哪一个。

cpp 复制代码
 npm ls y18n

y18n 包的问题

cpp 复制代码
npm warn Unknown user config "ELECTRON_MIRROR". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
npm warn Unknown user config "ELECTRON_BUILDER_BINARIES_MIRROR". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options.
jvedio-web@0.1.0 H:\
`-- (empty)

关键结论

npm ls y18n 输出 (empty),说明 node_modules 里确实没装成功,所以依赖树是空的。

但 package-lock.json 里大概率已经写死了 y18n@5.0.8 的下载地址为 https://registry.nlark.com/y18n/download/y18n-5.0.8.tgz。npm install 时会优先按锁文件里的 resolved 地址去下载,直接忽略你全局设的 registry。 这就是为什么你设了 npmmirror 还是去找 nlark。

解决方法

下载源码时,下载了package-lock ,先清掉

安装试用:npm install --legacy-peer-deps

个人问题 sass太旧,太多其他项目(你可能不会有这个问题)

css 复制代码
del package-lock.json
rmdir /s /q node_modules
npm uninstall node-sass
npm install sass --save-dev
npm install --legacy-peer-deps

好吧,想多了,真的只有WPF版本

没有vue,Vue 的含量只有0.5%

先实现简单化全盘搜索-- 无编译,纯代码

不是一个真实项目,或者二次修改,因为无法验证,就是纯代码输出

cs 复制代码
        /// <summary>
        /// 搜索
        /// </summary>
        /// <returns></returns>
        public async Task<List<string>> GetSearchCandidate()//异步,(可能开多个主线程)
        {
            return await Task.Run(() => {
                SearchField searchType = (SearchField)SearchSelectedIndex;
                string field = searchType.ToString();

                List<string> result = new List<string>();
                if (string.IsNullOrEmpty(SearchText))
                    return result;
                //做一个外部扩展类,Video 的外部阔咋和
                SelectWrapper<Video> wrapper = new SelectWrapper<Video>();
                SetSortOrder(wrapper); // 按照当前排序
                wrapper.Eq("metadata.DBId", ConfigManager.Main.CurrentDBId).Eq("metadata.DataType", 0);
                SelectWrapper<Video> selectWrapper = GetSearchWrapper(searchType);
                if (selectWrapper != null)
                    wrapper.Join(selectWrapper);

                //很粗暴的 SQL 拼装
                string sql = $"SELECT DISTINCT {field} FROM metadata_video " +
                            "JOIN metadata " +
                            "on metadata.DataID=metadata_video.DataID ";

                if (ExtraWrapper != null) {
                    wrapper.Join(ExtraWrapper);
                    if (!string.IsNullOrEmpty(ExtraWrapper.ExtraSql))
                        sql += ExtraWrapper.ExtraSql;
                }

                if (FilterWrapper != null) {
                    wrapper.Join(FilterWrapper);
                    if (!string.IsNullOrEmpty(FilterSQL))
                        sql += FilterSQL;
                }

                if (searchType == SearchField.ActorName)
                    sql += ActorMapper.SQL_JOIN_ACTOR;
                else if (searchType == SearchField.LabelName)
                    sql += VideoMapper.SQL_JOIN_LABEL;


                string condition_sql = wrapper.ToWhere(false) + wrapper.ToOrder()
                            + $" LIMIT 0,{SEARCH_CANDIDATE_MAX_COUNT}";

                if (searchType == SearchField.Genre) {
                    // 类别特殊处理
                    string genre_sql = $"SELECT {field} FROM metadata_video " +
                            "JOIN metadata " +
                            "on metadata.DataID=metadata_video.DataID ";
                    List<Dictionary<string, object>> list = metaDataMapper.Select(genre_sql);
                    if (list != null && list.Count > 0)
                        SetGenreCandidate(field, list, ref result);
                } else {
                    List<Dictionary<string, object>> list = metaDataMapper.Select(sql + condition_sql);
                    if (list != null && list.Count > 0) {
                        foreach (Dictionary<string, object> dict in list) {
                            if (!dict.ContainsKey(field))
                                continue;
                            string value = dict[field].ToString();
                            if (string.IsNullOrEmpty(value))
                                continue;
                            result.Add(value);
                        }
                    }
                }

                return result;
            });
        }

先实现插件管理-- 无编译,纯代码

源码里这个插件系统主要分两类:信息同步(爬虫)插件 和皮肤插件,不是一个统一的 DLL 插件加载机制。

上面需要的搜索代码并不存在,可能放在插件里面

而C#的插件系统是如何实现呢:

  • 插件目录与清单 :根目录是 plugins,下面分 crawlers 和 themes;远程插件列表地址是 GitHub Pages 上的 pluginlist.json。PathManager.cs UrlManager.cs
  • 信息同步插件 :每个爬虫插件目录包含 DLL 和元数据 JSON。启动时 CrawlerManager 扫描 plugins/crawlers,解析元数据、加载 DLL,并读取插件启用状态;插件 DLL 通过反射加载。CrawlerManager.cs
  • 运行时调用 :刮削影片信息时,程序按插件是否启用、服务器配置和影片类型筛选爬虫,再调用插件的 GetInfo。VideoDownLoader.cs 爬虫的 URL、Headers、Cookies 等服务器配置则单独保存到应用配置中。ServerConfig.cs
  • 皮肤插件 :主要是目录资源和 main.json 元数据,由主题模块读取并应用,不像爬虫那样加载 DLL。插件文档
  • 管理界面与更新 :插件窗口由 SuperControls.Style.Plugin.Window_Plugin 提供,主程序负责配置插件目录、远程列表 URL,以及下载或删除完成后的刷新回调。Window_Main.xaml.cs 爬虫插件删除会先加入待删除列表,重启时再清理。WindowStartUp.xaml.cs
cs 复制代码
//并没有调试,所以即使源码
//还是需要运行时调试,或者执行后才知道哪些数据对不上,否则老是提示运行错误,或者错误异常
//就会很烦,并不是这个软件不能用,或者架构不好,或者C#就是不好用
//能Debug得代码,就是在AI时代也是好代码

参考::其实 wpf 是比android 要开发得快,和有一些IDE 编辑工具优势

2011年春

但是工具真不算什么,底层框架才是核心

但是两者底层其实都是xml

乌龟 vs 王八

2者 层次真没什么不同不同,不可拿来比较<---这句话比较禅,观点与角度问题,不同人有不同理解

写了1年android,java的,最近同时写了1个月wpf,一开始不习惯wpf的布局,控件总是跑了,1个月后喜欢上了如此人性化的布局

谁TMD还跟我说JAVA好,用android开发快,我跟他急

右对齐(Layout)

下对齐

出来效果,截图还不算特别明显,无论窗口拖多宽,还是能保证界面结构,请留意输入框和返回按钮的不同

最最关键的是,在控件周围原点,点下鼠标即可实现布局

绝对相信meego系统的开发比较快,求Meego开发者证明,再求android系统开发框架

(最终他这个项目也没有实现Android 版本)

相关推荐
OxYGC1 小时前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
拥小抱17 小时前
Compose 知识点
android
文章永久免费只为良心17 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
AIsoft_868917 小时前
学术讲座录音如何整理?录音APP可行吗
android·iphone
Patrick在香港19 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
海雅达手持终端PDA21 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
booboosui1 天前
删掉一个住在本机的 agent:8 处要清,顺序不能反
android
hcgeng1 天前
Android获取崩溃日志
android