Закрыть

Audio API Редактировано: 28.08.2020 в 04:15

Теперь в Easy VK есть Audio API. Неофициальное, да, но зато работает.
В реализации Audio API я постарался повторить все методы, которые существовали в прошлом API ВКонтакте на основе официальной документации, которое разработчики, к слову, закрыли. Так что можно сказать, что Audio API в Easy VK - это полностью экспериментальная фитча, которая не рекомендуется для использования, но и не противопоказана :D
В общем, все на Ваше усмотрение, может работать, а может и нет.

ЕСТЬ ВАЖНОЕ НО!
В Easy VK будут выходить периодически различные обновления, которые будут фиксить все ошибки Audio API. Я буду стараться поддерживать актуальные возможности раздела аудиозаписей ВКонтакте. Некоторые параметры просто напросто не поддерживаются в Audio API, но это только потому, что ВКонтакте сам их не поддерживает. Вот так вот. В общем, ниже я постарался описать все методы, и как с нимим работать.

# audio.get()

Метод получает список аудиозаписей из плейлиста, из группы, или из аудиозаписей пользователя.

Параметры

  • owner_id - ID пользователя или группы, чьи аудиозаписис надо достать
  • playlist_id - ID плейлиста, из которого надо взять аудозаписи
  • offset - Смещение по аудиозаписям, вернет аудозаписи, начиная с номера offset

Метод, как и многие другие методы Audio API возвращает объект <Promise>, в resolve функцию возвращаются следующие объекты


	{
		json: Object, // Читайте описание в разделе JSON Audio Api 
		vkr: VKResponse, 
		vk: EasyVK
	}

http.audio.get({
	owner_id: -123675921
}).then(({vkr, json}) => {
	let offset;

	if (json.hasMore) {
		// Есть еще аудозаписи, делаем offset
		offset = json.nextOffset;
	}

	console.log(vkr);

});

# audio.getById()

Метод возвращает аудиозапись по заданному идентифекатору

Параметры

  • ids - список идентифекаторов аудиозаписей
    
    	"2_67859194,-683495_39822725,2_63937759"
    
    Или массив строк
    
    	["2_67859194","-683495_39822725","2_63937759"]			
    

Метод вернет массив аудиозаписей AudioItem


http.audio.getById({
	ids: '-2000506793_456239022'
}).then(({vkr, json}) => {
		
	console.log(vkr[0])

})

Очень-чень опасный метод, который я еще дорабатываю, но он уже вполне работает. Короче, этот метод ищет аудиозаписи

Параметры

  • q - Строка поискового запроса, например "MORGENSHTERN"
  • offset - Смещение по поисковой странице, API вернет аудиоизапись начиная с номера offset

К сожалению остальные параметры, вроде filter, пока что не работают


http.audio.search({
	q: "MORGENSHTERN"
}).then(({vkr}) => {
	
	console.log(vkr);

});

# audio.getLyrics()

Метод возвращает старые слова, текст к песне (то, что уже не работает на новых аудиозаписях, но актуально для старых)

Параметры

  • lid - lyrics_id, можно взять из некоторых объектов аудиозаписей, которые можно получить с помощью методов audio.get() или audio.getById()

Примеров нет, так как в целом метод старый и не рекомендуется для использования

# audio.getCount()

Метод возвращает количество аудиозаписей пользователя или группы

Параметры

  • owner_id - ID пользователя или группы, откуда нужно взять количество аудиозаписей


http.audio.getCount({
	owner_id: -123675921
}).then(({vkr}) => {
	console.log(vkr)
})

# audio.getUploadServer()

Метод возвращает URL для загрузки аудиозаписи


{
	// ответ
	upload_url: 'https://pu.vk.com/c815231/upload.php?act=load_audio&aid=0&gid=...'
}

Параметры

  • gid
  • - ID группы, если есть необходимость загрузить в группу


http.audio.getUploadServer().then(({vkr}) => {
	console.log(vkr.upload_url);

	// Теперь можно загружать на url файл аудиозаписи
})

Как загружать, читайте ниже

# audio.upload()

Метод загружает на указанный URL адрес аудиозапись, точнее, просто файл, но его можно использовать, чтобы загрузить аудиозапись в профиль в связке с методом audio.getUploadServer(), чтобы получить URL для загрузки.

Параметры

  • url * (<string>)

    URL адрес сервера, на который будет идти загрузка

  • file_path * (<string>)

    Путь к файлу, который нужно загрузить

Метод вернет промежуточные данные для сохранения аудиозаписи, эти данные Вы можете использовать, чтобы сохранить аудиозапись в группу или у пользователя


let upload_url = 'https://pu.vk.com/c815231/upload.php?act=load_audio&aid=0&gid=...';
let mp3_path = __dirname + 'my.mp3';

http.audio.upload(upload_url, mp3_path).then(({vkr}) => {
	
	console.log(vkr);

})

Чтобы узнать, как сохранить файл, читайте документацию метода audio.save()

# audio.save()

Метод сохраняет аудиозапись после загрузки, в него надо передать только промежуточные данные, полученные с метода audio.upload()

Метод вернет сохраненную аудиозапись, объект AudioItem



http.audio.getUploadServer().then(({vkr}) => {
	let upload_url = vkr.upload_url;
	let mp3 = __dirname + 'my.mp3';

	http.audio.upload(upload_url, mp3).then(({vkr}) => {
			
		http.audio.save(vkr).then(({vkr: audio}) => {
			
			console.log(audio);

		})

	})
	

})

# audio.getURL()

Метод возвращает разобранный URL адрес mp3 файла аудиозаписи. Во многих местах mp3 аудиозаписи скрыт и, когда Вы попытаетесь прослушать аудиозапись из url, будет звучать что-то в роде "этому приложению не доступно прослушивание аудиозаписей ВКонтакте". Короче, нужно этот URL вставить в данный метод и он просто вернет разобранный нормальный URL по алгоритму


vk.call("wall.getById", {
	posts: "-149662823_108"
}).then(({vkr}) => {
	let post = vkr[0];
	
	let audio = post.attachments[1].audio;
	audio.url = http.audio.getURL(audio.url);

	console.log(audio);
	
})

# audio.add()

Метод добавляет выбранную аудиозапись в список аудиозаписей группы или пользователя

Аргументы

  • audio * (<AudioItem>) - объект AudioItem, или просто объект такого типа
    
    {
    	owner_id: AUDIO_OWNER_ID,
    	id: AUDIO_ID,
    	add_hash: AUDIO_ADD_HASH
    }
    			

    Рекомендую брать данный объект из методов вроде audio.get() или audio.getById()

  • params (<Object>) - список дополнительный настроек
    • group_id - id группы, в которую нужно добавить аудиозапись


http.audio.get({
	owner_id: -84720287
}).then(({vkr}) => {
	
	let audioObject = vkr[0];
	
	http.audio.add(audioObject).then(({vkr}) => {
			
		console.log(`Аудиозапись ${audioObject.title} добавлена!`);

	})

})

# audio.delete()

Метод удаляет аудиозапись

Принимает только один аргумент - объект аудиозаписи AudioItem


{
	id: AUDIO_ID,
	owner_id: AUDIO_OWNER_ID,
	delete_hash: AUDIO_DELETE_HASH	
}

Рекомендую брать данный объект из методов вроде audio.get() или audio.getById()


http.audio.get().then(({vkr}) => {
	
	let audioObject = vkr[0];

	http.audio.delete(audioObject).then(({vkr}) => {
			
		console.log(`Аудиозапись ${audioObject.title} удалена!`);

	});

});

# audio.edit()

Метод редактирует аудиозапись

Аргументы

  • audio * (<AudioItem>) - объект аудиозаписи AudioItem или примерно такой объект
    
    {
    	owner_id: AUDIO_OWNER_ID,
    	edit_hash: AUDIO_EDIT_HASH,
    	id: AUDIO_ID
    }
    

    Рекомендую брать данный объект из методов вроде audio.get() или audio.getById()

  • params - объект параметров запроса
    • title - новое название аудиозаписи (по умолчанию не изменяется)
    • privacy - аудиозапись скрыта из поиска
    • 
      {
      	privacy: [0, 1][0]
      }
      			
    • text - текст аудиозаписи, слова
    • performer - исполнитель трека
    • genre - номер жанра, можно взять из объекта AudioAPI
    • 
      AudioAPI.genres = {
      	1: "Rock",
      	2: "Pop",
      	3: "Rap & Hip-Hop",
      	4: "Easy Listening",
      	5: "Dance & House",
      	6: "Instrumental",
      	7: "Metal",
      	8: "Dubstep",
      	10: "Drum & Bass",
      	11: "Trance",
      	12: "Chanson",
      	13: "Ethnic",
      	14: "Acoustic & Vocal",
      	15: "Reggae",
      	16: "Classical",
      	17: "Indie Pop",
      	18: "Other",
      	19: "Speech",
      	21: "Alternative",
      	22: "Electropop & Disco",
      	1001: "Jazz & Blues",
      }
      				
      
      {
      	title: 'До зимы',
      	performer: 'Oxxxymiron',
      	genre: http.audio.genres[3]
      }
      				

Метод вернет отредактированную аудиозапись


http.audio.get().then(({vkr}) => {
	
	let audioObject = vkr[0];

	http.audio.edit(audioObject, {
		title: "Rest In Peace",
		performer: "Astrokai",
		genre: http.audio.genres[1001]
	}).then(({vkr}) => {
			
		console.log('Отредачили!', vkr);

	})

})

# audio.reorder()

Метод перемещает аудиозапись в списке аудиозаписей

Параметры

  • audio_id - ID аудиозаписиси, которую нужно переместить
  • after_audio_id - ID аудиозаписи, после которой в списке поместить выбранную аудиозапись. Аудиозапись переместится на место этой аудиозаписи

Пример, как я поменял 1ю аудиозапись местами со 2й


http.audio.get().then(({vkr}) => {
	
	let audios = vkr;
	
	http.audio.reorder({
		audio_id: audios[0].id,
		after_audio_id: audios[0].id
	}).then(({vkr}) => {
		
		console.log('Переместили!', vkr);

	});
	
});

# audio.restore()

Метод восстанавливает аудиозапись в списке аудиозаписей после удаления, точно не знаю через сколько времени уже нельзя восстановить аудиозапись

Аргументы

  • audio * ( <AudioItem>) - объект аудиозаписи

    Рекомендую брать данный объект из методов вроде audio.get() или audio.getById()


http.audio.get().then(({vkr}) => {

	let audio = vkr[0];


	http.audio.delete(audio).then(() => {
		
		console.log('Удалили!');

		http.audio.restore(audio).then(() => {
			
			console.log('Восстановили!');

		})

	})
	
})

# audio.getPlaylists()

Метод возвращает список плейлистов пользователя или группы

Параметры

  • owner_id - ID пользователя или группы, из которой надо достать список плейлистов
  • offset - смещение по номеру плейлиста, начиная с этого номера будут возвращены новые плейлисты

Метод вернет массив плейлистов объекта Playlist, читайте документацию для этого объекта.


http.audio.getPlaylists({
	owner_id: -123675921
}).then(({vkr}) => {

	console.log(vkr[0].title);

});

# audio.getPlaylistById()

Метод возвращает плейлист по указанном параметрам

Параметры

  • owner_id - ID владельца плейлиста (группа или пользователь)
  • playlist_id - ID плейлиста, который нужно получить

Вернет объект плейлиста Playlist


http.audio.getPlaylistById({
	owner_id: -123675921,
	playlist_id: 1
}).then(({vkr}) => {
	
	console.log(vkr.title);

});

# audio.followPlaylist()

Метод добавляет плейлист в подписки (проще говоря, он добавляет чужой плейлист в список плейлистов пользователя, подписывается). Чтобы отписаться от плейлиста, надо вызвать метод повторно

Аргументы

  • playlist * (<Playlist>) - объект плейлиста, или примерно такой бъект
    
    {
    	id: PLAYLIST_ID,
    	owner_id: PLAYLIST_OWNER_ID,
    	follow_hash: PLAYLIST_FOLLOW_HASH
    }
    		

    Рекомендую получать данный объект через методы вроде audio.getPlaylists() или audio.getPlaylistById()


http.audio.getPlaylists({
	owner_id: -123675921
}).then(({vkr}) => {
	
	let playlist = vkr[0];


	http.audio.followPlaylist(playlist).then(() => {
		
		console.log('Подписались!');

	})

})

# audio.deletePlaylist()

Метод удаляет плейлист из списка плейлистов (только СВОЙ плейлист, чужие нельзя удалить этим методом, всмысле, что, если Вы подписались на плейлист, надо отписаться, а не удалять его!)

Аргументы

  • playlist * (<Playlist>) - объект плейлиста, или примерно такой бъект
    
    {
    	id: PLAYLIST_ID,
    	owner_id: PLAYLIST_OWNER_ID,
    	edit_hash: PLAYLIST_EDIT_HASH
    }
    		

    Рекомендую получать данный объект через методы вроде audio.getPlaylists() или audio.getPlaylistById()


http.audio.getPlaylists().then(({vkr}) => {
	
	let playlist = vkr[0];


	http.audio.deletePlaylist(playlist).then(() => {
		
		console.log('Удалили плейлист!');

	})

})

# audio.moveToPlaylist()

Метод добавляет аудиозапись в выбранный плейлист

Аргументы


http.audio.get().then(({vkr}) => {
	
	let audio = vkr[0];

	http.audio.getPlaylists().then(({vkr: playlists}) => {
		let playlist = playlists[0];

		http.audio.moveToPlaylist(audio, playlist).then(({vkr}) => {
			
			console.log('Добавили аудиозапись в плейлист!');

		})

	})

})

Playlist

Это объект плейлиста, который Easy VK генерирует автоматически при работе с плейлистами. В обобщенном виде он выглядет так:


{
	// ID плейлиста
	id: playlist.id,

	// ID владельца плейлиста
	owner_id: playlist.ownerId,

	// Полный идентифекатор плейлиста
	raw_id: playlist.ownerId + '_' + playlist.id,

	// Название плейлиста
	title: playlist.title,

	// Обложка плейлиста
	cover_url: playlist.coverUrl,

	// Дата последнего обновления
	last_updated: playlist.lastUpdated,

	// Содержит откровенный контент (мат)
	explicit: playlist.isExplicit,

	// Подписан ли пользователь на плейлист
	followed: playlist.isFollowed,

	// Подтвержденный плейлист (лицензия и т.п)
	official: playlist.isOfficial,

	// Сколько людей прослушали плейлист
	listens: playlist.listens,

	// Количество аудиозаписей в плейлисте
	size: playlist.size,
	
	// Все типы обложек
	covers: playlist.grid_covers,

	// Описание плейлиста
	description: playlist.description,

	// Маленькое описание плейлиста + HTML код
	raw_description: playlist.rawDescription,

	// Аудиозаписи плейлиста
	list: playlist.list
}

AudioItem

Это объект аудиозаписи, который Easy VK генерирует автоматически, когда работает с разделом аудиозаписей. Посмотрите, что он из себя представляет в обобщенном виде


AudioItem {
	id: 456239601,
	owner_id: 356607530,

	// URL адрес mp3 файла
	url:
	 'https://cs1-77v4.vkuseraudio.net/p13/d2f2dafd1d0e2d.mp3?extra=ZxfD...',
	
	// Название трека 
	title: 'Le clan des Siciliens',
	
	// Исполнитель
	performer: 'Ennio Morricone',
	
	// Продолжительность в секундах
	duration: 240, 

	// Список обложек
	covers:
	 'https://pp.userapi.com/c639520/v639520452/20464/qNd2FPHsB-0.jpg,https://pp
	.userapi.com/c639520/v639520452/20463/qXltktjrN1I.jpg',

	// Маленький размер обложки
	coverUrl_s: 
	 'https://pp.userapi.com/c639520/v639520452/20464/qNd2FPHsB-0.jpg',

	// Обложка размера постера
	coverUrl_p:
	 'https://pp.userapi.com/c639520/v639520452/20463/qXltktjrN1I.jpg', 

	// Флаги аудиозаписи (hq, и т.д)
	flags: 67,

	// высокое качество аудиозаписи (с недавних пор везде false)
	hq: false,
	
	// Подтверждено (типа по лицензии вроде)
	claimed: false,

	// Лицензия United Media Agency
	uma: false,

	// Взята из альбома
	album_id: 0,
	full_id: '356607530_456239601',

	// Содержит контент откровенного содержания (откровения тут это мат)
	explicit: false,

	// Не видел нигде, может старое что-то
	subtitle: '', 

	// Можно редактировать
	can_edit: true,

	// Можно удалить
	can_delete: true,

	// Можно добавить к себе
	can_add: true,

	// Cтарые данные аудиозаписи, тут же lyrics_id
	album: [ -2000050253, 50253, '41aa55652f111368ac' ],

	// ID слов песни, чтобы получить через audio.getLyrics()
	lyrics_id: 50253
}

JSON Audio Api

Данный объект возвращается в большинстве методов Audio API, и HTTP клиента. В нем хранится полный JSON ответ сервера ВКонтакте, его можно использовать для дебага, а также для того чтобы использовать полные возможности HTTP клиента. Так, например, в методе audio.get() в json возвращается объект с такимим параметрами, как hasMore, nextOffset и т.д

Данный объект сильно расширяет возможности клиента. Но помните один важный момент: точной документации для него не дать, Вы сами должны понимать, что в нем хранится, так как он всегда может придти разным (опять про нестабильность Audio API в целом, но это не минус, просто дотошность)


http.audio.get({
	owner_id: -123675921
}).then(({json}) => {
	console.log(json.hasMore) // Есть ли еще аудиозаписи
	console.log(json.nextOffset)
})