托5年github的新规,终于是进到这个大家庭了。已经申请过一直也没通过,感谢此次开放,非常开心!! 曾经我是站在讨论区外,看见各位佬佬们的讨论,无法参与。如今我也加入进来啦! 6年的程序员,向各位佬佬们请安! 1 个帖子 - 1 位参与者 阅读完整话题
即 https://linux.do/t/topic/2291466这个帖子中间发生了一个小插曲,还是挺有意思的,直接上图 原来是之前在我视频下面评论的,但是这个事情已经过去了很久很久,我都记不起来了,我一开始没想搭理,但是他说了 你不行 还得练 这个时候已经燃起了我的斗志 我有点受不了 于是开始了对这个网站复刻 原网站地址: https://trustwallet.com/ 复刻网站地址: https://trustwallet-static.pages.dev/ 6 个帖子 - 4 位参与者 阅读完整话题
英伟达因发布全新RTX Spark CPU而成为此次中国台北国际电脑展的新闻头条,这是有史以来首次Windows笔记本有能力和苹果MacBooks竞争,当然这要感谢ARM架构,但这并非没有代价。 最近有传闻称,搭载英伟达RTX Spark N1X的笔记本电脑和台式机售价至少为2900美元,相当于人民币19631元。而性能稍弱的Spark N1硬件售价可能在1800美元左右,但仍然相当昂贵。 “大摩”(摩根士丹利)发布了一份关于RTX Spark的报道,报道指出搭载RTX Spark N1X的硬件定价将达到2900美元。当然,贵有它贵的道理。 RTX Spark N1X性能超强,搭载20核 Garce CPU,带有6144 CUDA核心的RTX 5070,最高128GB的LPDDR5X共享内存,CPU和GPU之间600GB的带宽,并支持完整Nvidia软件栈。 虽然同等配置的MacBook价格几乎相同或更低,但由于英伟达先进计算技术,N1X笔记本电脑在游戏和设备上大规模AI任务处理方面将有更高的图形性能。 对于一般的视频剪辑、办公和电池续航,MacBook就足够了;但如果你需要运行强大的AI模型、玩游戏等等,即使在这个价位上,N1X也是更好的选择。 查看评论
ANTHROPIC :CLAUDE OPUS 4.8 正在向所有用户推出。 此次发布还包括一个更新的思考努力选择器,提供低、中、高、额外和最大选项。 为你最具雄心的作品切换到 Opus 4.8 - 现在你可以设置努力级别,以实现彻底性或速度。 1 个帖子 - 1 位参与者 阅读完整话题
原文(英文) (点击了解更多详细信息) 2 个帖子 - 2 位参与者 阅读完整话题
5月27日,长鑫科技科创板IPO获上市委会议通过。长鑫科技此次IPO拟募资295亿元,用于存储器晶圆制造量产线技术升级改造项目、DRAM存储器技术升级项目、动态随机存取存储器前瞻技术研究与开发项目等项目。 今年一季度,长鑫科技成功扭亏为盈,归母净利润247.62亿元,平均每天能赚2.75亿元以上。上半年预计营收将达1100亿至1200亿元,同比增长612.53%至677.31%,归母净利润区间为500亿至570亿元。 据了解,长鑫科技不仅是国内规模最大、技术最领先的DRAM一体化制造商,其产能与出货量更是稳居中国第一、全球第四。 查看评论
IT之家 5 月 27 日消息,据上海证券交易所官网信息,长鑫科技科创板 IPO 获上市委会议通过。 长鑫科技此次 IPO 拟募资 295 亿元,用于存储器晶圆制造量产线技术升级改造项目、DRAM 存储器技术升级项目、动态随机存取存储器前瞻技术研究与开发项目等项目。 财务数据显示,长鑫科技 2026 年第一季度实现营业收入 508 亿元,同比增长 719.13%;实现净利润 330.12 亿元,同比增长 1268.45%;实现归属于母公司所有者的净利润 247.62 亿元,同比增长 1688.30%。公司预计,2026 年上半年实现营业收入 1100 亿元至 1200 亿元,同比增长 612.53% 至 677.31%;实现归母净利润 500 亿元至 570 亿元,同比增长 2244.03% 至 2544.19%。 据IT之家了解,长鑫科技专注于动态随机存取存储芯片(DRAM)的设计、研发、生产和销售。公司现已形成 DDR 系列、LPDDR 系列等多元化产品布局,并可提供 DRAM 晶圆、DRAM 芯片、DRAM 模组等多样化的产品方案,可以有效满足服务器、移动设备、个人电脑、智能汽车等市场需求。公司在合肥、北京两地共拥有 3 座 12 英寸 DRAM 晶圆厂。根据 Omdia 的数据,按照产能和出货量统计,公司已成为中国第一、全球第四的 DRAM 厂商。
太空探索技术公司(SpaceX)此次递交 IPO 招股书,首度对外披露这家全球规模最大非上市公司的财务状况与经营运作情况。本次上市有望创下全球史上最大 IPO 纪录,也或将助力创始人埃隆・马斯克成为全球首位万亿富豪。公司计划于 6 月在纳斯达克挂牌上市,股票代码定为 SPCX 。本次周三提交的招股文件暂未披露发行价与预估初始估值,以下为招股书中核心关键信息: 今年 3 月,美国佛罗里达州卡纳维拉尔角,太空探索技术公司猎鹰 9 号火箭顺利升空。 亏损规模高达 49 亿美元 市场预估公司上市初始估值将达到 1.5 万亿美元及以上,但其财务状况远逊于美国其他大型巨头企业。去年公司营收 187 亿美元,全年亏损 49 亿美元。 今年亏损进一步扩大:一季度营收 47 亿美元,亏损高达 43 亿美元。 财报数据折射出两大经营现状: 其一,传统航天业务稳步发展,依托初代猎鹰火箭承接卫星发射、载人航天等成熟业务,同时星链卫星互联网业务持续扩张。去年航天发射业务营收 41 亿美元,目前仍未实现盈利;星链业务营收达 114 亿美元。 其二,今年 2 月完成对人工智能初创企业 xAI 的合并重组,由此产生巨额亏损。xAI 为追赶行业竞品,大举投入资金兴建大型数据中心,烧钱规模庞大,该企业去年实现营收 32 亿美元。 近期 SpaceX 与人工智能企业安思卓达成合作,后者旗下克劳德 AI 与 SpaceX 自研的格罗克 AI 形成竞争关系。双方约定,SpaceX 对外出租两大大型数据中心算力资源,每月租赁费用 12.5 亿美元,合作期限直至 2029 年 5 月。 公司去年整体资本开支达 207 亿美元,其中 xAI 投入 127 亿美元,航天发射与卫星业务合计资本开支 80 亿美元。 马斯克掌控 85% 投票权 2002 年马斯克怀揣火星殖民愿景创立 SpaceX,如今牢牢把控公司管理权与股权格局。截至 5 月 1 日,凭借特殊高投票权 B 类股份,身为首席执行官的马斯克手握公司 85% 投票权 。 面向普通投资者发行的 A 类股份每股对应 1 票投票权,而 B 类股份每股拥有 10 倍投票权。 马斯克持有 8.49 亿股 A 类股份、56 亿股 B 类股份。 公司内部董事及高管合计持有约 20% 的 A 类股份与 94% 的 B 类股份,合计掌握 86% 总投票权。这般股权架构几乎彻底断绝了外部投资者罢免马斯克 CEO 职位的可能性。 绑定火星愿景的薪酬体系 2025 年马斯克固定年薪仅 5.4 万美元,其绝大部分财富收益来自两大巨额股权激励计划。 今年 1 月,公司向马斯克授予 10 亿股 B 类股份,解锁条件分为两项:一是成功在火星建成常住人口不少于 100 万的永久性人类聚居地;二是达成系列市值目标,推动公司总市值攀升至 7.5 万亿美元。 今年 3 月,董事会再度向其授予 3.021 亿股股份,用以替代此前 xAI 相关股权激励。这批股权解锁要求为:建成地外太空数据中心,同时完成 12 项市值增长目标,将企业市值推高至 6.6 万亿美元。 就在数月之前,马斯克执掌的特斯拉股东大会刚通过其巨额薪酬方案,若达成全部激进发展目标,这份薪酬价值或将接近 1 万亿美元。 董事会仅设八名成员 SpaceX 董事会共计八名董事,由马斯克亲自出任董事长,董事会成员均由其选定,核心圈层皆是其核心盟友。 其余董事包括长期担任 SpaceX公司总裁的格温妮・肖特韦尔、Google高管唐纳德・哈里森,以及投资人安东尼奥・格拉西亚斯、史蒂夫・尤尔韦特松、卢克・诺塞克。长期担任公司董事观察员的兰迪・格兰、常年任职特斯拉董事的艾拉・埃伦普赖斯于今年 2 月正式入驻董事会。 投资机构维诺资本创始人格拉西亚斯自 2010 年起任职董事,该机构是 SpaceX 核心投资方,持股比例 7.3%,按照 1.5 万亿预估市值计算,对应股权价值超千亿美元。 作为控股股东掌控型企业,SpaceX 无需满足董事会多数成员为独立董事的监管要求。即便如此,公司仍将尤尔韦特松、诺塞克、埃伦普赖斯等人划定为独立董事,前两人依靠投资马斯克旗下企业积累巨额财富,后者同时兼任特斯拉董事。 公司一众高层持股丰厚,有望跻身亿万富豪行列。肖特韦尔去年年收入 8600 万美元,收入主要来自股票期权,目前持有 550 万股 A 类股份、710 万股 B 类股份。 关联企业交易往来密切 马斯克旗下多家企业深度协同合作,共用公务飞机、互相采购产品与服务已成常态。2025 年,SpaceX 按照厂商指导价,向特斯拉采购总价 1.31 亿美元的赛博皮卡。 本次上市招股书首次公开了这类关联交易具体金额:2025 年 SpaceX 还斥资 5.06 亿美元购入特斯拉大型储能电池产品;自 2024 年初至 2026 年 2 月,马斯克旗下 xAI 累计向特斯拉支付约 7.31 亿美元合作费用。 此外,SpaceX 正与特斯拉联手筹建大型芯片工厂泰拉工厂,联合研发人工智能项目迈克罗哈德。招股书中提及特斯拉相关内容多达 87 处,文件明确表示,未来双方还将持续挖掘更多战略协同合作领域。 手握大量美国政府订单 去年美国联邦机构订单收入,占到 SpaceX 营收的两成,合作对象除美国国家航空航天局外,还包含美国国防部及多家情报机构。 公司并未详细披露国家安全相关业务细节,但证实美国国家侦察局为其合作客户。该机构主营太空情报侦察业务,近几年双方携手研发多款涉密卫星网络项目。 股份分批解禁,锁定期设置差异 马斯克及部分核心大型投资方承诺,在公司股票正式上市交易后 366 天内 不得减持套现。 其余上市前入局的早期投资者股份锁定期为 180 天,同时享有提前解禁减持的相关权限。 公司发布首份季度财报后,符合提前解禁条件的股份中,最多可减持 20%;若上市后至首次财报发布前,公司股价稳定维持在特定价位区间,可再额外解禁 10% 股份。 后续还将分多个时间分批解禁股份,其中包含公司上市后发布第二份季度财报等关键时间点。而马斯克及公司内部核心管理层所持股份,不享受任何提前解禁减持资格。 查看评论
IT之家 5 月 21 日消息,据新华社今日报道,中国移动宣布在全国上线 词元(Token)套餐 。此次中国移动创新推出统一算力量纲,其将不同模型、不同规格的词元消耗统一封装为标准积分,旨在解决多模型量纲不统一的问题。 据中国移动相关负责人介绍, 该套餐价格最低为 5 元月包 ,包含一定数量的词元,适合轻度体验用户。中国移动的词元套餐已实现全国用户全覆盖。 除了基础算力套餐,中国移动还将词元和云电脑、云手机等产品深度融合,用户购买词元套餐,可直接在类似腾讯 WorkBuddy 等 AI 应用上使用。 IT之家测试,在中国移动 App 搜索 Token,会直接跳转到北京移动的算力 Token 套餐页面,Token 次包定价 5.99 元起 / 次,月包定价 24.99 元起 / 月。IT之家暂未查询到其他地区的词元(Token)套餐办理渠道。 据IT之家此前报道, 中国电信在 5 月 17 日推出系列试商用 Token 套餐 ,面向个人及家庭用户推出轻享版、畅享版、尊享版三档 Token Plan,每个月的资费价格分别为 9.9 元、29.9 元、49.9 元,分别对应每月 1000 万 Tokens、4000 万 Tokens、8000 万 Tokens。
Gemini网页端悄咪咪又更新了!!! 此次更新模型名字也进行了修改,之前的快速和思考分别改成了3.1 Flash-Lite和3 Flash 并且3个模型都设置两个推理档位,“标准”和“扩展” 简单测试天气卡片效果 3 个帖子 - 2 位参与者 阅读完整话题
OpenAI联合创始人兼总裁格雷格・布罗克曼正式接手公司产品战略统筹工作。此次人事调整实则是既定安排落地。此前负责通用人工智能落地业务的首席执行官菲吉・西莫因休病假,布罗克曼已临时代管公司产品业务。据悉,布罗克曼在内部员工备忘录中透露,计划将聊天机器人ChatGPT与代码开发工具Codex整合,打造一体化使用体验。 他表示:“我们整合产品研发资源,全力聚焦智能体发展方向,力争同时拿下消费端与企业端市场。” OpenAI证实,西莫目前仍在休病假,此次产品调整方案由其与布罗克曼共同商议敲定。官方同时透露,公司早已规划将ChatGPT、Codex及应用程序接口整合为统一平台,组建专属核心产品团队统筹运营。 去年年末,OpenAI首席执行官山姆・奥尔特曼宣布进入“紧急调整状态”,要求公司重新聚焦ChatGPT核心产品体验。自此之后,公司暂停了视频生成模型索拉、科学领域专项研发等非核心项目。 查看评论
IT之家 5 月 16 日消息,据央视新闻及新华社报道,神舟二十三号载人飞船与长征二号 F 遥二十三运载火箭组合体开始向发射区转运。 按照此前爆料,神舟二十三号船箭组合体预计将于 5 月 24 日 22:47 左右进行发射,神舟二十三号航天员名单有望在当天或前一天揭晓。IT之家后续将保持关注。 根据规划,我国 2026 年将组织实施天舟十号、神舟二十三号、神舟二十四号、梦舟一号等 4 次飞行任务。其中,神舟二十三号飞行乘组 1 名航天员开展 1 年以上长期驻留试验,实施航天员出舱活动和货物气闸舱出舱等任务。 作为参考,神舟二十一号载人飞船于 2025 年 10 月 31 日在酒泉卫星发射中心由长征二号 F 遥二十一运载火箭成功发射,并搭载神舟二十号航天员乘组(陈冬、陈中瑞、王杰)于 2025 年 11 月 14 日安全返回地面。 按照计划,神舟二十一号乘组(张陆、武飞和张洪章)将搭乘神舟二十二号飞船(2025 年 11 月 25 日发射)在本月底或下月初返回地球(原计划 4 月底或 5 月初,后延期一个月)。 截至 2026 年 5 月中旬,神舟二十一号乘组在轨驻留超 7 个月,期间完成了多次出舱活动、空间碎片防护装置安装、科学实验等任务,身心状态稳定,工作按计划推进。
此外,此次同行的商业界代表团成员有(转载): 简·弗雷泽 (Jane Fraser) ,花旗集团 Citi 首席执行官 蒂姆·库克 (Tim Cook) ,苹果公司 Apple 首席执行官 埃隆·马斯克 (Elon Musk) ,特斯拉公司 Tesla 首席执行官 黄仁勋 (Jensen Huang) ,英伟达公司 NVIDIA 首席执行官 布莱恩·赛克斯 (Brian Sikes) ,嘉吉公司 Cargill 首席执行官 拉里·芬克 (Larry Fink) ,贝莱德集团 BlackRock 董事长兼首席执行官 凯利·奥特伯格 (Kelly Ortberg) ,波音公司 Boeing 首席执行官 瑞安·麦金纳尼 (Ryan McInerney) ,维萨公司 Visa 首席执行官 查克·罗宾斯 (Chuck Robbins) ,思科系统 Cisco 董事长兼首席执行官 雅各布·泰森 (Jacob Thaysen) ,因美纳公司 Illumina 首席执行官 吉姆·安德森 (Jim Anderson) ,高意集团 Coherent 首席执行官 桑杰·梅赫罗特拉 (Sanjay Mehrotra) ,美光科技 Micron 董事长兼首席执行官 克里斯蒂亚诺·阿蒙 (Christiano Amon) ,高通公司 Qualcomm 首席执行官 迈克尔·米巴赫 (Michael Miebach) ,万事达卡公司 Mastercard 首席执行官 迪娜·鲍威尔·麦考密克 (Dina Powell McCormick) ,Meta 公司 全球事务总裁 大卫·所罗门 (David Solomon) ,高盛集团 Goldman Sachs 董事长兼首席执行官 H·劳伦斯·卡尔普 (H Lawrence Culp) ,GE 航空航天 GE Aerospace 董事长兼首席执行官 斯蒂芬·施瓦茨曼 (Stephen Schwarzman) ,黑石集团 Blackstone 董事长兼首席执行官 source: Nvidia CEO Joins Trump’s China Trip as Last-Minute Addition (1) 8 个帖子 - 8 位参与者 阅读完整话题
IT之家 5 月 11 日消息,今天上午,搭载天舟十号货运飞船的长征七号遥十一运载火箭,在我国文昌航天发射场点火发射。 IT之家注:天舟十号作为中国天舟系列的第十艘货运飞船, 是目前世界上现役货物运输能力最大、在轨支持能力最全面的货运飞船之一 。此次任务计划上行近 6.3 吨重的补给物资,主要用于保障神舟二十三号和神舟二十四号两批航天员乘组在轨正常工作、生活所需的物品。
贝宝(PYPL)计划在未来两到三年内裁减20% 的员工。此次裁员属于公司最新战略部署:加快人工智能落地、压缩运营成本。截至 2025 年底贝宝员工总数为 23800 人,按此基数计算,本次裁员规模将达4760 个岗位。彭博社此前已率先报道该裁员消息。 贝宝首席执行官恩里克・洛雷斯周二向投资者表示,公司过往在技术平台投入不足,已落后于其他金融科技同行。他计划砍掉冗余管理层级,把更多资源投向人工智能研发,力争成为行业技术领军者。 他表示:“贝宝需要聚焦主业,回归业务根本。” 前任 CEO 亚历克斯・克里斯被解职后,洛雷斯于今年 3 月空降执掌贝宝。他表示,削减成本是为了腾出资金加大新技术研发投入。 洛雷斯称:“第一,我们将精简组织架构,去除业务重复设置与冗余层级;第二,在全业务线加速人工智能落地与自动化运营布局。” 受消息影响,贝宝股价周二大跌超 8%,报 45.93 美元。 公司管理层预计,未来两至三年,本轮降本举措至少可实现年化总节约成本 15 亿美元。贝宝并未具体披露将在哪些业务板块削减开支。 管理层表示,今明两年贝宝将全面重组团队架构,搭建全新业务运营系统与流程体系。 由于不满前任 CEO 克里斯主导的变革节奏,贝宝董事会今年年初聘请前惠普 CEO 洛雷斯出任掌门人。疫情过后,贝宝核心支付结算业务增长放缓,公司一直寻求业务多元化转型。 洛雷斯表示,当前首要核心任务是稳固线上收银支付主业;同时看好先买后付(BNPL) 业务增长空间,消费者对灵活分期付款需求持续上升。 此外,金融服务、Venmo 社交支付、支付处理业务也将是重点发力方向。 贝宝一季度净利润降至11.1 亿美元,折合每股收益 1.21 美元;去年同期净利润 12.9 亿美元,每股收益 1.29 美元。 剔除一次性项目后,一季度调整后每股收益为 1.34 美元,高于分析师预期的 1.27 美元。 洛雷斯在执掌惠普期间,以精简架构、推动公司向人工智能与订阅业务转型著称。 本轮裁员降本是洛雷斯上任后的第二项重大改革举措。上周贝宝已宣布业务重组,将整合成三大事业板块: 收银支付解决方案与贝宝主业 消费金融服务与 Venmo 支付服务与加密货币业务 贝宝表示,此次架构调整将强化管理层权责考核,使公司组织架构更好对接收银支付、支付处理、消费金融等高增长市场机遇。 公司一季度营收从去年同期的 77.9 亿美元增至83.5 亿美元,高于分析师预期的 80.5 亿美元。 备受市场关注的盈利指标交易利润同比增长 3%,达 38 亿美元;总支付交易量同比上涨 11%,至 4640 亿美元。 对于当前第二季度,贝宝预计调整后盈利将出现高个位数下滑,降幅约 9%;交易利润预计下滑约 3%。 查看评论
天星银行正式更名为「象象银行」,以「象象银行,识投资」开启金融新时代。 同时,银行Logo与银行卡亦全面翻新。 此次更名或早有迹象: 香港《信报》曾于3月2日披露,富途在2025年9月已再度向天星银行母公司注资5亿港元,持股比例由44.11%一举提升至68.43%,取代小米集团-W(01810.HK)成为天星银行控股股东。 而将时间回溯至2024年6月,富途以4.4亿港元首次入股天星银行母公司“引力金融科技有限公司”, 成为天星银行第二大股东。 当时,小米持股由90%摊薄至50.3%,仍维持控股股东地位。天星银行另一创始股东尚乘集团,其持股则由10%摊薄至5.59%。 而随着2025年9月新一轮增资,小米持股进一步被摊薄至28.41%,退居第二大股东;尚乘集团的持股亦由5.59%降至3.16%。 此前,天星银行APP便已经过多轮重构:砍掉深色模式、页面UI大改同时主题色变为紫色、加入与富途UI基本相同的证券功能、推出PC端。 此次更名可能的来源:小米集团的金融板块名为「天星金融」,而富途证券理财功能此前名为「富途大象财富」。为了显示富途的控股地位,此次将「天星银行」更名为「象象银行」。 转自encmasuta 3 个帖子 - 3 位参与者 阅读完整话题
此次更新修复了第一次打开youtube视频无法加载下载按钮的问题,目前软件支持视频下载和短视频下载,支持手机端和电脑端。强调:由于调用第三方解析站,下载视频需要等待加载! // ==UserScript== // @name YouTube Downloader (loader.to) // @namespace http://tampermonkey.net/ // @version 1.0 // @description Download YouTube videos using loader.to, beautifully integrated into YouTube web and mobile UI. // @author You // @match *://*.youtube.com/* // @grant GM_xmlhttpRequest // @connect p.savenow.to // @run-at document-idle // ==/UserScript== (function () { 'use strict'; const SELECTOR_DESKTOP = '#top-level-buttons-computed'; const SELECTOR_MOBILE = 'ytm-slim-video-action-bar-renderer .slim-video-action-bar-actions'; const SELECTOR_SHORTS_DESKTOP = 'ytd-reel-video-renderer #actions #button-bar'; const SELECTOR_SHORTS_MOBILE = 'div.ytShortsCarouselCarouselItem[aria-hidden="false"] .reel-player-overlay-actions'; // Add base styles const style = document.createElement('style'); style.textContent = ` #yt-custom-download-btn { display: flex; align-items: center; justify-content: center; padding: 0 16px; height: 36px; border-radius: 18px; background-color: var(--yt-spec-buttonchip-background-primary, rgba(0, 0, 0, 0.05)); color: var(--yt-spec-text-primary, #0f0f0f); font-size: 14px; font-weight: 500; font-family: "Roboto", "Arial", sans-serif; cursor: pointer; margin-right: 8px; border: none; outline: none; transition: background-color 0.2s; } #yt-custom-download-btn:hover { background-color: var(--yt-spec-buttonchip-background-hover, rgba(0, 0, 0, 0.1)); } .yt-is-dark-theme #yt-custom-download-btn { background-color: var(--yt-spec-buttonchip-background-primary, rgba(255, 255, 255, 0.1)); color: var(--yt-spec-text-primary, #f1f1f1); } .yt-is-dark-theme #yt-custom-download-btn:hover { background-color: var(--yt-spec-buttonchip-background-hover, rgba(255, 255, 255, 0.2)); } #yt-custom-download-btn svg { margin-right: 6px; fill: currentColor; width: 20px; height: 20px; } #yt-download-popover { position: absolute; background-color: var(--yt-spec-base-background, #ffffff); color: var(--yt-spec-text-primary, #0f0f0f); border: 1px solid var(--yt-spec-10-percent-layer, rgba(0,0,0,0.1)); border-radius: 12px; padding: 16px; box-shadow: 0 4px 24px rgba(0,0,0,0.15); z-index: 9999; display: none; flex-direction: column; gap: 12px; min-width: 250px; font-family: inherit; } .yt-is-dark-theme #yt-download-popover { background-color: var(--yt-spec-base-background, #0f0f0f); border-color: var(--yt-spec-10-percent-layer, rgba(255,255,255,0.1)); box-shadow: 0 4px 24px rgba(0,0,0,0.5); color: var(--yt-spec-text-primary, #f1f1f1); } #yt-download-popover .popover-header { display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: bold; } #yt-dl-close { background: none; border: none; color: var(--yt-spec-text-primary, #000); cursor: pointer; font-size: 22px; line-height: 1; padding: 0 4px; } .yt-is-dark-theme #yt-dl-close { color: #f1f1f1; } #yt-dl-format { padding: 8px; border-radius: 6px; border: 1px solid var(--yt-spec-10-percent-layer, #ccc); background: var(--yt-spec-base-background, #fff); color: var(--yt-spec-text-primary, #000); width: 100%; outline: none; font-size: 14px; } .yt-is-dark-theme #yt-dl-format { border-color: rgba(255,255,255,0.2); background: #272727; color: #f1f1f1; } .yt-dl-actions { display: flex; gap: 10px; margin-top: 5px; } #yt-dl-confirm { flex: 1; background-color: #3ea6ff; color: #fff; border: none; padding: 8px; border-radius: 6px; cursor: pointer; font-weight: 500; font-size: 14px; } #yt-dl-confirm:hover { background-color: #65b8ff; } #yt-dl-iframe-container { width: 100%; text-align: center; margin-top: 5px; min-height: 65px; overflow: hidden; display: flex; justify-content: center; } /* Mobile styles overrides */ .mobile-layout #yt-custom-download-btn { margin: 0 4px; height: 32px; padding: 0 12px; border-radius: 16px; } .mobile-layout #yt-download-popover { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); width: calc(100% - 40px); max-width: 400px; } `; document.head.appendChild(style); // Context tracking let popoverElement = null; function getCleanUrl() { // Strip out list and index parameters from URL let url = window.location.href; url = url.replace(/&list=[^&]*/g, ''); url = url.replace(/\?list=[^&]*&?/g, '?'); url = url.replace(/&index=[^&]*/g, ''); url = url.replace(/\?index=[^&]*&?/g, '?'); url = url.replace(/\?$/g, ''); return url; } function isDarkTheme() { return document.documentElement.hasAttribute('dark') || document.body.hasAttribute('dark') || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); } function createPopover() { if (popoverElement) return popoverElement; popoverElement = document.createElement('div'); popoverElement.id = 'yt-download-popover'; // Replace innerHTML with programmatic nodes to satisfy TrustedHTML policy // 1. Header const headerDiv = document.createElement('div'); headerDiv.className = 'popover-header'; const headerTitle = document.createElement('span'); headerTitle.textContent = 'Download Video'; const headerClose = document.createElement('button'); headerClose.id = 'yt-dl-close'; headerClose.textContent = '×'; headerDiv.appendChild(headerTitle); headerDiv.appendChild(headerClose); // 2. Format Select const formatSelect = document.createElement('select'); formatSelect.id = 'yt-dl-format'; const formats = [ { value: 'mp3', text: 'MP3 (Audio)' }, { value: 'm4a', text: 'M4A (Audio)' }, { value: '360', text: 'MP4 360p' }, { value: '480', text: 'MP4 480p' }, { value: '720', text: 'MP4 720p', selected: true }, { value: '1080', text: 'MP4 1080p' }, { value: '4k', text: 'WEBM 4K' }, { value: '8k', text: 'WEBM 8K' } ]; formats.forEach(f => { const opt = document.createElement('option'); opt.value = f.value; opt.textContent = f.text; if (f.selected) opt.selected = true; formatSelect.appendChild(opt); }); // 3. Actions Form const actionsDiv = document.createElement('div'); actionsDiv.className = 'yt-dl-actions'; const confirmBtn = document.createElement('button'); confirmBtn.id = 'yt-dl-confirm'; confirmBtn.textContent = 'Load Download Link'; actionsDiv.appendChild(confirmBtn); // 4. Removed iframeContainer since we open in a new tab // 5. Build Popover popoverElement.appendChild(headerDiv); popoverElement.appendChild(formatSelect); popoverElement.appendChild(actionsDiv); popoverElement.appendChild(actionsDiv); document.body.appendChild(popoverElement); // Event listeners (Using the elements we just created above) headerClose.addEventListener('click', () => { popoverElement.style.display = 'none'; }); confirmBtn.addEventListener('click', () => { const selectedFormat = formatSelect.value; const cleanUrl = getCleanUrl(); // Encode the cleaned url const encodedUrl = encodeURIComponent(cleanUrl); // UI State change confirmBtn.disabled = true; confirmBtn.style.backgroundColor = '#888'; confirmBtn.textContent = 'Starting...'; const originalText = 'Load Download Link'; const originalBg = ''; // reverts to css style function resetBtn() { confirmBtn.disabled = false; confirmBtn.style.backgroundColor = originalBg; confirmBtn.textContent = originalText; } // 1. Init Download Task try { if (typeof GM_xmlhttpRequest === 'undefined') { throw new Error('GM_xmlhttpRequest not granted.'); } GM_xmlhttpRequest({ method: 'GET', url: 'https://p.savenow.to/ajax/download.php?format=' + selectedFormat + '&url=' + encodedUrl, headers: { 'Origin': 'https://en.loader.to', 'Referer': 'https://en.loader.to/' }, onload: function (response) { let data; try { data = JSON.parse(response.responseText); } catch (e) { console.error("Failed to parse init response: ", response.responseText); confirmBtn.textContent = 'Parse Error'; setTimeout(resetBtn, 2000); return; } // Extract ID. Sometimes it's directly 'id', sometimes we extract from progress_url let taskId = data.id; if (!taskId && data.progress_url) { try { const urlObj = new URL(data.progress_url); taskId = urlObj.searchParams.get('id'); } catch (e) { } } if (!data.success || !taskId || data.text === 'Video too long / Livestream') { console.error('API Error or Video too long', data); confirmBtn.textContent = data.text ? 'Error: ' + data.text : 'API Error'; setTimeout(resetBtn, 3000); return; } confirmBtn.textContent = 'Initializing (0%)...'; // 2. Poll Progress const pollInterval = setInterval(() => { GM_xmlhttpRequest({ method: 'GET', url: 'https://p.savenow.to/api/progress?id=' + taskId, headers: { 'Origin': 'https://en.loader.to', 'Referer': 'https://en.loader.to/' }, onload: function (res) { let progData; try { progData = JSON.parse(res.responseText); } catch (e) { return; // ignore parse errors on polling, try next tick } if (progData.progress !== undefined) { const rawProgress = parseInt(progData.progress, 10); const currentProgress = isNaN(rawProgress) ? 0 : rawProgress; const pct = (currentProgress / 10).toFixed(1); const statusText = progData.text || 'Downloading'; if (currentProgress < 1000) { confirmBtn.textContent = statusText + ' (' + pct + '%)...'; } else { // 100% finished clearInterval(pollInterval); confirmBtn.textContent = 'Download Ready!'; confirmBtn.style.backgroundColor = '#4caf50'; // Green // Trigger native download using window.open if (progData.download_url) { window.open(progData.download_url, '_blank'); } setTimeout(resetBtn, 3000); } } }, onerror: function (e) { console.error('Polling error:', e); clearInterval(pollInterval); confirmBtn.textContent = 'Polling Error'; setTimeout(resetBtn, 2000); } }); }, 1500); // Poll every 1.5 seconds }, onerror: function (err) { console.error('Init error:', err); confirmBtn.textContent = 'Network Error'; setTimeout(resetBtn, 2000); } }); } catch (err) { console.error('Fatal Script Error:', err); confirmBtn.textContent = 'Script Error (Update Headers)'; setTimeout(resetBtn, 3000); } }); // Close when clicking outside of the popover document.addEventListener('click', (e) => { const btn = document.getElementById('yt-custom-download-btn'); if (popoverElement.style.display === 'flex' && !popoverElement.contains(e.target) && (!btn || !btn.contains(e.target))) { popoverElement.style.display = 'none'; } }); return popoverElement; } function positionPopover(button) { const isMobile = window.location.hostname === 'm.youtube.com'; const popover = createPopover(); // removed iframe container reset // Update theme class based on YouTube's current theme if (isDarkTheme()) { document.body.classList.add('yt-is-dark-theme'); } else { document.body.classList.remove('yt-is-dark-theme'); } if (isMobile) { document.body.classList.add('mobile-layout'); // CSS handles fixed bottom position for mobile } else { document.body.classList.remove('mobile-layout'); // Calculate position for desktop (relative to clicked button) const rect = button.getBoundingClientRect(); const popoverWidth = 250; // Estimated height of the popover menu const popoverHeight = 120; // Default: position below the button let topPos = rect.bottom + window.scrollY + 10; // If it would overflow the bottom of the screen, place it ABOVE the button instead if (rect.bottom + popoverHeight + 10 > window.innerHeight) { topPos = rect.top + window.scrollY - popoverHeight - 10; } popover.style.top = topPos + 'px'; // Center popover horizontally relative to the button let leftPos = rect.left + window.scrollX - (popoverWidth / 2) + (rect.width / 2); // Ensure popover doesn't overflow viewport horizontally (especially on Shorts right-aligned UI) if (leftPos + popoverWidth > window.innerWidth) { leftPos = window.innerWidth - popoverWidth - 20; } if (leftPos < 10) { leftPos = 10; } popover.style.left = leftPos + 'px'; } popover.style.display = 'flex'; } function injectButton() { // Only run on watch or shorts pages const isWatch = window.location.pathname.startsWith('/watch'); const isShorts = window.location.pathname.startsWith('/shorts'); if (!isWatch && !isShorts) return; const isMobile = window.location.hostname === 'm.youtube.com'; let targetElement = null; // More aggressive find: Check for actual layout presence const findTarget = (selectorList) => { const selectors = selectorList.split(',').map(s => s.trim()); for (const selector of selectors) { const elms = document.querySelectorAll(selector); const found = Array.from(elms).find(el => { const rect = el.getBoundingClientRect(); // In SPA, wait for element to have at least some height, // but don't be too strict on offsetParent return rect.height > 0 || el.childNodes.length > 0; }); if (found) return found; } return null; }; if (isShorts) { targetElement = findTarget(isMobile ? SELECTOR_SHORTS_MOBILE : SELECTOR_SHORTS_DESKTOP); } else { if (isMobile) { targetElement = findTarget(SELECTOR_MOBILE); } else { // PC Desktop: Target the primary button container, with multiple fallbacks targetElement = findTarget('ytd-watch-metadata #top-level-buttons-computed, ytd-video-primary-info-renderer #top-level-buttons-computed, #top-level-buttons-computed, #actions-inner #menu #top-level-buttons-computed'); // Final fallback for PC: look for the segmented like button container and inject into its parent menu if (!targetElement) { const likeBtn = document.querySelector('ytd-segmented-like-dislike-button-renderer'); if (likeBtn) { targetElement = likeBtn.closest('#top-level-buttons-computed') || likeBtn.parentElement; } } } } if (!targetElement) return; // Prevent duplicate injection, but handle infinite scroll for Shorts const existingBtn = document.getElementById('yt-custom-download-btn'); if (existingBtn) { if (isShorts && !targetElement.contains(existingBtn)) { // Button is attached to an old/inactive Short. Remove it so we inject into the new active one. existingBtn.remove(); } else { // Button is already exactly where it should be return; } } const btn = document.createElement('button'); btn.id = 'yt-custom-download-btn'; // Construct the button safely (No innerHTML) const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('preserveAspectRatio', 'xMidYMid meet'); svg.setAttribute('focusable', 'false'); svg.style.pointerEvents = 'none'; svg.style.display = 'block'; const g = document.createElementNS('http://www.w3.org/2000/svg', 'g'); const path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path.setAttribute('d', 'M17 18V19H6V18H17ZM16.5 11.4L15.8 10.7L12 14.4V4H11V14.4L7.2 10.6L6.5 11.3L11.5 16.3L16.5 11.4Z'); g.appendChild(path); svg.appendChild(g); const textSpan = document.createElement('span'); textSpan.className = 'btn-text'; textSpan.textContent = 'Download'; btn.appendChild(svg); btn.appendChild(textSpan); // Add tooltip for desktop if (!isMobile) { btn.title = 'Download Video'; } btn.addEventListener('click', (e) => { e.preventDefault(); e.stopPropagation(); const popover = document.getElementById('yt-download-popover'); if (popover && popover.style.display === 'flex') { popover.style.display = 'none'; // Toggle off } else { positionPopover(btn); // Show } }); // Insert into YouTube DOM if (isShorts) { if (!isMobile) { // Desktop Shorts layout needs circular button btn.style.marginRight = '0'; btn.style.marginTop = '16px'; btn.style.width = '48px'; btn.style.height = '48px'; btn.style.borderRadius = '50%'; btn.style.padding = '0'; btn.style.backgroundColor = 'var(--yt-spec-badge-chip-background, rgba(0, 0, 0, 0.05))'; // Hide text on desktop shorts (stack of round icons) textSpan.style.display = 'none'; svg.style.marginRight = '0'; svg.style.width = '24px'; svg.style.height = '24px'; targetElement.appendChild(btn); } else { // Mobile Shorts layout: transparent, vertical layout btn.style.backgroundColor = 'transparent'; btn.style.marginRight = '0'; btn.style.marginTop = '16px'; btn.style.display = 'flex'; btn.style.flexDirection = 'column'; btn.style.justifyContent = 'center'; btn.style.alignItems = 'center'; svg.style.width = '28px'; svg.style.height = '28px'; svg.style.marginRight = '0'; textSpan.style.display = 'block'; // Ensure text is visible if overridden by media query textSpan.style.fontSize = '12px'; textSpan.style.marginTop = '4px'; textSpan.style.color = '#fff'; // Add right after the other vertical buttons targetElement.appendChild(btn); } } else if (isMobile) { targetElement.appendChild(btn); } else { // Desktop standard video: Insert before the first button in the top-level-buttons container if (targetElement.firstChild) { targetElement.insertBefore(btn, targetElement.firstChild); } else { targetElement.appendChild(btn); } } } // Use MutationObserver because YouTube is an SPA and loads comments/metadata asynchronously let domObserver = new MutationObserver((mutations) => { injectButton(); }); function init() { // Start observing DOM changes to inject button when target element appears domObserver.observe(document.body, { childList: true, subtree: true }); // Handle YouTube's SPA navigation events (cleanup and re-inject) const handleNav = () => { // 1. Hide and reset popover const popover = document.getElementById('yt-download-popover'); if (popover) { popover.style.display = 'none'; } // 2. Force remove old button const oldBtn = document.getElementById('yt-custom-download-btn'); if (oldBtn) { oldBtn.remove(); } // 3. Polling retry with longer duration (10s) let retries = 0; const poller = setInterval(() => { const btn = document.getElementById('yt-custom-download-btn'); if (btn || retries > 20) { clearInterval(poller); } else { injectButton(); retries++; } }, 500); }; window.addEventListener('yt-navigate-finish', handleNav); window.addEventListener('yt-page-data-updated', handleNav); // Initial run injectButton(); } // Initialize the script init(); })(); 1 个帖子 - 1 位参与者 阅读完整话题
6月10日,2026年第三期和第四期储蓄国债(电子式)发行。此次发行在渠道端有新的变化,个人养老金账户可以购买储蓄国债。个人养老金产品矩阵迎来扩容。业内人士表示,这一举措既丰富了个人养老金投资品类,还有望改善养老金账户“开户热、投资冷”的局面,为养老保险第三支柱导入长期稳定资金。据了解,储蓄国债纳入个人养老金账户后市场反响热烈。当天中午,北京一家中行网点客户经理表示,该网点本期储蓄式国债已售罄,暂无额度,“国债本身热度就高,上午开售没多久额度就抢完了”。(证券时报)
OpenAI 正准备对 ChatGPT 进行上线以来最大幅度升级,此次升级也引爆了人工智能热潮。这家估值 8500 亿美元的集团计划在今年上市前寻找新的增长引擎。该公司打算将这款聊天机器人转型为 “超级应用”,整合编程工具与人工智能智能体,新增多款高管认为能带来更高收入的产品。据十多位现任及前任员工透露,这些调整是 OpenAI 整体重组计划的一部分。这家总部位于旧金山的公司正调配资源,全力争取高利润企业客户,并与竞争对手 Anthropic 展开更激烈的竞争。此次调整将提升 OpenAI 编程产品 Codex 的地位并增加资源投入,反映出公司内部日益坚定的共识:人工智能的未来并非回答问题的聊天机器人,而是能为用户执行任务的智能体。(新浪财经)
LG Innotek将于下月开始扩建其位于越南的半导体基板工厂。此次扩建将通过其越南生产子公司的直接投资进行,计划2027年5月竣工。(新浪财经)