diff --git a/README.md b/README.md index e0360e8..e491325 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ docker run --init --rm -v ${PWD}:/root/ --name yamusic yandex-music-downloader:1 ## Usage ```bat -Yandex Music Downloader v1.2 +Yandex Music Downloader v1.4 ya.pl [-adhklpstu] [long options...] -p[=INT] --playlist[=INT] playlist id to download @@ -127,6 +127,8 @@ ya.pl [-adhklpstu] [long options...] -u[=STR] --url[=STR] download by URL -d[=STR] --dir[=STR] download path (current direcotry will be 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) --exclude STR skip tracks specified in file --include STR download only tracks specified in file @@ -138,7 +140,7 @@ ya.pl [-adhklpstu] [long options...] (Session_id=...) --bitrate INT bitrate (eg. 64, 128, 192, 320) --pattern STR track naming pattern - --path STR path pattern + --path STR path saving pattern Available placeholders: #number, #artist, #title, #album, #year @@ -155,15 +157,19 @@ ya.pl [-adhklpstu] [long options...] -h --help print usage --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 -a 123 - ya.pl -a 123 -t 321 - ya.pl -u https://music.yandex.ru/album/215690 --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 ... + ya.pl -a 123 + ya.pl -a 123 -t 321 + ya.pl -u + https://music.yandex.ru/album/215690 + --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) ``` diff --git a/src/ya.pl b/src/ya.pl index 637b200..9f36e71 100755 --- a/src/ya.pl +++ b/src/ya.pl @@ -53,7 +53,7 @@ HQ_BITRATE => '320', DEFAULT_CODEC => 'mp3', PODCAST_TYPE => 'podcast', - VERSION => '1.3', + VERSION => '1.4', COPYRIGHT => '© 2013-2022 by Kaimi (https://kaimi.io)', }; use constant @@ -197,6 +197,7 @@ ['track|t:i', 'track to download (album id must be specified)'], ['url|u:s', 'download by URL'], ['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)'], ['exclude=s', 'skip tracks specified in file'], ['include=s', 'download only tracks specified in file'], @@ -416,6 +417,12 @@ last; } } + + if($opt{skip_existing} && track_file_exists($track_info_ref)) + { + $skip = 1; + } + if($skip) { info(INFO, 'Skipping: ' . $track_info_ref->{title}); @@ -503,20 +510,15 @@ sub fetch_track info(ERROR, 'Failed to add MP3 tags for ' . $file_path); } - my $target_path = $opt{dir}; - if($opt{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})) + my $target_path = create_storage_path($track_info_ref); + if(!$target_path) { info(ERROR, 'Failed to create: ' . $target_path); return; } $target_path = File::Spec->catfile($target_path, $track_info_ref->{title} . FILE_SAVE_EXT); + if(rename_track($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 { my ($url) = @_;