kaimi-io / yandex-music-download Goto Github PK
View Code? Open in Web Editor NEWYandex Music Downloader
Home Page: https://kaimi.io/2013/11/yandex-music-downloader/
License: MIT License
Yandex Music Downloader
Home Page: https://kaimi.io/2013/11/yandex-music-downloader/
License: MIT License
Если в названии трека есть запрещенные символы для имен файлов, например "?", ":" и т.п., которые потом будут заменены, этот трек будет скачиваться при каждом запуске. Например у меня каждый день скачивается вот этот трек
Двоеточие после слова ТРОН
Как временное решение можно конечно убрать подобные треки из плейлиста, но все же желательно починить.
Спасибо.
HTTP/1.1 400 Bad request
<p>Если у вас возникли проблемы, пожалуйста, воспользуйтесь <a class="link" href="https://yandex.ru/support/smart-captcha/#help"
ya.pl --url https://music.yandex.ru/users/user/playlists/3 --cookie "***" --exclude exclude.txt --dir ./download --debug
ya.pl --cookie "Session_id=3:1599336781.5.0.1599336781602:DDFHsg:48.11166458334.0.2.0:3222489.833617.tBYeau9PyzqoTwvnHo9vHXAozT4" -u https://music.yandex.ru/album/3622135/track/30022994 --debug
[DEBUG] main::print_perl_info(1221): OS: linux; Path: /usr/bin/perl; Version: v5.30.0
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching album info: 3622135
[INFO] Album title: Subway Gawdz
[INFO] Tracks total: 14
[INFO] Filtering single track: 30022994 [3622135]
[INFO] Trying to fetch track: Too Many Zooz - FTG, Pt. 1
[DEBUG] main::get_track_url(644): Track url: https://s363sas.storage.yandex.net/get-mp3/61bb01ed1dcc37b953772725aaa3aafe/0005ae97e3f43fff/rmusic/U2FsdGVkX1-jTtx0AsRHdjm6mqftETxmsmRpfFOGH68eFsks2ZPdYiXgGRP1z1MD-bT8il-xlsu-ZqCXJrWvD70uj1SX9oPFfT_Rzdiy1TQ/aa9df326f2d5b358ec5ff2c69c8f601beeb0817610773c0a77f4cb14e141511f?track-id=30022994&from=service-10-track&similarities-experiment=default
[DEBUG] main::download_track(519): File size from header: 481115
[OK] Temporary saved track at ./aHvv6yzkrR
[DEBUG] main::fetch_album_cover(985): Cover url: https://avatars.yandex.net/get-music-content/38044/befca0be.a.3622135-1/400x400
[DEBUG] main::write_mp3_tags(954): add_frame: TYER=2016
[DEBUG] main::write_mp3_tags(954): add_frame: TRCK=6
[DEBUG] main::write_mp3_tags(954): add_frame: TPE2=Too Many Zooz
[DEBUG] main::write_mp3_tags(954): add_frame: TALB=Subway Gawdz
[DEBUG] main::write_mp3_tags(954): add_frame: TPE1=Too Many Zooz
[DEBUG] main::write_mp3_tags(954): add_frame: TIT2=FTG, Pt. 1
[DEBUG] main::write_mp3_tags(954): add_frame: TCON=pop
[DEBUG] main::write_mp3_tags(954): add_frame: APIC=ARRAY(0x5614d6ff
[INFO] MP3 tags added for ./aHvv6yzkrR
[INFO] ./aHvv6yzkrR -> ./Too Many Zooz - FTG, Pt. 1.mp3
[OK] Done!
mp3info -x *.mp3
Too Many Zooz - FTG, Pt. 1.mp3 does not have an ID3 1.x tag.
File: Too Many Zooz - FTG, Pt. 1.mp3
Media Type: MPEG 1.0 Layer III
Audio: 128 kbps, 44 kHz (joint stereo)
Emphasis: none
CRC: No
Copyright: No
Original: Yes
Padding: Yes
Length: 0:30```
Доброго времени суток!
Не удается скачать ни один трек по следующей команде:
perl ya.pl -u https://music.yandex.ru/album/2747498/track/23559960 --auth {39_digit_auth_header_token} --bitrate 320 --debug -d /music
Получаю ошибку:
[DEBUG] main::get_track_url(556): Can't find track with proper format & bitrate
Делаю что-то не так, или просто лавочку прикрыли, и в HQ скачать уже ничего нельзя?
Спасибо за скрипт!
Ctrl+C does not interrupt the process. At least when run in Docker (I have not checked other deployments) with --interactive --tty
options. At least on Windows (I have not checked other operating systems).
Hi there, may I know how to add it to path?
привет. посмотрел примеры использования и поискал в issues, но похоже не прям такое есть.
можно ли сделать, чтобы скрипт сам не скачивал файл, если он уже есть?
я видел что можно указать файл со списком треков, которые не надо скачивать, но хотелось бы чтобы скрипт мог сам в список файлов заглядывать.
у меня очень много треков, не все за один проход скачиваются, и иногда новые появляются. хотелось бы автоматизировать это, не перекачивая все файлы.
everytime i try to download anything with this script, i'm getting this error,
E:>ya.pl -u https://music.yandex.ru/album/107020
[INFO] Fetching album info: 107020[ERROR] Can't get track list info
Use of uninitialized value $storage_path in substitution (s///) at ./ya.pl line 948.
Using current master build - 38c1d68
Macos Monterey
Done all your instructions
Now running:
$ perl ya.pl -h
Getting:
Please, install this modules: Mozilla::CA, File::Util, MP3::Tag
Running:
cpanm Mozilla::CA, File::Util, MP3::Tag
Getting:
! Finding Mozilla::CA, on cpanmetadb failed.
! Finding Mozilla::CA, () on mirror http://www.cpan.org failed.
! Couldn't find module or a distribution Mozilla::CA,
! Finding File::Util, on cpanmetadb failed.
! Finding File::Util, () on mirror http://www.cpan.org failed.
! Couldn't find module or a distribution File::Util,
Hello! Thank you for your great software.
It would be great if you attach the lyrics to the audio metadata. Lyrics are accessible from the track handler API path in the JSON response. For example,
https://music.yandex.ru/handlers/track.jsx?track=46402425%3A6255689&lang=ru&external-domain=music.yandex.ru&overembed=false&ncrnd=0.7224647013686882
hast the lyric attribute
{
"counter": 1,
"artists": [
{
"id": "5054100",
"name": "Дайте танк (!)",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2480468/6537dc4f.p.5054100/%%",
"prefix": "6537dc4f.p.5054100/"
},
"ogImage": "avatars.yandex.net/get-music-content/2480468/6537dc4f.p.5054100/%%",
"noPicturesFromSearch": true,
"genres": [
"local-indie"
],
"counts": {
"tracks": 108,
"directAlbums": 18,
"alsoAlbums": 2,
"alsoTracks": 2
},
"available": true,
"ratings": {
"week": 78,
"month": 103,
"day": 72
},
"links": [
{
"title": "daitetank.ru",
"href": "http://daitetank.ru/",
"type": "official"
},
{
"title": "channel/UCqJ2L80I0pFEl1WZWZYklzw",
"href": "https://www.youtube.com/channel/UCqJ2L80I0pFEl1WZWZYklzw",
"type": "social",
"socialNetwork": "youtube"
},
{
"title": "daitetank",
"href": "https://vk.com/daitetank",
"type": "social",
"socialNetwork": "vk"
}
],
"ticketsAvailable": false
}
],
"aliases": [],
"otherVersions": {},
"similarTracks": [
{
"id": "85647597",
"realId": "85647597",
"title": "Двадцать",
"major": {
"id": 1,
"name": "UNIVERSAL_MUSIC"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 215260,
"fileSize": 0,
"r128": {
"i": -9.6,
"tp": 0.06
},
"previewDurationMs": 30000,
"artists": [
{
"id": 3836355,
"name": "Shortparis",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2397565/0ee820d0.p.3836355/%%",
"prefix": "0ee820d0.p.3836355/"
},
"genres": []
}
],
"albums": [
{
"id": 16375345,
"title": "Яблонный сад",
"metaType": "music",
"contentWarning": "explicit",
"year": 2021,
"releaseDate": "2021-06-24T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/5235336/ec72931b.a.16375345-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5235336/ec72931b.a.16375345-1/%%",
"genre": "local-indie",
"trackCount": 11,
"likesCount": 2215,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 3836355,
"name": "Shortparis",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2397565/0ee820d0.p.3836355/%%",
"prefix": "0ee820d0.p.3836355/"
},
"genres": []
}
],
"labels": [
{
"id": 448618,
"name": "Universal Music"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [
85647594,
81733102,
85647597
],
"trackPosition": {
"volume": 1,
"index": 8
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/5235336/ec72931b.a.16375345-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5235336/ec72931b.a.16375345-1/%%",
"lyricsAvailable": true,
"type": "music",
"rememberPosition": false,
"backgroundVideoUri": "https://strm.yandex.ru/vh-music-videoshots-converted/vod-content/8999043040986813294/mp4/mp4/360x640p.mp4",
"trackSharingFlag": "VIDEO_ALLOWED",
"playerId": "vxVMOXpfkwB4",
"lyricsInfo": {
"hasAvailableSyncLyrics": true,
"hasAvailableTextLyrics": true
},
"trackSource": "OWN"
},
{
"id": "102412676",
"realId": "102412676",
"title": "Еду к тебе",
"major": {
"id": 298,
"name": "REPOST"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 181490,
"fileSize": 0,
"r128": {
"i": -9.51,
"tp": -0.88
},
"previewDurationMs": 30000,
"artists": [
{
"id": 9160246,
"name": "Митя Крылов",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2806365/15cc716b.p.9160246/%%",
"prefix": "15cc716b.p.9160246/"
},
"genres": []
}
],
"albums": [
{
"id": 21734625,
"title": "НОМЕР ДВА",
"metaType": "music",
"contentWarning": "explicit",
"year": 2022,
"releaseDate": "2022-03-12T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/5503671/cf830468.a.21734625-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5503671/cf830468.a.21734625-1/%%",
"genre": "alternative",
"trackCount": 5,
"likesCount": 3,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 9160246,
"name": "Митя Крылов",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2806365/15cc716b.p.9160246/%%",
"prefix": "15cc716b.p.9160246/"
},
"genres": []
}
],
"labels": [
{
"id": 2257091,
"name": "Митя Крылов"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [],
"trackPosition": {
"volume": 1,
"index": 2
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/5503671/cf830468.a.21734625-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5503671/cf830468.a.21734625-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "COVER_ONLY",
"lyricsInfo": {
"hasAvailableSyncLyrics": false,
"hasAvailableTextLyrics": false
},
"trackSource": "OWN"
},
{
"id": "49376183",
"realId": "49376183",
"title": "Всех сдал",
"major": {
"id": 123,
"name": "IRICOM"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 169950,
"fileSize": 0,
"r128": {
"i": -7.91,
"tp": 0.32
},
"previewDurationMs": 30000,
"artists": [
{
"id": 2816301,
"name": "МОРЭ&РЭЛЬСЫ",
"various": false,
"composer": false,
"cover": {
"type": "from-album-cover",
"uri": "avatars.yandex.net/get-music-content/5587254/82736828.a.20153296-1/%%",
"prefix": "82736828.a.20153296-1"
},
"genres": []
}
],
"albums": [
{
"id": 6776583,
"title": "Ломая суть демо (ЛСД)",
"metaType": "music",
"year": 2018,
"releaseDate": "2018-11-06T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/108289/7f673d54.a.6776583-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/108289/7f673d54.a.6776583-1/%%",
"genre": "local-indie",
"trackCount": 11,
"likesCount": 2,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 2816301,
"name": "МОРЭ&РЭЛЬСЫ",
"various": false,
"composer": false,
"cover": {
"type": "from-album-cover",
"uri": "avatars.yandex.net/get-music-content/5587254/82736828.a.20153296-1/%%",
"prefix": "82736828.a.20153296-1"
},
"genres": []
}
],
"labels": [
{
"id": 490803,
"name": "Первое музыкальное"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [
49376179,
49376182
],
"trackPosition": {
"volume": 1,
"index": 7
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/108289/7f673d54.a.6776583-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/108289/7f673d54.a.6776583-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "VIDEO_ALLOWED",
"lyricsInfo": {
"hasAvailableSyncLyrics": false,
"hasAvailableTextLyrics": false
},
"trackSource": "OWN"
},
{
"id": "39541761",
"realId": "39541761",
"title": "когда?",
"major": {
"id": 87,
"name": "BELIEVE_DIGITAL"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 225220,
"fileSize": 0,
"r128": {
"i": -8.7,
"tp": 0.19
},
"previewDurationMs": 30000,
"artists": [
{
"id": 5364444,
"name": "источник",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2373979/9ce3c23f.p.5364444/%%",
"prefix": "9ce3c23f.p.5364444/"
},
"genres": []
}
],
"albums": [
{
"id": 5106602,
"title": "Когда?",
"type": "single",
"metaType": "music",
"year": 2018,
"releaseDate": "2018-02-23T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/149669/cb1c252e.a.5106602-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/149669/cb1c252e.a.5106602-1/%%",
"genre": "punk",
"trackCount": 1,
"likesCount": 104,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 5364444,
"name": "источник",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2373979/9ce3c23f.p.5364444/%%",
"prefix": "9ce3c23f.p.5364444/"
},
"genres": []
}
],
"labels": [
{
"id": 2279821,
"name": "❀USTO4NUK❀"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [],
"trackPosition": {
"volume": 1,
"index": 1
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/149669/cb1c252e.a.5106602-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/149669/cb1c252e.a.5106602-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "COVER_ONLY",
"lyricsInfo": {
"hasAvailableSyncLyrics": true,
"hasAvailableTextLyrics": true
},
"trackSource": "OWN"
},
{
"id": "101011111",
"realId": "101011111",
"title": "Убегай",
"contentWarning": "explicit",
"major": {
"id": 123,
"name": "IRICOM"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 280000,
"fileSize": 0,
"r128": {
"i": -11.02,
"tp": -0.19
},
"previewDurationMs": 30000,
"artists": [
{
"id": 13191077,
"name": "Извините за опоздание",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/5485872/5767e62f.p.13191077/%%",
"prefix": "5767e62f.p.13191077/"
},
"genres": []
}
],
"albums": [
{
"id": 21261469,
"title": "Грустно",
"metaType": "music",
"contentWarning": "explicit",
"year": 2022,
"releaseDate": "2022-02-18T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/5531900/c39eebe7.a.21261469-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5531900/c39eebe7.a.21261469-1/%%",
"genre": "rusrock",
"trackCount": 7,
"likesCount": 56,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 13191077,
"name": "Извините за опоздание",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/5485872/5767e62f.p.13191077/%%",
"prefix": "5767e62f.p.13191077/"
},
"genres": []
}
],
"labels": [
{
"id": 1220958,
"name": "Vauvision"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [
101011109,
101011115
],
"trackPosition": {
"volume": 1,
"index": 4
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/5531900/c39eebe7.a.21261469-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5531900/c39eebe7.a.21261469-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "VIDEO_ALLOWED",
"lyricsInfo": {
"hasAvailableSyncLyrics": false,
"hasAvailableTextLyrics": false
},
"trackSource": "OWN"
},
{
"id": "2291868",
"realId": "2291868",
"title": "P.R.",
"major": {
"id": 87,
"name": "BELIEVE_DIGITAL"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 195130,
"fileSize": 0,
"r128": {
"i": -8.34,
"tp": 0.21
},
"previewDurationMs": 30000,
"artists": [
{
"id": 454163,
"name": "Leut Magnetik",
"various": false,
"composer": false,
"cover": {
"type": "from-album-cover",
"uri": "avatars.yandex.net/get-music-content/118603/ada67bc6.a.7738131-1/%%",
"prefix": "ada67bc6.a.7738131-1"
},
"genres": []
}
],
"albums": [
{
"id": 227183,
"title": "Leut Magnetik",
"metaType": "music",
"year": 2005,
"releaseDate": "2005-01-01T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/34131/5b367d16.a.227183-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/34131/5b367d16.a.227183-1/%%",
"genre": "folk",
"trackCount": 11,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 454163,
"name": "Leut Magnetik",
"various": false,
"composer": false,
"cover": {
"type": "from-album-cover",
"uri": "avatars.yandex.net/get-music-content/118603/ada67bc6.a.7738131-1/%%",
"prefix": "ada67bc6.a.7738131-1"
},
"genres": []
}
],
"labels": [
{
"id": 19306,
"name": "Aquarius"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [],
"trackPosition": {
"volume": 1,
"index": 6
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/34131/5b367d16.a.227183-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/34131/5b367d16.a.227183-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "COVER_ONLY",
"lyricsInfo": {
"hasAvailableSyncLyrics": false,
"hasAvailableTextLyrics": false
},
"trackSource": "OWN"
},
{
"id": "92471336",
"realId": "92471336",
"title": "Пластилин",
"major": {
"id": 143,
"name": "FRESH_TUNES"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 156980,
"fileSize": 0,
"r128": {
"i": -6.27,
"tp": -0.11
},
"previewDurationMs": 30000,
"artists": [
{
"id": 8497052,
"name": "ZeNoir",
"various": false,
"composer": false,
"cover": {
"type": "from-album-cover",
"uri": "avatars.yandex.net/get-music-content/5587254/6dfc3d90.a.21060806-1/%%",
"prefix": "6dfc3d90.a.21060806-1"
},
"genres": []
}
],
"albums": [
{
"id": 18531931,
"title": "Пластилин",
"metaType": "music",
"year": 2021,
"releaseDate": "2021-09-27T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/5559490/98b9bce8.a.18531931-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5559490/98b9bce8.a.18531931-1/%%",
"genre": "indie",
"trackCount": 4,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 8497052,
"name": "ZeNoir",
"various": false,
"composer": false,
"cover": {
"type": "from-album-cover",
"uri": "avatars.yandex.net/get-music-content/5587254/6dfc3d90.a.21060806-1/%%",
"prefix": "6dfc3d90.a.21060806-1"
},
"genres": []
}
],
"labels": [
{
"id": 3707682,
"name": "Magnitofon Music"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [],
"trackPosition": {
"volume": 1,
"index": 1
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/5559490/98b9bce8.a.18531931-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5559490/98b9bce8.a.18531931-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "COVER_ONLY",
"lyricsInfo": {
"hasAvailableSyncLyrics": false,
"hasAvailableTextLyrics": false
},
"trackSource": "OWN"
},
{
"id": "104667761",
"realId": "104667761",
"title": "Будем гулять всю ночь",
"major": {
"id": 308,
"name": "ONERPM"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 250180,
"fileSize": 0,
"r128": {
"i": -4.52,
"tp": 0.78
},
"previewDurationMs": 30000,
"artists": [
{
"id": 13942057,
"name": "Письмо на Марс",
"various": false,
"composer": false,
"cover": {
"type": "from-album-cover",
"uri": "avatars.yandex.net/get-music-content/6255016/3a207191.a.23613443-1/%%",
"prefix": "3a207191.a.23613443-1"
},
"genres": []
}
],
"albums": [
{
"id": 22556892,
"title": "Будем гулять всю ночь",
"type": "single",
"metaType": "music",
"year": 2022,
"releaseDate": "2022-06-06T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/6296749/da379867.a.22556892-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/6296749/da379867.a.22556892-1/%%",
"genre": "alternative",
"trackCount": 1,
"likesCount": 1,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 13942057,
"name": "Письмо на Марс",
"various": false,
"composer": false,
"cover": {
"type": "from-album-cover",
"uri": "avatars.yandex.net/get-music-content/6255016/3a207191.a.23613443-1/%%",
"prefix": "3a207191.a.23613443-1"
},
"genres": []
}
],
"labels": [
{
"id": 3984470,
"name": "Письмо на Марс"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [],
"trackPosition": {
"volume": 1,
"index": 1
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/6296749/da379867.a.22556892-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/6296749/da379867.a.22556892-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "COVER_ONLY",
"lyricsInfo": {
"hasAvailableSyncLyrics": false,
"hasAvailableTextLyrics": false
},
"trackSource": "OWN"
},
{
"id": "42834874",
"realId": "42834874",
"title": "Кто я такой",
"major": {
"id": 123,
"name": "IRICOM"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 188670,
"fileSize": 0,
"r128": {
"i": -6.59,
"tp": -0.08
},
"previewDurationMs": 30000,
"artists": [
{
"id": 4184841,
"name": "ATOW",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/6202531/35d31852.p.4184841/%%",
"prefix": "35d31852.p.4184841/"
},
"genres": []
}
],
"albums": [
{
"id": 5675862,
"title": "Предсмертные записки несуществующих людей",
"metaType": "music",
"year": 2018,
"releaseDate": "2018-08-22T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/192707/b0b10301.a.5675862-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/192707/b0b10301.a.5675862-1/%%",
"genre": "indie",
"trackCount": 5,
"likesCount": 2,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 4184841,
"name": "ATOW",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/6202531/35d31852.p.4184841/%%",
"prefix": "35d31852.p.4184841/"
},
"genres": []
}
],
"labels": [
{
"id": 1099709,
"name": "Ionoff Music"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [],
"trackPosition": {
"volume": 1,
"index": 1
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/192707/b0b10301.a.5675862-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/192707/b0b10301.a.5675862-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "VIDEO_ALLOWED",
"lyricsInfo": {
"hasAvailableSyncLyrics": false,
"hasAvailableTextLyrics": false
},
"trackSource": "OWN"
},
{
"id": "25517034",
"realId": "25517034",
"title": "Бойз Донт Край",
"contentWarning": "explicit",
"major": {
"id": 308,
"name": "ONERPM"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 551440,
"fileSize": 0,
"r128": {
"i": -6.15,
"tp": 0.71
},
"previewDurationMs": 30000,
"artists": [
{
"id": 359561,
"name": "Курара",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/4747389/80abdd16.p.359561/%%",
"prefix": "80abdd16.p.359561/"
},
"genres": []
}
],
"albums": [
{
"id": 17870709,
"title": "Бойз Донт Край",
"metaType": "music",
"contentWarning": "explicit",
"year": 2015,
"releaseDate": "2015-10-13T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/5234929/e18da5cb.a.17870709-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5234929/e18da5cb.a.17870709-1/%%",
"genre": "local-indie",
"trackCount": 5,
"likesCount": 16,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 359561,
"name": "Курара",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/4747389/80abdd16.p.359561/%%",
"prefix": "80abdd16.p.359561/"
},
"genres": []
}
],
"labels": [
{
"id": 1449158,
"name": "КУРАРА"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [
90428861
],
"trackPosition": {
"volume": 1,
"index": 1
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/5234929/e18da5cb.a.17870709-1/%%",
"ogImage": "avatars.yandex.net/get-music-content/5234929/e18da5cb.a.17870709-1/%%",
"lyricsAvailable": false,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "COVER_ONLY",
"lyricsInfo": {
"hasAvailableSyncLyrics": true,
"hasAvailableTextLyrics": true
},
"trackSource": "OWN"
}
],
"track": {
"id": "46402425",
"realId": "46402425",
"title": "Мы",
"major": {
"id": 87,
"name": "BELIEVE_DIGITAL"
},
"available": true,
"availableForPremiumUsers": true,
"availableFullWithoutPermission": false,
"storageDir": "",
"durationMs": 182970,
"fileSize": 0,
"r128": {
"i": -5.29,
"tp": -0.25
},
"previewDurationMs": 30000,
"artists": [
{
"id": 5054100,
"name": "Дайте танк (!)",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2480468/6537dc4f.p.5054100/%%",
"prefix": "6537dc4f.p.5054100/"
},
"genres": []
}
],
"albums": [
{
"id": 6255689,
"title": "На вырост",
"type": "single",
"metaType": "music",
"year": 2018,
"releaseDate": "2018-11-27T00:00:00+03:00",
"coverUri": "avatars.yandex.net/get-music-content/3226792/7e2b95cc.a.6255689-5/%%",
"ogImage": "avatars.yandex.net/get-music-content/3226792/7e2b95cc.a.6255689-5/%%",
"genre": "local-indie",
"trackCount": 3,
"likesCount": 4757,
"recent": false,
"veryImportant": false,
"artists": [
{
"id": 5054100,
"name": "Дайте танк (!)",
"various": false,
"composer": false,
"cover": {
"type": "from-artist-photos",
"uri": "avatars.yandex.net/get-music-content/2480468/6537dc4f.p.5054100/%%",
"prefix": "6537dc4f.p.5054100/"
},
"genres": []
}
],
"labels": [
{
"id": 978492,
"name": "Дайте танк (!)"
}
],
"available": true,
"availableForPremiumUsers": true,
"availableForMobile": true,
"availablePartially": false,
"bests": [
46402425
],
"trackPosition": {
"volume": 1,
"index": 2
}
}
],
"coverUri": "avatars.yandex.net/get-music-content/3226792/7e2b95cc.a.6255689-5/%%",
"ogImage": "avatars.yandex.net/get-music-content/3226792/7e2b95cc.a.6255689-5/%%",
"lyricsAvailable": true,
"type": "music",
"rememberPosition": false,
"trackSharingFlag": "COVER_ONLY",
"lyricsInfo": {
"hasAvailableSyncLyrics": true,
"hasAvailableTextLyrics": true
},
"trackSource": "OWN"
},
"lyricsAvailable": true,
"alsoInAlbums": [],
"lyric": [
{
"majorId": 560,
"majorName": "Musixmatch",
"writers": "Дайте танк (!)",
"externalLyricId": "90113380",
"lyricId": 8397144,
"fullLyrics": "Мы разрисуем все заборы своими стихами\nДостань, пожалуйста, краску из рюкзака\nНам ни к чему учителя — мы придумаем сами\nПравила русского языка\n\nКогда экономят силы все остальные\nМы заранее готовимся к ностальгии\nМы решили: дорога каждая минута\nМы валяем дурака, и пока\nВпечатления — наша валюта\n\nМы сказочно богаты\nСказочно богаты\nСказочно богаты\nТы и я\nЭй, подожди, куда ты?\nПодожди, куда ты?\nПодожди, куда ты\nМолодость моя?\n\nДавай в подземном переходе играть на гитаре?\nНотная грамота тоже нам не нужна\nНа фоне площади луна\nКак огромный фонарик\n\nИ губы, бордовые от вина\nДополнение к очкам нашим розовым\nВ этом возрасте легко быть философом\nВ этом мире даже на приключения\nПоднимается цена, но она\nНе имеет значения\n\nМы сказочно богаты\nСказочно богаты\nСказочно богаты\nТы и я\nЭй, подожди, куда ты?\nПодожди, куда ты?\nПодожди, куда ты\nМолодость моя?\n\nМолодость моя\nМолодость моя\nМолодость моя!",
"lyrics": "Мы разрисуем все заборы своими стихами\nДостань, пожалуйста, краску из рюкзака\nНам ни к чему учителя — мы придумаем сами\nПравила русского языка"
}
],
"episodeDescription": [],
"videos": [
{
"cover": "https://avatars.yandex.net/get-music-content/6255016/1479fd1b.a.22146772-1/%%",
"title": "Мы",
"embedUrl": "https://frontend.vh.yandex.ru/player/8832287696922927833?service=ya-video&from=ya-music"
}
],
"isUgcTrack": false
}
Thank you!
Hi, I'm making a Gentoo ebuild (an installation script) for your downloader and the format requires a license. How do you distribute the code?
Maximum download size is 551 KB (30 seconds)
Hi!
I have your Script running with my Yandex Plus Account and russian VPN.
I can download the first ~10 Songs without any Problems. But from this Time on, I get always the message:
[ERROR] Can't get track list info
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching album info: 9454617
Do you also experience this Problem ?
Do you know if it is possible to decrypt/convert downloaded Songs by the Yandex Android App ?
I can download and find the files on the Storage from the mobile Device but Im not able to play it.
Best Regards!
That would be great if users would have an ability to authorize with their yandex login/password.
I cloned the repository and after installing the dependencies with cpan and figuring out I need to prepend commands with perl. I ran into the same error all the time and the script just wouldn't get me anything useful.
kix@KiXBoX:~/yandex-music-download/src$ perl ya.pl -a=3155218Unknown option: =
Unknown option: 3
Unknown option: 1
Unknown option: 5
Unknown option: 5
Unknown option: 2
Unknown option: 1
Unknown option: 8
ya.pl [-adkptu] [long options...]
-p[=INT] --playlist[=INT] playlist id to download
-k[=STR] --kind[=STR] playlist kind (eg. ya-playlist,
music-blog, music-partners, etc.)
-a[=INT] --album[=INT] album to download
-t[=INT] --track[=INT] track to download (album id must be
specified)
-u[=STR] --url[=STR] download by URL
-d[=STR] --dir[=STR] download path (current direcotry will be
used by default)
--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
--delay INT delay between downloads (in seconds)
--mobile INT use mobile API--debug print debug info during work
--help print usage--include and --exclude options use weak match i.e. ~/$term/
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
ya.pl -u https://music.yandex.ru/album/215688/track/1710808
ya.pl -u https://music.yandex.ru/users/ya.playlist/playlists/1257
kix@KiXBoX:/yandex-music-download/src$ perl ya.pl -a 3155218/yandex-music-download/src$ perl ya.pl -u https://music.yandex.ru/album/3155218
[INFO] Checking Yandex.Music availability
[ERROR] Yandex.Music is not available
[INFO] Fetching album info: 3155218
[ERROR] Can't get track list info
kix@KiXBoX:
[INFO] Checking Yandex.Music availability
[ERROR] Yandex.Music is not available
[INFO] Fetching album info: 3155218
[ERROR] Can't get track list info
kix@KiXBoX:/yandex-music-download/src$ sudo perl ya.pl -u https://music.yandex.ru/album/3155218/yandex-music-download/src$ ya.pl -u https://music.yandex.ru/album/215690
[INFO] Checking Yandex.Music availability
[ERROR] Yandex.Music is not available
[INFO] Fetching album info: 3155218
[ERROR] Can't get track list info
kix@KiXBoX:
ya.pl: command not found
kix@KiXBoX:/yandex-music-download/src$ perl ya.pl -u https://music.yandex.ru/album/215690/yandex-music-download/src$ perl ya.pl -u https://music.yandex.ru/album/215688/track/1710808
[INFO] Checking Yandex.Music availability
[ERROR] Yandex.Music is not available
[INFO] Fetching album info: 215690
[ERROR] Can't get track list info
kix@KiXBoX:
[INFO] Checking Yandex.Music availability
[ERROR] Yandex.Music is not available
[INFO] Fetching album info: 215688
[INFO] Filtering single track: 1710808 [215688]
[ERROR] Can't get track list info
kix@KiXBoX:/yandex-music-download/src$ ya.pl -u https://music.yandex.ru/users/ya.playlist/playlists/1257/yandex-music-download/src$ perl ya.pl -u https://music.yandex.ru/users/ya.playlist/playlists/1257
ya.pl: command not found
kix@KiXBoX:
[INFO] Checking Yandex.Music availability
[ERROR] Yandex.Music is not available
[INFO] Fetching playlist info: 1257 [ya.playlist]
[ERROR] Can't get track list info
kix@KiXBoX:~/yandex-music-download/src$
Если честно, я здесь не из-за яндекс.музыки, просто вспомнил про тест на битарда и захотелось его еще раз перепройти, но не нашел куда можно написать по этому вопросу
Кажется он не может распарсить русские имена.
На 2 плейлистах, которые имеют названия на русском получаю ошибку:
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching playlist info: 1000 [username]
[ERROR] Can't get track list info
А скопированные треки в плейлист с английским названием - качает корректно
[DEBUG] main::print_debug_info(1226): OS: linux; Path: /usr/bin/perl; Version: v5.18.2
[DEBUG] main::print_debug_info(1228): Cookie: 3:1606303467.5.0.********8580:zIvsLg:e.1|176462006.0.2|226361.948517.z5q5H1BeobpDlqzTANIzndzV6Es
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching album info: 12903800
[DEBUG] main::get_album_tracks_info(666): Request failed
[DEBUG] main::log_response(1215): Response stored at log_1606303606
[ERROR] Can't get track list info
Скачал последнюю версию, при запуске получаю ошибку
perl ya.pl Please, install this modules: Mozilla::CA, MP3::Tag, Getopt::Long::Descriptive, LWP::UserAgent, LWP::Protocol::https, HTTP::Cookies, HTML::Entities
Замечательный инструмент, спасибо
но есть проблема ("в шапке")
указываю --cookie='Session_id:....'
м.б. я чего-то не так указываю
куки брал из ФайрФокса
пробовал и sessionid2 и вместе с Session_id
заход из браузера по ссылке (если -l) дает тот же эффект - тоько 30сек
Отличный скрипт, ничего лишнего и всё необходимое, но появилась проблема.
Ещё вчера всё отрабатывало, около 200 песен скачал, а теперь выдаёт эту ошибку.
Всё делал скриптом на macOS, его код не менялся. Что это может быть?
Содержимое моего .command
файла:
cd "`dirname $0`"
perl ./ya.pl\
-d ./ya.new\
-u https://music.yandex.ru/users/MikkBenelis/playlists/3
Скрин результата работы (для наглядности выбрал другой плейлист с 1 треком):
Можно ли скачивать "Мне нравится"? А получать список песен по урлу?
Если нет, то вношу предложение для следующей версии)
(
Can i get my "Liked" tracks or get text list of album/"Liked"/playList by url?
)
Tracks in a playlist have an order. When a playlist is downloaded, this order is lost. I suggest to (optionally) save this order by adding a track number in the filename of the track.
For example:
01. Example author - Example title.mp3
instead of just
Example author - Example title.mp3
yandex-music-downloader only downloads a part of a track 30 seconds long. I have used --cookie
option. However, in a web browser, while authenticated with the same cookie, I can listen a whole track.
Привет!
Похоже срабатывает какое-то ограничение.
Например для трэка https://music.yandex.ru/album/1719036/track/15773883
Это пример из программы без дополнительного логирования:
[DEBUG] main::rename_track(922): CreateFileW failed with: Ñèñòåìå íå óäàåòñÿ íàéòè óêàçàííûé ïóòü
[DEBUG] main::rename_track(922): CreateFileW failed with: Ñèñòåìå íå óäàåòñÿ íàéòè óêàçàííûé ïóòü
[DEBUG] main::rename_track(922): CreateFileW failed with: Ñèñòåìå íå óäàåòñÿ íàéòè óêàçàííûé ïóòü
...
И далее бесконечный цикл с такой ошибкой.
Тут добавил три строчки логирования получил такое:
https://cloud.mail.ru/public/7QDp/ncwV3W611
Отличная программа! Мне тольк очень нехватает скачивание по артисту, но я вышел из ситуции скриптом на питоне. Еще очень помогло бы запись тега TPE2 (исполнитель альбома) не как Various Artists а как и в TPE1 (исполнитель). А то мой в plex приходится сопоставление артиста вручную выставлять. (также пытаюсь скриптом исправить, но пока не получается)
A.
i get error
[DEBUG] main::get_track_url(634):
[DEBUG] main::get_track_url(637): Request failed
[DEBUG] main::log_response(1215): Response stored at log_1601474202
// log_1601474202
400 URL must be absolute
Content-Type: text/plain
Client-Date: Wed, 30 Sep 2020 13:56:42 GMT
Client-Warning: Internal response
400 URL must be absolute
i run: perl ya.pl -u https://music.yandex.com/users/yamusic-daily/playlists/121583123 --cookie "xxxxxx" --debug --proxy xxxxxxxx
B.
i dont understand how to get the cooike session_id
i tried to copy-paste from chrom
and i dont know how to put it in the arguments
so if you can explain how execly to do it
thanks
Got error with several files, that write_v24 disabled.
Fast fix:
`--- a/src/ya.pl
+++ b/src/ya.pl
@@ -128,6 +128,9 @@ for my $module(@{$req_modules{ALL}}, IS_WIN ? @{$req_modules{WIN}} : @{$req_modu
}
}
+# Configure modules
+MP3::Tag->config(write_v24 => 'TRUE');
+
if(@missing_modules)
{
print 'Please, install this modules: ' . join ', ', @missing_modules;`
All files downloaded with bitrate 160. Option -bitrate 320 don't help.
I saw similar issue, but didn't find anything helpful there
#40
And I see these lines in the code
# Fix for "Writing of ID3v2.4 is not fully supported (prohibited now via `write_v24')"
MP3::Tag->config
(
id3v23_unsync => 0,
write_v24 => 1,
decode_encoding_v2 => 'UTF-8'
);
But it doesn't matter if I set write_v24
to 1
or 0
, the program anyway ends with Writing of ID3v2.4 is not fully supported (prohibited now via
write_v24').`
Here are logs of the program with --debug
:
[0] $ perl ya.pl --debug -u https://music.yandex.com/album/7489514 --delay 1 --bitrate 192 --path /home/grbit/music/zendo/#artist/#album --cookie ''
[DEBUG] main::print_debug_info(1351): Yandex Music Downloader v1.5
[DEBUG] main::print_debug_info(1352): OS: linux; Path: /usr/bin/perl; Version: v5.32.1
[DEBUG] main::print_debug_info(1354): Cookie:
[INFO] Fetching album info: 7489514
[INFO] Album title: Termistic
[INFO] Tracks total: 16
[INFO] Trying to fetch track: Max DetaL' - Trip
[DEBUG] main::get_track_url(723): Track url: https://s474vla.storage.yandex.net/get-mp3/815b397b27067f6e1e40d723e6ceb5c2/0005fd7c84c4f73c/rmusic/U2FsdGVkX1_lCEMzM9aQmX9Vh7ibl7CqMg-RoJ3WKAZkbJw3--08J4mk6qG7Vap49Tc-glJMT6nVq6x9A6uQ9OxnxWhtrA7zoPGbqzmTu0c/b39809eaf9d101a3661884296aca87d2acfa2bf046fdbd668974b466202d1a34?track-id=52888864&from=service-10-track&similarities-experiment=default
[DEBUG] main::download_track(597): File size from header: 481115
[OK] Temporary saved track at ./Vh8ix4ys_z
[DEBUG] main::fetch_album_cover(1074): Cover URL: https://avatars.yandex.net/get-music-content/114728/b37d9a0b.a.7489514-1/400x400
[DEBUG] main::fetch_track_lyrics(1095): Lyrics URL: https://music.yandex.ru/handlers/track.jsx?track=52888864:7489514&lang=ru&external-domain=music.yandex.ru&overembed=false&ncrnd=1686082560
[DEBUG] main::write_mp3_tags(1043): add_frame: TIT2=Trip
[DEBUG] main::write_mp3_tags(1043): add_frame: TRCK=1
[DEBUG] main::write_mp3_tags(1043): add_frame: TCON=electronics
[DEBUG] main::write_mp3_tags(1043): add_frame: TYER=2019
[DEBUG] main::write_mp3_tags(1043): add_frame: TALB=Termistic
[DEBUG] main::write_mp3_tags(1043): add_frame: TPE2=Max DetaL'
[DEBUG] main::write_mp3_tags(1043): add_frame: APIC=ARRAY(0x55fee73f
[DEBUG] main::write_mp3_tags(1043): add_frame: TPE1=Max DetaL'
Writing of ID3v2.4 is not fully supported (prohibited now via `write_v24').
Can someone help me a bit? I'm all thumbs with perl
Could a '
in artist name be a problem?
UPD: I've tested another album — it works fine. So, I guess the problem is the '
. But I have no idea how to fix it.
How to install? How to use?
With any url:
[ERROR] Can't get track list info
Не работает последняя версия скрипта
NL => IS_WIN ? "\015\012" : "\012",
./ya.pl -u https://music.yandex.ru/album/6153640/track/45788378 --debug
[DEBUG] main::print_perl_info(1144): OS: linux; Path: /usr/bin/perl; Version: v5.18.2
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching album info: 6153640
[INFO] Album title: Different World
[INFO] Tracks total: 15
[INFO] Filtering single track: 45788378 [6153640]
[INFO] Trying to fetch track: Alan Walker, K-391, Emelie Hollow - Lily
[DEBUG] main::get_track_url(574): Can't find track with proper format & bitrate
[ERROR] Can't get track url
[OK] Done!
Предыдущая версия работает, но иногда криво сохраняет некоторые треки, как посмотреть версию не знаю.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.