Запросы песен (requested songs)

у кого есть данный скрипт или как его сделать поделитесь пожалуйста
 
1moment сказал(а):
neonmill сказал(а):
или как его сделать поделитесь пожалуйста
Вот и мне это интересно.
Есть довольно неплохой скрипт-основа. Естественно требует доработки под Ваши задачи и сайт.
https://www.radioboss.ru/smf_ru/index.php/topic,2524.msg11045.html#msg11045
 
Доброго дня, форумчане, поделитесь кто-нибудь скриптом, или может кто сможет написать? ни как не даётся он нам
 
Я вот устал ждать, взял себя в руки, обсмотрелся ютубами, обчитался документацией и сделал бота в телеграм для своего радио за две недели изучения.

Стало очень удобно. Бот умеет показывать играющий трек (nowplaying), добавлять его в плейлист по заказу (like/request), скачивать album art и сам трек.

Писал на Python3, всё хостится дома на маленькой машинке Z83II Mini PC.

Если интересно, могу подсказать в каком направлении нужно думать. Сам до этого питон вообще не знал и с сетевыми технологиями не работал, только универский минимум по программированию ;) в то время это был турбо паскаль.
 
Реализация запросов из telegram бота к radioboss api

Итак, у нас имеется зарегистрированный бот, доступ к Radioboss api и библиотека, которая оборачивает в функции запросы к Telegram api.

Вот библиотеки, которые я использую в своём боте:
Код:
import configtb
import requests
import xmltodict
import os
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
import logging

configtb — это просто питоновский файл, в котором находятся кофигурационные данные (токен бота, пароль и порт для radioboss). Это сделано для того, чтобы не светить данные в коде основной программы и для удобочитаемости.

Выглядит он вот так:

Код:
# -*- coding: utf-8 -*-

token = str('846592746:LDFGFqBi2:85JYFhfn0pfkbjg94LFjghv2Zl') # @your_bot token (тут он изменён естественно)
URL = str("https://api.telegram.org/bot" + token + "/") # часть урла к api telagram
rbPas = str('password') # пароль к radioboss
rbPort = str('0000') # порт radioboss

С помощью библиотеки requests будем отправлять запросы. С помощью xmltodict будем разбирать приходящий от radioboss XML и преобразовывать его в словарь питона.  Библиотеку os я использую для определения наличия определённого  файла на диске. Остальные относятся к боту и логгированию ошибок.

Для удобства определяю несколько глобальных переменных и словарь:

Код:
def get_np():
    
    global nowpl
    getPlInfo = {'pass': rb_Pas, 'action': 'playbackinfo'}
    r = requests.get('http://hyperadio.ru:' + rb_Port + '/', params=getPlInfo)
    doc = xmltodict.parse(r.content)
    nowpl = {'t_artist': doc['Info']['CurrentTrack']['TRACK']['@ARTIST'],
            't_title': doc['Info']['CurrentTrack']['TRACK']['@TITLE'],
            't_album': doc['Info']['CurrentTrack']['TRACK']['@ALBUM'],
            't_year': doc['Info']['CurrentTrack']['TRACK']['@YEAR'],
            't_genre': doc['Info']['CurrentTrack']['TRACK']['@GENRE'],
            't_comment': doc['Info']['CurrentTrack']['TRACK']['@COMMENT'],
            't_filename': doc['Info']['CurrentTrack']['TRACK']['@FILENAME'],
            't_duration': doc['Info']['CurrentTrack']['TRACK']['@DURATION'],
            't_playcount': doc['Info']['CurrentTrack']['TRACK']['@PLAYCOUNT'],
            't_lastplayed': doc['Info']['CurrentTrack']['TRACK']['@LASTPLAYED'],
            't_intro': doc['Info']['CurrentTrack']['TRACK']['@INTRO'],
            't_outro': doc['Info']['CurrentTrack']['TRACK']['@OUTRO'],
            't_casttitle': doc['Info']['CurrentTrack']['TRACK']['@CASTTITLE'],
            't_listeners': doc['Info']['CurrentTrack']['TRACK']['@LISTENERS'],
            'nt_artist': doc['Info']['NextTrack']['TRACK']['@ARTIST'],
            'nt_title': doc['Info']['NextTrack']['TRACK']['@TITLE'],
            'nt_album': doc['Info']['NextTrack']['TRACK']['@ALBUM'],
            'nt_year': doc['Info']['NextTrack']['TRACK']['@YEAR'],
            'nt_genre': doc['Info']['NextTrack']['TRACK']['@GENRE'],
            'nt_comment': doc['Info']['NextTrack']['TRACK']['@COMMENT'],
            'nt_filename': doc['Info']['NextTrack']['TRACK']['@FILENAME'],
            'nt_duration': doc['Info']['NextTrack']['TRACK']['@DURATION'],
            'nt_playcount': doc['Info']['NextTrack']['TRACK']['@PLAYCOUNT'],
            'nt_lastplayed': doc['Info']['NextTrack']['TRACK']['@LASTPLAYED'],
            'nt_intro': doc['Info']['NextTrack']['TRACK']['@INTRO'],
            'nt_outro': doc['Info']['NextTrack']['TRACK']['@OUTRO'],
            'nt_casttitle': doc['Info']['NextTrack']['TRACK']['@CASTTITLE'],
            'play_pos': doc['Info']['Playback']['@pos'],
            'play_len': doc['Info']['Playback']['@len'],
            'play_state': doc['Info']['Playback']['@state'],
            'playlist_pos': doc['Info']['Playback']['@playlistpos']}
    return nowpl

Таким образом у нас сформировался словарь из пар 'ключ: значение', которые очень просто и удобно использовать. Осталось только определить функцию для вывода. В моём случае выводится название-автор, длительность, а также позиция проигрывания по времени, ну и данные о следующем треке.

Код:
def nowplay():
    
    global nowpl
    get_np()
    secs = int(nowpl['play_pos']) // 1000
    mins = secs // 60
    secs = secs - mins * 60
    nowplay_str = str('HYPERADIO.RETROSCENE.ORG'+'\n\n'+'Now playing: ' + nowpl['t_casttitle'])+'\n\n'+str('Duration: '+ nowpl['t_duration'])+str(' Play position: ' + str(mins) + 'min ' + str(secs)+'sec')+'\n\n'+str('Next track: '+ nowpl['nt_artist'] + ' — ' + nowpl['nt_title']) + '\n'+str('Next track duration: ' + nowpl['nt_duration'])+'\n\n'+str('Current listeners: ' + nowpl['t_listeners'])
    return nowplay_str

Всё, эта функция возвращает строку для вывода. В принципе, можно было бы вывод определить прямо в этой функции (изначально у меня так и было), но для вывода я определил ещё одну.

Код:
def np(bot,update):

    global nowpl
    update.message.reply_text(nowplay())
    print ('Bot: ' + update.message.from_user['username'] + ' request Nowplay for ' + nowpl['t_casttitle'] + '\n')

Где  строчка update.message.reply_text(nowplay()) — это ответ юзеру в телеграм, а
print ('Bot: ' + update.message.from_user['username'] + ' request Nowplay for ' + nowpl['t_casttitle'] + '\n') — вывод информации в консоль, для наблюдения работы бота.

Вот результат работы команды /np моего бота:

HYPERADIO.RETROSCENE.ORG

Now playing: Tufan Uysal (SoNiC) - B1 (rotation mix) - sid.oth4.com

Duration: 04:51 Play position: 2min 38sec

Next track: Stefan Uram (Orcan) — Tchernobyl's Tears
Next track duration: 03:55

Current listeners: 1

Теперь о том, как реализована команда запроса песен (request song). В api radioboss есть команда songRequest и всё что нужно — это передать эту команду и передать имя нужного файла. В моём случае добавляется играющий трек, а его имя с путём мы благополучно уже занесли в словарь функцией get_np().

Вот так выглядит функция запроса:

Код:
def send_like():

    global nowpl
    global user_name
    get_np()
    songRequest = {'pass': rb_Pas, 'action': 'songrequest', 'filename': nowpl['t_filename'], 'message': user_name}
    r = requests.get('http://hyperadio.ru:' + rb_Port + '/', params=songRequest)
    return None

Имя пользователя нам необходимо, чтобы передать его в сообщении при отправлении запроса к radioboss. Сначала выполняем get_np(), тем самым обновляем наш словарь по команде getPlInfo радиобосса, потом формируем параметры для запроса songRequest (это, кстати тоже словарик) и отправляем сам запрос. Возвращать нам ничего не нужно. После запроса к api radioboss трек по имени файла отправится в список запроса.

Вот так будет выглядеть наш список:
4b8cA7ltpyclWYTHt-6Ewg


В основном цикле обрабатывается реакция на команды из бота:

Код:
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help))
    dp.add_handler(CommandHandler("like", like))
    dp.add_handler(CommandHandler("np", np))
    dp.add_handler(CommandHandler("dl", dl_track))
    dp.add_handler(CommandHandler("art", dl_art))
   
Я его взял из примеров по использованию библиотеки Python Telegram Bot. Как видно, бот просто реагирует на команды, приходящие от пользователей. На текущий момент у меня обрабатывается 6 команд:

  • /start — первая команда для инициализации бота, просто выводит информацию по боту и команды
  • /help — информация по командам
  • /like — команда добавления трека в плейлист по запросу
  • /np — команда вывода информации по играющему треку
  • /dl — команда по которой бот отправляет играющий трек в виде аудиофайла пользователю в телеграм
  • /art — команда по которой бот отправляет album art в виде картинки пользователю в телеграм

По времени у меня ушло примерно неделя на изучение Python в необходимом минимуме, чтобы уметь читать чужой код (youtube, блоги и несколько книг в электронном виде). Ещё неделю я экспериментировал с библиотеками для telegram api (их несколько и они разные по функциональным возможностям. Первый работающий прототип умел только показывать now play и добавлять трек в плейлист по заказу. Ещё неделя ушла на то, чтобы полностью переписать бота с использованием ptb библиотеки.

Не скрою, что поначалу программа на питоне даже не запускалась, я всё углублялся  в изучение, находил ошибки, исправлял, начинал заново. Первая радость была, когда пришел ответ от radioboss c XML, потом когда этот XML я смог разобрать, потом когда я получил ответ от telegram api и научился его разбирать, потом, когда смог отправить сообщение юзеру в телеграм на запрошенную команду.

Сейчас бот исправно работает, всё крутится дома на бесшумном mini pc. Мощностей хватает для того чтобы работал icecast, radioboss и скрипт на python. Загрузка процессора в штатном режиме где-то 30%. При генерации плейлистов конечно нагрузка подрастает до 70-90%, но я генерирую один большой плейлист на сутки из 8,5 тысяч треков. И в течении дня еще генерируется несколько 30 минутных плейлистов. С 22:00 до 00:00 в основной плейлист каждые 10 минут вставляются треки из списка по запросу.

Собственно всё. Я год мечтал о таком боте в телеграме и искал людей, кто мог бы мне помочь с реализацией. Так я никого и не нашел, поэтому взял себя в руки и научился всему сам. А сейчас меня это всё настолько увлекло, что я всеръёз начал изучать Python, уж очень мне он понравился и планирую переделать страничку своего радио уже с использованием скриптов на питоне.

Стрим: http://hyperadio.retroscene.org/
Бот в telegram: http://t.me/hyperadio_bot/

Весь исходный код бота я не привожу т.к. он еще далёк от идеала и не полностью наполнен функционалом, который я бы хотел в него внести, но данные части кода должны дать понять основу для работы с api radioboss и telegram.

Я в telegram: http://t.me/nodeus, если есть вопросы, я постараюсь на них ответить (если хватит моей компетенции).

Еще я очень хочу сделать web интерфейс администратора для удалённой работы с radioboss через api. Может быть моё желание переполнит чашу и я возьмусь и за это ;)
 
.....бот просто реагирует на команды, приходящие от пользователей.
— команда добавления трека в плейлист по запросу
— команда вывода информации по играющему треку
— команда по которой бот отправляет играющий трек в виде аудиофайла пользователю в телеграм
— команда по которой бот отправляет album art в виде картинки пользователю в телеграм
баловство ...
зачем это? Делать из радио второй Яндекс-недорадио-музыку?
 
Alex Ivanov сказал(а):
баловство ...
зачем это? Делать из радио второй Яндекс-недорадио-музыку?

Это лишь для того, чтобы удовлетворить просьбы слушателей отдельно взятого стрима. К вашему радио это не имеет никакого отношения, прошу заметить.

И да, что вы имеете против Яндекса?
 
scorp сказал(а):
Собственно всё. Я год мечтал о таком боте в телеграме и искал людей, кто мог бы мне помочь с реализацией. Так я никого и не нашел, поэтому взял себя в руки и научился всему сам. А сейчас меня это всё настолько увлекло, что я всеръёз начал изучать Python, уж очень мне он понравился и планирую переделать страничку своего радио уже с использованием скриптов на питоне.
Спасибо за проделанную работу. Но к сожалению далеко не все пользуются телеграмом.
Вот бы сделать веб-интерфейс заказа песен на сайте. Как это реализовано в Sam Broadcaster. Выводится база треков на сайт, либо без свечения базы делается поиск по названию песни и кнопка заказать. Можно оставить комментарий, для кого эта песня. диджей (автодиджей) прочитает. Ну и правила, не чаще раза в 30 минут или чего то там ещё :)
 
Drakkar сказал(а):
Вот бы сделать веб-интерфейс заказа песен на сайте.

Планирую сделать это у себя в дальнейшем. Не вижу ничего сложного.

— Импорт полной базы треков
— Интерфейс работы со списком песен на сайте
— Обработка запроса от пользователя
— Формирование и отправка запроса к api radioboss
— Исключение повторного запроса трека на определённые период, до обнуления списка запросов в radioboss

А какими средствами это реализовывать — это уже не важно. Главное — начать ;)
 
Alex Ivanov сказал(а):
зачем это? Делать из радио второй Яндекс-недорадио-музыку?
Некоторые радио более интерактивные, чем другие. Почему нет?
 
Это лишь для того, чтобы удовлетворить просьбы слушателей отдельно взятого интернет-радио. К вашему радио это не имеет никакого отношения, прошу заметить.
удовлетворят просьбы слушателей поисковики и спец. муз. сайт платные/беспатентные.
Ну, неужели, чтоб мне послушать Высоцкого я пойду рыться в ваших дебрях муз. базы?  Еще и пережатый по сто раз mp3    ;D  не смешите .... удовлетворить слушателей.  Точно такая -же система запросов работает на 101.ru, куча мертвых р/проектов на любой вкус и жанр...    пройдите и осмотритесь.
 
Drakkar сказал(а):
Вот бы сделать веб-интерфейс заказа песен на сайте.
Есть уже готовый довольно неплохой скрипт-основа. Естественно требует доработки под Ваши задачи и сайт.
https://www.radioboss.ru/smf_ru/index.php/topic,2524.msg11045.html#msg11045

Я начал допиливать его себе, но остановился пока... жду когда РБ переведут на БД и сделают нормальный удобный АПИ, потому что все эти эти извращения сейчас с парсингом XML в которых нету толком никакой гибкости и не вся нужная информация дико раздражают...
 
Alex Ivanov сказал(а):
Точно такая -же система запросов работает на 101.ru, куча мертвых р/проектов на любой вкус и жанр...    пройдите и осмотритесь.

Не понимаю почему вы бъётесь в горячке, приплетаете какие-то песни Высоцкого, поисковики, и кучи мёртвых проектов...

Разберитесь в теме, пожалуйста и тогда лейте свой аргументированный негатив. Demoscene ориентированных интернет-радио не так много, а хоть с каким-то интерактивом и совсем пара-тройка штук. А тех, которые работают в связке с мессенджерами вообще нет.

Назовите хотя бы одно радио, которое предлагает к прослушиванию качественно преобразованные чиптюн модули pt2 и pt3?
 
scorp сказал(а):
жду когда РБ переведут на БД и сделают нормальный удобный АПИ, потому что все эти эти извращения сейчас с парсингом XML
Чем не угодил XML? Для парсинга этого формата во всех основных языках есть встроенные средства. API предоставляет достаточно функций, тем более если вам просто нужно сделать запросы песен. Как пример использования API можете посмотреть на RadioBOSS Cloud: https://www.djsoft.net/smf/index.php/topic,5001.0.html
 
Назовите хотя бы одно радио, которое предлагает к прослушиванию качественно преобразованные чиптюн модули pt2 и pt3?
вот пожалуйста готовые собранные архивы bulba.untergrund.net/music.htm
или группа ВК vk.com/club9755214

вот, вы мне лучше найдите такое радио, которое играет музыку написанную/сделанную по принципу преобразования графических изображений и/или спектральных картинок! Ну, то есть ресинтез ...    вы же знаете ...

;D ;D    чудаки ... на букву М 
API предоставляет достаточно функций,
ну, благодаря такому API мы на своем интернет проекте радио как раз сделали интерактив со слушателями, а это ведущие, чат, общение, заказ песен ..  а что еще нужно?  Осталось только еще предоставить возможность своим слушателям за нас программировать эфир р/станции на ближайшие сутки )))  или это лучше сделает бот из месенджера?

Стало очень удобно. Бот умеет показывать играющий трек (nowplaying), добавлять его в плейлист по заказу (like/request), скачивать album art и сам трек.

.....бот просто реагирует на команды, приходящие от пользователей.
— команда добавления трека в плейлист по запросу
— команда вывода информации по играющему треку
— команда по которой бот отправляет играющий трек в виде аудиофайла пользователю в телеграм
— команда по которой бот отправляет album art в виде картинки пользователю в телеграм
Разберитесь в теме, пожалуйста и тогда лейте свой аргументированный негатив.
аргументированный негатив :  Делать из радио второй Яндекс-недорадио-музыку

это я от вас хочу услышать.  Зачем? Я ищу в этом смысл .. уже второй день ..
Current: 2 Peak: 9  оно вам нужно?

такой ваш "машинный" интерактив популярности радио не даст, а лишь будет банально простым и предсказуемым ...
 
djsoft сказал(а):
scorp сказал(а):
жду когда РБ переведут на БД и сделают нормальный удобный АПИ, потому что все эти эти извращения сейчас с парсингом XML
Чем не угодил XML? Для парсинга этого формата во всех основных языках есть встроенные средства. API предоставляет достаточно функций, тем более если вам просто нужно сделать запросы песен. Как пример использования API можете посмотреть на RadioBOSS Cloud: https://www.djsoft.net/smf/index.php/topic,5001.0.html
Знаю я что есть готовые функции и классы для парсинга, но данных там не хватает. Я писал, просил, но вы отказались допилить пару удобств. Поэтому ждем базу, там эти неудобства удет сами по себе и ничего Вас просить и упрашивать не придется, если конечно вы не додумаетесь там что-то ограничить.
Возможно и придется ковырять XML если в ближайшем будущем не дождусь БД, но вроде как уже обещали, есть надежда что уже скоро жить станет чуточку проще...
 
Назад
Верх