Skip to content

Instantly share code, notes, and snippets.

@derand
Last active August 28, 2016 08:05
Show Gist options
  • Save derand/ec88dcc2b0aead0b2831b3098a86a302 to your computer and use it in GitHub Desktop.
Save derand/ec88dcc2b0aead0b2831b3098a86a302 to your computer and use it in GitHub Desktop.
Скачивание своих плейлистов с сервиса pleer.net

Создатели сервиса pleer.net не подрудились перед закрытием своего сервиса не только дать возможность скачать музыку, но даже не дали скачать список треков из плейлистов. Я раскажу как скачать всю музыку из своих плейлистов с сайта pleer.net.


Сначала нужно скачать свой плейлисты в JSON формате. Спасибо за наводку Vadim Burshtyn, я немного изменил скрипт, что б вытащить больше данных о треках (файл pp.js).

Скачиваем файл, копируем содержимое. Открываем сайт плеера. Жмем F12 в хроме. Переходим на вкладку Console, жмем Ctrl+V, жмем Enter. В открывшемся окне выбираем куда сохранять файлик, жмем ОК. Теперь у вас есть ваш плейлист в формате json. Хоть что-то. И да, это будет работать при условии, что вы были залогинены на сайте.

В результате у вас должно скачатся файл "tracks.json", похожий на прикрепленный.

Скачиваем файл "pleer_downloader.py" в ту-же папку, где лежит "tracks.json" и запускаем Python-скрипт. В результате его работы у вас в текущей папке создадутся каталоги плейлистов, а в них скачаются mp3-файлы.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
import sys, os
def convert_bytes(bt):
s = 'bKMGT'
i = 0
while i < len(s):
if bt < 1024:
break
bt = float(bt)/ 1024.0
i+=1
return '%.2f%s'%(bt, s[i])
class Pleer(object):
"""docstring for Pleer"""
def __init__(self, access_token=None):
super(Pleer, self).__init__()
self._access_token = access_token
def get_access_token(self):
r = requests.post('http://api.pleer.com/token.php', data={'grant_type': 'client_credentials'}, auth=('WJG21K6km5eDPAUxMNl', ''))
self._access_token = r.json().get('access_token')
return self._access_token
def get_track_info(self, track_id):
if not self._access_token:
self.get_access_token()
prms = {
'access_token': self._access_token,
'method': 'tracks_get_info',
'track_id': track_id
}
r = requests.post('http://api.pleer.com/index.php', data=prms)
return r.json().get('data')
def download_track(self, track_id, filename):
if not self._access_token:
self.get_access_token()
prms = {
'access_token': self._access_token,
'method': 'tracks_get_download_link',
'reason': 'save',
'track_id': track_id,
}
r = requests.post('http://api.pleer.com/index.php', data=prms)
url = r.json().get('url')
if url:
with open(filename, "wb") as f:
try:
response = requests.get(url, stream=True)
except requests.exceptions.ReadTimeout, e:
print('Can\'t get track \'%s\' for url: %s'%(track_id, url))
return None
total_length = response.headers.get('content-length')
if total_length is None: # no content length header
content = response.content
f.write(content)
dl = len(content)
total_length = dl
else:
dl = 0
total_length = int(total_length)
for data in response.iter_content(chunk_size=1024*100):
dl += len(data)
f.write(data)
done = int(50 * dl / total_length)
sys.stdout.write("\r[%s%s] %s"%('='*done, ' '*(50-done), convert_bytes(total_length)))
sys.stdout.flush()
print(' OK')
else:
print('Can\'t get url for \'%s\''%track_id)
if __name__ == "__main__":
with open('tracks.json') as data_file:
tracks = json.load(data_file)
pleer = Pleer()
access_token = pleer.get_access_token()
#pleer._access_token = '92a6b8cdf5922ad6e892fa4b4f78d43bfb01abb7'
print('Access token: %s'%pleer._access_token)
for playlist in tracks:
dir_name = playlist.get('Title')
if not os.path.exists(dir_name):
os.makedirs(dir_name)
for track in playlist.get('Tracks'):
track_id = track.get('link')
track_info = pleer.get_track_info(track_id)
tmp = '%s - %s'%(track_info.get('artist'), track_info.get('track'))
filename = '%s/%s.mp3'%(dir_name, tmp.replace('/', ' '))
print(filename)
pleer.download_track(track_id=track_id, filename=filename)
function readData(){
var playlists = $("#accordion .drop");
var data = new Array();
for (index = 0; index < playlists.length; ++index) {
var list = playlists[index];
var pli = $(list).children(".playlist-title").attr("list_name");
var playlist = $(list).find(".playlist li");
var tracks = new Array();
for(i = 0 ; i < playlist.length; i++)
{
var track = $(playlist[i]);
var trackData =
{
artist : track.attr("singer"),
song : track.attr("song"),
file_id: track.attr("file_id"),
track_id: track.attr("track_id"),
link: track.attr("link"),
duration: track.attr("duration"),
rate: track.attr("rate"),
size: track.attr("size"),
source: track.attr("source")
}
console.log(track);
tracks.push(trackData);
}
var playlistData = {Title : pli, Tracks : tracks};
data.push(playlistData);
}
return JSON.stringify(data, null, 2);
}
function saveAs(uri) {
var link = document.createElement('a');
if (typeof link.download === 'string') {
document.body.appendChild(link); // Firefox requires the link to be in the body
link.download = "tracks.json";
link.href = uri;
link.click();
document.body.removeChild(link); // remove the link when done
} else {
location.replace(uri);
}
}
var Data = 'data:application/json;charset=utf-8,' + encodeURIComponent(readData());
saveAs(Data);
[
{
"Title": "~like",
"Tracks": [
{
"artist": "FatBoy Slim",
"song": "Ya Mama (Push The Tempo)",
"file_id": "y3tra91ab",
"track_id": "72028944",
"link": "5782683CXYv",
"duration": "338",
"rate": "320 Kb/s",
"size": "12.915 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Light of the Seven",
"file_id": "3h96ap302c",
"track_id": "71457806",
"link": "14160819hhAO",
"duration": "590",
"rate": "VBR",
"size": "9.014 Mb",
"source": "playlist/my"
},
{
"artist": "Youssou N'Dour",
"song": "7 Seconds (Duet With Neneh Cherry)",
"file_id": "qkakh66cn",
"track_id": "70932002",
"link": "4428213YbxC",
"duration": "306",
"rate": "192 Kb/s",
"size": "7.024 Mb",
"source": "playlist/my"
},
{
"artist": "Linkin Park -",
"song": "Numb",
"file_id": "qnow2ocz5",
"track_id": "70948745",
"link": "44662018SBp",
"duration": "187",
"rate": "VBR",
"size": "4.884 Mb",
"source": "playlist/my"
}
]
},
{
"Title": "Ramin Djawadi - Game of Thrones - Season 6 (2016)",
"Tracks": [
{
"artist": "Ramin Djawadi",
"song": "Main Titles",
"file_id": "3h99xjzff6",
"track_id": "71458765",
"link": "14162593mmO7",
"duration": "111",
"rate": "320 Kb/s",
"size": "4.354 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Blood of My Blood",
"file_id": "3h99xkml49",
"track_id": "71458767",
"link": "14162594pEsn",
"duration": "215",
"rate": "320 Kb/s",
"size": "8.324 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Light of the Seven",
"file_id": "3h99svh3hr",
"track_id": "71458805",
"link": "14162485CmMK",
"duration": "590",
"rate": "VBR",
"size": "13.515 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Needle",
"file_id": "3h99xlgic9",
"track_id": "71458769",
"link": "14162595Z1Q9",
"duration": "176",
"rate": "320 Kb/s",
"size": "6.834 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Coronation",
"file_id": "3h99xmax5v",
"track_id": "71458771",
"link": "141625961T0l",
"duration": "106",
"rate": "320 Kb/s",
"size": "4.174 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Feed the Hounds",
"file_id": "3h99xmemui",
"track_id": "71458772",
"link": "14162597baYa",
"duration": "188",
"rate": "320 Kb/s",
"size": "7.294 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "My Watch Has Ended",
"file_id": "3h99xndk51",
"track_id": "71458775",
"link": "14162598cWJ6",
"duration": "174",
"rate": "320 Kb/s",
"size": "6.744 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "The Red Woman",
"file_id": "3h99xnmjcw",
"track_id": "71458777",
"link": "14162599uojP",
"duration": "197",
"rate": "320 Kb/s",
"size": "7.634 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Hold the Door",
"file_id": "3h99zg5mcx",
"track_id": "71458778",
"link": "14162600oVsg",
"duration": "441",
"rate": "320 Kb/s",
"size": "16.965 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Khaleesi",
"file_id": "3h99zgsmj0",
"track_id": "71458780",
"link": "14162601kudl",
"duration": "185",
"rate": "320 Kb/s",
"size": "7.194 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Maester",
"file_id": "3h99zhfykg",
"track_id": "71458781",
"link": "141626027e3V",
"duration": "172",
"rate": "320 Kb/s",
"size": "6.694 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "A Painless Death",
"file_id": "3h99zi9a1l",
"track_id": "71458782",
"link": "141626030Iay",
"duration": "202",
"rate": "320 Kb/s",
"size": "7.824 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Reign",
"file_id": "3h99zidf8k",
"track_id": "71458784",
"link": "14162604VDUD",
"duration": "196",
"rate": "320 Kb/s",
"size": "7.594 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Let's Play a Game",
"file_id": "3h99zj34cr",
"track_id": "71458785",
"link": "14162605huqi",
"duration": "351",
"rate": "320 Kb/s",
"size": "13.515 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Bastard",
"file_id": "3h99zjs036",
"track_id": "71458786",
"link": "14162606Pu8i",
"duration": "305",
"rate": "320 Kb/s",
"size": "11.755 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Trust Each Other",
"file_id": "3h99zkuhjj",
"track_id": "71458788",
"link": "14162607rZ8Q",
"duration": "189",
"rate": "320 Kb/s",
"size": "7.344 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Winter Has Come",
"file_id": "3h99zl6fcu",
"track_id": "71458789",
"link": "14162608fcAH",
"duration": "194",
"rate": "320 Kb/s",
"size": "7.534 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Hear Me Roar",
"file_id": "3h99zlm0vr",
"track_id": "71458790",
"link": "14162609UIMf",
"duration": "136",
"rate": "320 Kb/s",
"size": "5.334 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "The Winds of Winter",
"file_id": "3h99zqd1lp",
"track_id": "71458792",
"link": "14162610bV30",
"duration": "209",
"rate": "320 Kb/s",
"size": "8.114 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Lord of Light",
"file_id": "3h99zqqghb",
"track_id": "71458793",
"link": "14162611CMMv",
"duration": "256",
"rate": "320 Kb/s",
"size": "9.894 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Service of the Gods",
"file_id": "3h99zrnmkr",
"track_id": "71458794",
"link": "14162612jvIN",
"duration": "168",
"rate": "320 Kb/s",
"size": "6.534 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "I Need You by My Side",
"file_id": "3h99zs8jpd",
"track_id": "71458798",
"link": "14162613rCHg",
"duration": "156",
"rate": "320 Kb/s",
"size": "6.094 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "The Tower",
"file_id": "3h99zsjfzn",
"track_id": "71458799",
"link": "14162614y2IO",
"duration": "153",
"rate": "320 Kb/s",
"size": "5.964 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Unbowed, Unbent, Unbroken",
"file_id": "3h99zt8a6s",
"track_id": "71458800",
"link": "14162615KDrN",
"duration": "104",
"rate": "320 Kb/s",
"size": "4.094 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "I Choose Violence",
"file_id": "3h99ztqyne",
"track_id": "71458802",
"link": "14162616bJet",
"duration": "108",
"rate": "320 Kb/s",
"size": "4.244 Mb",
"source": "playlist/my"
},
{
"artist": "Ramin Djawadi",
"song": "Hodor",
"file_id": "3h99zuoxzg",
"track_id": "71458803",
"link": "14162617IlCD",
"duration": "144",
"rate": "320 Kb/s",
"size": "5.634 Mb",
"source": "playlist/my"
}
]
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment