当前位置: 首页 > news >正文

Mac 使用脚本批量导入 Apple 歌曲

最近呢,买了一个 iPad,虽然家里笔记本台式都有,显示器都是 2个,比较方便看代码(边打游戏边追剧)。

但是在床上拿笔记本始终还是不方便,手机在家看还是小了点,自从有 iPad 之后,拿个大屏在家里用着确实舒服不少。

能追剧,能玩玩其他应用,那还得听听音乐不是,但是懂的都懂,苹果里导入文件是个麻烦事,更别说音乐播放。

所以这件事就得研究研究,因为在电脑上已经把音乐都按照文件夹整理好了。

在 Android 中很简单,adb 一推到 Music 目录中,更新一下就行。


但是 iOS 搜了一圈发现还真不好弄,基本都是要通过 Apple 这个音乐导入到资料库,接着再通过 iTunes(新版已经合并在 Finder 中) 进行同步。

我试了下音乐这个应用,确实是可以通过新建歌单后,把需要添加的音乐文件夹直接拖入到歌单中,这样一次就可以添加多首,这个虽然要操作一下,但是也还可以接受。

正当我发现这个方案可行的时候,我看了一眼歌单,发现只有部分歌,就有点纳闷为啥部分歌曲没有导入。

请添加图片描述

在网上一搜,发现原来不支持无损,就是 FLAC 格式的文件。

这不是尴尬了么,所以看来还需要一个操作把 FLAC 文件转为 mp3 格式再导入才可以。

如果选第三方的工具,比如格式工厂或者狸窝,文件夹太多的情况,都要自己动手就太折腾了,比如我这里有几十个文件夹。(别问为啥这么多,强迫症就是歌手区分,各种风格也要区分)

用过 shell 的朋友都知道,这种批量的工作最好就交给脚本来做,遍历文件夹批量转化所有文件就行。

批量转化音乐

当然这里还有一些其他的逻辑,比如歌曲中已经是 mp3 的格式了,那应该就直接复制,除了 mp3 还有 wav 格式,同理针对 lrc 歌词文件也应该是直接复制。

所以和 ChatGPT “对线”几轮后,终于得到了一个满意的脚本,就不卖关子了。(对线真的考验心态和血压,最好自己能懂部分,可以自己动手改一下 shell)

#!/bin/bash# 检查是否安装了 ffmpeg
if ! command -v ffmpeg &> /dev/null
thenecho "Error: ffmpeg 未安装。请先安装 ffmpeg。"exit 1
fi# 检查参数是否足够
if [ "$#" -ne 2 ]; thenecho "Usage: $0 <import_directory> <export_directory>"exit 1
fi# 输入和输出目录
import_dir="$1"
export_dir="$2"
error_log="$export_dir/error_log.txt"# 检查导入目录是否存在
if [ ! -d "$import_dir" ]; thenecho "Error: 导入目录 $import_dir 不存在。"exit 1
fi# 创建导出目录(如果不存在)
mkdir -p "$export_dir"# 清空错误日志文件
: > "$error_log"# 查找所有文件并计算文件总数
total_files=$(find "$import_dir" -type f | wc -l)
if [ "$total_files" -eq 0 ]; thenecho "Error: 未找到文件。"exit 1
fiecho "共找到 $total_files 个文件,开始处理..."# 初始化计数器
counter=1# 遍历所有歌手目录
for artist_dir in "$import_dir"/*; doif [ -d "$artist_dir" ]; then# 遍历每个歌手目录下的所有文件for song in "$artist_dir"/*; doif [ -f "$song" ]; then# 确定输出文件夹结构rel_path="${song#$import_dir/}"output_dir="$export_dir/$(dirname "$rel_path")"mkdir -p "$output_dir"# 获取文件扩展名ext="${song##*.}"# 处理不同文件类型if [ "$ext" = "flac" ]; then# 转换 FLAC 文件为 MP3,指定比特率 320k,并显式指定编码器output_file="$output_dir/$(basename "${song%.flac}.mp3")"echo "正在转换文件 ($counter/$total_files): $song -> $output_file"# 使用 libmp3lame 编码器,忽略非音频流,并增加 analyzeduration 和 probesizeffmpeg -analyzeduration 100M -probesize 50M -i "$song" -vn -c:a libmp3lame -b:a 320k "$output_file" > /dev/null 2> ffmpeg_errors.txtif [ $? -ne 0 ]; thenecho "Error: 转换 $song 失败。" | tee -a "$error_log"elseecho "转换成功: $output_file"fielif [ "$ext" = "lrc" ] || [ "$ext" = "mp3" ] || [ "$ext" = "wav" ]; then# 直接复制 LRC 和 MP3 文件echo "正在复制文件 ($counter/$total_files): $song -> $output_dir/"cp "$song" "$output_dir/"if [ $? -ne 0 ]; thenecho "Error: 复制 $song 失败。" | tee -a "$error_log"elseecho "复制成功: $song"fielseecho "跳过不支持的文件 ($counter/$total_files): $song"fi# 更新计数器counter=$((counter + 1))fidonefi
doneecho "所有文件已处理完成。"

总结几个点:

  1. 这里是通过 ffmpeg 进行转换,毕竟这个开源工具很强大,视频都能随便处理,音频处理不是手到擒来么。
  2. 加入了处理进度,会在控制台输出,这样我们比较好知道处理到哪了,大概还有多久的时间。
  3. 第三是加入了错误日志导出,这样知道哪些歌曲出错了,没有处理。

因为脚本上也有对应的注释,如果知道一点编程的朋友应该能知道怎么修改一下。但是呢,考虑到可能会有非程序员的朋友看到该文章,还是简单讲一下这里的操作的流程。


打开终端应用。

在这里插入图片描述

在里面输入下面的语句,这个是通过 brew 命令安装 ffmpeg 库。

brew install ffmpeg

当命令行自己运行一会,光标重新开始闪烁时一般就是安装完毕。可以通过查看下 ffmpeg 版本看下是否安装好了。

ffmpeg --version

在这里插入图片描述

这样就完成了第一步 ffmpeg 安装。接着我们通过命令要新建一个普通文件,命名为 cvt.sh ,意思就是 converte 缩写,当然可以换个任意你喜欢的名字。

touch cvt.sh

一般来说命令行首次打开会在自己的 home 目录下,那么新建也是在这里。

在这里插入图片描述

如果会用命令修改的话可以直接通过 vi 打开复制,不会的朋友找到这个文件,然后用文本编辑应用打开。把刚刚那一长串代码复制进去,就像这样,记得保存一下。(Command + s)

在这里插入图片描述

第二部脚本文件可以说准备好了,但这里还差一点,就是新建的脚本文件需要加上可执行的权限。

在命令行中输入,这样我们一会才能执行这个转化的脚本。

chmod 711 cvt.sh

万事具备,讲一讲这个用法。(输出的文件夹可以不用存在,会自动创建)

#这里需要把对应的文件夹名字换一下。
bash cvt.sh <输入的文件夹> <输出的文件夹>

这里还要说明一下,脚本扫描的路径层级是这样:

输入的文件夹 - 二级目录(一般是歌手或者歌曲风格) - 该目录下所有歌曲

如果二级目录这个位置是歌曲是不会处理的,因为这么设计是为了方便后续导入 Apple 歌单.

我这里示范一下,假如我的音乐 testMusic 和脚本在一个地方,都在 home 目录下。

bash cvt.sh testMusic outputMusic

在这里插入图片描述
在这里插入图片描述

这样就开始了,可以看到有复制的,有转换的,也有对应进度。

需要注意的是,因为这里把错误信息导出到文件了,所以当第一次跑脚本,中途取消了,重新跑会发现,命令行卡着不动,实际上可以在当前目录中看到有错误日志,这里提示问是否覆盖。

在这里插入图片描述

所以建议如果用这个脚本,就一次性跑完,或者需要重新跑的时候把目标文件夹清除一下。

当然更优秀的朋友应该知道根据自己需求改下脚本,比如文件是直接强行覆盖不用询问么,或者还是需要手动对比。当然每个人的想法不一样,这里就是抛砖引玉。

这样的话,音乐的转换就完成了。

如果只有几个歌单需要添加的朋友,那么手动拖一下到 音乐 中就可以解决问题了。


批量导入歌单

接着就是到歌曲导入为 Apple 的歌单了。

从我前面的强迫症发言来看,就知道我需要导入的歌单不少,那这么多都需要操作一遍岂不是很麻烦,所得想个招,比如有没有办法用脚本来做,所以懒惰才是人类的第一生产力。

问了下 gpt ,好消息-有方案,坏消息-是其他脚本。

Gpt 提到可以用 Mac 自带的脚本编辑器来做,虽然我不会它这个脚本的语法,但是我有 gpt 呀,它会≈我会。😎

把导入的诉求告诉了它,又是一顿 battle 。

算是最后拿出了一个脚本,你还别说,shell 都算语法奇怪的了,苹果这个更奇怪,不过 …… 反正能跑就是好代码不是。

照例加入进度打印,错误输出。

on run argv-- 确保传入的参数数量正确if (count of argv) is not 1 thenerror "请提供一个参数:音乐文件夹的根路径。"end if-- 获取传入路径set inputPath to item 1 of argv-- 检查是否为相对路径,若是则转换为绝对路径if inputPath does not start with "/" thenset currentDirectory to (POSIX path of (do shell script "pwd"))set rootFolderPathString to currentDirectory & "/" & inputPathelseset rootFolderPathString to inputPathend if-- 转换路径为 POSIX file 类型set rootFolderPath to POSIX file rootFolderPathString-- 设置日志文件路径set logFilePath to POSIX file (rootFolderPathString & "/import_log.txt")-- 强制启动音乐应用tell application "Music"launch -- 确保 Music 应用已启动end tell-- 获取根文件夹下的所有文件夹tell application "Finder"set musicFolders to every folder of folder rootFolderPathend tell-- 清空日志文件tryset logFile to open for access logFilePath with write permissionset eof of logFile to 0 -- 清空文件close access logFileon error-- 如果日志文件不存在,则创建它set logFile to open for access logFilePath with write permissionclose access logFileend try-- 总文件夹数量set totalFolders to count of musicFolders-- 遍历每个文件夹repeat with musicFolder in musicFoldersset playlistName to name of musicFolder -- 使用文件夹名作为播放列表名称set musicFolderPath to (musicFolder as alias)tell application "Music"-- 检查是否已经存在同名播放列表set playlistExists to falserepeat with aPlaylist in (get user playlists)if (name of aPlaylist) is equal to playlistName thenset playlistExists to trueset existingPlaylist to aPlaylistexit repeatend ifend repeat-- 如果不存在同名播放列表,则创建新的播放列表if playlistExists thenset targetPlaylist to existingPlaylistelseset targetPlaylist to make new user playlist with properties {name:playlistName}log "Created new playlist: " & playlistNameend if-- 获取该文件夹中的所有音乐文件tell application "Finder"set musicFiles to every file of musicFolderend tell-- 当前文件夹的已处理文件计数set processedFilesInFolder to 0 -- 初始化当前文件夹处理计数-- 将每个文件导入到音乐应用并添加到播放列表repeat with aFile in musicFilesset fileName to name of aFileset fileExtension to (name extension of aFile)log "Checking fileName " & fileName & " ;fileExtension: " & fileExtension-- 只处理 .mp3 和 .wav 文件if fileExtension is "mp3" or fileExtension is "wav" thentry-- 检查文件是否已经在播放列表中set songAlreadyInPlaylist to falselog "File name: " & (name of aFile) -- 查看文件名repeat with aTrack in (get tracks of targetPlaylist)if (name of aTrack) is equal to fileName thenset songAlreadyInPlaylist to truelog "Found existing song in playlist: " & fileNameexit repeatend ifend repeat-- 如果歌曲尚未在播放列表中,才导入if not songAlreadyInPlaylist thenlog "Importing song to playlist: " & fileName-- 确保 aFile 以 alias 形式导入set importedTrack to add (aFile as alias) to targetPlaylistlog "Successfully added: " & fileName--delay 1 -- 添加 1 秒的延迟elselog "Skipping already existing song: " & fileName--delay 1 -- 添加 1 秒的延迟end ifon error errorMsg-- 处理可能的错误,记录详细信息set logMessage to "Error importing file: " & fileName & return & errorMsgmy appendToLog(logMessage, logFilePath)end tryelse-- 记录不支持的文件到日志文件log "Skipping unsupported file: " & fileNameend if-- 增加当前文件夹的已处理文件数量set processedFilesInFolder to processedFilesInFolder + 1-- 打印当前进度my displayProgress(processedFilesInFolder, (count of musicFiles), playlistName)end repeatend tellend repeat-- 打印总的处理完成信息display dialog "所有歌曲已处理完成!" buttons {"OK"} default button 1
end run-- 函数:将消息附加到日志文件
on appendToLog(logMessage, logFilePath)set logFile to open for access logFilePath with write permissionwrite logMessage to logFile starting at eofclose access logFile
end appendToLog-- 函数:显示处理进度
on displayProgress(folderProcessed, totalInFolder, playlistName)set progressPercent to (folderProcessed / totalInFolder) * 100set formattedProgress to round progressPercent * 10 / 10.0 -- 保留一位小数-- 在终端输出进度log "Processing " & playlistName & ": " & (folderProcessed as string) & "/" & (totalInFolder as string) & " (" & (formattedProgress as string) & "%)"
end displayProgress

关于这个脚本的用法,简单讲一下,估计大部分朋友都没有接触过,毕竟不通用。

在这里插入图片描述

打开这个编辑器,把刚才的脚本拷贝上,然后保存为 脚本格式。

在这里插入图片描述

我这里文件名用的是 importMusic.scpt ,说一下用法。

osascript <脚本名称> <导入的文件夹>

和刚才一样,我的命令行在 home 目录下,新建的 importMusic.scpt 也挪到这个目录,处理后的音乐还在刚才的位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
那我就可以这么用。

osascript importMusic.scpt outputMusic

接下来就是见证奇迹的时刻。

在这里插入图片描述

轻轻松松导入,真是省大心。

当然最后可以把这一段执行代码再组合在前面的 shell 文档中,不过分开一下也好,各个朋友有各自的需求,需求什么用什么。

脚本真是提升效率的利器。

在这里插入图片描述

后续计划录个视频把操作和代码上传一下,如果有看视频来的朋友用起来就比较方便了。

如果对你有帮助请点赞收藏支持一下,感谢 ~

相关文章:

Mac 使用脚本批量导入 Apple 歌曲

最近呢&#xff0c;买了一个 iPad&#xff0c;虽然家里笔记本台式都有&#xff0c;显示器都是 2个&#xff0c;比较方便看代码&#xff08;边打游戏边追剧&#xff09;。 但是在床上拿笔记本始终还是不方便&#xff0c;手机在家看还是小了点&#xff0c;自从有 iPad 之后&…...

全桥PFC电路及MATLAB仿真

一、PFC电路原理概述 PFC全称“Power Factor Correction”&#xff08;功率因数校正&#xff09;&#xff0c;PFC电路即能对功率因数进行校正&#xff0c;或者说是能提高功率因数的电路。是开关电源中很常见的电路。功率因数是用来描述电力系统中有功功率&#xff08;实际使用…...

【安当产品应用案例100集】025-确保数据安全传输——基于KMS与HSM的定期分发加密解决方案

引言&#xff1a; 在当今快速发展的数字化时代&#xff0c;企业面临着前所未有的信息安全挑战。尤其是在需要向供应商定期分发敏感数据的情况下&#xff0c;如何保证这些数据在传输过程中的安全性变得至关重要。为此&#xff0c;我们推出了结合安当KMS密钥管理平台与HSM密码机…...

十 缺陷检测解决策略之三:频域+空域

十 缺陷检测解决策略之三:频域空域 read_image (Image, 矩形) * 中间低频&#xff0c;四周高频 fft_image (Image, ImageFFT) * 中间低频&#xff0c;四周高频 fft_generic (Image, ImageFFT1, to_freq, -1, sqrt, dc_center, complex) * 中间高频&#xff0c;四周低频 rft_ge…...

有望第一次走出慢牛

A股已走完30多年历程。 大约每十年&#xff0c;会经历一轮牛熊周期。特点是每一轮周期&#xff0c;大约九成的时间都是熊市主导。就是我们常说的 快牛慢熊。 这一次&#xff0c;会不会重复历史? 历史不会简单重复。已经感受到了盘面的变化。 有人说&#xff0c;股市爆涨爆…...

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…...

电力行业 | 等保测评(网络安全等级保护)工作全解

电力行业为什么要做网络安全等级保护&#xff1f; 电力行业是关系到国家安全和社会稳定的基础性行业&#xff0c;电力行业信息化程度相对较高&#xff0c;是首批国家信息安全等级保护的重点行业。 01 国家法律法规的要求 1994《计算机信息系统安全保护条例》&#xff08;国务…...

总裁主题CeoMax-Pro主题7.6开心版

激活方式&#xff1a; 1.授权接口源码ceotheme-auth-api.zip搭建一个站点&#xff0c;绑定www.ceotheme.com域名&#xff0c;并配置任意一个域名的 SSL 证书。 2.在 hosts 中添加&#xff1a;127.0.0.1 www.ceotheme.com 3.上传class-wp-http.php到wp-includes目录&#xff…...

深入探讨编程的核心概念、学习路径、实际应用以及对未来的影响

在当今这个数字化时代&#xff0c;编程已成为连接现实与虚拟世界的桥梁&#xff0c;它不仅塑造了我们的生活方式&#xff0c;还推动了科技的飞速发展。从简单的网页制作到复杂的人工智能系统&#xff0c;编程无处不在&#xff0c;其重要性不言而喻。本文旨在深入探讨编程的核心…...

IDEA如何将一个分支的代码合并到另一个分支(当前分支)

前言 我们在使用IDEA开发Java应用时&#xff0c;经常是和git一起使用的。我们对于git常用的操作包括提交&#xff0c;推送&#xff0c;拉取代码等。还有一个重要的功能是合并代码。 那么&#xff0c;我们应该如何合并代码呢&#xff1f; 如何合并代码 首先&#xff0c;我们…...

Python实现基于WebSocket的stomp协议调试助手工具

stomp协议很简单&#xff0c;但是搜遍网络竟没找到一款合适的客户端工具。大多数提供的都是客户端库的使用。可能是太简单了吧&#xff01;可是即便这样&#xff0c;假如有一可视化的工具&#xff0c;将方便的对stomp协议进行抓包调试。网上类似MQTT的客户端工具有很多&#xf…...

基于neo4j的旅游知识图谱维护与问答系统

你还在为毕业设计发愁吗&#xff1f;试试这个基于Neo4j的旅游知识图谱维护与问答系统吧&#xff01;这套系统不仅功能强大&#xff0c;而且几乎涵盖了你需要的一切&#xff0c;完美助力你的毕业项目&#xff01; 系统介绍 该系统是专门针对旅游景点信息的知识图谱工具&#x…...

竞赛学习路线推荐(编程基础)

关于学习路线的推荐&#xff0c;总体上&#xff0c;分两步学习&#xff0c;第一步学习编程语言&#xff08;C、C、java&#xff09;&#xff0c;第二步是学习数据结构和算法 不少初学者会选择C语言或C作为首选&#xff0c;笔者这里也推荐C或C作为入门&#xff0c;需要注意的是&…...

webRTC搭建:STUN 和 TURN 服务器 链接google的有点慢,是不是可以自己搭建

如果使用 Google 提供的 STUN/TURN 服务器速度较慢&#xff0c;你完全可以自己搭建 STUN 和 TURN 服务器。这有助于提升网络连接速度和稳定性&#xff0c;特别是在需要穿透 NAT 或防火墙的网络环境下。 下面是如何自己搭建 STUN 和 TURN 服务器的具体步骤&#xff1a; 1. 选择…...

利用Pix4D和ArcGIS计算植被盖度

除了水文分析和沟道形态分析之外&#xff0c;在实际工作中还要计算植被盖度&#xff01; 植被盖度&#xff0c;也称为植被覆盖率或植物覆盖度&#xff0c;是指某一地表面积上植物冠层垂直投影面积占该地表面积的比例。它通常以百分比的形式表示&#xff0c;是描述地表植被状况的…...

用docker Desktop 下载使用thingsboard/tb-gateway

1、因为正常的docker pull thingsboard/tb-gateway 国内不行了&#xff0c;所以需要其它工具来下载 2、在win下用powershell管理员下运行 docker search thingsboard/tb-gateway 可以访问到了 docker pull thingsboard/tb-gateway就可以下载了 3、docker Desktop就可以看到…...

从视频中学习的SeeDo:VLM解释视频并生成规划、代码(含通过RGB视频模仿的人形机器人OKAMI、DexMV)

前言 在此文《UMI——斯坦福刷盘机器人&#xff1a;从手持夹持器到动作预测Diffusion Policy(含代码解读)》的1.1节开头有提到 机器人收集训练数据一般有多种方式&#xff0c;比如来自人类视频的视觉演示 有的工作致力于从视频数据——例如YouTube视频中进行策略学习 即最常见…...

项目集群部署定时任务重复执行......怎么解决???

项目集群部署在不同服务器&#xff0c;导致定时任务重复执行 1、可以在部署时只让一个服务器上有定时任务模块&#xff0c;不过这样如果这台服务器宕机&#xff0c;就会导致整个定时任务崩溃 2、使用分布式锁&#xff0c;使用redis setNX命令加lua脚本在定时任务执行的时候只…...

使用JUC包的AtomicXxxFieldUpdater实现更新的原子性

写在前面 本文一起来看下使用JUC包的AtomicXxxxFieldUpdater实现更新的原子性。代码位置如下&#xff1a; 当前有针对int&#xff0c;long&#xff0c;ref三种类型的支持。如果你需要其他类型的支持的话&#xff0c;也可以照葫芦画瓢。 1&#xff1a;例子 1.1&#xff1a;普…...

vue3组件通信--props

目录 1.父传子2.子传父 最近在做项目的过程中发现&#xff0c;props父子通信忘的差不多了。下面写个笔记复习一下。 1.父传子 父组件&#xff08;FatherComponent.vue&#xff09;&#xff1a; <script setup> import ChildComponent from "/components/ChildComp…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...