ncmdl

package module
v2.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 30, 2024 License: GPL-3.0 Imports: 21 Imported by: 0

README

ncmdl

本项目仅供学习,请勿用于其他用途。

网易云VIP每个下载周期的限额是300首歌曲,我经常因为当月超额导致没办法扩充曲库,所以花了点时间写了这个命令行工具,用来下载更多的歌曲。

但是这个工具是有限制的,如果你下载的链接中包含了VIP歌曲,一般情况下,下载下来的歌曲只有30秒的试听片段。必须提供你在网易云音乐网站的cookies文件,并且你在网易云音乐的账户是VIP,才可以下载VIP歌曲。

使用这个工具,我默认你对于命令行操作、如何导出cookies文件等技能有所了解。

安装

本地有Go环境,执行

go install github.com/caiknife/ncmdl/v2/ncmdl@latest

本地没有Go环境,请在release页面下载最新的二进制文件,请注意区分操作系统和CPU架构。并将二进制文件放在曲库文件夹下。

下载

请自行替换链接

下载单曲

ncmdl "https://music.163.com/#/song?id=1824625066"

下载专辑

ncmdl "https://music.163.com/#/album?id=123837273"

下载歌单

ncmdl "https://music.163.com/#/playlist?id=6623715587"
使用cookies下载完整VIP歌曲

请自行替换下载链接

首先请使用浏览器插件,将你在网易云音乐网站的cookies导出成Netscape格式的文件,最好命名为ncm.txt,放在你的个人用户目录下。

这种情况下,直接执行下载命令即可

ncmdl "https://music.163.com/#/album?id=123837273"

如果cookies文件保存在其他路径下,请执行

ncmdl -c cookies文件所在路径 "https://music.163.com/#/album?id=123837273"

Documentation

Index

Constants

View Source
const (
	PoolSize      = 5
	NullSeparator = "\u0000"
)
View Source
const (
	ErrSongDetailIsEmpty types.Error = "单曲详情为空"
	ErrSongDownload      types.Error = "解析歌单歌曲下载链接异常"
)
View Source
const (
	ErrAlbumIsEmpty  types.Error = "专辑歌曲为空"
	ErrAlbumDownload types.Error = "解析专辑歌曲下载链接异常"
)
View Source
const (
	ErrPlaylistIsEmpty  types.Error = "歌单列表为空"
	ErrPlaylistDownload types.Error = "解析歌单歌曲下载链接异常"
)
View Source
const (
	ErrCannotFindSingleID   types.Error = "没有匹配到单曲ID"
	ErrCannotFindAlbumID    types.Error = "没有匹配到专辑ID"
	ErrCannotFindPlaylistID types.Error = "没有匹配到歌单ID"
)
View Source
const (
	ErrLinkTypeNotMatch types.Error = "链接不是歌单、专辑、单曲类型"
	ErrLinkIDNotMatch   types.Error = "链接无法匹配ID"
)
View Source
const (
	ErrCookieFile types.Error = "cookies文件格式异常"
)
View Source
const (
	ErrInputLinksAreEmpty types.Error = "请输入歌单、专辑、单曲链接"
)

Variables

View Source
var AppLogger *logrus.Logger
View Source
var DefaultPoolSize = PoolSize

Functions

func AlbumDetail

func AlbumDetail(albumID int, reqData *utils.RequestData) (result types.Slice[*SingleInfo], err error)

func AlbumLinkID

func AlbumLinkID(s string) (int, error)

func AsyncDownload

func AsyncDownload(songs types.Slice[*SingleInfo], destDir string) error

func DownloadFile

func DownloadFile(url string, single *SingleInfo, destDir string) error
func DownloadLink(songIDs []int, reqData *utils.RequestData) (result types.Slice[*DownloadInfo], err error)
func IsAlbumLink(s string) bool
func IsPlaylistLink(s string) bool
func IsSingleLink(s string) bool

func MergeURL

func MergeURL(downloadInfo types.Slice[*DownloadInfo], detail *types.Slice[*SingleInfo])

func Path

func Path(destDir string) string

func PlaylistDetail

func PlaylistDetail(playlistID int, reqData *utils.RequestData) (result types.Slice[*SingleInfo], err error)

func PlaylistLinkID

func PlaylistLinkID(s string) (int, error)

func SingleDetail

func SingleDetail(singleID int, reqData *utils.RequestData) (result types.Slice[*SingleInfo], err error)

func SingleLinkID

func SingleLinkID(s string) (int, error)

func WriteTag

func WriteTag(filePath string, single *SingleInfo) error

Types

type AlbumInfo

type AlbumInfo struct {
	ID     int    `json:"id"`
	Name   string `json:"name"`
	PicURL string `json:"picUrl"`
}

func (*AlbumInfo) String

func (a *AlbumInfo) String() string

type AlbumResult

type AlbumResult struct {
	Songs types.Slice[*SingleInfo] `json:"songs"`
	Album *AlbumInfo               `json:"album"`
}

func (*AlbumResult) String

func (a *AlbumResult) String() string

type ArtistInfo

type ArtistInfo struct {
	ID   int    `json:"id"`
	Name string `json:"name"`
}

func (*ArtistInfo) String

func (a *ArtistInfo) String() string

type CookieFile

type CookieFile struct {
	Values types.Slice[*http.Cookie] `json:"values"`
}

func NewCookieFile

func NewCookieFile(cookieFile string) *CookieFile

func (*CookieFile) IsEmpty

func (c *CookieFile) IsEmpty() bool

func (*CookieFile) String

func (c *CookieFile) String() string

func (*CookieFile) ToHttpCookie

func (c *CookieFile) ToHttpCookie() (cookie types.Slice[*http.Cookie])

type DownloadInfo

type DownloadInfo struct {
	ID  int    `json:"id"`
	URL string `json:"url"`
}

func (*DownloadInfo) String

func (d *DownloadInfo) String() string

type DownloadResult

type DownloadResult struct {
	Data types.Slice[*DownloadInfo] `json:"data"`
}

func (*DownloadResult) String

func (d *DownloadResult) String() string
type Link struct {
	Type       LinkType    `json:"type"`
	URL        string      `json:"url"`
	ID         int         `json:"id"`
	CookieFile *CookieFile `json:"cookie_file"`
	Info       bool        `json:"info"`
	Tmp        bool        `json:"tmp"`
	// contains filtered or unexported fields
}
func NewLink(url string, opts ...LinkOption) (l *Link, err error)

func (*Link) Download

func (l *Link) Download() error

func (*Link) String

func (l *Link) String() string

type LinkOption

type LinkOption func(link *Link)

func LinkOptionCookieFile

func LinkOptionCookieFile(file *CookieFile) LinkOption

func LinkOptionOnlyInfo

func LinkOptionOnlyInfo(flag bool) LinkOption

func LinkOptionTmp

func LinkOptionTmp(flag bool) LinkOption

type LinkType

type LinkType int
const (
	Single LinkType = iota + 1
	Album
	Playlist
)

type PlaylistInfo

type PlaylistInfo struct {
	Tracks types.Slice[*SingleInfo] `json:"tracks"`
}

func (*PlaylistInfo) String

func (p *PlaylistInfo) String() string

type PlaylistResult

type PlaylistResult struct {
	Playlist *PlaylistInfo `json:"playlist"`
}

func (*PlaylistResult) String

func (p *PlaylistResult) String() string

type SingleInfo

type SingleInfo struct {
	ID     int                      `json:"id"`
	Name   string                   `json:"name"`
	Artist types.Slice[*ArtistInfo] `json:"ar"`
	Album  *AlbumInfo               `json:"al"`
	URL    string                   `json:"url"`
}

func (*SingleInfo) AllArtistsTag

func (s *SingleInfo) AllArtistsTag() string

func (*SingleInfo) CoverURL

func (s *SingleInfo) CoverURL() string

func (*SingleInfo) FileName

func (s *SingleInfo) FileName() string

func (*SingleInfo) SaveFileName

func (s *SingleInfo) SaveFileName() string

func (*SingleInfo) SavePath

func (s *SingleInfo) SavePath() string

func (*SingleInfo) String

func (s *SingleInfo) String() string

type SingleResult

type SingleResult struct {
	Songs types.Slice[*SingleInfo] `json:"songs"`
}

func (*SingleResult) String

func (s *SingleResult) String() string

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL