24
README.md
24
README.md
@@ -115,7 +115,7 @@ docker run --init --rm -v ${PWD}:/root/ --name yamusic yandex-music-downloader:1
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
```bat
|
```bat
|
||||||
Yandex Music Downloader v1.2
|
Yandex Music Downloader v1.4
|
||||||
|
|
||||||
ya.pl [-adhklpstu] [long options...]
|
ya.pl [-adhklpstu] [long options...]
|
||||||
-p[=INT] --playlist[=INT] playlist id to download
|
-p[=INT] --playlist[=INT] playlist id to download
|
||||||
@@ -127,6 +127,8 @@ ya.pl [-adhklpstu] [long options...]
|
|||||||
-u[=STR] --url[=STR] download by URL
|
-u[=STR] --url[=STR] download by URL
|
||||||
-d[=STR] --dir[=STR] download path (current direcotry will be
|
-d[=STR] --dir[=STR] download path (current direcotry will be
|
||||||
used by default)
|
used by default)
|
||||||
|
--skip-existing skip downloading tracks that already exist
|
||||||
|
on the specified path
|
||||||
--proxy STR HTTP-proxy (format: 1.2.3.4:8888)
|
--proxy STR HTTP-proxy (format: 1.2.3.4:8888)
|
||||||
--exclude STR skip tracks specified in file
|
--exclude STR skip tracks specified in file
|
||||||
--include STR download only tracks specified in file
|
--include STR download only tracks specified in file
|
||||||
@@ -138,7 +140,7 @@ ya.pl [-adhklpstu] [long options...]
|
|||||||
(Session_id=...)
|
(Session_id=...)
|
||||||
--bitrate INT bitrate (eg. 64, 128, 192, 320)
|
--bitrate INT bitrate (eg. 64, 128, 192, 320)
|
||||||
--pattern STR track naming pattern
|
--pattern STR track naming pattern
|
||||||
--path STR path pattern
|
--path STR path saving pattern
|
||||||
|
|
||||||
Available placeholders: #number, #artist,
|
Available placeholders: #number, #artist,
|
||||||
#title, #album, #year
|
#title, #album, #year
|
||||||
@@ -155,15 +157,19 @@ ya.pl [-adhklpstu] [long options...]
|
|||||||
-h --help print usage
|
-h --help print usage
|
||||||
|
|
||||||
--include and --exclude options use weak
|
--include and --exclude options use weak
|
||||||
match i.e. ~/$term/
|
match i.e. ~/$term/
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
ya.pl -p 123 -k ya-playlist
|
ya.pl -p 123 -k ya-playlist
|
||||||
ya.pl -a 123
|
ya.pl -a 123
|
||||||
ya.pl -a 123 -t 321
|
ya.pl -a 123 -t 321
|
||||||
ya.pl -u https://music.yandex.ru/album/215690 --cookie ...
|
ya.pl -u
|
||||||
ya.pl -u https://music.yandex.ru/album/215688/track/1710808 --auth ...
|
https://music.yandex.ru/album/215690
|
||||||
ya.pl -u https://music.yandex.ru/users/ya.playlist/playlists/1257 --cookie ...
|
--cookie ...
|
||||||
|
ya.pl -u
|
||||||
|
https://music.yandex.ru/album/215688/track/1710808 --auth ...
|
||||||
|
ya.pl -u
|
||||||
|
https://music.yandex.ru/users/ya.playlist/playlists/1257 --cookie ...
|
||||||
|
|
||||||
© 2013-2022 by Kaimi (https://kaimi.io)
|
© 2013-2022 by Kaimi (https://kaimi.io)
|
||||||
```
|
```
|
||||||
|
|||||||
58
src/ya.pl
58
src/ya.pl
@@ -53,7 +53,7 @@ use constant
|
|||||||
HQ_BITRATE => '320',
|
HQ_BITRATE => '320',
|
||||||
DEFAULT_CODEC => 'mp3',
|
DEFAULT_CODEC => 'mp3',
|
||||||
PODCAST_TYPE => 'podcast',
|
PODCAST_TYPE => 'podcast',
|
||||||
VERSION => '1.3',
|
VERSION => '1.4',
|
||||||
COPYRIGHT => '© 2013-2022 by Kaimi (https://kaimi.io)',
|
COPYRIGHT => '© 2013-2022 by Kaimi (https://kaimi.io)',
|
||||||
};
|
};
|
||||||
use constant
|
use constant
|
||||||
@@ -197,6 +197,7 @@ my ($opt, $usage) = Getopt::Long::Descriptive::describe_options
|
|||||||
['track|t:i', 'track to download (album id must be specified)'],
|
['track|t:i', 'track to download (album id must be specified)'],
|
||||||
['url|u:s', 'download by URL'],
|
['url|u:s', 'download by URL'],
|
||||||
['dir|d:s', 'download path (current direcotry will be used by default)', {default => '.'}],
|
['dir|d:s', 'download path (current direcotry will be used by default)', {default => '.'}],
|
||||||
|
['skip-existing', 'skip downloading tracks that already exist on the specified path'],
|
||||||
['proxy=s', 'HTTP-proxy (format: 1.2.3.4:8888)'],
|
['proxy=s', 'HTTP-proxy (format: 1.2.3.4:8888)'],
|
||||||
['exclude=s', 'skip tracks specified in file'],
|
['exclude=s', 'skip tracks specified in file'],
|
||||||
['include=s', 'download only tracks specified in file'],
|
['include=s', 'download only tracks specified in file'],
|
||||||
@@ -416,6 +417,12 @@ if($opt{album} || ($opt{playlist} && $opt{kind}))
|
|||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($opt{skip_existing} && track_file_exists($track_info_ref))
|
||||||
|
{
|
||||||
|
$skip = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if($skip)
|
if($skip)
|
||||||
{
|
{
|
||||||
info(INFO, 'Skipping: ' . $track_info_ref->{title});
|
info(INFO, 'Skipping: ' . $track_info_ref->{title});
|
||||||
@@ -503,20 +510,15 @@ sub fetch_track
|
|||||||
info(ERROR, 'Failed to add MP3 tags for ' . $file_path);
|
info(ERROR, 'Failed to add MP3 tags for ' . $file_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
my $target_path = $opt{dir};
|
my $target_path = create_storage_path($track_info_ref);
|
||||||
if($opt{path})
|
if(!$target_path)
|
||||||
{
|
|
||||||
$target_path = File::Spec->catdir($target_path, $track_info_ref->{storage_path});
|
|
||||||
}
|
|
||||||
|
|
||||||
my $file_util = File::Util->new();
|
|
||||||
if(!-d $file_util->make_dir($target_path => oct DEFAULT_PERMISSIONS => {if_not_exists => 1}))
|
|
||||||
{
|
{
|
||||||
info(ERROR, 'Failed to create: ' . $target_path);
|
info(ERROR, 'Failed to create: ' . $target_path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$target_path = File::Spec->catfile($target_path, $track_info_ref->{title} . FILE_SAVE_EXT);
|
$target_path = File::Spec->catfile($target_path, $track_info_ref->{title} . FILE_SAVE_EXT);
|
||||||
|
|
||||||
if(rename_track($file_path, $target_path))
|
if(rename_track($file_path, $target_path))
|
||||||
{
|
{
|
||||||
info(INFO, $file_path . ' -> ' . $target_path);
|
info(INFO, $file_path . ' -> ' . $target_path);
|
||||||
@@ -527,6 +529,44 @@ sub fetch_track
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub create_storage_path
|
||||||
|
{
|
||||||
|
my $track_info_ref = shift;
|
||||||
|
|
||||||
|
my $target_path = get_storage_path($track_info_ref);
|
||||||
|
|
||||||
|
my $file_util = File::Util->new();
|
||||||
|
if(!-d $file_util->make_dir($target_path => oct DEFAULT_PERMISSIONS => {if_not_exists => 1}))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $target_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub track_file_exists
|
||||||
|
{
|
||||||
|
my $track_info_ref = shift;
|
||||||
|
|
||||||
|
my $target_path = get_storage_path($track_info_ref);
|
||||||
|
$target_path = File::Spec->catfile($target_path, $track_info_ref->{title} . FILE_SAVE_EXT);
|
||||||
|
|
||||||
|
return -e $target_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_storage_path
|
||||||
|
{
|
||||||
|
my $track_info_ref = shift;
|
||||||
|
|
||||||
|
my $target_path = $opt{dir};
|
||||||
|
if($opt{path})
|
||||||
|
{
|
||||||
|
$target_path = File::Spec->catdir($target_path, $track_info_ref->{storage_path});
|
||||||
|
}
|
||||||
|
|
||||||
|
return $target_path;
|
||||||
|
}
|
||||||
|
|
||||||
sub download_track
|
sub download_track
|
||||||
{
|
{
|
||||||
my ($url) = @_;
|
my ($url) = @_;
|
||||||
|
|||||||
Reference in New Issue
Block a user