From 8dc4e72af61882bd7f6161012f75af26834967e7 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 18 Dec 2018 18:08:49 -0500 Subject: [PATCH] 2018-12-18 Fred Gleason * Added a 'pypad_live365.py' PyPAD script. * Removed the 'rlm_live365' RLM. * Fixed typos in the docstrings for 'PyPAD.Update::startDateTime()' and 'PyPAD.Update::padField()'. --- ChangeLog | 5 + apis/PyPAD/api/PyPAD.py | 12 +- apis/PyPAD/scripts/Makefile.am | 6 + apis/PyPAD/scripts/pypad_live365.exemplar | 97 ++++ apis/PyPAD/scripts/pypad_live365.py | 76 +++ apis/rlm/Makefile.am | 2 - apis/rlm/rlm_live365.c | 544 ---------------------- 7 files changed, 190 insertions(+), 552 deletions(-) create mode 100644 apis/PyPAD/scripts/pypad_live365.exemplar create mode 100755 apis/PyPAD/scripts/pypad_live365.py delete mode 100644 apis/rlm/rlm_live365.c diff --git a/ChangeLog b/ChangeLog index f009ef4f..7af27031 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18234,3 +18234,8 @@ 2018-12-18 Fred Gleason * Removed the source file for the 'rlm_urlwrite' RLM. * Removed the source file for the 'rlm_walltime' RLM. +2018-12-18 Fred Gleason + * Added a 'pypad_live365.py' PyPAD script. + * Removed the 'rlm_live365' RLM. + * Fixed typos in the docstrings for 'PyPAD.Update::startDateTime()' + and 'PyPAD.Update::padField()'. diff --git a/apis/PyPAD/api/PyPAD.py b/apis/PyPAD/api/PyPAD.py index d963d0d8..cd03af1c 100644 --- a/apis/PyPAD/api/PyPAD.py +++ b/apis/PyPAD/api/PyPAD.py @@ -410,8 +410,8 @@ class Update(object): Takes one argument: pad_type - The type of PAD value. Valid values are: - PyPAD.NOW - Now playing data - PyPAD.NEXT - Next to play data + PyPAD.TYPE_NOW - Now playing data + PyPAD.TYPE_NEXT - Next to play data """ try: return self.__fields['padUpdate'][pad_type]!=None @@ -425,8 +425,8 @@ class Update(object): Takes one argument: pad_type - The type of PAD value. Valid values are: - PyPAD.NOW - Now playing data - PyPAD.NEXT - Next to play data + PyPAD.TYPE_NOW - Now playing data + PyPAD.TYPE_NEXT - Next to play data """ try: return self.__fromIso8601(self.__fields['padUpdate'][pad_type]['startDateTime']) @@ -440,8 +440,8 @@ class Update(object): Takes two arguments: pad_type - The type of PAD value. Valid values are: - PyPAD.NOW - Now playing data - PyPAD.NEXT - Next to play data + PyPAD.TYPE_NOW - Now playing data + PyPAD.TYPE_NEXT - Next to play data pad_field - The specific field. Valid values are: PyPAD.FIELD_AGENCY - The 'Agency' field (string) diff --git a/apis/PyPAD/scripts/Makefile.am b/apis/PyPAD/scripts/Makefile.am index 13d6bd50..f1b623a9 100644 --- a/apis/PyPAD/scripts/Makefile.am +++ b/apis/PyPAD/scripts/Makefile.am @@ -24,6 +24,8 @@ install-exec-am: mkdir -p $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD ../../../helpers/install_python.sh pypad_filewrite.py $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_filewrite.py cp pypad_filewrite.exemplar $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_filewrite.exemplar + ../../../helpers/install_python.sh pypad_live365.py $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_live365.py + cp pypad_live365.exemplar $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_live365.exemplar ../../../helpers/install_python.sh pypad_udp.py $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_udp.py cp pypad_udp.exemplar $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_udp.exemplar ../../../helpers/install_python.sh pypad_urlwrite.py $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_urlwrite.py @@ -34,6 +36,8 @@ install-exec-am: uninstall-local: rm -f $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_filewrite.exemplar rm -f $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_filewrite.py + rm -f $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_live365.exemplar + rm -f $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_live365.py rm -f $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_udp.exemplar rm -f $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_udp.py rm -f $(DESTDIR)$(prefix)/@RD_LIB_PATH@/rivendell/PyPAD/pypad_urlwrite.exemplar @@ -43,6 +47,8 @@ uninstall-local: EXTRA_DIST = pypad_filewrite.exemplar\ pypad_filewrite.py\ + pypad_live365.exemplar\ + pypad_live365.py\ pypad_udp.exemplar\ pypad_udp.py\ pypad_urlwrite.exemplar\ diff --git a/apis/PyPAD/scripts/pypad_live365.exemplar b/apis/PyPAD/scripts/pypad_live365.exemplar new file mode 100644 index 00000000..fd62b1b4 --- /dev/null +++ b/apis/PyPAD/scripts/pypad_live365.exemplar @@ -0,0 +1,97 @@ +; This is the configuration for the 'pypad_live365.py' script for +; Rivendell, which can be used to update the metadata on a Live 365 channel +; using Now & Next data. + +; Section Header +; +; One section per Live365 station is configured, starting with +; 'Station1' and working up consecutively +[Station1] + + +; MemberName +; +; The member name of the Live365 station to which to send updates. +MemberName=my_station + + +; Password +; +; The password of the Live365 station to which to send updates. +Password=changeme + + +; Metadata String. The metadata fields to be sent each time RDAirPlay changes +; play state, including any wildcards as placeholders for metadata values. +; +; The list of available wildcards can be found in the 'metadata_wildcards.txt' +; file in the Rivendell documentation directory. +; +TitleString=%t +ArtistString=%a +AlbumString=%l + + +; Log Selection +; +; Set the status for each log to 'Yes', 'No' or 'Onair' to indicate whether +; state changes on that log should be output to this station. If set +; to 'Onair', then output will be generated only if RDAirPlays OnAir flag +; is active. +MasterLog=Yes +Aux1Log=Yes +Aux2Log=Yes +VLog101=No +VLog102=No +VLog103=No +VLog104=No +VLog105=No +VLog106=No +VLog107=No +VLog108=No +VLog109=No +VLog110=No +VLog111=No +VLog112=No +VLog113=No +VLog114=No +VLog115=No +VLog116=No +VLog117=No +VLog118=No +VLog119=No +VLog120=No + + +; Additional Live365 stations can be configured by adding new +; sections... +; +;[Station2] +;MemberName=your_station +;Password=changeme +;TitleString=%t +;ArtistString=%a +;AlbumString=%l +;MasterLog=No +;Aux1Log=Yes +;Aux2Log=No +;VLog101=No +;VLog102=No +;VLog103=No +;VLog104=No +;VLog105=No +;VLog106=No +;VLog107=No +;VLog108=No +;VLog109=No +;VLog110=No +;VLog111=No +;VLog112=No +;VLog113=No +;VLog114=No +;VLog115=No +;VLog116=No +;VLog117=No +;VLog118=No +;VLog119=No +;VLog120=No diff --git a/apis/PyPAD/scripts/pypad_live365.py b/apis/PyPAD/scripts/pypad_live365.py new file mode 100755 index 00000000..6995569e --- /dev/null +++ b/apis/PyPAD/scripts/pypad_live365.py @@ -0,0 +1,76 @@ +#!%PYTHON_BANGPATH% + +# pypad_live365.py +# +# Write PAD updates to Live365 stations +# +# (C) Copyright 2018 Fred Gleason +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# + +import sys +import syslog +import configparser +import pycurl +import PyPAD +from io import BytesIO + +def eprint(*args,**kwargs): + print(*args,file=sys.stderr,**kwargs) + +def ProcessPad(update): + n=1 + try: + while(True): + section='Station'+str(n) + if update.shouldBeProcessed(section) and update.hasPadType(PyPAD.TYPE_NOW): + member=update.escape(update.config().get(section,'MemberName'),PyPAD.ESCAPE_URL) + password=update.escape(update.config().get(section,'Password'),PyPAD.ESCAPE_URL) + title=update.resolvePadFields(update.config().get(section,'TitleString'),PyPAD.ESCAPE_URL) + artist=update.resolvePadFields(update.config().get(section,'ArtistString'),PyPAD.ESCAPE_URL) + album=update.resolvePadFields(update.config().get(section,'AlbumString'),PyPAD.ESCAPE_URL) + seconds=str(update.padField(PyPAD.TYPE_NOW,PyPAD.FIELD_LENGTH)//1000) + buf=BytesIO() + curl=pycurl.Curl() + url='http://www.live365.com/cgi-bin/add_song.cgi?member_name='+member+'&password='+password+'&version=2&filename=Rivendell&seconds='+seconds+'&title='+title+'&artist='+artist+'&album='+album + curl.setopt(curl.URL,url) + curl.setopt(curl.WRITEDATA,buf) + curl.setopt(curl.FOLLOWLOCATION,True) + try: + curl.perform() + code=curl.getinfo(pycurl.RESPONSE_CODE) + if (code<200) or (code>=300): + syslog.syslog(syslog.LOG_WARNING,'['+section+'] returned response code '+str(code)) + except pycurl.error: + syslog.syslog(syslog.LOG_WARNING,'['+section+'] failed: '+curl.errstr()) + curl.close() + n=n+1 + + except configparser.NoSectionError: + return + +# +# 'Main' function +# +syslog.openlog(sys.argv[0].split('/')[-1]) + +rcvr=PyPAD.Receiver() +try: + rcvr.setConfigFile(sys.argv[3]) +except IndexError: + eprint('pypad_live365.py: you must specify a configuration file') + sys.exit(1) +rcvr.setCallback(ProcessPad) +rcvr.start(sys.argv[1],int(sys.argv[2])) diff --git a/apis/rlm/Makefile.am b/apis/rlm/Makefile.am index 0f47f4aa..8fb6f7b9 100644 --- a/apis/rlm/Makefile.am +++ b/apis/rlm/Makefile.am @@ -25,7 +25,6 @@ RLM_MODULES=rlm_ando.rlm\ rlm_icecast2.rlm\ rlm_inno713.rlm\ rlm_liqcomp.rlm\ - rlm_live365.rlm\ rlm_padpoint.rlm\ rlm_serial.rlm\ rlm_shoutcast1.rlm\ @@ -59,7 +58,6 @@ EXTRA_DIST = Makefile-example\ rlm_icecast2.c\ rlm_inno713.c\ rlm_liqcomp.c\ - rlm_live365.c\ rlm_padpoint.c\ rlm_serial.c\ rlm_shoutcast1.c\ diff --git a/apis/rlm/rlm_live365.c b/apis/rlm/rlm_live365.c deleted file mode 100644 index 730674e9..00000000 --- a/apis/rlm/rlm_live365.c +++ /dev/null @@ -1,544 +0,0 @@ -/* rlm_live365.c - * - * (C) Copyright 2014-2018 Fred Gleason - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * This is a Rivendell Loadable Module. It uses Now&Next PAD data - * to update the metadata on an Icecast2 mountpoint specified in the - * configuration file pointed to by the plugin argument. - * - * This module requires the curl(1) network transfer tool, included with - * most Linux distros. It is also available at http://curl.haxx.se/. - * - * To compile this module, just do: - * - * gcc -shared -o rlm_live365.rlm rlm_live365.c - */ - -#include -#include -#include -#include -#include -#include - -#include - -int rlm_live365_devs; -char *rlm_live365_stations; -char *rlm_live365_passwords; -char *rlm_live365_titles; -char *rlm_live365_artists; -char *rlm_live365_albums; -int *rlm_live365_masters; -int *rlm_live365_aux1s; -int *rlm_live365_aux2s; -int *rlm_live365_vlog101s; -int *rlm_live365_vlog102s; -int *rlm_live365_vlog103s; -int *rlm_live365_vlog104s; -int *rlm_live365_vlog105s; -int *rlm_live365_vlog106s; -int *rlm_live365_vlog107s; -int *rlm_live365_vlog108s; -int *rlm_live365_vlog109s; -int *rlm_live365_vlog110s; -int *rlm_live365_vlog111s; -int *rlm_live365_vlog112s; -int *rlm_live365_vlog113s; -int *rlm_live365_vlog114s; -int *rlm_live365_vlog115s; -int *rlm_live365_vlog116s; -int *rlm_live365_vlog117s; -int *rlm_live365_vlog118s; -int *rlm_live365_vlog119s; -int *rlm_live365_vlog120s; - - -int rlm_live365_BufferDiff(char *sString,int dOrigin,int dDiff,int dMaxSize) -{ - int dOldSize,dNewSize; - int i; - - /* - * Will it fit? - */ - dOldSize=strlen(sString); - if((dOldSize+dDiff)>=dMaxSize) { - return -1; - } - dNewSize=dOldSize+dDiff; - - /* - * Adding characters - */ - if(dDiff>0) { - for(i=dOldSize;i>dOrigin;i--) { - sString[i+dDiff]=sString[i]; - } - return dNewSize; - } - - /* - * No Change - */ - if(dDiff==0) { - return dNewSize; - } - - /* - * Deleting Characters - */ - if(dDiff<0) { - for(i=dOrigin;i'9') && (sString[i]<'A')) || - ((sString[i]>'Z') && (sString[i]<'a')) || - (sString[i]>'z'))) { - if(rlm_live365_BufferDiff(sString,i,2,dMaxSize)<0) { - return -1; - } - sprintf(sAccum,"%%%2x",sString[i]); - sString[i++]=sAccum[0]; - sString[i++]=sAccum[1]; - sString[i]=sAccum[2]; - } - if(sString[i]==' ') { - sString[i]='+'; - } - i++; - if(i>=dMaxSize) { - return -1; - } - } - return strlen(sString); -} - - -int rlm_live365_GetLogStatus(void *ptr,const char *arg,const char *section, - const char *logname) -{ - const char *tag=RLMGetStringValue(ptr,arg,section,logname,""); - if(strcasecmp(tag,"yes")==0) { - return 1; - } - if(strcasecmp(tag,"on")==0) { - return 1; - } - if(strcasecmp(tag,"true")==0) { - return 1; - } - if(strcasecmp(tag,"no")==0) { - return 0; - } - if(strcasecmp(tag,"off")==0) { - return 0; - } - if(strcasecmp(tag,"false")==0) { - return 0; - } - if(strcasecmp(tag,"onair")==0) { - return 2; - } - return 0; -} - - -void rlm_live365_RLMStart(void *ptr,const char *arg) -{ - char password[256]; - char section[256]; - char errtext[256]; - int i=1; - - rlm_live365_devs=0; - rlm_live365_stations=NULL; - rlm_live365_passwords=NULL; - rlm_live365_titles=NULL; - rlm_live365_artists=NULL; - rlm_live365_albums=NULL; - rlm_live365_masters=NULL; - rlm_live365_aux1s=NULL; - rlm_live365_aux2s=NULL; - rlm_live365_vlog101s=NULL; - rlm_live365_vlog102s=NULL; - rlm_live365_vlog103s=NULL; - rlm_live365_vlog104s=NULL; - rlm_live365_vlog105s=NULL; - rlm_live365_vlog106s=NULL; - rlm_live365_vlog107s=NULL; - rlm_live365_vlog108s=NULL; - rlm_live365_vlog109s=NULL; - rlm_live365_vlog110s=NULL; - rlm_live365_vlog111s=NULL; - rlm_live365_vlog112s=NULL; - rlm_live365_vlog113s=NULL; - rlm_live365_vlog114s=NULL; - rlm_live365_vlog115s=NULL; - rlm_live365_vlog116s=NULL; - rlm_live365_vlog117s=NULL; - rlm_live365_vlog118s=NULL; - rlm_live365_vlog119s=NULL; - rlm_live365_vlog120s=NULL; - - sprintf(section,"Station%d",i++); - strncpy(password,RLMGetStringValue(ptr,arg,section,"Password",""),255); - password[255]=0; - if(strlen(password)==0) { - RLMLog(ptr,LOG_WARNING,"rlm_live365: no Live365 stations specified"); - return; - } - while(strlen(password)>0) { - rlm_live365_passwords=realloc(rlm_live365_passwords, - (rlm_live365_devs+1)*(rlm_live365_devs+1)*256); - strcpy(rlm_live365_passwords+256*rlm_live365_devs,password); - rlm_live365_stations=realloc(rlm_live365_stations,(rlm_live365_devs+1)*256); - strncpy(rlm_live365_stations+256*rlm_live365_devs, - RLMGetStringValue(ptr,arg,section,"MemberName",""),256); - - rlm_live365_titles=realloc(rlm_live365_titles,(rlm_live365_devs+1)*256); - strncpy(rlm_live365_titles+256*rlm_live365_devs, - RLMGetStringValue(ptr,arg,section,"TitleString",""),256); - - rlm_live365_artists=realloc(rlm_live365_artists,(rlm_live365_devs+1)*256); - strncpy(rlm_live365_artists+256*rlm_live365_devs, - RLMGetStringValue(ptr,arg,section,"ArtistString",""),256); - - rlm_live365_albums=realloc(rlm_live365_albums,(rlm_live365_devs+1)*256); - strncpy(rlm_live365_albums+256*rlm_live365_devs, - RLMGetStringValue(ptr,arg,section,"AlbumString",""),256); - - - rlm_live365_masters=realloc(rlm_live365_masters, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_masters[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"MasterLog"); - rlm_live365_aux1s=realloc(rlm_live365_aux1s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_aux1s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"Aux1Log"); - rlm_live365_aux2s=realloc(rlm_live365_aux2s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_aux2s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"Aux2Log"); - - rlm_live365_vlog101s=realloc(rlm_live365_vlog101s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog101s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog101"); - - rlm_live365_vlog102s=realloc(rlm_live365_vlog102s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog102s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog102"); - - rlm_live365_vlog103s=realloc(rlm_live365_vlog103s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog103s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog103"); - - rlm_live365_vlog104s=realloc(rlm_live365_vlog104s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog104s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog104"); - - rlm_live365_vlog105s=realloc(rlm_live365_vlog105s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog105s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog105"); - - rlm_live365_vlog106s=realloc(rlm_live365_vlog106s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog106s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog106"); - - rlm_live365_vlog107s=realloc(rlm_live365_vlog107s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog107s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog107"); - - rlm_live365_vlog108s=realloc(rlm_live365_vlog108s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog108s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog108"); - - rlm_live365_vlog109s=realloc(rlm_live365_vlog109s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog109s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog109"); - - rlm_live365_vlog110s=realloc(rlm_live365_vlog110s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog110s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog110"); - - rlm_live365_vlog111s=realloc(rlm_live365_vlog111s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog111s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog111"); - - rlm_live365_vlog112s=realloc(rlm_live365_vlog112s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog112s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog112"); - - rlm_live365_vlog113s=realloc(rlm_live365_vlog113s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog113s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog113"); - - rlm_live365_vlog114s=realloc(rlm_live365_vlog114s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog114s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog114"); - - rlm_live365_vlog115s=realloc(rlm_live365_vlog115s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog115s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog115"); - - rlm_live365_vlog116s=realloc(rlm_live365_vlog116s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog116s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog116"); - - rlm_live365_vlog117s=realloc(rlm_live365_vlog117s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog117s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog117"); - - rlm_live365_vlog118s=realloc(rlm_live365_vlog118s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog118s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog118"); - - rlm_live365_vlog119s=realloc(rlm_live365_vlog119s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog119s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog119"); - - rlm_live365_vlog120s=realloc(rlm_live365_vlog120s, - (rlm_live365_devs+1)*sizeof(int)); - rlm_live365_vlog120s[rlm_live365_devs]= - rlm_live365_GetLogStatus(ptr,arg,section,"VLog120"); - - sprintf(errtext,"rlm_live365: configured station \"%s\"", - rlm_live365_stations+256*rlm_live365_devs); - rlm_live365_devs++; - RLMLog(ptr,LOG_INFO,errtext); - sprintf(section,"Station%d",i++); - strncpy(password,RLMGetStringValue(ptr,arg,section,"Password",""),255); - password[255]=0; - } -} - - -void rlm_live365_RLMFree(void *ptr) -{ - free(rlm_live365_stations); - free(rlm_live365_passwords); - free(rlm_live365_titles); - free(rlm_live365_artists); - free(rlm_live365_albums); - free(rlm_live365_masters); - free(rlm_live365_aux1s); - free(rlm_live365_aux2s); - free(rlm_live365_vlog101s); - free(rlm_live365_vlog102s); - free(rlm_live365_vlog103s); - free(rlm_live365_vlog104s); - free(rlm_live365_vlog105s); - free(rlm_live365_vlog106s); - free(rlm_live365_vlog107s); - free(rlm_live365_vlog108s); - free(rlm_live365_vlog109s); - free(rlm_live365_vlog110s); - free(rlm_live365_vlog111s); - free(rlm_live365_vlog112s); - free(rlm_live365_vlog113s); - free(rlm_live365_vlog114s); - free(rlm_live365_vlog115s); - free(rlm_live365_vlog116s); - free(rlm_live365_vlog117s); - free(rlm_live365_vlog118s); - free(rlm_live365_vlog119s); - free(rlm_live365_vlog120s); -} - - -void rlm_live365_RLMPadDataSent(void *ptr,const struct rlm_svc *svc, - const struct rlm_log *log, - const struct rlm_pad *now, - const struct rlm_pad *next) -{ - int i; - int flag=0; - char station[1024]; - char password[1024]; - char title[1024]; - char artist[1024]; - char album[1024]; - char url[8192]; - char msg[1500]; - - for(i=0;ilog_mach) { - case 0: - flag=rlm_live365_masters[i]; - break; - - case 1: - flag=rlm_live365_aux1s[i]; - break; - - case 2: - flag=rlm_live365_aux2s[i]; - break; - - case 100: - flag=rlm_live365_vlog101s[i]; - break; - - case 101: - flag=rlm_live365_vlog102s[i]; - break; - - case 102: - flag=rlm_live365_vlog103s[i]; - break; - - case 103: - flag=rlm_live365_vlog104s[i]; - break; - - case 104: - flag=rlm_live365_vlog105s[i]; - break; - - case 105: - flag=rlm_live365_vlog106s[i]; - break; - - case 106: - flag=rlm_live365_vlog107s[i]; - break; - - case 107: - flag=rlm_live365_vlog108s[i]; - break; - - case 108: - flag=rlm_live365_vlog109s[i]; - break; - - case 109: - flag=rlm_live365_vlog110s[i]; - break; - - case 110: - flag=rlm_live365_vlog111s[i]; - break; - - case 111: - flag=rlm_live365_vlog112s[i]; - break; - - case 112: - flag=rlm_live365_vlog113s[i]; - break; - - case 113: - flag=rlm_live365_vlog114s[i]; - break; - - case 114: - flag=rlm_live365_vlog115s[i]; - break; - - case 115: - flag=rlm_live365_vlog116s[i]; - break; - - case 116: - flag=rlm_live365_vlog117s[i]; - break; - - case 117: - flag=rlm_live365_vlog118s[i]; - break; - - case 118: - flag=rlm_live365_vlog119s[i]; - break; - - case 119: - flag=rlm_live365_vlog120s[i]; - break; - } - if((flag==1)||((flag==2)&&(log->log_onair!=0))) { - strncpy(station,RLMResolveNowNext(ptr,now,next, - rlm_live365_stations+256*i),256); - rlm_live365_EncodeString(station,1023); - - strncpy(password,RLMResolveNowNext(ptr,now,next, - rlm_live365_passwords+256*i),256); - rlm_live365_EncodeString(title,1023); - - strncpy(title,RLMResolveNowNext(ptr,now,next, - rlm_live365_titles+256*i),256); - rlm_live365_EncodeString(title,1023); - strncpy(artist,RLMResolveNowNext(ptr,now,next, - rlm_live365_artists+256*i),256); - rlm_live365_EncodeString(artist,1023); - strncpy(album,RLMResolveNowNext(ptr,now,next, - rlm_live365_albums+256*i),256); - rlm_live365_EncodeString(album,1023); - snprintf(url,8192,"http://www.live365.com/cgi-bin/add_song.cgi?member_name=%s&password=%s&version=2&filename=Rivendell&seconds=%u&title=%s&artist=%s&album=%s", - station, - password, - now->rlm_len/1000, - title, - artist, - album); - if(strlen(now->rlm_title)!=0) { - if(fork()==0) { - execlp("curl","curl","-o","/dev/null","-s",url,(char *)NULL); - RLMLog(ptr,LOG_WARNING,"rlm_live365: unable to execute curl(1)"); - exit(0); - } - } - snprintf(msg,1500,"rlm_live365: sending pad update: \"%s\"", - (const char *)url); - RLMLog(ptr,LOG_INFO,msg); - } - } -}