免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3209 | 回复: 9
打印 上一主题 下一主题

请教一个问题,php如何读取mp3文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-03 15:20 |只看该作者 |倒序浏览
我想用php写一个程序来读取mp3文件信息,我在手册上只找到了读id3标签的函数,请问我想读出mp3的播放时间等等信息如何用php实现,那位朋友给点帮助,谢谢了!!!

论坛徽章:
0
2 [报告]
发表于 2006-03-03 15:25 |只看该作者
你破解mp3的文件格式吧。网上有很多c++源代码的,按字节读就可以了

论坛徽章:
0
3 [报告]
发表于 2006-03-03 19:18 |只看该作者
哦,多谢了,可惜偶不懂C++

论坛徽章:
0
4 [报告]
发表于 2006-03-03 23:45 |只看该作者
pear库里找MP3_ID类

论坛徽章:
0
5 [报告]
发表于 2006-03-04 00:32 |只看该作者
强呀

论坛徽章:
0
6 [报告]
发表于 2006-03-04 02:19 |只看该作者
也许 这个可以帮助你

http://www.google.com/custom?domains=www.phpclasses.org&q=mp3&sa=Search&sitesearch=www.phpclasses.org&client=pub-2951707118576741&forid=1&channel=5742870948&ie=ISO-8859-1&oe=ISO-8859-1&cof=GALT%3A%23663399%3BGL%3A1%3BDIV%3A%23222222%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3AA3C5CC%3BLBGC%3AA3C5CC%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BLH%3A50%3BLW%3A256%3BL%3Ahttp%3A%2F%2Ffiles.phpclasses.org%2Fgraphics%2Fgooglesearch.jpg%3BS%3Ahttp%3A%2F%2Fwww.phpclasses.org%2Fsearch.html%3BFORID%3A1%3B&hl=en

里面的类似乎都不错

论坛徽章:
0
7 [报告]
发表于 2006-03-04 02:21 |只看该作者
这个网址无限长

第一次发现原来google可以这样用

论坛徽章:
0
8 [报告]
发表于 2006-03-04 02:33 |只看该作者


  1. /***************** 附件mp3信息获取的函数******************************/
  2. // This function parse ID3 tag from MP3 file. It's quite fast.
  3. // syntax mp3_id(filename)
  4. // function will return -1 if file not exists or no frame cynch found at the beginning of file. i realized that some songs downloaded thru gnutella have about four lines of text info at the beginning. it seepms players can handle. so i will implement it later.
  5. // variable bitrates are not yet implemented, as they are quite slow to check. you can find them to read lot of first frames and check their bitrates. If theyre not the same, its variable bitrate. and also you then cannot compute real song lenght, unless you will scan the whole file for frames and compute its lenght... (at least what i read)
  6. // there is second version of ID3 tag which is tagged at the beginning of the file and its quite large. you can learnt more about at http://www.id3.org/. i dont finding this so interesting. there are too good things on new version: you can write more than 30 chars at field and the tag is on the beginning of file. there are so many fields in v2 that i found really unusefull in many case. while it seems that id3v2 will still write tag v1 at the end, i can see no reason why to implement it, cos it is really 'slow' to parse all these informations.

  7. // You can use 'genres' to determine what means the 'genreid' number. if you think you will not need it, delete it to. And also we need to specify all variables for mp3 header.

  8. // Corrected by Luca (18/06/01): luca@linuxmendoza.org.ar
  9. $genres = Array(
  10. 'Blues',
  11. 'Classic Rock',
  12. 'Country',
  13. 'Dance',
  14. 'Disco',
  15. 'Funk',
  16. 'Grunge',
  17. 'Hip-Hop',
  18. 'Jazz',
  19. 'Metal',
  20. 'New Age',
  21. 'Oldies',
  22. 'Other',
  23. 'Pop',
  24. 'R&B',
  25. 'Rap',
  26. 'Reggae',
  27. 'Rock',
  28. 'Techno',
  29. 'Industrial',
  30. 'Alternative',
  31. 'Ska',
  32. 'Death Metal',
  33. 'Pranks',
  34. 'Soundtrack',
  35. 'Euro-Techno',
  36. 'Ambient',
  37. 'Trip-Hop',
  38. 'Vocal',
  39. 'Jazz+Funk',
  40. 'Fusion',
  41. 'Trance',
  42. 'Classical',
  43. 'Instrumental',
  44. 'Acid',
  45. 'House',
  46. 'Game',
  47. 'Sound Clip',
  48. 'Gospel',
  49. 'Noise',
  50. 'AlternRock',
  51. 'Bass',
  52. 'Soul',
  53. 'Punk',
  54. 'Space',
  55. 'Meditative',
  56. 'Instrumental Pop',
  57. 'Instrumental Rock',
  58. 'Ethnic',
  59. 'Gothic',
  60. 'Darkwave',
  61. 'Techno-Industrial',
  62. 'Electronic',
  63. 'Pop-Folk',
  64. 'Eurodance',
  65. 'Dream',
  66. 'Southern Rock',
  67. 'Comedy',
  68. 'Cult',
  69. 'Gangsta',
  70. 'Top 40',
  71. 'Christian Rap',
  72. 'Pop/Funk',
  73. 'Jungle',
  74. 'Native American',
  75. 'Cabaret',
  76. 'New Wave',
  77. 'Psychadelic',
  78. 'Rave',
  79. 'Showtunes',
  80. 'Trailer',
  81. 'Lo-Fi',
  82. 'Tribal',
  83. 'Acid Punk',
  84. 'Acid Jazz',
  85. 'Polka',
  86. 'Retro',
  87. 'Musical',
  88. 'Rock & Roll',
  89. 'Hard Rock',
  90. 'Folk',
  91. 'Folk-Rock',
  92. 'National Folk',
  93. 'Swing',
  94. 'Fast Fusion',
  95. 'Bebob',
  96. 'Latin',
  97. 'Revival',
  98. 'Celtic',
  99. 'Bluegrass',
  100. 'Avantgarde',
  101. 'Gothic Rock',
  102. 'Progressive Rock',
  103. 'Psychedelic Rock',
  104. 'Symphonic Rock',
  105. 'Slow Rock',
  106. 'Big Band',
  107. 'Chorus',
  108. 'Easy Listening',
  109. 'Acoustic',
  110. 'Humour',
  111. 'Speech',
  112. 'Chanson',
  113. 'Opera',
  114. 'Chamber Music',
  115. 'Sonata',
  116. 'Symphony',
  117. 'Booty Bass',
  118. 'Primus',
  119. 'Porn Groove',
  120. 'Satire',
  121. 'Slow Jam',
  122. 'Club',
  123. 'Tango',
  124. 'Samba',
  125. 'Folklore',
  126. 'Ballad',
  127. 'Power Ballad',
  128. 'Rhythmic Soul',
  129. 'Freestyle',
  130. 'Duet',
  131. 'Punk Rock',
  132. 'Drum Solo',
  133. 'Acapella',
  134. 'Euro-House',
  135. 'Dance Hall'
  136. );

  137. $genreids = Array(
  138. "Blues" => 0,
  139. "Classic Rock" => 1,
  140. "Country" => 2,
  141. "Dance" => 3,
  142. "Disco" => 4,
  143. "Funk" => 5,
  144. "Grunge" => 6,
  145. "Hip-Hop" => 7,
  146. "Jazz" => 8,
  147. "Metal" => 9,
  148. "New Age" => 10,
  149. "Oldies" => 11,
  150. "Other" => 12,
  151. "Pop" => 13,
  152. "R&B" => 14,
  153. "Rap" => 15,
  154. "Reggae" => 16,
  155. "Rock" => 17,
  156. "Techno" => 18,
  157. "Industrial" => 19,
  158. "Alternative" => 20,
  159. "Ska" => 21,
  160. "Death Metal" => 22,
  161. "Pranks" => 23,
  162. "Soundtrack" => 24,
  163. "Euro-Techno" => 25,
  164. "Ambient" => 26,
  165. "Trip-Hop" => 27,
  166. "Vocal" => 28,
  167. "Jazz+Funk" => 29,
  168. "Fusion" => 30,
  169. "Trance" => 31,
  170. "Classical" => 32,
  171. "Instrumental" => 33,
  172. "Acid" => 34,
  173. "House" => 35,
  174. "Game" => 36,
  175. "Sound Clip" => 37,
  176. "Gospel" => 38,
  177. "Noise" => 39,
  178. "AlternRock" => 40,
  179. "Bass" => 41,
  180. "Soul" => 42,
  181. "Punk" => 43,
  182. "Space" => 44,
  183. "Meditative" => 45,
  184. "Instrumental Pop" => 46,
  185. "Instrumental Rock" => 47,
  186. "Ethnic" => 48,
  187. "Gothic" => 49,
  188. "Darkwave" => 50,
  189. "Techno-Industrial" => 51,
  190. "Electronic" => 52,
  191. "Pop-Folk" => 53,
  192. "Eurodance" => 54,
  193. "Dream" => 55,
  194. "Southern Rock" => 56,
  195. "Comedy" => 57,
  196. "Cult" => 58,
  197. "Gangsta" => 59,
  198. "Top 40" => 60,
  199. "Christian Rap" => 61,
  200. "Pop/Funk" => 62,
  201. "Jungle" => 63,
  202. "Native American" => 64,
  203. "Cabaret" => 65,
  204. "New Wave" => 66,
  205. "Psychadelic" => 67,
  206. "Rave" => 68,
  207. "Showtunes" => 69,
  208. "Trailer" => 70,
  209. "Lo-Fi" => 71,
  210. "Tribal" => 72,
  211. "Acid Punk" => 73,
  212. "Acid Jazz" => 74,
  213. "Polka" => 75,
  214. "Retro" => 76,
  215. "Musical" => 77,
  216. "Rock & Roll" => 78,
  217. "Hard Rock" => 79,
  218. "Folk" => 80,
  219. "Folk-Rock" => 81,
  220. "National Folk" => 82,
  221. "Swing" => 83,
  222. "Fast Fusion" => 84,
  223. "Bebob" => 85,
  224. "Latin" => 86,
  225. "Revival" => 87,
  226. "Celtic" => 88,
  227. "Bluegrass" => 89,
  228. "Avantgarde" => 90,
  229. "Gothic Rock" => 91,
  230. "Progressive Rock" => 92,
  231. "Psychedelic Rock" => 93,
  232. "Symphonic Rock" => 94,
  233. "Slow Rock" => 95,
  234. "Big Band" => 96,
  235. "Chorus" => 97,
  236. "Easy Listening" => 98,
  237. "Acoustic" => 99,
  238. "Humour" => 100,
  239. "Speech" => 101,
  240. "Chanson" => 102,
  241. "Opera" => 103,
  242. "Chamber Music" => 104,
  243. "Sonata" => 105,
  244. "Symphony" => 106,
  245. "Booty Bass" => 107,
  246. "Primus" => 108,
  247. "Porn Groove" => 109,
  248. "Satire" => 110,
  249. "Slow Jam" => 111,
  250. "Club" => 112,
  251. "Tango" => 113,
  252. "Samba" => 114,
  253. "Folklore" => 115,
  254. "Ballad" => 116,
  255. "Power Ballad" => 117,
  256. "Rhythmic Soul" => 118,
  257. "Freestyle" => 119,
  258. "Duet" => 120,
  259. "Punk Rock" => 121,
  260. "Drum Solo" => 122,
  261. "Acapella" => 123,
  262. "Euro-House" => 124,
  263. "Dance Hall" => 125
  264. );

  265. // end
  266. $version=Array("00"=>2.5, "10"=>2, "11"=>1);
  267. $layer  =Array("01"=>3, "10"=>2, "11"=>1);
  268. $crc=Array("Yes", "No");
  269. $bitrate["0001"]=Array(32,32,32,32,8,8);
  270. $bitrate["0010"]=Array(64,48,40,48,16,16);
  271. $bitrate["0011"]=Array(96,56,48,56,24,24);
  272. $bitrate["0100"]=Array(128,64,56,64,32,32);
  273. $bitrate["0101"]=Array(160,80,64,80,40,40);
  274. $bitrate["0110"]=Array(192,96,80,96,48,48);
  275. $bitrate["0111"]=Array(224,112,96,112,56,56);
  276. $bitrate["1000"]=Array(256,128,112,128,64,64);
  277. $bitrate["1001"]=Array(288,160,128,144,80,80);
  278. $bitrate["1010"]=Array(320,192,160,160,96,96);
  279. $bitrate["1011"]=Array(352,224,192,176,112,112);
  280. $bitrate["1100"]=Array(384,256,224,192,128,128);
  281. $bitrate["1101"]=Array(416,320,256,224,144,144);
  282. $bitrate["1110"]=Array(448,384,320,256,160,160);
  283. $bitindex=Array("1111"=>"0","1110"=>"1","1101"=>"2",
  284. "1011"=>"3","1010"=>"4","1001"=>"5","0011"=>"3","0010"=>4,"0001"=>"5");
  285. $freq["00"]=Array("11"=>44100,"10"=>22050,"00"=>11025);
  286. $freq["01"]=Array("11"=>48000,"10"=>24000,"00"=>12000);
  287. $freq["10"]=Array("11"=>32000,"10"=>16000,"00"=>8000);
  288. $mode=Array("00"=>"Stereo","01"=>"Joint stereo","10"=>"Dual channel","11"=>"Mono");
  289. $copy=Array("No","Yes");

  290. // New function by Luca (18/02/01): devel@lluca.com

  291. /* This function strip null chars from a string. For example:
  292.   * If you get a 30 chars string for the comment, but the comment name has 4 chars like "Moon",
  293.   * and it has a track number (ID3 1.1), you get "Moon<all_null_caracters><track#>",
  294.   * compleating the 30 chars, in hex:
  295.   * "4D6F6F6E0000000000000000000000000000000000000000000000000006" where just
  296.   *  ~~~~~~~~                                                  ==
  297.   *     \-------> this is useful data. <-----------------------/
  298.   * This function looks for the first null char, and cut the string
  299.   * so it converts this string to "4D6F6F6E" = "Moon". And then you can look if there is a track number.
  300.   * This function strips trailing spaces too.
  301.   */
  302. function strip_nulls( $str ) {
  303.    $res = explode( chr(0), $str );
  304.    return chop( $res[0] );
  305. }

  306. // end


  307. // here goes the function

  308. function mp3_id($file) {
  309.    global $version, $layer, $crc, $bitrate, $bitindex, $freq, $mode, $copy, $genres;
  310.    if(!$f=@fopen($file, "r")) { return -1; break; } else {

  311. // read first 4 bytes from file and determine if it is wave file if so, header begins five bytes after word 'data'

  312.      $tmp=fread($f,4);
  313.      if($tmp=="RIFF") {
  314.        $idtag["ftype"]="Wave";
  315.        fseek($f, 0);
  316.        $tmp=fread($f,128);
  317.        $x=StrPos($tmp, "data");
  318.        fseek($f, $x+8);
  319.        $tmp=fread($f,4);
  320.      }

  321. // now convert those four bytes to BIN. maybe it can be faster and easier. dunno how yet. help?

  322.      for($y=0;$y<4;$y++) {
  323.        $x=decbin(ord($tmp[$y]));
  324.        for($i=0;$i<(8-StrLen($x));$i++) {$x.="0";}
  325.        $bajt.=$x;
  326.      }

  327. // every mp3 framesynch begins with eleven ones, lets look for it. if not found continue looking for some 1024 bytes (you can search multiple for it or you can disable this, it will speed up and not many mp3 are like this. anyways its not standart)

  328. //     if(substr($bajt,1,11)!="11111111111") {
  329. //        return -1;
  330. //        break;
  331. //     }
  332.      if(substr($bajt,1,11)!="11111111111") {
  333.        fseek($f, 4);
  334.        $tmp=fread($f,2048);
  335.          for($i=0;$i<2048;$i++){
  336.            if(ord($tmp[$i])==255 && substr(decbin(ord($tmp[$i+1])),0,3)=="111") {
  337.               $tmp=substr($tmp, $i,4);
  338.               $bajt="";
  339.               for($y=0;$y<4;$y++) {
  340.                 $x=decbin(ord($tmp[$y]));
  341.                 for($i=0;$i<(8-StrLen($x));$i++) {$x.="0";}
  342.                 $bajt.=$x;
  343.               }
  344.               break;
  345.             }
  346.           }
  347.      }
  348.      if($bajt=="") {
  349.         return -1;
  350.         break;
  351.      }


  352. // now parse all the info from frame header

  353.      $len=filesize($file);
  354.      $idtag["version"]=$version[substr($bajt,11,2)];
  355.      $idtag["layer"]=$layer[substr($bajt,13,2)];
  356.      $idtag["crc"]=$crc[$bajt[15]];
  357.      $idtag["bitrate"]=$bitrate[substr($bajt,16,4)][$bitindex[substr($bajt,11,4)]];
  358.      $idtag["frequency"]=$freq[substr($bajt,20,2)][substr($bajt,11,2)];
  359.      $idtag["padding"]=$copy[$bajt[22]];
  360.      $idtag["mode"]=$mode[substr($bajt,24,2)];
  361.      $idtag["copyright"]=$copy[$bajt[28]];
  362.      $idtag["original"]=$copy[$bajt[29]];

  363. // lets count lenght of the song

  364.      if($idtag["layer"]==1) {
  365.        $fsize=(12*($idtag["bitrate"]*1000)/$idtag["frequency"]+$idtag["padding"])*4; }
  366.      else {
  367.        $fsize=144*(($idtag["bitrate"]*1000)/$idtag["frequency"]+$idtag["padding"]);}
  368.      // Modified by Luca (18/02/01): devel@lluca.com
  369.      $idtag["lenght_sec"] = @round($len/Round($fsize)/38.37);
  370.      // end
  371.      $idtag["lenght"] = (Round($fsize)) ? @date("i:s",round($len/Round($fsize)/38.37)) : 0;

  372. // now lets see at the end of the file for id3 tag. if exists then  parse it. if file doesnt have an id 3 tag if will return -1 in field 'tag' and if title is empty it returns file name.

  373.      if(!$len) $len=filesize($file);
  374.      fseek($f, $len-128);
  375.      $tag = fread($f, 128);
  376.      if(Substr($tag,0,3)=="TAG") {
  377.        $idtag["file"]=$file;
  378.        $idtag["tag"]=-1;
  379.        // Modified by Luca (18/02/01): devel@lluca.com
  380.        $idtag["title"]=strip_nulls( Substr($tag,3,30) );
  381.        $idtag["artist"]=strip_nulls( Substr($tag,33,30) );
  382.        $idtag["album"]=strip_nulls( Substr($tag,63,30) );
  383.        $idtag["year"]=strip_nulls( Substr($tag,93,4) );
  384.        $idtag["comment"]=strip_nulls( Substr($tag,97,30) );
  385.        // If the comment is less than 29 chars, we look for the presence of a track #
  386.        if ( strlen( $idtag["comment"] ) < 29 ) {
  387.          if ( Ord(Substr($tag,125,1)) == chr(0) ) // If char 125 is null then track (maybe) is present
  388.            $idtag["track"]=Ord(Substr($tag,126,1));
  389.          else // If not, we are sure is not present.
  390.            $idtag["track"]=0;
  391.        } else { // If the comment is 29 or 30 chars long, there's no way to put track #
  392.          $idtag["track"]=0;
  393.        }
  394.        // end
  395.        $idtag["genreid"]=Ord(Substr($tag,127,1));
  396.        $idtag["genre"]=$genres[$idtag["genreid"]];
  397.        $idtag["filesize"]=$len;
  398.      } else {
  399.        $idtag["tag"]=0;
  400.      }

  401. // close opened file and return results.

  402.    if(!$idtag["title"]) {
  403.      $idtag["title"]=Str_replace("\\","/", $file);
  404.      $idtag["title"]=substr($idtag["title"],strrpos($idtag["title"],"/")+1, 255);
  405.    }
  406.    fclose($f);
  407.    return $idtag;
  408.    }
  409. }


  410. //-------- Function ends HERE

  411. // New function by Luca (18/02/01): devel@lluca.com

  412. /* This function completes and crop a string to a specified lenght, with a specified string.
  413.   */
  414. function str_padtrunc( $str, $len, $with = " " ) {
  415.    $l = strlen( $str );
  416.    if ( $len < $l ) {
  417.      return substr( $str, 0, $len );
  418.    } elseif ( $len > $l ) {
  419.      $s = "";
  420.      for ( $i = 0; $i < ($len - $l); $i++) {
  421.        $s .= $with;
  422.      }
  423.      return $str . $s;
  424.    } else
  425.      return $str;
  426. }


  427. /* This function sets the ID3 TAG of a mp3 (or not?) file.
  428.   * The argument is an array with this structure (compatible with mp3_id):
  429.   *  ARRAY FIELD             DESCRIPTION      TYPE
  430.   *  $id3tag["title"] ...... Song Title ..... 30 chars
  431.   *  $id3tag["album"] ...... Album .......... 30 chars
  432.   *  $id3tag["artist"] ..... Artist ......... 30 chars
  433.   *  $id3tag["year"] ....... Year ........... 4 chars
  434.   *  $id3tag["comment"] .... Comment ........ 28 chars (ID3v1.1)
  435.   *  $id3tag["genreid"] .... Genre ID ....... 0 - 114 (1 char)
  436.   *  $id3tag["track"] ...... Track number ... 0 - 255 (1 char)
  437.   * If you use $genres array to get the genre, you can use $genreids array to get the id back.
  438.   * Just the present fields are modified, so if your array look like this:
  439.   *  $id3tag["year"] = "1999";
  440.   *  $id3tag["track"] = 4;
  441.   * Just the year and track info will be modified. If the track number is modified/added, the comment
  442.   * will be truncated to 28 chars.
  443.   * Returns True if the id3 tag it was successfuly updated, false if not.
  444.   */
  445. function set_id3( $file, $id3tag ) {
  446.    $id3 = mp3_id( $file );
  447.    if ( !is_array( $id3 ) ) // If I couldn't open the file
  448.      return false; // quit with error.
  449.    $fields = array( "title", "artist", "album", "year", "comment", "track", "genreid" );
  450.    // Checks if the ID is present, if not, create an empty one.
  451.    reset( $fields );
  452.    if ( !$id3["tag"] )
  453.      while ( $field = each( $fields ) )
  454.        $id3[$field["value"]] = "";
  455.    // Update the ID3 TAG info with the new one
  456.    reset( $fields );
  457.    while ( $field = each( $fields ) )
  458.      if ( isset( $id3tag[$field["value"]] ) )
  459.        $id3[$field["value"]] = $id3tag[$field["value"]];
  460.    // Make the TAG with this info.
  461.    $tag =  "TAG";
  462.    $tag .= str_padtrunc( $id3["title"], 30, chr(0) );
  463.    $tag .= str_padtrunc( $id3["artist"], 30, chr(0) );
  464.    $tag .= str_padtrunc( $id3["album"], 30, chr(0) );
  465.    $tag .= str_padtrunc( $id3["year"], 4, chr(0) );
  466.    $tag .= str_padtrunc( str_padtrunc( $id3["comment"], 28, chr(0) ), 29, chr(0) );
  467.    $tag .= chr( $id3["track"] );
  468.    $tag .= chr( $id3["genreid"] );
  469.    // Try to open the file with read/write perms...
  470.    if ( !$f = @fopen( $file, "r+" ) ) {
  471.      return false;
  472.    } else {
  473.      $len = filesize( $file );
  474.      if ( !$id3["tag"] ) // If TAG doesn't exist, put the pointer at the end of the file
  475.        fseek( $f, $len );
  476.      else                // If exists, put the pointer at the begining of the TAG.
  477.        fseek( $f, $len - 128 );
  478.      echo "\n";
  479.      // Saves the data
  480.      if ( fputs( $f, $tag, 128 ) != 128 ) { // If doesn't writes 128 bytes...
  481.        fclose( $f ); // Close File
  482.        return false; // Return with error
  483.      }
  484.    }
  485.    fclose( $f );
  486.    return true;
  487. }

  488. // end

复制代码

论坛徽章:
0
9 [报告]
发表于 2006-03-17 21:44 |只看该作者
getid3 有php 版的呀

论坛徽章:
0
10 [报告]
发表于 2006-03-18 11:07 |只看该作者
关注
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP