Linuxインターネットラジオオートメーション

こんにちは、「whoami」。



この投稿では、インターネットブロードキャストを自動化する方法の1つについて説明します。これは、最も信頼できる方法ではなく、最も予算がかかる方法です。 私はすぐに、このシステムがLinuxでの使用に向けられていることを警告しますが、おなじみの「大工道具」の助けを借りてWindowsでそれを実装することは可能です。 この記事は初心者のIT専門家を対象としています。そのため、私は多くの瞬間を「噛む」ことを試みました。 私がどうやってそれをしたのか、それはあなた次第です、私の親愛なる読者。



まえがき



そのため、まず自分に設定した目標について説明します。

1. 24時間365日、ノンストップで放送します(家の停電はカウントしません)。

2.スケジュールされた放送。 つまり、放送中の特定の期間に、特定のスタイル/ジャンルの歌が鳴ります。

3.マスター/ DJの「ホット」接続および切断のサポート。

4.サイトの要件:

4.a. 響きのある組成物の投票の控えめな実装、およびそれに応じて、TOP-20 / 30 /許容範囲の評価。

4.b. 現在のトラック、現在のスタイル/ジャンル、および必要に応じてリスナーの数に関する情報。



ここで、私の「隠し場所」(より正確には、パントリー)にあったものについて少し説明します。

-2003ホームコンピューター、AMD Athlon 1.8 GHz。これは長い間ホームサーバーとして動作していました(ところで、電力を節約するためにクロック周波数を1.1 GHzに下げました)。

-Gentoo Linuxオペレーティングシステム。

-グローバルネットワークへのアクセス〜10Mbit / s +専用IP;



Icecastサーバーのセットアップ



行きましょう。 プログラムのインストールについては説明しません。 ほとんどのディストリビューションでは、それらはリポジトリで利用可能であり、1つのチームによってインストール/組み立てられます。



Icecast 2.3.2は、ノンストップ-icesのソースクライアントとしてサーバーとして選択されました(バージョンを覚えていません)。



インストール後、次のようにIcecastを構成する必要があります。



ファイル/etc/icecast2/icecast.xml:

<icecast> <limits> <sources>2</sources> <burst-size>32768</burst-size> <threadpool>5</threadpool> </limits> <authentication> <admin-user>admin</admin-user> <admin-password>_</admin-password> </authentication> <directory> <yp-url-timeout>15</yp-url-timeout> <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url> </directory> <directory> <yp-url-timeout>15</yp-url-timeout> <yp-url>http://www.oddsock.org/cgi-bin/yp-cgi</yp-url> </directory> <hostname>_IP_</hostname> <listen-socket> <port>__</port> <!—  8000 --> </listen-socket> <fileserve>1</fileserve> <!--,    :   Icecast,    ,  ,     xml-    ,    --> <paths> <basedir>/usr/share/icecast</basedir> <logdir>/var/log/icecast</logdir> <webroot>/home/www/icecast</webroot> <adminroot>/home/www/icecast/admin</adminroot> <alias source="/" dest="/status.xsl"/> </paths> <logging> <accesslog>access.log</accesslog> <errorlog>error.log</errorlog> <loglevel>3</loglevel> </logging> <!--   -.       , ..      ices,     . --> <mount> <mount-name>/non-stop</mount-name> <password>_-</password> <max-listeners>___</max-listeners> <charset>cp1251</charset> <public>0</public> <stream-name>_</stream-name> <!-- , Habr.FM Non-Stop --> <stream-description>24/7 Non-stop music</stream-description> <stream-url>_</stream-url> <genre>Electronic</genre> <!-— --> <bitrate>128</bitrate> <type>audio/mpeg</type> <subtype>mp3</subtype> <!--   mp3,    . --> <hidden>0</hidden> </mount> <!--    mountpoint  ,        --> <mount> <mount-name>/live</mount-name> <password>__</password> <max-listeners>100</max-listeners> <!--     : ,        mountpoint /live,      ,   ( )   -.      ,        /live.     . --> <fallback-mount>/non-stop</fallback-mount> <fallback-override>1</fallback-override> <fallback-when-full>0</fallback-when-full> <charset>cp1251</charset> <public>1</public> <stream-name>_</stream-name> <stream-description>_</stream-description> <stream-url>_</stream-url> <genre>Electronic</genre> <!--   --> <bitrate>128</bitrate> <type>audio/mpeg</type> <subtype>mp3</subtype> <hidden>0</hidden> </mount> <security> <chroot>0</chroot> <changeowner> <user>icecast</user> <!-- ,      Icecast --> <group>nogroup</group> <!--   --> </changeowner> </security> </icecast>
      
      





氷の設定



氷を設定すると、物事が簡単になります



ファイル/etc/ices.conf:

 <ices:Configuration xmlns:ices="http://www.icecast.org/projects/ices"> <Playlist> <!--      (    ). --> <File>/home/PUBLIC/Music/playlist.m3u</File> <Randomize>0</Randomize> <!--   , ..    . --> <Type>builtin</Type> <Module>ices</Module> <Crossfade>1</Crossfade> <!--   ,   (.  <Reencode>) --> </Playlist> <Server> <Hostname>localhost</Hostname> <Port>_</Port> <Password>_</Password> <Protocol>http</Protocol> </Server> <Execution> <Background>1</Background> <Verbose>1</Verbose> <Base_Directory>/tmp</Base_Directory> </Execution> <Stream> <!--   <Server> (. ) --> <Server> <Hostname>localhost</Hostname> <Port>_</Port> <Password>_</Password> <Protocol>http</Protocol> </Server> <Mountpoint>/non-stop</Mountpoint> <!--       , ..    . --> <Name>_</Name> <Genre>Electronic</Genre> <!--  --> <Description>24/7 Non-stop music</Description> <URL>_</URL> <Bitrate>128</Bitrate> <Public>1</Public> <!--    . ices        ,      ,      . --> <Reencode>0</Reencode> <Samplerate>-1</Samplerate> <Channels>2</Channels> </Stream> </ices:Configuration>
      
      





そのため、Icecastサーバーは構成されており、既に開始できます(通常、/ etc / init.d / icecast start)。

Icesも設定されていますが、ノンストップのプレイリストがないため、起動するには早すぎます。

実際に、今すぐ修正します...



プレイリストを作成する



小さな紹介。 私はこのラジオ局を一人ではなく、私のコンピューターよりもはるかに多くの音楽を持っている友人と一緒に手に入れました。 以前は、コンピューターとサーバーの間で仮想プライベートネットワーク(VPN)が作成されていたため、ファイルを安全に交換できました。 すべてのトラックを、samba-ballで利用可能なサーバー上の別のディレクトリにノンストップで保存し、同僚がトラックをアップロード(または削除)できるようにすることにしました。



ディレクトリ構造は単純です:



ミュージック

-ジャンル1

---- File1.mp3

---- File2.mp3

---- ...

---- playlist.m3u

-ジャンル2

---- File1.mp3

---- File2.mp3

---- ...

---- playlist.m3u

...

playlist.m3u



つまり メインの音楽カタログには、さまざまなスタイルのいくつかのサブディレクトリがあります(ノンストップスケジュールについて話していたことを思い出してください)。 各サブディレクトリには、mp3ファイルと1つのプレイリストが含まれています。



それでは、すべてのスタイルのプレイリストを作成するための小さなBASHスクリプトから始めましょう。



Music_find.shファイル(スクリプトを簡素化してくれたdifferentlocalに感謝)

 #!/bin/bash #     MUSICDIR=/home/PUBLIC/Music cd $MUSICDIR for i in *; do cd $MUSICDIR/$i find `pwd` -name "*.mp3" > playlist.m3u done
      
      





注:電子音楽から遠く離れた人々のために、私はBreaks、Chill、Hardcoreは電子音楽の単なるスタイルであると説明します。



私の同僚はLinuxから遠く離れており、ディレクトリの内容を更新した後、SSHにログオンしてこのスクリプトを実行できないため、このミッションをGreat Cronusに委任することが決定されました。

 # crontab -e 10,40 * * * * /root/scripts/radio/music_find.sh
      
      





これで、30分ごとにスクリプトが実行され、プレイリストが更新されます。



ただし、まだ忘れていない場合は、ices configで「メイン」プレイリストが指定されていますが、このスクリプトでは作成されません。



ここで、スケジュールを覚えておく必要があります。 アイデアは簡単です。恥ずかしがり屋です。特定の時間(放送時間帯)に、目的のプレイリストを音楽のルートディレクトリ(私の場合は/ home / PUBLIC / Music)にコピーして置き換えます。 当初はスケジュールを完全にBASHに実装することを考えていましたが、良いKronが常に私たちを助け、すべての汚い仕事をする準備ができていたことを思い出しました。 したがって、スケジュールに従ってプレイリストへの変更を実装するスクリプトが発生しました。



しかし、まず余談...



アイスを構成したときに、ランダム化機能をオフにしたことを覚えていますか? なぜだろうか? 2つの理由があります。

1.神は、氷がどのようにランダム化を行うかを知っています。 私は(すみません)状況を可能な限り制御するのに慣れています。 したがって、あなたが望むようにランダム化を行うことは、魂がまだ落ち着くために良いです。

2.この記事を読んでいるなら、おそらく「jingle」という用語を知っているでしょう。 そのため、空気にジングルを挿入する場合(たとえば3トラックごと)、氷は無力です。 彼はそれが何であるか知らない。 これは、独自のランダム化プログラムを作成するもう1つの理由です。



もちろん、BASHは良いことですが、このタスクではC ++言語を選択しました。 以下は、以前に作成されたプレイリストファイル(名前がパラメーターとして渡される)の内容を単に読み取り、それを混合し、同じファイルに書き込むC ++プログラムのソースコードです。



ランダム化プログラムのソースコード:

 #include <iostream> #include <fstream> #include <cstdlib> #include <ctime> #include <string> #include <vector> using namespace std; int main(const int argc, const char *argv[]) { if (argc<2) { cout << "ERROR: no argument recieved." << endl; return 1; } vector<string> list; string line; ifstream infile(argv[1]); if (infile.fail()) return 1; cout << "Using file: " << argv[1] << endl; while (!infile.eof()) { getline(infile,line); list.push_back(line); } infile.close(); cout << "End of file reached." << endl; int n = list.size(); if (n>1) { cout << "Begin shuffle." << endl; srand(time(0)); string temp; for (int i=0; i<(n-1); i++) { int r = i + (rand() % (ni)); temp = list[i]; list[i] = list[r]; list[r] = temp; } cout << "Finished shuffle." << endl; ofstream outfile(argv[1]); for (int i=0; i<n; i++) outfile << list[i] << endl; outfile.close(); cout << "File succuessfully updated." << endl; return 0; } return 1; }
      
      





このプログラムでは、ジングル挿入を実装しませんでしたが、読者の皆さんがこのコードをニーズに合わせて簡単に微調整できるか、さらに良いことに、独自のコードを作成できることを心から願っています。



スケジュールの実施



余談は終わり、スケジュールに戻ります。



Playlist_updateファイル:

 #!/bin/bash MUSICDIR=/home/PUBLIC/Music cd $MUSICDIR cp -f $1/playlist.m3u playlist.m3u /root/scripts/radio/shuffle playlist.m3u >> /dev/null echo "$1" > /home/www/HabrFM.ru/genre_non-stop.txt if ps -A | grep ices then killall -HUP ices else /etc/init.d/ices start fi
      
      





最初に、スクリプトは目的のプレイリストファイルを置き換えてコピーを実行し、次にランダム化プログラムを起動して、現在のジャンルをテキストファイルに書き込みます(理由は後でわかります)

「プレイリストの再読み込み」アイスに信号を送信します。 以前にicesがシャットダウンした場合、スクリプトはそれを再度実行します。 現在のトラックの再生が終了したときにのみ、アイスが新しいプレイリストの再生を開始することを知っておくことが重要です。 したがって、スケジュールはあまりエレガントに見えませんが、友人のクロンに委ねることができます。



私のスタイルの例を挙げます:

 crontab -e 58 01 * * * /root/scripts/radio/playlist_update Breaks 58 03 * * * /root/scripts/radio/playlist_update Chill 58 09 * * * /root/scripts/radio/playlist_update Dance 58 14 * * * /root/scripts/radio/playlist_update House 58 17 * * * /root/scripts/radio/playlist_update Trance 58 21 * * * /root/scripts/radio/playlist_update Hardstyle 58 23 * * * /root/scripts/radio/playlist_update Hardcore
      
      





くそー! これで、予定されている放送の構築が完了しました。 DJがいないときは、スケジュールどおりにノンストップで演奏し、DJが現れると、リスナーは自動的に「ブロードキャスト」にリダイレクトされます。 ただし、覚えている場合、サイトに関する未実現のタスクがまだあります。



音楽データベース



そうそう、私は完全に忘れていました。 投票システムを実装するために、MySQLデータベースを使用しました。 友だちが一生懸命頑張ってください。



そのため、「ルート音楽ディレクトリ」にあるすべてのトラックに関する情報をデータベースに保存する必要があります。 データベースを作成する必要があり(私の例では、ラジオです)、次の構造を持つ2つのテーブルがあります。



歌の表

id INT(11)AUTO_INCREMENT PRIMARY_KEY

ジャンルVARCHAR(15)

タイトルVARCHAR(100)

ファイル名VARCHAR(200)

レートINT(11)



投票表

id INT(11)

ip VARCHAR(16)



悲しいことについて。 第1に、すべてのmp3ファイル(ライセンスされているものも含む)に正しいID3タグがあるわけではなく、ほとんどのファイルにはまったくありません。 次に、ファイルからID3タグを読み取るスクリプトが見つかりませんでした。 したがって、私はいくつかの犠牲を払わなければなりませんでした。 つまり、TagScannerプログラムを使用して、すべてのファイルのID3タグを手動で編集し、同じプログラムを使用して、既に有効なID3タグに従ってファイルの名前を変更します。 次のテンプレートを選択しました。



<カウンター>。 <アーティスト>-<作曲> .mp3



この記事では、このプログラムでの作業については説明しません。 UTF-8ではなくすべてのID3タグを保存することが基本的に重要であるとしか言えません 。 プログラム設定には、対応するオプションがあります。 さらに、すべての文字「&」を、たとえばandに置き換える必要があります。 プログラムを使用すると、すべてのファイルに対してこれをすぐに行うことができます。



OK、パターンに一致する正しいファイル名があり、データベースの構造が正しいと仮定します。 さらに、実際には別のスクリプトですが、既にPHPに含まれています(そのため、自由にインストールすることを忘れないでください)。



Db_update.phpファイル:

 #!/usr/bin/php <?php $MUSICDIR="/home/PUBLIC/Music"; $hostname = "localhost"; $username = "radio"; //     $password = "12345"; //   $dbName = "radio"; //   mysql_connect($hostname,$username,$password) OR die("Can't connect to database."); mysql_select_db($dbName) or die(mysql_error()); $Gen = array('Dance','House','Trance','Hardstyle','Hardcore','Chill','Breaks','Pumping'); $sql = "SELECT * FROM radio.songs"; $all = mysql_query($sql); $num_before = mysql_num_rows($all); echo "There are $num_before records in database.\n"; echo "\n"; echo "Searching for non-existing file names...\n"; $deleted = 0; while($row = mysql_fetch_array($all, MYSQL_ASSOC)) { $id = $row['id']; $db_filename = $row['Filename']; $exist = @fopen($db_filename,"r"); if (!$exist) { echo "Deleting: [$id] $db_filename\n"; $sql = "DELETE FROM radio.songs WHERE id=$id"; mysql_query($sql); $deleted++; } } if (!$deleted) { echo "Nothing deleted.\n"; } else { echo "Total deleted: $deleted records.\n"; } echo "\n"; $added = 0; echo "Searching for new tracks...\n"; for ($i=0;$i<count($Gen);$i++) { $genre=$Gen[$i]; $fp = fopen("$MUSICDIR/$genre/playlist.m3u","r"); while (!feof($fp)) { $filename = fgets($fp); if (strpos($filename,".mp3")) { $filename = substr($filename,0,strlen($filename)-1); $sql = sprintf("SELECT * FROM radio.songs WHERE Filename='%s'",mysql_real_escape_string($filename)); $res = mysql_query($sql); $num = mysql_num_rows($res); if ($num == 0) { $title = strstr($filename," "); $start = strpos($filename,". ")+2; $len = strpos($filename,".mp3") - $start; $title = substr($filename,$start,$len); $filename = substr($filename,0,strpos($filename,".mp3")+4); $sql = sprintf("INSERT INTO radio.songs ( `id`, `Genre`, `Title`, `Filename`, `Rate` ) VALUES ( NULL, '$genre', '%s', '%s', '0' )", mysql_real_escape_string($title),mysql_real_escape_string($filename)); mysql_query($sql) or die(mysql_error()); $added++; echo "Adding $filename\n"; } } } } if (!$added) { echo "Nothing added.\n"; } else { echo "Total added: $added records.\n"; } echo "\n"; $sql = "SELECT * FROM radio.songs"; $all = mysql_query($sql); $num_after = mysql_num_rows($all); if ($num_before == $num_after) { echo "There are still $num_after records in database.\n"; } else { echo "There are $num_after records in database.\n"; } mysql_close(); ?>
      
      





上記のスクリプトは、最初に対応するディレクトリになくなったトラックに関するデータベースからレコードを削除し、次に新しいトラックがあれば追加します。



プレイリストをコンパイルした直後にこのスクリプトを実行することは論理的であるため、music_find.shファイルに1行追加します(最初に、パスを独自のパスに置き換えます)。



 /root/scripts/radio/db_update.php
      
      





現在、プレイリストをコンパイルすると、データベース内の情報が自動的に更新されます。



2番目のテーブル(投票)からおやつを取ります。



放送情報収集



ここでは、特に詳細には触れません。 現在のトラックの名前、スタイル、リスナーの数をテキストファイルに書き込むphpスクリプトに注目してください。 これらのファイルは、私たちのサイトのルート、つまり 私の友人であるあなたがWebサーバーをインストールしていない場合は、急いでインストールしてください。



ファイルicecast_status.php:

 #!/usr/bin/php <?php $STATS_FILE = 'http://IP__:_/status.xsl'; $DOCROOT = '/var/www/HabrFM.ru'; //   $hostname = "localhost"; $username = "radio"; //     $password = "12345"; //   $dbName = "radio"; //   mysql_connect($hostname,$username,$password) OR die("Can't connect to database."); mysql_select_db($dbName) or die(mysql_error()); for($i=1;$i<13;$i++) { $fp = fopen($STATS_FILE,'r'); if(!$fp) { die("Unable to connect to Icecast server."); } $stats_file_contents = ''; while(!feof($fp)) { $stats_file_contents .= fread($fp,1024); } fclose($fp); $radio_info = array(); $radio_info['genre'] = ''; $radio_info['listeners'] = ''; $radio_info['now_playing'] = ''; $temp = array(); $search_for = "<td\s[^>]*class=\"streamdata\">(.*)<\/td>"; $search_td = array('<td class="streamdata">','</td>'); if(preg_match_all("/$search_for/siU",$stats_file_contents,$matches)) { foreach($matches[0] as $match) { $to_push = str_replace($search_td,'',$match); $to_push = trim($to_push); array_push($temp,$to_push); } } $radio_info['listeners'] = $temp[5]; $radio_info['now_playing'] = $temp[9]; if(strpos($stats_file_contents,'/live')) { $radio_info['genre'] = "DJ On-Air"; } else { $fp = fopen("$DOCROOT/genre_non-stop.txt","r"); $radio_info['genre'] = fgets($fp); fclose($fp); $radio_info['genre'] = substr($radio_info['genre'],0,strlen($radio_info['genre'])-1); } if ($radio_info['genre'] == "DJ On-Air"){ $rate = "1000+"; } else { $sql = sprintf("SELECT * FROM songs WHERE ( Genre='%s' AND Title='%s' )", mysql_real_escape_string($radio_info['genre']), mysql_real_escape_string($radio_info['now_playing'])); $res = mysql_query($sql) or die(); $row = mysql_fetch_array($res, MYSQL_ASSOC); $rate = $row['Rate']; $id = $row['id']; } $fp = fopen("$DOCROOT/now_playing.txt","w"); fputs($fp,$radio_info['now_playing']); fclose($fp); $fp = fopen("$DOCROOT/id.txt","w"); fputs($fp,$id); fclose($fp); $fp = fopen("$DOCROOT/listeners.txt","w"); if ($radio_info['listeners'] > 0) { fputs($fp,'<span style="color:green; font-weight: bold;">'.$radio_info['listeners'].'</span>'); } else { fputs($fp,'<span style="color:black; font-weight: bold;">'.$radio_info['listeners'].'</span>'); } fclose($fp); $fp = fopen("$DOCROOT/genre.txt","w"); fputs($fp,$radio_info['genre']); fclose($fp); $fp = fopen("$DOCROOT/rate.txt","w"); if ($rate > 0) { fputs($fp,'<span style="color:green; font-weight: bold;">+'.$rate.'</span>'); } if ($rate < 0) { fputs($fp,'<span style="color:red; font-weight: bold;">'.$rate.'</span>'); } if ($rate == 0) { fputs($fp,'<span style="color:black; font-weight: bold;">'.$rate.'</span>'); } fclose($fp); sleep(5); } ?>
      
      







このスクリプトは毎分実行する必要があり、5秒の遅延で12回実行されます。 この「バイク」は、友人のクロンが1分未満の時間単位の存在を暗示していないという事実によるものです。 そして、少なくとも5秒ごとにこの情報を更新する必要があります。



さて、このスクリプトを毎分実行するように(最後に)Cronに依頼してください。



 crontab -e */1 * * * * /root/scripts/radio/icecast_status.php
      
      





OK、今私たちのサイトのルートにはすでに5つの素晴らしいファイルがあります:

•now_playing.txt-現在のトラックのアーティストと名前。

•id.txt-現在のコンポジションのデータベース内の一意の番号。

•genre.txt-ノンストップで再生している場合はトラックのスタイル、DJが放送中の場合は「DJ On-Air」のライン。

•listeners.txt-リスナーの数(HTML形式を考慮:0より大きい場合は緑、ゼロの場合は緑-黒)。

•rate.txt-評価を追跡します(HTML形式も考慮に入れます)。



うわー、私たちは私たちが欲しかったもの(または私が欲しかったもの)をほとんど手に入れました。 投票を実施し、実際にサイトに必要な情報を表示することが残っています。



歌に投票する



投票を実装したいときに最初に考えたのは、1つのトラックの繰り返し投票をブロックする方法でしたか? クッキーは通常使用されますが、私はそれらを使用したことはなく(そうです、これも起こります)、IPアドレスでブロックすることにしました。 したがって、votesテーブルにはidとipの2つのフィールドしかありません。



ファイルvote.php(サイトのルートに配置する必要があります):

 <?php //, ,     $DOCROOT = '/var/www/HabrFM.ru'; $hostname = "localhost"; $username = "radio"; $password = "12345"; $dbName = "radio"; mysql_connect($hostname,$username,$password) OR die("Can't connect to database."); mysql_select_db($dbName) or die(mysql_error()); $fp = fopen("$DOCROOT/id.txt", "r"); $id = fgets($fp); fclose($fp); $sql = sprintf("SELECT * FROM votes WHERE ( id='%s' AND ip='%s' )", $id, mysql_real_escape_string($_SERVER['REMOTE_ADDR'])); $res = mysql_query($sql); $num = mysql_num_rows($res); if ($num == 0) { $type = $_GET['type']; if ($type == 'plus') { $sql = sprintf("UPDATE songs SET Rate=Rate+1 WHERE id='%s'", $id); } else { if ($type == 'minus') { $sql = sprintf("UPDATE songs SET Rate=Rate-1 WHERE id='%s'", $id); } else { die('Irregular argument.'); } } if (mysql_query($sql)) { $sql = sprintf("INSERT INTO votes (`id`, `ip`) VALUES ('%s', '%s')", $id, mysql_real_escape_string($_SERVER['REMOTE_ADDR'])); mysql_query($sql); echo '  .'; } else { echo ' .'; } } else { echo "     ."; } mysql_close(); ?>
      
      







このスクリプトは、1つのパラメーター-投票のタイプ(賛成または反対)を取ります。 したがって、呼び出し

 vote.php?type=plus
      
      





現在のトラックに1つの評価を追加します。

 vote.php?type=minus
      
      





1つの評価を奪います。



サイトの情報を表示する



だから、投票があります。 おそらく、サイトに必要なすべての情報を表示するために残っています。 特定のHTMLコードは提供しません。 すばらしいjQueryフレームワークの存在を突然忘れてしまった場合は、思い出させてください。



HTMLコードの適切な場所に、トラック名にid = 'now_playing'、ジャンルにid = 'genre'などの要素があるようにします。

次に、次の呼び出しに埋め込むと便利です(もちろん、jQueryライブラリをサイトディレクトリに追加して接続する必要があります)。

 <script> function show() { $.ajax({ url: "now_playing.txt", cache: false, success: function(html){ $("#now_playing").html(html); } }); $.ajax({ url: "genre.txt", cache: false, success: function(html){ $("#genre").html(html); } }); $.ajax({ url: "listeners.txt", cache: false, success: function(html){ $("#listeners").html(html); } }); $.ajax({ url: "rate.txt", cache: false, success: function(html){ $("#rate").html(html); } }); } $(document).ready(function(){ show(); setInterval('show()',5000); }); </script>
      
      







そして、5秒ごとにページの情報が更新されます(さらに、ページをリロードすることなく)。



記事の冒頭で、TOP20ランキングを発表したことを覚えていますか? はい、それは素晴らしいことです。



そのため、特定のスタイル/ジャンルのベスト(タイプ= 1)またはワースト(タイプ= 2)トラックのテーブルを次の形式で生成する最後のスクリプト:

| 構成| 評価|



ファイルtop20.php(ウェブサイトでツールを終了することをお勧めします):

 <?php $Gen = array('Dance','House','Trance','Hardstyle','Hardcore','Chill','Breaks','Pumping'); //    :) $hostname = "localhost"; $username = "radio"; $password = "12345"; $dbName = "radio"; mysql_connect($hostname,$username,$password) OR die("Can't connect to database."); mysql_select_db($dbName) or die(mysql_error()); $genre = $_GET["genre"]; $type = $_GET["type"]; echo "<br>\n"; if (!(in_array($genre,$Gen))) { die("Irregular argument."); } $sql = sprintf("SELECT Title, Rate FROM songs WHERE (Genre='%s'",mysql_real_escape_string($genre)); if ($type==1) { $sql = $sql . " AND Rate>0) ORDER BY Rate DESC LIMIT 20"; } else if ($type==2) { $sql = $sql . " AND Rate<0) ORDER BY Rate ASC LIMIT 20"; } else { die("Irregular argument"); } $res = mysql_query($sql); if (mysql_num_rows($res)>0) { echo '<table border="1" style="font-family: Verdana,Geneva; font-size: 10;" cellspacing="0" width="100%">'; echo "\n"; echo '<tr><td align="left">№</td><td align="left" width="100%"> - </td><td align="right"></td></tr>'; echo "\n"; } else { echo "   .     -       ."; } $i = 1; while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<tr>"; echo '<td align="left">' . $i . '.</td>'; echo '<td align="left">' . $row['Title'] . '</td>'; echo '<td align="right">' . $row['Rate'] . '</td>'; echo "</tr>\n"; $i++; } if (mysql_num_rows($res)>0) { echo '</table>'; } mysql_close(); ?>
      
      





以上です。 次に、このスクリプトをHTMLコードの適切な場所に埋め込む必要があります(同じjQueryはsetInterval( 'show()'、5000)なしでのみ使用できます。しかし、これは私の友人であるあなたに宿題として任せます。



私の話があなたにとって有用であるか、単に興味深いものになることを心から願っています。



All Articles