
什么是 Swing Music ?
Swing Music是一款漂亮的自托管音乐播放器,适用于您的本地音频文件。就像一个更酷的Spotify…但带上你自己的音乐。
第一次在 reddit 上看到 Swing Music,就被其 UI 吸引了

但源码站点的releases 中只有 windows 和 linux 的版本

老苏不是程序员,但作为一个爱折腾的人,岂能轻易放弃,何不借助最近火的一塌糊涂的 ChatGPT,让其协助完成 Docker 版呢?于是就有了下面👇的一场对话
以下只记录了对话的要点,不是事无巨细的完整记录。整个对话断断续续进行了 2天,其中包含了老苏查资料、编译、测试的时间
首先当然是看官方的安装手册了

说实话没看懂,虽然之前折腾过 python 的项目,但是 poetry 是什么鬼?
于是老苏向 ChatGPT 提了第一个问题
Dockerfilegit clone https://github.com/geoffrey45/swingmusic.git
cd swingmusic
# install dependencies using poetry
poetry install
# start the app
poetry run python manage.py
ChatGPT 很快就做出了响应,看起来是不是头头是道的?不仅给了代码,还有详细的解释
Dockerfile 的步骤如下:Dockerfile 的文件,将以下内容复制到文件中:FROM python:3.8-slim-buster
# 更换国内源
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get clean
# 安装 Git 和 Poetry
RUN apt-get update && \
apt-get install -y git && \
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
# 下载代码
RUN git clone https://github.com/geoffrey45/swingmusic.git /app
# 安装依赖
WORKDIR /app
RUN poetry install --no-dev
# 启动应用
CMD ["poetry", "run", "python", "manage.py"]
Dockerfile 基于 Python 3.8 官方镜像构建,安装了 Git 和 Poetry,从 GitHub 上下载了 geoffrey45/swingmusic 项目的代码,安装了项目依赖,并在容器启动时启动了应用程序。
在命令行中进入包含 Dockerfile 文件的目录,并执行以下命令构建 Docker 镜像:
docker build -t my-swingmusic-app .
其中,my-swingmusic-app 是您为该 Docker 镜像指定的名称。
构建完成后,可以使用以下命令启动 Docker 容器:
docker run --name my-swingmusic-container my-swingmusic-app
其中,my-swingmusic-container 是您为该 Docker 容器指定的名称。
希望这些步骤能够帮助您将上述命令编写为 Dockerfile,并成功构建和运行 Docker 容器。
接来下老苏让 ChatGPT 改了阿里源、 python 的版本,同时根据编译的情况做了修正,最后得到了可以编译过的服务端的 Dockerfile 文件
FROM python:3.11-slim-buster
# 改阿里源
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN cat /etc/apt/sources.list
RUN rm -Rf /var/lib/apt/lists/*
# 安装 Git 和 Poetry
RUN apt-get update && \
apt-get install -y git curl
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
ENV PATH /root/.local/bin:$PATH
# 下载代码
RUN git clone https://ghproxy.com/github.com/geoffrey45/swingmusic.git /app
# 安装依赖
WORKDIR /app
#RUN pip install pyinstaller && \
RUN pip install --upgrade pip && \
poetry install
EXPOSE 1970
# 启动应用
CMD ["poetry", "run", "python", "manage.py"]
如法炮制,让 ChatGPT 将客户端的安装过程转为 Dockerfile 文件

Dockerfilegit clone https://github.com/geoffrey45/swing-client.git
cd swing-client
# Install dependencies
yarn install
# Start the development server
yarn dev
# Build the project
yarn build
ChatGPT 同样很快就有了回应
Dockerfile 的示例:FROM node:latest
RUN apt-get update && apt-get install -y git
RUN git clone https://github.com/geoffrey45/swing-client.git /app
WORKDIR /app
RUN yarn install
RUN yarn build
EXPOSE 3000
CMD ["yarn", "start"]
在该 Dockerfile 中,我们使用了 Node.js 的官方镜像作为基础镜像,并安装了 Git 。接着,我们克隆了 Swing 客户端的代码并将其复制到 Docker 容器中的 /app目录下。然后,我们在 /app 目录中运行了 yarn install、yarn build 命令来安装依赖和构建项目。最后,我们暴露了容器的 3000 端口并在容器启动时运行了 yarn start 命令。
接下来,老苏要求改为多阶段,采用阿里的源等多次反复之后,得到了下面的 Dockerfile
# 第一阶段:构建应用
FROM node:latest as builder
RUN apt-get update && apt-get install -y git
# 设置淘宝镜像源
RUN npm config set registry https://registry.npm.taobao.org/
RUN git clone https://github.com/geoffrey45/swing-client.git /app
WORKDIR /app
RUN yarn install
RUN yarn build
# 第二阶段:运行应用
FROM node:latest
# 设置淘宝镜像源
RUN npm config set registry https://registry.npm.taobao.org/
COPY --from=builder /app /app
WORKDIR /app
EXPOSE 3000
CMD ["yarn", "start"]
如果你不想自己构建,可以跳过,直接阅读下一章节
在这个项目中,老苏还是有贡献的 😂 ,对 ChatGPT 给的代码进行了融合、编译和调试,最终的 Dockerfile 是下面这样的
#前端构建
FROM node:latest as builder
# 改阿里源
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN cat /etc/apt/sources.list
RUN rm -Rf /var/lib/apt/lists/*
# 安装 Git
RUN apt-get update && \
apt-get install -y git
# 设置yarn镜像为国内镜像
RUN yarn config set registry https://registry.npm.taobao.org --global && \
yarn config set disturl https://npm.taobao.org/dist --global
# 下载客户端代码
RUN git clone https://github.com/geoffrey45/swing-client.git /app
# 删除 yarn.lock,否则改源没有用
RUN rm -Rf /app/yarn.lock
# 安装依赖
WORKDIR /app
RUN yarn install && \
yarn build
# 后端构建
FROM python:3.11-slim-buster
MAINTAINER laosu<wbsu2003@gmail.com>
# 改阿里源
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN cat /etc/apt/sources.list
RUN rm -Rf /var/lib/apt/lists/*
# 安装 Git 和 Poetry
RUN apt-get update && \
apt-get install -y git curl
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
ENV PATH /root/.local/bin:$PATH
# 下载服务端代码
RUN git clone https://github.com/geoffrey45/swingmusic.git /app
# 复制前端
COPY --from=builder /app/dist/. /app/client/.
# 安装依赖
WORKDIR /app
#RUN pip install pyinstaller && \
RUN pip install --upgrade pip && \
poetry install
EXPOSE 1970
ENV XDG_CONFIG_HOME=/data
# 替换 localhost 为 0.0.0.0,否则容器外无法访问
RUN sed -i "s@localhost@0.0.0.0@g" /app/app/settings.py
# 启动应用
CMD ["poetry", "run", "python", "manage.py"]
构建镜像和容器运行的基本命令如下👇
# 新建目录
mkdir swingmusic
# 进入目录
cd swingmusic
# 创建 Dockerfile 文件
touch Dockerfile
# 构建镜像
docker build -t wbsu2003/swingmusic:v1 .
# 运行容器
docker run -d \
--name swingmusic \
-p 1970:1970 \
-v $(pwd)/data:/data \
-v $(pwd)/music:/music \
wbsu2003/swingmusic:v1
下篇进入 Swing Music 的安装、使用环节,咱们周三不见不散。
swing-opensource/swingmusic: Swing Music is a beautiful, self-hosted music player for your local audio files. Like a cooler Spotify … but bring your own music.
地址:https://github.com/swing-opensource/swingmusic
swing-opensource/swingmusic-client: Browser-based client for the swing music player: (https://github.com/swing-opensource/swingmusic). Powered by VueJS, Typescript, Pinia and Axios
地址:https://github.com/swing-opensource/swingmusic-client
英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案
1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'
2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动
目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans
我是Ruby的新手,但过去两周我一直在对Chef测试进行大量研究。该测试使用ChefSpec和Fauxhai,但它看起来不是很“像ruby”,我希望社区能给我一些编码风格的建议。有没有更好的方法来编写这样的嵌套循环?Recipe/foo/recipes/default.rbpackage"foo"doaction:installendRecipe/foo/spec/default_spec.rbrequire'chefspec'describe'foo::default'doplatforms={"debian"=>['6.0.5'],"ubuntu"=>['12.04','10.04
假设一个使用类变量的简单ruby程序,classHolder@@var=99defHolder.var=(val)@@var=valenddefvar@@varendend@@var="toplevelvariable"a=Holder.newputsa.var我猜结果应该是99,但输出不是99。我想知道为什么。由于类变量的范围是类,我假设@@var="toplevelvariable"行不会影响类中的变量。 最佳答案 @@var是Holder的类变量。而顶层的@@var不是Holder的同名类变量@@var,是你在创建类Obj