├── .gitignore ├── LICENSE ├── README.md ├── bin └── iptv.php ├── composer.json ├── composer.lock ├── data ├── china_mobile.php ├── cmvideo.php ├── epg.php └── ysp.php ├── dist ├── china_mobile.m3u ├── cmvideo.m3u ├── index.html ├── iptv.m3u └── ysp.m3u ├── iptv.m3u ├── runtime ├── .gitkeep ├── counter │ └── .gitignore └── history │ ├── .gitkeep │ ├── china_mobile.json │ ├── cmvideo.json │ └── ysp.json ├── src ├── AbstractDriver.php ├── AbstractTv.php ├── App.php ├── ChinaMobile │ ├── ChinaMobile.php │ └── Driver │ │ ├── BeijingDriver.php │ │ └── ChinaMobileDriver.php ├── Cmvideo │ ├── Cmvideo.php │ └── Driver │ │ ├── CdnDriver.php │ │ └── CmvideoDriver.php ├── Constant │ ├── ChinaMobileConstant.php │ ├── CmvideoConstant.php │ ├── EpgConstant.php │ ├── LogConstant.php │ ├── TvConstant.php │ └── YspConstant.php ├── Function.php ├── Http.php ├── Logger.php └── Ysp │ ├── Driver │ ├── Ajh102026Driver.php │ ├── Dyanj311Driver.php │ ├── Kkfong820033Driver.php │ ├── QwerttvvDriver.php │ ├── SasonDriver.php │ ├── YspDriver.php │ ├── YuechanDriver.php │ └── Zhxch3Driver.php │ └── Ysp.php ├── tests ├── ChinaMobileDriverTest.php ├── CmvideoDriverTest.php ├── CmvideoTvTest.php ├── HttpTest.php ├── InitTest.php ├── LoggerTest.php ├── YspDriverTest.php └── YspTvTest.php └── ysp.m3u /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /runtime/logs/ 3 | .phpunit.result.cache -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iptv 2 | iptv 国内视频源 3 | 4 | ## 视频源地址·推荐 (已内置 EPG)(国内 gitee) 5 | - 央视频 & cmvideo & 中国移动 6 | - 央视频 7 | - cmvideo 8 | - 中国移动 9 | 10 | ## EPG 地址 11 | > M3U 视频源已内置 EPG,此地址仅提供给不支持内置 EPG 源的 IPTV 客户端使用 12 | 13 | 14 | ## 央视频 URI 来源项目 15 | - [TV.Sason](http://tv.sason.xyz/) 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | 23 | ## 生成新的 m3u 文件 24 | ```code 25 | composer install 26 | php ./bin/iptv.php 27 | ``` -------------------------------------------------------------------------------- /bin/iptv.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | =5.5.0" 118 | }, 119 | "require-dev": { 120 | "phpunit/phpunit": "^4.0" 121 | }, 122 | "type": "library", 123 | "extra": { 124 | "branch-alias": { 125 | "dev-master": "1.4-dev" 126 | } 127 | }, 128 | "autoload": { 129 | "psr-4": { 130 | "GuzzleHttp\\Promise\\": "src/" 131 | }, 132 | "files": [ 133 | "src/functions_include.php" 134 | ] 135 | }, 136 | "notification-url": "https://packagist.org/downloads/", 137 | "license": [ 138 | "MIT" 139 | ], 140 | "authors": [ 141 | { 142 | "name": "Michael Dowling", 143 | "email": "mtdowling@gmail.com", 144 | "homepage": "https://github.com/mtdowling" 145 | } 146 | ], 147 | "description": "Guzzle promises library", 148 | "keywords": [ 149 | "promise" 150 | ], 151 | "time": "2016-12-20T10:07:11+00:00" 152 | }, 153 | { 154 | "name": "guzzlehttp/psr7", 155 | "version": "1.6.1", 156 | "source": { 157 | "type": "git", 158 | "url": "https://github.com/guzzle/psr7.git", 159 | "reference": "239400de7a173fe9901b9ac7c06497751f00727a" 160 | }, 161 | "dist": { 162 | "type": "zip", 163 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", 164 | "reference": "239400de7a173fe9901b9ac7c06497751f00727a", 165 | "shasum": "", 166 | "mirrors": [ 167 | { 168 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 169 | "preferred": true 170 | } 171 | ] 172 | }, 173 | "require": { 174 | "php": ">=5.4.0", 175 | "psr/http-message": "~1.0", 176 | "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" 177 | }, 178 | "provide": { 179 | "psr/http-message-implementation": "1.0" 180 | }, 181 | "require-dev": { 182 | "ext-zlib": "*", 183 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" 184 | }, 185 | "suggest": { 186 | "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" 187 | }, 188 | "type": "library", 189 | "extra": { 190 | "branch-alias": { 191 | "dev-master": "1.6-dev" 192 | } 193 | }, 194 | "autoload": { 195 | "psr-4": { 196 | "GuzzleHttp\\Psr7\\": "src/" 197 | }, 198 | "files": [ 199 | "src/functions_include.php" 200 | ] 201 | }, 202 | "notification-url": "https://packagist.org/downloads/", 203 | "license": [ 204 | "MIT" 205 | ], 206 | "authors": [ 207 | { 208 | "name": "Michael Dowling", 209 | "email": "mtdowling@gmail.com", 210 | "homepage": "https://github.com/mtdowling" 211 | }, 212 | { 213 | "name": "Tobias Schultze", 214 | "homepage": "https://github.com/Tobion" 215 | } 216 | ], 217 | "description": "PSR-7 message implementation that also provides common utility methods", 218 | "keywords": [ 219 | "http", 220 | "message", 221 | "psr-7", 222 | "request", 223 | "response", 224 | "stream", 225 | "uri", 226 | "url" 227 | ], 228 | "time": "2019-07-01T23:21:34+00:00" 229 | }, 230 | { 231 | "name": "monolog/monolog", 232 | "version": "2.1.1", 233 | "source": { 234 | "type": "git", 235 | "url": "https://github.com/Seldaek/monolog.git", 236 | "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5" 237 | }, 238 | "dist": { 239 | "type": "zip", 240 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f9eee5cec93dfb313a38b6b288741e84e53f02d5", 241 | "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5", 242 | "shasum": "", 243 | "mirrors": [ 244 | { 245 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 246 | "preferred": true 247 | } 248 | ] 249 | }, 250 | "require": { 251 | "php": ">=7.2", 252 | "psr/log": "^1.0.1" 253 | }, 254 | "provide": { 255 | "psr/log-implementation": "1.0.0" 256 | }, 257 | "require-dev": { 258 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 259 | "doctrine/couchdb": "~1.0@dev", 260 | "elasticsearch/elasticsearch": "^6.0", 261 | "graylog2/gelf-php": "^1.4.2", 262 | "php-amqplib/php-amqplib": "~2.4", 263 | "php-console/php-console": "^3.1.3", 264 | "php-parallel-lint/php-parallel-lint": "^1.0", 265 | "phpspec/prophecy": "^1.6.1", 266 | "phpunit/phpunit": "^8.5", 267 | "predis/predis": "^1.1", 268 | "rollbar/rollbar": "^1.3", 269 | "ruflin/elastica": ">=0.90 <3.0", 270 | "swiftmailer/swiftmailer": "^5.3|^6.0" 271 | }, 272 | "suggest": { 273 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 274 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 275 | "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", 276 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 277 | "ext-mbstring": "Allow to work properly with unicode symbols", 278 | "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", 279 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 280 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", 281 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 282 | "php-console/php-console": "Allow sending log messages to Google Chrome", 283 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 284 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server" 285 | }, 286 | "type": "library", 287 | "extra": { 288 | "branch-alias": { 289 | "dev-master": "2.x-dev" 290 | } 291 | }, 292 | "autoload": { 293 | "psr-4": { 294 | "Monolog\\": "src/Monolog" 295 | } 296 | }, 297 | "notification-url": "https://packagist.org/downloads/", 298 | "license": [ 299 | "MIT" 300 | ], 301 | "authors": [ 302 | { 303 | "name": "Jordi Boggiano", 304 | "email": "j.boggiano@seld.be", 305 | "homepage": "http://seld.be" 306 | } 307 | ], 308 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 309 | "homepage": "http://github.com/Seldaek/monolog", 310 | "keywords": [ 311 | "log", 312 | "logging", 313 | "psr-3" 314 | ], 315 | "time": "2020-07-23T08:41:23+00:00" 316 | }, 317 | { 318 | "name": "psr/http-client", 319 | "version": "1.0.1", 320 | "source": { 321 | "type": "git", 322 | "url": "https://github.com/php-fig/http-client.git", 323 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" 324 | }, 325 | "dist": { 326 | "type": "zip", 327 | "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 328 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 329 | "shasum": "", 330 | "mirrors": [ 331 | { 332 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 333 | "preferred": true 334 | } 335 | ] 336 | }, 337 | "require": { 338 | "php": "^7.0 || ^8.0", 339 | "psr/http-message": "^1.0" 340 | }, 341 | "type": "library", 342 | "extra": { 343 | "branch-alias": { 344 | "dev-master": "1.0.x-dev" 345 | } 346 | }, 347 | "autoload": { 348 | "psr-4": { 349 | "Psr\\Http\\Client\\": "src/" 350 | } 351 | }, 352 | "notification-url": "https://packagist.org/downloads/", 353 | "license": [ 354 | "MIT" 355 | ], 356 | "authors": [ 357 | { 358 | "name": "PHP-FIG", 359 | "homepage": "http://www.php-fig.org/" 360 | } 361 | ], 362 | "description": "Common interface for HTTP clients", 363 | "homepage": "https://github.com/php-fig/http-client", 364 | "keywords": [ 365 | "http", 366 | "http-client", 367 | "psr", 368 | "psr-18" 369 | ], 370 | "time": "2020-06-29T06:28:15+00:00" 371 | }, 372 | { 373 | "name": "psr/http-message", 374 | "version": "1.0.1", 375 | "source": { 376 | "type": "git", 377 | "url": "https://github.com/php-fig/http-message.git", 378 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 379 | }, 380 | "dist": { 381 | "type": "zip", 382 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 383 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 384 | "shasum": "", 385 | "mirrors": [ 386 | { 387 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 388 | "preferred": true 389 | } 390 | ] 391 | }, 392 | "require": { 393 | "php": ">=5.3.0" 394 | }, 395 | "type": "library", 396 | "extra": { 397 | "branch-alias": { 398 | "dev-master": "1.0.x-dev" 399 | } 400 | }, 401 | "autoload": { 402 | "psr-4": { 403 | "Psr\\Http\\Message\\": "src/" 404 | } 405 | }, 406 | "notification-url": "https://packagist.org/downloads/", 407 | "license": [ 408 | "MIT" 409 | ], 410 | "authors": [ 411 | { 412 | "name": "PHP-FIG", 413 | "homepage": "http://www.php-fig.org/" 414 | } 415 | ], 416 | "description": "Common interface for HTTP messages", 417 | "homepage": "https://github.com/php-fig/http-message", 418 | "keywords": [ 419 | "http", 420 | "http-message", 421 | "psr", 422 | "psr-7", 423 | "request", 424 | "response" 425 | ], 426 | "time": "2016-08-06T14:39:51+00:00" 427 | }, 428 | { 429 | "name": "psr/log", 430 | "version": "1.1.3", 431 | "source": { 432 | "type": "git", 433 | "url": "https://github.com/php-fig/log.git", 434 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" 435 | }, 436 | "dist": { 437 | "type": "zip", 438 | "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", 439 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", 440 | "shasum": "", 441 | "mirrors": [ 442 | { 443 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 444 | "preferred": true 445 | } 446 | ] 447 | }, 448 | "require": { 449 | "php": ">=5.3.0" 450 | }, 451 | "type": "library", 452 | "extra": { 453 | "branch-alias": { 454 | "dev-master": "1.1.x-dev" 455 | } 456 | }, 457 | "autoload": { 458 | "psr-4": { 459 | "Psr\\Log\\": "Psr/Log/" 460 | } 461 | }, 462 | "notification-url": "https://packagist.org/downloads/", 463 | "license": [ 464 | "MIT" 465 | ], 466 | "authors": [ 467 | { 468 | "name": "PHP-FIG", 469 | "homepage": "http://www.php-fig.org/" 470 | } 471 | ], 472 | "description": "Common interface for logging libraries", 473 | "homepage": "https://github.com/php-fig/log", 474 | "keywords": [ 475 | "log", 476 | "psr", 477 | "psr-3" 478 | ], 479 | "time": "2020-03-23T09:12:05+00:00" 480 | }, 481 | { 482 | "name": "ralouphie/getallheaders", 483 | "version": "3.0.3", 484 | "source": { 485 | "type": "git", 486 | "url": "https://github.com/ralouphie/getallheaders.git", 487 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 488 | }, 489 | "dist": { 490 | "type": "zip", 491 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 492 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 493 | "shasum": "", 494 | "mirrors": [ 495 | { 496 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 497 | "preferred": true 498 | } 499 | ] 500 | }, 501 | "require": { 502 | "php": ">=5.6" 503 | }, 504 | "require-dev": { 505 | "php-coveralls/php-coveralls": "^2.1", 506 | "phpunit/phpunit": "^5 || ^6.5" 507 | }, 508 | "type": "library", 509 | "autoload": { 510 | "files": [ 511 | "src/getallheaders.php" 512 | ] 513 | }, 514 | "notification-url": "https://packagist.org/downloads/", 515 | "license": [ 516 | "MIT" 517 | ], 518 | "authors": [ 519 | { 520 | "name": "Ralph Khattar", 521 | "email": "ralph.khattar@gmail.com" 522 | } 523 | ], 524 | "description": "A polyfill for getallheaders.", 525 | "time": "2019-03-08T08:55:37+00:00" 526 | } 527 | ], 528 | "packages-dev": [ 529 | { 530 | "name": "doctrine/instantiator", 531 | "version": "1.3.1", 532 | "source": { 533 | "type": "git", 534 | "url": "https://github.com/doctrine/instantiator.git", 535 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" 536 | }, 537 | "dist": { 538 | "type": "zip", 539 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", 540 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", 541 | "shasum": "", 542 | "mirrors": [ 543 | { 544 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 545 | "preferred": true 546 | } 547 | ] 548 | }, 549 | "require": { 550 | "php": "^7.1 || ^8.0" 551 | }, 552 | "require-dev": { 553 | "doctrine/coding-standard": "^6.0", 554 | "ext-pdo": "*", 555 | "ext-phar": "*", 556 | "phpbench/phpbench": "^0.13", 557 | "phpstan/phpstan-phpunit": "^0.11", 558 | "phpstan/phpstan-shim": "^0.11", 559 | "phpunit/phpunit": "^7.0" 560 | }, 561 | "type": "library", 562 | "extra": { 563 | "branch-alias": { 564 | "dev-master": "1.2.x-dev" 565 | } 566 | }, 567 | "autoload": { 568 | "psr-4": { 569 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 570 | } 571 | }, 572 | "notification-url": "https://packagist.org/downloads/", 573 | "license": [ 574 | "MIT" 575 | ], 576 | "authors": [ 577 | { 578 | "name": "Marco Pivetta", 579 | "email": "ocramius@gmail.com", 580 | "homepage": "http://ocramius.github.com/" 581 | } 582 | ], 583 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 584 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 585 | "keywords": [ 586 | "constructor", 587 | "instantiate" 588 | ], 589 | "time": "2020-05-29T17:27:14+00:00" 590 | }, 591 | { 592 | "name": "myclabs/deep-copy", 593 | "version": "1.10.1", 594 | "source": { 595 | "type": "git", 596 | "url": "https://github.com/myclabs/DeepCopy.git", 597 | "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" 598 | }, 599 | "dist": { 600 | "type": "zip", 601 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", 602 | "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", 603 | "shasum": "", 604 | "mirrors": [ 605 | { 606 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 607 | "preferred": true 608 | } 609 | ] 610 | }, 611 | "require": { 612 | "php": "^7.1 || ^8.0" 613 | }, 614 | "replace": { 615 | "myclabs/deep-copy": "self.version" 616 | }, 617 | "require-dev": { 618 | "doctrine/collections": "^1.0", 619 | "doctrine/common": "^2.6", 620 | "phpunit/phpunit": "^7.1" 621 | }, 622 | "type": "library", 623 | "autoload": { 624 | "psr-4": { 625 | "DeepCopy\\": "src/DeepCopy/" 626 | }, 627 | "files": [ 628 | "src/DeepCopy/deep_copy.php" 629 | ] 630 | }, 631 | "notification-url": "https://packagist.org/downloads/", 632 | "license": [ 633 | "MIT" 634 | ], 635 | "description": "Create deep copies (clones) of your objects", 636 | "keywords": [ 637 | "clone", 638 | "copy", 639 | "duplicate", 640 | "object", 641 | "object graph" 642 | ], 643 | "time": "2020-06-29T13:22:24+00:00" 644 | }, 645 | { 646 | "name": "phar-io/manifest", 647 | "version": "1.0.3", 648 | "source": { 649 | "type": "git", 650 | "url": "https://github.com/phar-io/manifest.git", 651 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 652 | }, 653 | "dist": { 654 | "type": "zip", 655 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 656 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 657 | "shasum": "", 658 | "mirrors": [ 659 | { 660 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 661 | "preferred": true 662 | } 663 | ] 664 | }, 665 | "require": { 666 | "ext-dom": "*", 667 | "ext-phar": "*", 668 | "phar-io/version": "^2.0", 669 | "php": "^5.6 || ^7.0" 670 | }, 671 | "type": "library", 672 | "extra": { 673 | "branch-alias": { 674 | "dev-master": "1.0.x-dev" 675 | } 676 | }, 677 | "autoload": { 678 | "classmap": [ 679 | "src/" 680 | ] 681 | }, 682 | "notification-url": "https://packagist.org/downloads/", 683 | "license": [ 684 | "BSD-3-Clause" 685 | ], 686 | "authors": [ 687 | { 688 | "name": "Arne Blankerts", 689 | "email": "arne@blankerts.de", 690 | "role": "Developer" 691 | }, 692 | { 693 | "name": "Sebastian Heuer", 694 | "email": "sebastian@phpeople.de", 695 | "role": "Developer" 696 | }, 697 | { 698 | "name": "Sebastian Bergmann", 699 | "email": "sebastian@phpunit.de", 700 | "role": "Developer" 701 | } 702 | ], 703 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 704 | "time": "2018-07-08T19:23:20+00:00" 705 | }, 706 | { 707 | "name": "phar-io/version", 708 | "version": "2.0.1", 709 | "source": { 710 | "type": "git", 711 | "url": "https://github.com/phar-io/version.git", 712 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 713 | }, 714 | "dist": { 715 | "type": "zip", 716 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 717 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 718 | "shasum": "", 719 | "mirrors": [ 720 | { 721 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 722 | "preferred": true 723 | } 724 | ] 725 | }, 726 | "require": { 727 | "php": "^5.6 || ^7.0" 728 | }, 729 | "type": "library", 730 | "autoload": { 731 | "classmap": [ 732 | "src/" 733 | ] 734 | }, 735 | "notification-url": "https://packagist.org/downloads/", 736 | "license": [ 737 | "BSD-3-Clause" 738 | ], 739 | "authors": [ 740 | { 741 | "name": "Arne Blankerts", 742 | "email": "arne@blankerts.de", 743 | "role": "Developer" 744 | }, 745 | { 746 | "name": "Sebastian Heuer", 747 | "email": "sebastian@phpeople.de", 748 | "role": "Developer" 749 | }, 750 | { 751 | "name": "Sebastian Bergmann", 752 | "email": "sebastian@phpunit.de", 753 | "role": "Developer" 754 | } 755 | ], 756 | "description": "Library for handling version information and constraints", 757 | "time": "2018-07-08T19:19:57+00:00" 758 | }, 759 | { 760 | "name": "phpdocumentor/reflection-common", 761 | "version": "2.2.0", 762 | "source": { 763 | "type": "git", 764 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 765 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 766 | }, 767 | "dist": { 768 | "type": "zip", 769 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 770 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 771 | "shasum": "", 772 | "mirrors": [ 773 | { 774 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 775 | "preferred": true 776 | } 777 | ] 778 | }, 779 | "require": { 780 | "php": "^7.2 || ^8.0" 781 | }, 782 | "type": "library", 783 | "extra": { 784 | "branch-alias": { 785 | "dev-2.x": "2.x-dev" 786 | } 787 | }, 788 | "autoload": { 789 | "psr-4": { 790 | "phpDocumentor\\Reflection\\": "src/" 791 | } 792 | }, 793 | "notification-url": "https://packagist.org/downloads/", 794 | "license": [ 795 | "MIT" 796 | ], 797 | "authors": [ 798 | { 799 | "name": "Jaap van Otterdijk", 800 | "email": "opensource@ijaap.nl" 801 | } 802 | ], 803 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 804 | "homepage": "http://www.phpdoc.org", 805 | "keywords": [ 806 | "FQSEN", 807 | "phpDocumentor", 808 | "phpdoc", 809 | "reflection", 810 | "static analysis" 811 | ], 812 | "time": "2020-06-27T09:03:43+00:00" 813 | }, 814 | { 815 | "name": "phpdocumentor/reflection-docblock", 816 | "version": "5.2.0", 817 | "source": { 818 | "type": "git", 819 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 820 | "reference": "3170448f5769fe19f456173d833734e0ff1b84df" 821 | }, 822 | "dist": { 823 | "type": "zip", 824 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/3170448f5769fe19f456173d833734e0ff1b84df", 825 | "reference": "3170448f5769fe19f456173d833734e0ff1b84df", 826 | "shasum": "", 827 | "mirrors": [ 828 | { 829 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 830 | "preferred": true 831 | } 832 | ] 833 | }, 834 | "require": { 835 | "ext-filter": "*", 836 | "php": "^7.2 || ^8.0", 837 | "phpdocumentor/reflection-common": "^2.2", 838 | "phpdocumentor/type-resolver": "^1.3", 839 | "webmozart/assert": "^1.9.1" 840 | }, 841 | "require-dev": { 842 | "mockery/mockery": "~1.3.2" 843 | }, 844 | "type": "library", 845 | "extra": { 846 | "branch-alias": { 847 | "dev-master": "5.x-dev" 848 | } 849 | }, 850 | "autoload": { 851 | "psr-4": { 852 | "phpDocumentor\\Reflection\\": "src" 853 | } 854 | }, 855 | "notification-url": "https://packagist.org/downloads/", 856 | "license": [ 857 | "MIT" 858 | ], 859 | "authors": [ 860 | { 861 | "name": "Mike van Riel", 862 | "email": "me@mikevanriel.com" 863 | }, 864 | { 865 | "name": "Jaap van Otterdijk", 866 | "email": "account@ijaap.nl" 867 | } 868 | ], 869 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 870 | "time": "2020-07-20T20:05:34+00:00" 871 | }, 872 | { 873 | "name": "phpdocumentor/type-resolver", 874 | "version": "1.3.0", 875 | "source": { 876 | "type": "git", 877 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 878 | "reference": "e878a14a65245fbe78f8080eba03b47c3b705651" 879 | }, 880 | "dist": { 881 | "type": "zip", 882 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651", 883 | "reference": "e878a14a65245fbe78f8080eba03b47c3b705651", 884 | "shasum": "", 885 | "mirrors": [ 886 | { 887 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 888 | "preferred": true 889 | } 890 | ] 891 | }, 892 | "require": { 893 | "php": "^7.2 || ^8.0", 894 | "phpdocumentor/reflection-common": "^2.0" 895 | }, 896 | "require-dev": { 897 | "ext-tokenizer": "*" 898 | }, 899 | "type": "library", 900 | "extra": { 901 | "branch-alias": { 902 | "dev-1.x": "1.x-dev" 903 | } 904 | }, 905 | "autoload": { 906 | "psr-4": { 907 | "phpDocumentor\\Reflection\\": "src" 908 | } 909 | }, 910 | "notification-url": "https://packagist.org/downloads/", 911 | "license": [ 912 | "MIT" 913 | ], 914 | "authors": [ 915 | { 916 | "name": "Mike van Riel", 917 | "email": "me@mikevanriel.com" 918 | } 919 | ], 920 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 921 | "time": "2020-06-27T10:12:23+00:00" 922 | }, 923 | { 924 | "name": "phpspec/prophecy", 925 | "version": "1.11.1", 926 | "source": { 927 | "type": "git", 928 | "url": "https://github.com/phpspec/prophecy.git", 929 | "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160" 930 | }, 931 | "dist": { 932 | "type": "zip", 933 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160", 934 | "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160", 935 | "shasum": "", 936 | "mirrors": [ 937 | { 938 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 939 | "preferred": true 940 | } 941 | ] 942 | }, 943 | "require": { 944 | "doctrine/instantiator": "^1.2", 945 | "php": "^7.2", 946 | "phpdocumentor/reflection-docblock": "^5.0", 947 | "sebastian/comparator": "^3.0 || ^4.0", 948 | "sebastian/recursion-context": "^3.0 || ^4.0" 949 | }, 950 | "require-dev": { 951 | "phpspec/phpspec": "^6.0", 952 | "phpunit/phpunit": "^8.0" 953 | }, 954 | "type": "library", 955 | "extra": { 956 | "branch-alias": { 957 | "dev-master": "1.11.x-dev" 958 | } 959 | }, 960 | "autoload": { 961 | "psr-4": { 962 | "Prophecy\\": "src/Prophecy" 963 | } 964 | }, 965 | "notification-url": "https://packagist.org/downloads/", 966 | "license": [ 967 | "MIT" 968 | ], 969 | "authors": [ 970 | { 971 | "name": "Konstantin Kudryashov", 972 | "email": "ever.zet@gmail.com", 973 | "homepage": "http://everzet.com" 974 | }, 975 | { 976 | "name": "Marcello Duarte", 977 | "email": "marcello.duarte@gmail.com" 978 | } 979 | ], 980 | "description": "Highly opinionated mocking framework for PHP 5.3+", 981 | "homepage": "https://github.com/phpspec/prophecy", 982 | "keywords": [ 983 | "Double", 984 | "Dummy", 985 | "fake", 986 | "mock", 987 | "spy", 988 | "stub" 989 | ], 990 | "time": "2020-07-08T12:44:21+00:00" 991 | }, 992 | { 993 | "name": "phpunit/php-code-coverage", 994 | "version": "7.0.10", 995 | "source": { 996 | "type": "git", 997 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 998 | "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" 999 | }, 1000 | "dist": { 1001 | "type": "zip", 1002 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", 1003 | "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", 1004 | "shasum": "", 1005 | "mirrors": [ 1006 | { 1007 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1008 | "preferred": true 1009 | } 1010 | ] 1011 | }, 1012 | "require": { 1013 | "ext-dom": "*", 1014 | "ext-xmlwriter": "*", 1015 | "php": "^7.2", 1016 | "phpunit/php-file-iterator": "^2.0.2", 1017 | "phpunit/php-text-template": "^1.2.1", 1018 | "phpunit/php-token-stream": "^3.1.1", 1019 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 1020 | "sebastian/environment": "^4.2.2", 1021 | "sebastian/version": "^2.0.1", 1022 | "theseer/tokenizer": "^1.1.3" 1023 | }, 1024 | "require-dev": { 1025 | "phpunit/phpunit": "^8.2.2" 1026 | }, 1027 | "suggest": { 1028 | "ext-xdebug": "^2.7.2" 1029 | }, 1030 | "type": "library", 1031 | "extra": { 1032 | "branch-alias": { 1033 | "dev-master": "7.0-dev" 1034 | } 1035 | }, 1036 | "autoload": { 1037 | "classmap": [ 1038 | "src/" 1039 | ] 1040 | }, 1041 | "notification-url": "https://packagist.org/downloads/", 1042 | "license": [ 1043 | "BSD-3-Clause" 1044 | ], 1045 | "authors": [ 1046 | { 1047 | "name": "Sebastian Bergmann", 1048 | "email": "sebastian@phpunit.de", 1049 | "role": "lead" 1050 | } 1051 | ], 1052 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1053 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1054 | "keywords": [ 1055 | "coverage", 1056 | "testing", 1057 | "xunit" 1058 | ], 1059 | "time": "2019-11-20T13:55:58+00:00" 1060 | }, 1061 | { 1062 | "name": "phpunit/php-file-iterator", 1063 | "version": "2.0.2", 1064 | "source": { 1065 | "type": "git", 1066 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1067 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 1068 | }, 1069 | "dist": { 1070 | "type": "zip", 1071 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 1072 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 1073 | "shasum": "", 1074 | "mirrors": [ 1075 | { 1076 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1077 | "preferred": true 1078 | } 1079 | ] 1080 | }, 1081 | "require": { 1082 | "php": "^7.1" 1083 | }, 1084 | "require-dev": { 1085 | "phpunit/phpunit": "^7.1" 1086 | }, 1087 | "type": "library", 1088 | "extra": { 1089 | "branch-alias": { 1090 | "dev-master": "2.0.x-dev" 1091 | } 1092 | }, 1093 | "autoload": { 1094 | "classmap": [ 1095 | "src/" 1096 | ] 1097 | }, 1098 | "notification-url": "https://packagist.org/downloads/", 1099 | "license": [ 1100 | "BSD-3-Clause" 1101 | ], 1102 | "authors": [ 1103 | { 1104 | "name": "Sebastian Bergmann", 1105 | "email": "sebastian@phpunit.de", 1106 | "role": "lead" 1107 | } 1108 | ], 1109 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1110 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1111 | "keywords": [ 1112 | "filesystem", 1113 | "iterator" 1114 | ], 1115 | "time": "2018-09-13T20:33:42+00:00" 1116 | }, 1117 | { 1118 | "name": "phpunit/php-text-template", 1119 | "version": "1.2.1", 1120 | "source": { 1121 | "type": "git", 1122 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1123 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 1124 | }, 1125 | "dist": { 1126 | "type": "zip", 1127 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1128 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1129 | "shasum": "", 1130 | "mirrors": [ 1131 | { 1132 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1133 | "preferred": true 1134 | } 1135 | ] 1136 | }, 1137 | "require": { 1138 | "php": ">=5.3.3" 1139 | }, 1140 | "type": "library", 1141 | "autoload": { 1142 | "classmap": [ 1143 | "src/" 1144 | ] 1145 | }, 1146 | "notification-url": "https://packagist.org/downloads/", 1147 | "license": [ 1148 | "BSD-3-Clause" 1149 | ], 1150 | "authors": [ 1151 | { 1152 | "name": "Sebastian Bergmann", 1153 | "email": "sebastian@phpunit.de", 1154 | "role": "lead" 1155 | } 1156 | ], 1157 | "description": "Simple template engine.", 1158 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1159 | "keywords": [ 1160 | "template" 1161 | ], 1162 | "time": "2015-06-21T13:50:34+00:00" 1163 | }, 1164 | { 1165 | "name": "phpunit/php-timer", 1166 | "version": "2.1.2", 1167 | "source": { 1168 | "type": "git", 1169 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1170 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" 1171 | }, 1172 | "dist": { 1173 | "type": "zip", 1174 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", 1175 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", 1176 | "shasum": "", 1177 | "mirrors": [ 1178 | { 1179 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1180 | "preferred": true 1181 | } 1182 | ] 1183 | }, 1184 | "require": { 1185 | "php": "^7.1" 1186 | }, 1187 | "require-dev": { 1188 | "phpunit/phpunit": "^7.0" 1189 | }, 1190 | "type": "library", 1191 | "extra": { 1192 | "branch-alias": { 1193 | "dev-master": "2.1-dev" 1194 | } 1195 | }, 1196 | "autoload": { 1197 | "classmap": [ 1198 | "src/" 1199 | ] 1200 | }, 1201 | "notification-url": "https://packagist.org/downloads/", 1202 | "license": [ 1203 | "BSD-3-Clause" 1204 | ], 1205 | "authors": [ 1206 | { 1207 | "name": "Sebastian Bergmann", 1208 | "email": "sebastian@phpunit.de", 1209 | "role": "lead" 1210 | } 1211 | ], 1212 | "description": "Utility class for timing", 1213 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1214 | "keywords": [ 1215 | "timer" 1216 | ], 1217 | "time": "2019-06-07T04:22:29+00:00" 1218 | }, 1219 | { 1220 | "name": "phpunit/php-token-stream", 1221 | "version": "3.1.1", 1222 | "source": { 1223 | "type": "git", 1224 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 1225 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" 1226 | }, 1227 | "dist": { 1228 | "type": "zip", 1229 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", 1230 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", 1231 | "shasum": "", 1232 | "mirrors": [ 1233 | { 1234 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1235 | "preferred": true 1236 | } 1237 | ] 1238 | }, 1239 | "require": { 1240 | "ext-tokenizer": "*", 1241 | "php": "^7.1" 1242 | }, 1243 | "require-dev": { 1244 | "phpunit/phpunit": "^7.0" 1245 | }, 1246 | "type": "library", 1247 | "extra": { 1248 | "branch-alias": { 1249 | "dev-master": "3.1-dev" 1250 | } 1251 | }, 1252 | "autoload": { 1253 | "classmap": [ 1254 | "src/" 1255 | ] 1256 | }, 1257 | "notification-url": "https://packagist.org/downloads/", 1258 | "license": [ 1259 | "BSD-3-Clause" 1260 | ], 1261 | "authors": [ 1262 | { 1263 | "name": "Sebastian Bergmann", 1264 | "email": "sebastian@phpunit.de" 1265 | } 1266 | ], 1267 | "description": "Wrapper around PHP's tokenizer extension.", 1268 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 1269 | "keywords": [ 1270 | "tokenizer" 1271 | ], 1272 | "time": "2019-09-17T06:23:10+00:00" 1273 | }, 1274 | { 1275 | "name": "phpunit/phpunit", 1276 | "version": "8.5.8", 1277 | "source": { 1278 | "type": "git", 1279 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1280 | "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" 1281 | }, 1282 | "dist": { 1283 | "type": "zip", 1284 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", 1285 | "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", 1286 | "shasum": "", 1287 | "mirrors": [ 1288 | { 1289 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1290 | "preferred": true 1291 | } 1292 | ] 1293 | }, 1294 | "require": { 1295 | "doctrine/instantiator": "^1.2.0", 1296 | "ext-dom": "*", 1297 | "ext-json": "*", 1298 | "ext-libxml": "*", 1299 | "ext-mbstring": "*", 1300 | "ext-xml": "*", 1301 | "ext-xmlwriter": "*", 1302 | "myclabs/deep-copy": "^1.9.1", 1303 | "phar-io/manifest": "^1.0.3", 1304 | "phar-io/version": "^2.0.1", 1305 | "php": "^7.2", 1306 | "phpspec/prophecy": "^1.8.1", 1307 | "phpunit/php-code-coverage": "^7.0.7", 1308 | "phpunit/php-file-iterator": "^2.0.2", 1309 | "phpunit/php-text-template": "^1.2.1", 1310 | "phpunit/php-timer": "^2.1.2", 1311 | "sebastian/comparator": "^3.0.2", 1312 | "sebastian/diff": "^3.0.2", 1313 | "sebastian/environment": "^4.2.2", 1314 | "sebastian/exporter": "^3.1.1", 1315 | "sebastian/global-state": "^3.0.0", 1316 | "sebastian/object-enumerator": "^3.0.3", 1317 | "sebastian/resource-operations": "^2.0.1", 1318 | "sebastian/type": "^1.1.3", 1319 | "sebastian/version": "^2.0.1" 1320 | }, 1321 | "require-dev": { 1322 | "ext-pdo": "*" 1323 | }, 1324 | "suggest": { 1325 | "ext-soap": "*", 1326 | "ext-xdebug": "*", 1327 | "phpunit/php-invoker": "^2.0.0" 1328 | }, 1329 | "bin": [ 1330 | "phpunit" 1331 | ], 1332 | "type": "library", 1333 | "extra": { 1334 | "branch-alias": { 1335 | "dev-master": "8.5-dev" 1336 | } 1337 | }, 1338 | "autoload": { 1339 | "classmap": [ 1340 | "src/" 1341 | ] 1342 | }, 1343 | "notification-url": "https://packagist.org/downloads/", 1344 | "license": [ 1345 | "BSD-3-Clause" 1346 | ], 1347 | "authors": [ 1348 | { 1349 | "name": "Sebastian Bergmann", 1350 | "email": "sebastian@phpunit.de", 1351 | "role": "lead" 1352 | } 1353 | ], 1354 | "description": "The PHP Unit Testing framework.", 1355 | "homepage": "https://phpunit.de/", 1356 | "keywords": [ 1357 | "phpunit", 1358 | "testing", 1359 | "xunit" 1360 | ], 1361 | "time": "2020-06-22T07:06:58+00:00" 1362 | }, 1363 | { 1364 | "name": "sebastian/code-unit-reverse-lookup", 1365 | "version": "1.0.1", 1366 | "source": { 1367 | "type": "git", 1368 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1369 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 1370 | }, 1371 | "dist": { 1372 | "type": "zip", 1373 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 1374 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 1375 | "shasum": "", 1376 | "mirrors": [ 1377 | { 1378 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1379 | "preferred": true 1380 | } 1381 | ] 1382 | }, 1383 | "require": { 1384 | "php": "^5.6 || ^7.0" 1385 | }, 1386 | "require-dev": { 1387 | "phpunit/phpunit": "^5.7 || ^6.0" 1388 | }, 1389 | "type": "library", 1390 | "extra": { 1391 | "branch-alias": { 1392 | "dev-master": "1.0.x-dev" 1393 | } 1394 | }, 1395 | "autoload": { 1396 | "classmap": [ 1397 | "src/" 1398 | ] 1399 | }, 1400 | "notification-url": "https://packagist.org/downloads/", 1401 | "license": [ 1402 | "BSD-3-Clause" 1403 | ], 1404 | "authors": [ 1405 | { 1406 | "name": "Sebastian Bergmann", 1407 | "email": "sebastian@phpunit.de" 1408 | } 1409 | ], 1410 | "description": "Looks up which function or method a line of code belongs to", 1411 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1412 | "time": "2017-03-04T06:30:41+00:00" 1413 | }, 1414 | { 1415 | "name": "sebastian/comparator", 1416 | "version": "3.0.2", 1417 | "source": { 1418 | "type": "git", 1419 | "url": "https://github.com/sebastianbergmann/comparator.git", 1420 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 1421 | }, 1422 | "dist": { 1423 | "type": "zip", 1424 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 1425 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 1426 | "shasum": "", 1427 | "mirrors": [ 1428 | { 1429 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1430 | "preferred": true 1431 | } 1432 | ] 1433 | }, 1434 | "require": { 1435 | "php": "^7.1", 1436 | "sebastian/diff": "^3.0", 1437 | "sebastian/exporter": "^3.1" 1438 | }, 1439 | "require-dev": { 1440 | "phpunit/phpunit": "^7.1" 1441 | }, 1442 | "type": "library", 1443 | "extra": { 1444 | "branch-alias": { 1445 | "dev-master": "3.0-dev" 1446 | } 1447 | }, 1448 | "autoload": { 1449 | "classmap": [ 1450 | "src/" 1451 | ] 1452 | }, 1453 | "notification-url": "https://packagist.org/downloads/", 1454 | "license": [ 1455 | "BSD-3-Clause" 1456 | ], 1457 | "authors": [ 1458 | { 1459 | "name": "Jeff Welch", 1460 | "email": "whatthejeff@gmail.com" 1461 | }, 1462 | { 1463 | "name": "Volker Dusch", 1464 | "email": "github@wallbash.com" 1465 | }, 1466 | { 1467 | "name": "Bernhard Schussek", 1468 | "email": "bschussek@2bepublished.at" 1469 | }, 1470 | { 1471 | "name": "Sebastian Bergmann", 1472 | "email": "sebastian@phpunit.de" 1473 | } 1474 | ], 1475 | "description": "Provides the functionality to compare PHP values for equality", 1476 | "homepage": "https://github.com/sebastianbergmann/comparator", 1477 | "keywords": [ 1478 | "comparator", 1479 | "compare", 1480 | "equality" 1481 | ], 1482 | "time": "2018-07-12T15:12:46+00:00" 1483 | }, 1484 | { 1485 | "name": "sebastian/diff", 1486 | "version": "3.0.2", 1487 | "source": { 1488 | "type": "git", 1489 | "url": "https://github.com/sebastianbergmann/diff.git", 1490 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" 1491 | }, 1492 | "dist": { 1493 | "type": "zip", 1494 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 1495 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 1496 | "shasum": "", 1497 | "mirrors": [ 1498 | { 1499 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1500 | "preferred": true 1501 | } 1502 | ] 1503 | }, 1504 | "require": { 1505 | "php": "^7.1" 1506 | }, 1507 | "require-dev": { 1508 | "phpunit/phpunit": "^7.5 || ^8.0", 1509 | "symfony/process": "^2 || ^3.3 || ^4" 1510 | }, 1511 | "type": "library", 1512 | "extra": { 1513 | "branch-alias": { 1514 | "dev-master": "3.0-dev" 1515 | } 1516 | }, 1517 | "autoload": { 1518 | "classmap": [ 1519 | "src/" 1520 | ] 1521 | }, 1522 | "notification-url": "https://packagist.org/downloads/", 1523 | "license": [ 1524 | "BSD-3-Clause" 1525 | ], 1526 | "authors": [ 1527 | { 1528 | "name": "Kore Nordmann", 1529 | "email": "mail@kore-nordmann.de" 1530 | }, 1531 | { 1532 | "name": "Sebastian Bergmann", 1533 | "email": "sebastian@phpunit.de" 1534 | } 1535 | ], 1536 | "description": "Diff implementation", 1537 | "homepage": "https://github.com/sebastianbergmann/diff", 1538 | "keywords": [ 1539 | "diff", 1540 | "udiff", 1541 | "unidiff", 1542 | "unified diff" 1543 | ], 1544 | "time": "2019-02-04T06:01:07+00:00" 1545 | }, 1546 | { 1547 | "name": "sebastian/environment", 1548 | "version": "4.2.3", 1549 | "source": { 1550 | "type": "git", 1551 | "url": "https://github.com/sebastianbergmann/environment.git", 1552 | "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" 1553 | }, 1554 | "dist": { 1555 | "type": "zip", 1556 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", 1557 | "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", 1558 | "shasum": "", 1559 | "mirrors": [ 1560 | { 1561 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1562 | "preferred": true 1563 | } 1564 | ] 1565 | }, 1566 | "require": { 1567 | "php": "^7.1" 1568 | }, 1569 | "require-dev": { 1570 | "phpunit/phpunit": "^7.5" 1571 | }, 1572 | "suggest": { 1573 | "ext-posix": "*" 1574 | }, 1575 | "type": "library", 1576 | "extra": { 1577 | "branch-alias": { 1578 | "dev-master": "4.2-dev" 1579 | } 1580 | }, 1581 | "autoload": { 1582 | "classmap": [ 1583 | "src/" 1584 | ] 1585 | }, 1586 | "notification-url": "https://packagist.org/downloads/", 1587 | "license": [ 1588 | "BSD-3-Clause" 1589 | ], 1590 | "authors": [ 1591 | { 1592 | "name": "Sebastian Bergmann", 1593 | "email": "sebastian@phpunit.de" 1594 | } 1595 | ], 1596 | "description": "Provides functionality to handle HHVM/PHP environments", 1597 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1598 | "keywords": [ 1599 | "Xdebug", 1600 | "environment", 1601 | "hhvm" 1602 | ], 1603 | "time": "2019-11-20T08:46:58+00:00" 1604 | }, 1605 | { 1606 | "name": "sebastian/exporter", 1607 | "version": "3.1.2", 1608 | "source": { 1609 | "type": "git", 1610 | "url": "https://github.com/sebastianbergmann/exporter.git", 1611 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" 1612 | }, 1613 | "dist": { 1614 | "type": "zip", 1615 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", 1616 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", 1617 | "shasum": "", 1618 | "mirrors": [ 1619 | { 1620 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1621 | "preferred": true 1622 | } 1623 | ] 1624 | }, 1625 | "require": { 1626 | "php": "^7.0", 1627 | "sebastian/recursion-context": "^3.0" 1628 | }, 1629 | "require-dev": { 1630 | "ext-mbstring": "*", 1631 | "phpunit/phpunit": "^6.0" 1632 | }, 1633 | "type": "library", 1634 | "extra": { 1635 | "branch-alias": { 1636 | "dev-master": "3.1.x-dev" 1637 | } 1638 | }, 1639 | "autoload": { 1640 | "classmap": [ 1641 | "src/" 1642 | ] 1643 | }, 1644 | "notification-url": "https://packagist.org/downloads/", 1645 | "license": [ 1646 | "BSD-3-Clause" 1647 | ], 1648 | "authors": [ 1649 | { 1650 | "name": "Sebastian Bergmann", 1651 | "email": "sebastian@phpunit.de" 1652 | }, 1653 | { 1654 | "name": "Jeff Welch", 1655 | "email": "whatthejeff@gmail.com" 1656 | }, 1657 | { 1658 | "name": "Volker Dusch", 1659 | "email": "github@wallbash.com" 1660 | }, 1661 | { 1662 | "name": "Adam Harvey", 1663 | "email": "aharvey@php.net" 1664 | }, 1665 | { 1666 | "name": "Bernhard Schussek", 1667 | "email": "bschussek@gmail.com" 1668 | } 1669 | ], 1670 | "description": "Provides the functionality to export PHP variables for visualization", 1671 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1672 | "keywords": [ 1673 | "export", 1674 | "exporter" 1675 | ], 1676 | "time": "2019-09-14T09:02:43+00:00" 1677 | }, 1678 | { 1679 | "name": "sebastian/global-state", 1680 | "version": "3.0.0", 1681 | "source": { 1682 | "type": "git", 1683 | "url": "https://github.com/sebastianbergmann/global-state.git", 1684 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" 1685 | }, 1686 | "dist": { 1687 | "type": "zip", 1688 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 1689 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 1690 | "shasum": "", 1691 | "mirrors": [ 1692 | { 1693 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1694 | "preferred": true 1695 | } 1696 | ] 1697 | }, 1698 | "require": { 1699 | "php": "^7.2", 1700 | "sebastian/object-reflector": "^1.1.1", 1701 | "sebastian/recursion-context": "^3.0" 1702 | }, 1703 | "require-dev": { 1704 | "ext-dom": "*", 1705 | "phpunit/phpunit": "^8.0" 1706 | }, 1707 | "suggest": { 1708 | "ext-uopz": "*" 1709 | }, 1710 | "type": "library", 1711 | "extra": { 1712 | "branch-alias": { 1713 | "dev-master": "3.0-dev" 1714 | } 1715 | }, 1716 | "autoload": { 1717 | "classmap": [ 1718 | "src/" 1719 | ] 1720 | }, 1721 | "notification-url": "https://packagist.org/downloads/", 1722 | "license": [ 1723 | "BSD-3-Clause" 1724 | ], 1725 | "authors": [ 1726 | { 1727 | "name": "Sebastian Bergmann", 1728 | "email": "sebastian@phpunit.de" 1729 | } 1730 | ], 1731 | "description": "Snapshotting of global state", 1732 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1733 | "keywords": [ 1734 | "global state" 1735 | ], 1736 | "time": "2019-02-01T05:30:01+00:00" 1737 | }, 1738 | { 1739 | "name": "sebastian/object-enumerator", 1740 | "version": "3.0.3", 1741 | "source": { 1742 | "type": "git", 1743 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1744 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 1745 | }, 1746 | "dist": { 1747 | "type": "zip", 1748 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1749 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1750 | "shasum": "", 1751 | "mirrors": [ 1752 | { 1753 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1754 | "preferred": true 1755 | } 1756 | ] 1757 | }, 1758 | "require": { 1759 | "php": "^7.0", 1760 | "sebastian/object-reflector": "^1.1.1", 1761 | "sebastian/recursion-context": "^3.0" 1762 | }, 1763 | "require-dev": { 1764 | "phpunit/phpunit": "^6.0" 1765 | }, 1766 | "type": "library", 1767 | "extra": { 1768 | "branch-alias": { 1769 | "dev-master": "3.0.x-dev" 1770 | } 1771 | }, 1772 | "autoload": { 1773 | "classmap": [ 1774 | "src/" 1775 | ] 1776 | }, 1777 | "notification-url": "https://packagist.org/downloads/", 1778 | "license": [ 1779 | "BSD-3-Clause" 1780 | ], 1781 | "authors": [ 1782 | { 1783 | "name": "Sebastian Bergmann", 1784 | "email": "sebastian@phpunit.de" 1785 | } 1786 | ], 1787 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1788 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1789 | "time": "2017-08-03T12:35:26+00:00" 1790 | }, 1791 | { 1792 | "name": "sebastian/object-reflector", 1793 | "version": "1.1.1", 1794 | "source": { 1795 | "type": "git", 1796 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1797 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 1798 | }, 1799 | "dist": { 1800 | "type": "zip", 1801 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 1802 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 1803 | "shasum": "", 1804 | "mirrors": [ 1805 | { 1806 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1807 | "preferred": true 1808 | } 1809 | ] 1810 | }, 1811 | "require": { 1812 | "php": "^7.0" 1813 | }, 1814 | "require-dev": { 1815 | "phpunit/phpunit": "^6.0" 1816 | }, 1817 | "type": "library", 1818 | "extra": { 1819 | "branch-alias": { 1820 | "dev-master": "1.1-dev" 1821 | } 1822 | }, 1823 | "autoload": { 1824 | "classmap": [ 1825 | "src/" 1826 | ] 1827 | }, 1828 | "notification-url": "https://packagist.org/downloads/", 1829 | "license": [ 1830 | "BSD-3-Clause" 1831 | ], 1832 | "authors": [ 1833 | { 1834 | "name": "Sebastian Bergmann", 1835 | "email": "sebastian@phpunit.de" 1836 | } 1837 | ], 1838 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1839 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1840 | "time": "2017-03-29T09:07:27+00:00" 1841 | }, 1842 | { 1843 | "name": "sebastian/recursion-context", 1844 | "version": "3.0.0", 1845 | "source": { 1846 | "type": "git", 1847 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1848 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 1849 | }, 1850 | "dist": { 1851 | "type": "zip", 1852 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1853 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1854 | "shasum": "", 1855 | "mirrors": [ 1856 | { 1857 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1858 | "preferred": true 1859 | } 1860 | ] 1861 | }, 1862 | "require": { 1863 | "php": "^7.0" 1864 | }, 1865 | "require-dev": { 1866 | "phpunit/phpunit": "^6.0" 1867 | }, 1868 | "type": "library", 1869 | "extra": { 1870 | "branch-alias": { 1871 | "dev-master": "3.0.x-dev" 1872 | } 1873 | }, 1874 | "autoload": { 1875 | "classmap": [ 1876 | "src/" 1877 | ] 1878 | }, 1879 | "notification-url": "https://packagist.org/downloads/", 1880 | "license": [ 1881 | "BSD-3-Clause" 1882 | ], 1883 | "authors": [ 1884 | { 1885 | "name": "Jeff Welch", 1886 | "email": "whatthejeff@gmail.com" 1887 | }, 1888 | { 1889 | "name": "Sebastian Bergmann", 1890 | "email": "sebastian@phpunit.de" 1891 | }, 1892 | { 1893 | "name": "Adam Harvey", 1894 | "email": "aharvey@php.net" 1895 | } 1896 | ], 1897 | "description": "Provides functionality to recursively process PHP variables", 1898 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1899 | "time": "2017-03-03T06:23:57+00:00" 1900 | }, 1901 | { 1902 | "name": "sebastian/resource-operations", 1903 | "version": "2.0.1", 1904 | "source": { 1905 | "type": "git", 1906 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1907 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 1908 | }, 1909 | "dist": { 1910 | "type": "zip", 1911 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1912 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1913 | "shasum": "", 1914 | "mirrors": [ 1915 | { 1916 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1917 | "preferred": true 1918 | } 1919 | ] 1920 | }, 1921 | "require": { 1922 | "php": "^7.1" 1923 | }, 1924 | "type": "library", 1925 | "extra": { 1926 | "branch-alias": { 1927 | "dev-master": "2.0-dev" 1928 | } 1929 | }, 1930 | "autoload": { 1931 | "classmap": [ 1932 | "src/" 1933 | ] 1934 | }, 1935 | "notification-url": "https://packagist.org/downloads/", 1936 | "license": [ 1937 | "BSD-3-Clause" 1938 | ], 1939 | "authors": [ 1940 | { 1941 | "name": "Sebastian Bergmann", 1942 | "email": "sebastian@phpunit.de" 1943 | } 1944 | ], 1945 | "description": "Provides a list of PHP built-in functions that operate on resources", 1946 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1947 | "time": "2018-10-04T04:07:39+00:00" 1948 | }, 1949 | { 1950 | "name": "sebastian/type", 1951 | "version": "1.1.3", 1952 | "source": { 1953 | "type": "git", 1954 | "url": "https://github.com/sebastianbergmann/type.git", 1955 | "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" 1956 | }, 1957 | "dist": { 1958 | "type": "zip", 1959 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", 1960 | "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", 1961 | "shasum": "", 1962 | "mirrors": [ 1963 | { 1964 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1965 | "preferred": true 1966 | } 1967 | ] 1968 | }, 1969 | "require": { 1970 | "php": "^7.2" 1971 | }, 1972 | "require-dev": { 1973 | "phpunit/phpunit": "^8.2" 1974 | }, 1975 | "type": "library", 1976 | "extra": { 1977 | "branch-alias": { 1978 | "dev-master": "1.1-dev" 1979 | } 1980 | }, 1981 | "autoload": { 1982 | "classmap": [ 1983 | "src/" 1984 | ] 1985 | }, 1986 | "notification-url": "https://packagist.org/downloads/", 1987 | "license": [ 1988 | "BSD-3-Clause" 1989 | ], 1990 | "authors": [ 1991 | { 1992 | "name": "Sebastian Bergmann", 1993 | "email": "sebastian@phpunit.de", 1994 | "role": "lead" 1995 | } 1996 | ], 1997 | "description": "Collection of value objects that represent the types of the PHP type system", 1998 | "homepage": "https://github.com/sebastianbergmann/type", 1999 | "time": "2019-07-02T08:10:15+00:00" 2000 | }, 2001 | { 2002 | "name": "sebastian/version", 2003 | "version": "2.0.1", 2004 | "source": { 2005 | "type": "git", 2006 | "url": "https://github.com/sebastianbergmann/version.git", 2007 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 2008 | }, 2009 | "dist": { 2010 | "type": "zip", 2011 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 2012 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 2013 | "shasum": "", 2014 | "mirrors": [ 2015 | { 2016 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2017 | "preferred": true 2018 | } 2019 | ] 2020 | }, 2021 | "require": { 2022 | "php": ">=5.6" 2023 | }, 2024 | "type": "library", 2025 | "extra": { 2026 | "branch-alias": { 2027 | "dev-master": "2.0.x-dev" 2028 | } 2029 | }, 2030 | "autoload": { 2031 | "classmap": [ 2032 | "src/" 2033 | ] 2034 | }, 2035 | "notification-url": "https://packagist.org/downloads/", 2036 | "license": [ 2037 | "BSD-3-Clause" 2038 | ], 2039 | "authors": [ 2040 | { 2041 | "name": "Sebastian Bergmann", 2042 | "email": "sebastian@phpunit.de", 2043 | "role": "lead" 2044 | } 2045 | ], 2046 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2047 | "homepage": "https://github.com/sebastianbergmann/version", 2048 | "time": "2016-10-03T07:35:21+00:00" 2049 | }, 2050 | { 2051 | "name": "symfony/polyfill-ctype", 2052 | "version": "v1.18.1", 2053 | "source": { 2054 | "type": "git", 2055 | "url": "https://github.com/symfony/polyfill-ctype.git", 2056 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" 2057 | }, 2058 | "dist": { 2059 | "type": "zip", 2060 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", 2061 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", 2062 | "shasum": "", 2063 | "mirrors": [ 2064 | { 2065 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2066 | "preferred": true 2067 | } 2068 | ] 2069 | }, 2070 | "require": { 2071 | "php": ">=5.3.3" 2072 | }, 2073 | "suggest": { 2074 | "ext-ctype": "For best performance" 2075 | }, 2076 | "type": "library", 2077 | "extra": { 2078 | "branch-alias": { 2079 | "dev-master": "1.18-dev" 2080 | }, 2081 | "thanks": { 2082 | "name": "symfony/polyfill", 2083 | "url": "https://github.com/symfony/polyfill" 2084 | } 2085 | }, 2086 | "autoload": { 2087 | "psr-4": { 2088 | "Symfony\\Polyfill\\Ctype\\": "" 2089 | }, 2090 | "files": [ 2091 | "bootstrap.php" 2092 | ] 2093 | }, 2094 | "notification-url": "https://packagist.org/downloads/", 2095 | "license": [ 2096 | "MIT" 2097 | ], 2098 | "authors": [ 2099 | { 2100 | "name": "Gert de Pagter", 2101 | "email": "BackEndTea@gmail.com" 2102 | }, 2103 | { 2104 | "name": "Symfony Community", 2105 | "homepage": "https://symfony.com/contributors" 2106 | } 2107 | ], 2108 | "description": "Symfony polyfill for ctype functions", 2109 | "homepage": "https://symfony.com", 2110 | "keywords": [ 2111 | "compatibility", 2112 | "ctype", 2113 | "polyfill", 2114 | "portable" 2115 | ], 2116 | "time": "2020-07-14T12:35:20+00:00" 2117 | }, 2118 | { 2119 | "name": "theseer/tokenizer", 2120 | "version": "1.2.0", 2121 | "source": { 2122 | "type": "git", 2123 | "url": "https://github.com/theseer/tokenizer.git", 2124 | "reference": "75a63c33a8577608444246075ea0af0d052e452a" 2125 | }, 2126 | "dist": { 2127 | "type": "zip", 2128 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", 2129 | "reference": "75a63c33a8577608444246075ea0af0d052e452a", 2130 | "shasum": "", 2131 | "mirrors": [ 2132 | { 2133 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2134 | "preferred": true 2135 | } 2136 | ] 2137 | }, 2138 | "require": { 2139 | "ext-dom": "*", 2140 | "ext-tokenizer": "*", 2141 | "ext-xmlwriter": "*", 2142 | "php": "^7.2 || ^8.0" 2143 | }, 2144 | "type": "library", 2145 | "autoload": { 2146 | "classmap": [ 2147 | "src/" 2148 | ] 2149 | }, 2150 | "notification-url": "https://packagist.org/downloads/", 2151 | "license": [ 2152 | "BSD-3-Clause" 2153 | ], 2154 | "authors": [ 2155 | { 2156 | "name": "Arne Blankerts", 2157 | "email": "arne@blankerts.de", 2158 | "role": "Developer" 2159 | } 2160 | ], 2161 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2162 | "time": "2020-07-12T23:59:07+00:00" 2163 | }, 2164 | { 2165 | "name": "webmozart/assert", 2166 | "version": "1.9.1", 2167 | "source": { 2168 | "type": "git", 2169 | "url": "https://github.com/webmozart/assert.git", 2170 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" 2171 | }, 2172 | "dist": { 2173 | "type": "zip", 2174 | "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", 2175 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", 2176 | "shasum": "", 2177 | "mirrors": [ 2178 | { 2179 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2180 | "preferred": true 2181 | } 2182 | ] 2183 | }, 2184 | "require": { 2185 | "php": "^5.3.3 || ^7.0 || ^8.0", 2186 | "symfony/polyfill-ctype": "^1.8" 2187 | }, 2188 | "conflict": { 2189 | "phpstan/phpstan": "<0.12.20", 2190 | "vimeo/psalm": "<3.9.1" 2191 | }, 2192 | "require-dev": { 2193 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 2194 | }, 2195 | "type": "library", 2196 | "autoload": { 2197 | "psr-4": { 2198 | "Webmozart\\Assert\\": "src/" 2199 | } 2200 | }, 2201 | "notification-url": "https://packagist.org/downloads/", 2202 | "license": [ 2203 | "MIT" 2204 | ], 2205 | "authors": [ 2206 | { 2207 | "name": "Bernhard Schussek", 2208 | "email": "bschussek@gmail.com" 2209 | } 2210 | ], 2211 | "description": "Assertions to validate method input/output with nice error messages.", 2212 | "keywords": [ 2213 | "assert", 2214 | "check", 2215 | "validate" 2216 | ], 2217 | "time": "2020-07-08T17:02:28+00:00" 2218 | } 2219 | ], 2220 | "aliases": [], 2221 | "minimum-stability": "stable", 2222 | "stability-flags": [], 2223 | "prefer-stable": false, 2224 | "prefer-lowest": false, 2225 | "platform": { 2226 | "php": "^7.2.5", 2227 | "ext-json": "*" 2228 | }, 2229 | "platform-dev": [] 2230 | } 2231 | -------------------------------------------------------------------------------- /data/china_mobile.php: -------------------------------------------------------------------------------- 1 | "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226226/1.m3u8", 9 | "tvg-name" => "CCTV1" 10 | ], 11 | [ 12 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226230/1.m3u8", 13 | "tvg-name" => "CCTV2" 14 | ], 15 | [ 16 | "url" => "http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225606/1.m3u8", 17 | "tvg-name" => "CCTV3" 18 | ], 19 | [ 20 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226314/1.m3u8", 21 | "tvg-name" => "CCTV4" 22 | ], 23 | [ 24 | "url" => "http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225591/1.m3u8", 25 | "tvg-name" => "CCTV5" 26 | ], 27 | [ 28 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226225/1.m3u8", 29 | "tvg-name" => "CCTV5+" 30 | ], 31 | [ 32 | "url" => "http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225607/1.m3u8", 33 | "tvg-name" => "CCTV6" 34 | ], 35 | [ 36 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226234/1.m3u8", 37 | "tvg-name" => "CCTV7" 38 | ], 39 | [ 40 | "url" => "http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225608/1.m3u8", 41 | "tvg-name" => "CCTV8" 42 | ], 43 | [ 44 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226236/1.m3u8", 45 | "tvg-name" => "CCTV9" 46 | ], 47 | [ 48 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226227/1.m3u8", 49 | "tvg-name" => "CCTV10" 50 | ], 51 | [ 52 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226315/1.m3u8", 53 | "tvg-name" => "CCTV11" 54 | ], 55 | [ 56 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226228/1.m3u8", 57 | "tvg-name" => "CCTV12" 58 | ], 59 | [ 60 | "url" => "http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225599/1.m3u8", 61 | "tvg-name" => "CCTV13" 62 | ], 63 | [ 64 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226229/1.m3u8", 65 | "tvg-name" => "CCTV14" 66 | ], 67 | [ 68 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226333/1.m3u8", 69 | "tvg-name" => "CCTV15" 70 | ], 71 | [ 72 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226318/1.m3u8", 73 | "tvg-name" => "CCTV17" 74 | ], 75 | [ 76 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225867/1.m3u8", 77 | "tvg-name" => "CGTN" 78 | ], 79 | [ 80 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225866/1.m3u8", 81 | "tvg-name" => "CGTN记录", 82 | "tvg-logo" => "http://epg.51zmt.top:8000/tb1/CCTV/cgtn.png", 83 | "group-title" => "央视", 84 | "name" => "CGTN记录" 85 | ], 86 | [ 87 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226241/1.m3u8", 88 | "tvg-name" => "湖南卫视" 89 | ], 90 | [ 91 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226247/1.m3u8", 92 | "tvg-name" => "浙江卫视" 93 | ], 94 | [ 95 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226242/1.m3u8", 96 | "tvg-name" => "江苏卫视" 97 | ], 98 | [ 99 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226237/1.m3u8", 100 | "tvg-name" => "东方卫视" 101 | ], 102 | [ 103 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226308/1.m3u8", 104 | "tvg-name" => "山东卫视" 105 | ], 106 | [ 107 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226224/1.m3u8", 108 | "tvg-name" => "北京卫视" 109 | ], 110 | [ 111 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226336/1.m3u8", 112 | "tvg-name" => "辽宁卫视" 113 | ], 114 | [ 115 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226239/1.m3u8", 116 | "tvg-name" => "黑龙江卫视" 117 | ], 118 | [ 119 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226238/1.m3u8", 120 | "tvg-name" => "广东卫视" 121 | ], 122 | [ 123 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226223/1.m3u8", 124 | "tvg-name" => "安徽卫视" 125 | ], 126 | [ 127 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226245/1.m3u8", 128 | "tvg-name" => "深圳卫视" 129 | ], 130 | [ 131 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226246/1.m3u8", 132 | "tvg-name" => "天津卫视" 133 | ], 134 | [ 135 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226337/1.m3u8", 136 | "tvg-name" => "重庆卫视" 137 | ], 138 | [ 139 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225876/1.m3u8", 140 | "tvg-name" => "东南卫视" 141 | ], 142 | [ 143 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225879/1.m3u8", 144 | "tvg-name" => "广西卫视" 145 | ], 146 | [ 147 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225881/1.m3u8", 148 | "tvg-name" => "河北卫视" 149 | ], 150 | [ 151 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225882/1.m3u8", 152 | "tvg-name" => "河南卫视" 153 | ], 154 | [ 155 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226310/1.m3u8", 156 | "tvg-name" => "湖北卫视" 157 | ], 158 | [ 159 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226243/1.m3u8", 160 | "tvg-name" => "江西卫视" 161 | ], 162 | [ 163 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225886/1.m3u8", 164 | "tvg-name" => "吉林卫视" 165 | ], 166 | [ 167 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225895/1.m3u8", 168 | "tvg-name" => "山西卫视" 169 | ], 170 | [ 171 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225896/1.m3u8", 172 | "tvg-name" => "陕西卫视" 173 | ], 174 | [ 175 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225877/1.m3u8", 176 | "tvg-name" => "甘肃卫视" 177 | ], 178 | [ 179 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225898/1.m3u8", 180 | "tvg-name" => "四川卫视" 181 | ], 182 | [ 183 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225902/1.m3u8", 184 | "tvg-name" => "云南卫视" 185 | ], 186 | [ 187 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225880/1.m3u8", 188 | "tvg-name" => "贵州卫视" 189 | ], 190 | [ 191 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225890/1.m3u8", 192 | "tvg-name" => "旅游卫视" 193 | ], 194 | [ 195 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225892/1.m3u8", 196 | "tvg-name" => "宁夏卫视" 197 | ], 198 | [ 199 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225893/1.m3u8", 200 | "tvg-name" => "青海卫视" 201 | ], 202 | [ 203 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225891/1.m3u8", 204 | "tvg-name" => "内蒙古卫视" 205 | ], 206 | [ 207 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225900/1.m3u8", 208 | "tvg-name" => "西藏卫视" 209 | ], 210 | [ 211 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225901/1.m3u8", 212 | "tvg-name" => "新疆卫视" 213 | ], 214 | [ 215 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225942/1.m3u8", 216 | "tvg-name" => "凤凰中文" 217 | ], 218 | [ 219 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225949/1.m3u8", 220 | "tvg-name" => "凤凰资讯" 221 | ], 222 | [ 223 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225910/1.m3u8", 224 | "tvg-name" => "优漫卡通" 225 | ], 226 | [ 227 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225906/1.m3u8", 228 | "tvg-name" => "金鹰卡通" 229 | ], 230 | [ 231 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225914/1.m3u8", 232 | "tvg-name" => "黑莓动画" 233 | ], 234 | [ 235 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225931/1.m3u8", 236 | "tvg-name" => "黑莓电竞" 237 | ], 238 | [ 239 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225927/1.m3u8", 240 | "tvg-name" => "黑莓电影" 241 | ], 242 | [ 243 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225905/1.m3u8", 244 | "tvg-name" => "中国教育1台" 245 | ], 246 | [ 247 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225908/1.m3u8", 248 | "tvg-name" => "山东教育卫视" 249 | ], 250 | [ 251 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226233/1.m3u8", 252 | "tvg-name" => "NewTV超级电影", 253 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvdianying.jpg", 254 | "group-title" => "NewTV" 255 | ], 256 | [ 257 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226231/1.m3u8", 258 | "tvg-name" => "NewTV超级综艺", 259 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvzongyi.jpg", 260 | "group-title" => "NewTV" 261 | ], 262 | [ 263 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226232/1.m3u8", 264 | "tvg-name" => "NewTV超级体育", 265 | "tvg-logo" => "", 266 | "group-title" => "NewTV" 267 | ], 268 | [ 269 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225864/1.m3u8", 270 | "tvg-name" => "NewTV超级电视剧", 271 | "tvg-logo" => "", 272 | "group-title" => "NewTV" 273 | ], 274 | [ 275 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226298/1.m3u8", 276 | "tvg-name" => "NewTV中国功夫", 277 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvgongfu.jpg", 278 | "group-title" => "NewTV" 279 | ], 280 | [ 281 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226296/1.m3u8", 282 | "tvg-name" => "NewTV金牌综艺", 283 | "tvg-logo" => "", 284 | "group-title" => "NewTV" 285 | ], 286 | [ 287 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226304/1.m3u8", 288 | "tvg-name" => "NewTV农业致富", 289 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvnongye.jpg", 290 | "group-title" => "NewTV" 291 | ], 292 | [ 293 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226286/1.m3u8", 294 | "tvg-name" => "NewTV潮妈辣婆", 295 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvlama.jpg", 296 | "group-title" => "NewTV" 297 | ], 298 | [ 299 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226248/1.m3u8", 300 | "tvg-name" => "NewTV炫舞未来", 301 | "tvg-logo" => "", 302 | "group-title" => "NewTV" 303 | ], 304 | [ 305 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226295/1.m3u8", 306 | "tvg-name" => "NewTV明星大片", 307 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvdapian.jpg", 308 | "group-title" => "NewTV" 309 | ], 310 | [ 311 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226297/1.m3u8", 312 | "tvg-name" => "NewTV武博世界", 313 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvboji.jpg", 314 | "group-title" => "NewTV" 315 | ], 316 | [ 317 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226302/1.m3u8", 318 | "tvg-name" => "NewTV海外综合", 319 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvhaiwai.jpg", 320 | "group-title" => "NewTV" 321 | ], 322 | [ 323 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226294/1.m3u8", 324 | "tvg-name" => "NewTV惊悚悬疑", 325 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjingsong.jpg", 326 | "group-title" => "NewTV" 327 | ], 328 | [ 329 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226299/1.m3u8", 330 | "tvg-name" => "NewTV爱情喜剧", 331 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvxiju.jpg", 332 | "group-title" => "NewTV" 333 | ], 334 | [ 335 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226293/1.m3u8", 336 | "tvg-name" => "NewTV精品记录", 337 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjilu.jpg", 338 | "group-title" => "NewTV" 339 | ], 340 | [ 341 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226328/1.m3u8", 342 | "tvg-name" => "NewTV精品体育", 343 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjpty.jpg", 344 | "group-title" => "NewTV" 345 | ], 346 | [ 347 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226331/1.m3u8", 348 | "tvg-name" => "NewTV精品大剧", 349 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvdaju.jpg", 350 | "group-title" => "NewTV" 351 | ], 352 | [ 353 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226323/1.m3u8", 354 | "tvg-name" => "NewTV古装剧场", 355 | "tvg-logo" => "", 356 | "group-title" => "NewTV" 357 | ], 358 | [ 359 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226324/1.m3u8", 360 | "tvg-name" => "NewTV军旅剧场", 361 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjunlv.jpg", 362 | "group-title" => "NewTV" 363 | ], 364 | [ 365 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226326/1.m3u8", 366 | "tvg-name" => "NewTV军事评论", 367 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjspl.jpg", 368 | "group-title" => "NewTV" 369 | ], 370 | [ 371 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225919/1.m3u8", 372 | "tvg-name" => "NewTV怡伴健康", 373 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjiankang.jpg", 374 | "group-title" => "NewTV" 375 | ], 376 | [ 377 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225918/1.m3u8", 378 | "tvg-name" => "NewTV家庭剧场", 379 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjiating.jpg", 380 | "group-title" => "NewTV" 381 | ], 382 | [ 383 | "url" => "http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226288/1.m3u8", 384 | "tvg-name" => "NewTV动作电影", 385 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvdongzuo.jpg", 386 | "group-title" => "NewTV" 387 | ] 388 | ]; -------------------------------------------------------------------------------- /data/cmvideo.php: -------------------------------------------------------------------------------- 1 | "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000018602&livemode=1&stbId=4", 9 | "tvg-name" => "CCTV1" 10 | ], 11 | [ 12 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000023315&livemode=1&stbId=4", 13 | "tvg-name" => "CCTV2" 14 | ], 15 | [ 16 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000013682&livemode=1&stbId=4", 17 | "tvg-name" => "CCTV3" 18 | ], 19 | [ 20 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000031664&livemode=1&stbId=4", 21 | "tvg-name" => "CCTV4" 22 | ], 23 | [ 24 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000004794&livemode=1&stbId=4", 25 | "tvg-name" => "CCTV5" 26 | ], 27 | [ 28 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000020505&livemode=1&stbId=4", 29 | "tvg-name" => "CCTV5+" 30 | ], 31 | [ 32 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000001737&livemode=1&stbId=4", 33 | "tvg-name" => "CCTV6" 34 | ], 35 | [ 36 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000024341&livemode=1&stbId=4", 37 | "tvg-name" => "CCTV7" 38 | ], 39 | [ 40 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000031433&livemode=1&stbId=4", 41 | "tvg-name" => "CCTV8" 42 | ], 43 | [ 44 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000014583&livemode=1&stbId=4", 45 | "tvg-name" => "CCTV9" 46 | ], 47 | [ 48 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000023734&livemode=1&stbId=4", 49 | "tvg-name" => "CCTV10" 50 | ], 51 | [ 52 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000019789&livemode=1&stbId=4", 53 | "tvg-name" => "CCTV11" 54 | ], 55 | [ 56 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000032494&livemode=1&stbId=4", 57 | "tvg-name" => "CCTV12" 58 | ], 59 | [ 60 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000021303&livemode=1&stbId=4", 61 | "tvg-name" => "CCTV13" 62 | ], 63 | [ 64 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000008170&livemode=1&stbId=4", 65 | "tvg-name" => "CCTV14" 66 | ], 67 | [ 68 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000008163&livemode=1&stbId=4", 69 | "tvg-name" => "CCTV15" 70 | ], 71 | [ 72 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000005000056836&livemode=1&stbId=4", 73 | "tvg-name" => "CCTV17" 74 | ], 75 | [ 76 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000004000011651&livemode=1&stbId=4", 77 | "tvg-name" => "纯享4K", 78 | "group-title" => "央视", 79 | "name" => "CGTN记录" 80 | ], 81 | [ 82 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000032695&livemode=1&stbId=4", 83 | "tvg-name" => "湖南卫视" 84 | ], 85 | [ 86 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000014260&livemode=1&stbId=4", 87 | "tvg-name" => "浙江卫视" 88 | ], 89 | [ 90 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000001828&livemode=1&stbId=4", 91 | "tvg-name" => "江苏卫视" 92 | ], 93 | [ 94 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000005866&livemode=1&stbId=4", 95 | "tvg-name" => "东方卫视" 96 | ], 97 | [ 98 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000021288&livemode=1&stbId=4", 99 | "tvg-name" => "北京卫视" 100 | ], 101 | [ 102 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000024033&livemode=1&stbId=4", 103 | "tvg-name" => "辽宁卫视" 104 | ], 105 | [ 106 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000001925&livemode=1&stbId=4", 107 | "tvg-name" => "黑龙江卫视" 108 | ], 109 | [ 110 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000009263&livemode=1&stbId=4", 111 | "tvg-name" => "东南卫视" 112 | ], 113 | [ 114 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000003475&livemode=1&stbId=4", 115 | "tvg-name" => "天津卫视" 116 | ], 117 | [ 118 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000030159&livemode=1&stbId=4", 119 | "tvg-name" => "安徽卫视" 120 | ], 121 | [ 122 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000012807&livemode=1&stbId=4", 123 | "tvg-name" => "山东卫视" 124 | ], 125 | [ 126 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000014176&livemode=1&stbId=4", 127 | "tvg-name" => "广东卫视" 128 | ], 129 | [ 130 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000013731&livemode=1&stbId=4", 131 | "tvg-name" => "江西卫视" 132 | ], 133 | [ 134 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000009227&livemode=1&stbId=4", 135 | "tvg-name" => "深圳卫视" 136 | ], 137 | [ 138 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000024621&livemode=1&stbId=4", 139 | "tvg-name" => "湖北卫视" 140 | ], 141 | [ 142 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=bestzb&Contentid=5000000004000006211&livemode=1&stbId=4", 143 | "tvg-name" => "旅游卫视" 144 | ], 145 | [ 146 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000018937&livemode=1&stbId=4", 147 | "tvg-name" => "重庆卫视" 148 | ], 149 | [ 150 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000031451&livemode=1&stbId=4", 151 | "tvg-name" => "宁夏卫视" 152 | ], 153 | [ 154 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000021220&livemode=1&stbId=4", 155 | "tvg-name" => "山西卫视" 156 | ], 157 | [ 158 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000019837&livemode=1&stbId=4", 159 | "tvg-name" => "广西卫视" 160 | ], 161 | [ 162 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000029441&livemode=1&stbId=4", 163 | "tvg-name" => "新疆卫视" 164 | ], 165 | [ 166 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000017118&livemode=1&stbId=4", 167 | "tvg-name" => "河北卫视" 168 | ], 169 | [ 170 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=7384596500152929578&livemode=1&stbId=4", 171 | "tvg-name" => "河南卫视" 172 | ], 173 | [ 174 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000017827&livemode=1&stbId=4", 175 | "tvg-name" => "甘肃卫视" 176 | ], 177 | [ 178 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000003169&livemode=1&stbId=4", 179 | "tvg-name" => "贵州卫视" 180 | ], 181 | [ 182 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000007495&livemode=1&stbId=4", 183 | "tvg-name" => "陕西卫视" 184 | ], 185 | [ 186 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6042486520432105075&livemode=1&stbId=4", 187 | "tvg-name" => "吉林卫视" 188 | ], 189 | [ 190 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6603041244077933770&livemode=1&stbId=4", 191 | "tvg-name" => "西藏卫视" 192 | ], 193 | [ 194 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000004097&livemode=1&stbId=4", 195 | "tvg-name" => "山东教育卫视" 196 | ], 197 | [ 198 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000011619&livemode=1&stbId=4", 199 | "tvg-name" => "南方卫视" 200 | ], 201 | [ 202 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000004000011655&livemode=1&stbId=4", 203 | "tvg-name" => "珠江频道" 204 | ], 205 | [ 206 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000016825&livemode=1&stbId=4", 207 | "tvg-name" => "四川卫视" 208 | ], 209 | [ 210 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000014080&livemode=1&stbId=4", 211 | "tvg-name" => "内蒙古卫视" 212 | ], 213 | [ 214 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000002000024694&livemode=1&stbId=4", 215 | "tvg-name" => "云南卫视" 216 | ], 217 | [ 218 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000006906&livemode=1&stbId=4", 219 | "tvg-name" => "黑莓电竞" 220 | ], 221 | [ 222 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=8785669936177902664&livemode=1&stbId=4", 223 | "tvg-name" => "黑莓电影" 224 | ], 225 | [ 226 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6497762188035533951&livemode=1&stbId=4", 227 | "tvg-name" => "黑莓动画" 228 | ], 229 | [ 230 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000016545&livemode=1&stbId=4", 231 | "tvg-name" => "上海纪实" // 上海纪实人文 232 | ], 233 | [ 234 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=5000000010000017540&livemode=1&stbId=4", 235 | "tvg-name" => "五星体育频道" 236 | ], 237 | [ 238 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000001910&livemode=1&stbId=4", 239 | "tvg-name" => "北京纪实" // 北京东奥纪实 240 | ], 241 | [ 242 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=5897056882324761054&livemode=1&stbId=4", 243 | "tvg-name" => "NewTV中国功夫", 244 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvgongfu.jpg", 245 | "group-title" => "NewTV" 246 | ], 247 | [ 248 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=5822616274253344775&livemode=1&stbId=4", 249 | "tvg-name" => "NewTV军事评论", 250 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjspl.jpg", 251 | "group-title" => "NewTV" 252 | ], 253 | [ 254 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=7485075951068666323&livemode=1&stbId=4", 255 | "tvg-name" => "NewTV军旅剧场", 256 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjunlv.jpg", 257 | "group-title" => "NewTV" 258 | ], 259 | [ 260 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6193684637634073625&livemode=1&stbId=4", 261 | "tvg-name" => "NewTV农业致富", 262 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvnongye.jpg", 263 | "group-title" => "NewTV" 264 | ], 265 | [ 266 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=8103864434730665389&livemode=1&stbId=4", 267 | "tvg-name" => "NewTV动作电影", 268 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvdongzuo.jpg", 269 | "group-title" => "NewTV" 270 | ], 271 | [ 272 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6859053933687922163&livemode=1&stbId=4", 273 | "tvg-name" => "NewTV古装剧场", 274 | "tvg-logo" => "", 275 | "group-title" => "NewTV" 276 | ], 277 | [ 278 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6316377948248689070&livemode=1&stbId=4", 279 | "tvg-name" => "NewTV家庭剧场", 280 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjiating.jpg", 281 | "group-title" => "NewTV" 282 | ], 283 | [ 284 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=7820874641606664941&livemode=1&stbId=4", 285 | "tvg-name" => "NewTV怡伴健康", 286 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjiankang.jpg", 287 | "group-title" => "NewTV" 288 | ], 289 | [ 290 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=7151256057701199617&livemode=1&stbId=4", 291 | "tvg-name" => "NewTV惊悚悬疑", 292 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjingsong.jpg", 293 | "group-title" => "NewTV" 294 | ], 295 | [ 296 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000004000019008&livemode=1&stbId=4", 297 | "tvg-name" => "NewTV明星大片", 298 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvdapian.jpg", 299 | "group-title" => "NewTV" 300 | ], 301 | [ 302 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=bokesen&livemode=1&stbId=4", 303 | "tvg-name" => "NewTV武搏世界", 304 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvboji.jpg", 305 | "group-title" => "NewTV" 306 | ], 307 | [ 308 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=7681593242002292003&livemode=1&stbId=4", 309 | "tvg-name" => "NewTV海外剧场", 310 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvhaiwai.jpg", 311 | "group-title" => "NewTV" 312 | ], 313 | [ 314 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6516734029835465177&livemode=1&stbId=4", 315 | "tvg-name" => "NewTV潮妈辣婆", 316 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvlama.jpg", 317 | "group-title" => "NewTV" 318 | ], 319 | [ 320 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000000515&livemode=1&stbId=4", 321 | "tvg-name" => "NewTV炫舞未来", 322 | "tvg-logo" => "", 323 | "group-title" => "NewTV" 324 | ], 325 | [ 326 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=8393829412396288037&livemode=1&stbId=4", 327 | "tvg-name" => "NewTV爱情喜剧", 328 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvxiju.jpg", 329 | "group-title" => "NewTV" 330 | ], 331 | [ 332 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6460382139625130259&livemode=1&stbId=4", 333 | "tvg-name" => "NewTV精品体育", 334 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvjpty.jpg", 335 | "group-title" => "NewTV" 336 | ], 337 | [ 338 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=7882297361445410858&livemode=1&stbId=4", 339 | "tvg-name" => "NewTV精品大剧", 340 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvdaju.jpg", 341 | "group-title" => "NewTV" 342 | ], 343 | [ 344 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6298506997017621594&livemode=1&stbId=4", 345 | "tvg-name" => "NewTV精品纪录", 346 | "tvg-logo" => "", 347 | "group-title" => "NewTV" 348 | ], 349 | [ 350 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000009204&livemode=1&stbId=4", 351 | "tvg-name" => "NewTV超级体育", 352 | "tvg-logo" => "", 353 | "group-title" => "NewTV" 354 | ], 355 | [ 356 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000012884&livemode=1&stbId=4", 357 | "tvg-name" => "NewTV超级电影", 358 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvdianying.jpg", 359 | "group-title" => "NewTV" 360 | ], 361 | [ 362 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000008139&livemode=1&stbId=4", 363 | "tvg-name" => "NewTV超级电视剧", 364 | "tvg-logo" => "", 365 | "group-title" => "NewTV" 366 | ], 367 | [ 368 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000025771&livemode=1&stbId=4", 369 | "tvg-name" => "NewTV超级综艺", 370 | "tvg-logo" => "http://www.tvyan.com/uploads/dianshi/newtvzongyi.jpg", 371 | "group-title" => "NewTV" 372 | ], 373 | [ 374 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=6399725674632152632&livemode=1&stbId=4", 375 | "tvg-name" => "NewTV金牌综艺", 376 | "tvg-logo" => "", 377 | "group-title" => "NewTV" 378 | ], 379 | [ 380 | "url" => "http://gslbserv.itv.cmvideo.cn/index.m3u8?channel-id=ystenlive&Contentid=1000000001000006197&livemode=1&stbId=4", 381 | "tvg-name" => "NewTV魅力潇湘", 382 | "tvg-logo" => "", 383 | "group-title" => "NewTV" 384 | ] 385 | ]; -------------------------------------------------------------------------------- /data/ysp.php: -------------------------------------------------------------------------------- 1 | 2000210103, "tvg-name" => "CCTV1"], 8 | ["vid" => 2000203603, "tvg-name" => "CCTV2"], 9 | ["vid" => 2000203803, "tvg-name" => "CCTV3"], 10 | ["vid" => 2000204803, "tvg-name" => "CCTV4"], 11 | ["vid" => 2000205103, "tvg-name" => "CCTV5"], 12 | ["vid" => 2000204503, "tvg-name" => "CCTV5+"], 13 | ["vid" => 2000203303, "tvg-name" => "CCTV6"], 14 | ["vid" => 2000510003, "tvg-name" => "CCTV7"], 15 | ["vid" => 2000203903, "tvg-name" => "CCTV8"], 16 | ["vid" => 2000499403, "tvg-name" => "CCTV9"], 17 | ["vid" => 2000203503, "tvg-name" => "CCTV10"], 18 | ["vid" => 2000204103, "tvg-name" => "CCTV11"], 19 | ["vid" => 2000202603, "tvg-name" => "CCTV12"], 20 | ["vid" => 2000204603, "tvg-name" => "CCTV13"], 21 | ["vid" => 2000204403, "tvg-name" => "CCTV14"], 22 | ["vid" => 2000205003, "tvg-name" => "CCTV15"], 23 | ["vid" => 2000204203, "tvg-name" => "CCTV17"], 24 | ["vid" => 2000266303, "tvg-name" => "CCTV4K"], 25 | ["vid" => 2001656803, "tvg-name" => "CGTN"], 26 | ["vid" => 2000296203, "tvg-name" => "湖南卫视"], 27 | ["vid" => 2000295503, "tvg-name" => "浙江卫视"], 28 | ["vid" => 2000295603, "tvg-name" => "江苏卫视"], 29 | ["vid" => 2000292403, "tvg-name" => "东方卫视"], 30 | ["vid" => 2000294803, "tvg-name" => "山东卫视"], 31 | ["vid" => 2000272103, "tvg-name" => "北京卫视"], 32 | ["vid" => 2000281303, "tvg-name" => "辽宁卫视"], 33 | ["vid" => 2000293903, "tvg-name" => "黑龙江卫视"], 34 | ["vid" => 2000292703, "tvg-name" => "广东卫视"], 35 | ["vid" => 2000298003, "tvg-name" => "安徽卫视"], 36 | ["vid" => 2000292203, "tvg-name" => "深圳卫视"], 37 | ["vid" => 2000295103, "tvg-name" => "天津卫视"], 38 | ["vid" => 2000297803, "tvg-name" => "重庆卫视"], 39 | ["vid" => 2000292503, "tvg-name" => "东南卫视"], 40 | ["vid" => 2000294203, "tvg-name" => "广西卫视"], 41 | ["vid" => 2000293403, "tvg-name" => "河北卫视"], 42 | ["vid" => 2000296103, "tvg-name" => "河南卫视"], 43 | ["vid" => 2000294503, "tvg-name" => "湖北卫视"], 44 | ["vid" => 2000294103, "tvg-name" => "江西卫视"], 45 | ["vid" => 2000284703, "tvg-name" => "吉林卫视"], 46 | // ["vid" => 2000297703, "tvg-name" => "山西卫视"], 47 | ["vid" => 2000294403, "tvg-name" => "陕西卫视"], 48 | ["vid" => 2000294603, "tvg-name" => "甘肃卫视"], 49 | ["vid" => 2000295003, "tvg-name" => "四川卫视"], 50 | // ["vid" => 2000295403, "tvg-name" => "云南卫视"], 51 | ["vid" => 2000293303, "tvg-name" => "贵州卫视"], 52 | ["vid" => 2000291503, "tvg-name" => "旅游卫视"], // 海南卫视 53 | ["vid" => 2000294703, "tvg-name" => "青海卫视"] 54 | ]; -------------------------------------------------------------------------------- /dist/china_mobile.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U url-tvg="http://epg.51zmt.top:8000/e.xml.gz" 2 | #EXTINF:-1 tvg-id="1" tvg-name="CCTV1" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV1.png" group-title="央视", CCTV-1综合 3 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226226/1.m3u8 4 | #EXTINF:-1 tvg-id="2" tvg-name="CCTV2" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV2.png" group-title="央视", CCTV-2财经 5 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226230/1.m3u8 6 | #EXTINF:-1 tvg-id="3" tvg-name="CCTV3" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV3.png" group-title="央视", CCTV-3综艺 7 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225606/1.m3u8 8 | #EXTINF:-1 tvg-id="4" tvg-name="CCTV4" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV4.png" group-title="央视", CCTV-4中文国际 9 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226314/1.m3u8 10 | #EXTINF:-1 tvg-id="5" tvg-name="CCTV5" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV5.png" group-title="央视", CCTV-5体育 11 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225591/1.m3u8 12 | #EXTINF:-1 tvg-id="6" tvg-name="CCTV5+" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV5+.png" group-title="央视", CCTV-5+体育赛事 13 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226225/1.m3u8 14 | #EXTINF:-1 tvg-id="7" tvg-name="CCTV6" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV6.png" group-title="央视", CCTV-6电影 15 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225607/1.m3u8 16 | #EXTINF:-1 tvg-id="8" tvg-name="CCTV7" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV7.png" group-title="央视", CCTV-7国防军事 17 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226234/1.m3u8 18 | #EXTINF:-1 tvg-id="9" tvg-name="CCTV8" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV8.png" group-title="央视", CCTV-8电视剧 19 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225608/1.m3u8 20 | #EXTINF:-1 tvg-id="10" tvg-name="CCTV9" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV9.png" group-title="央视", CCTV-9纪录 21 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226236/1.m3u8 22 | #EXTINF:-1 tvg-id="11" tvg-name="CCTV10" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV10.png" group-title="央视", CCTV-10科教 23 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226227/1.m3u8 24 | #EXTINF:-1 tvg-id="12" tvg-name="CCTV11" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV11.png" group-title="央视", CCTV-11戏曲 25 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226315/1.m3u8 26 | #EXTINF:-1 tvg-id="13" tvg-name="CCTV12" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV12.png" group-title="央视", CCTV-12社会与法 27 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226228/1.m3u8 28 | #EXTINF:-1 tvg-id="14" tvg-name="CCTV13" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV13.png" group-title="央视", CCTV-13新闻 29 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225599/1.m3u8 30 | #EXTINF:-1 tvg-id="15" tvg-name="CCTV14" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV14.png" group-title="央视", CCTV-14少儿 31 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226229/1.m3u8 32 | #EXTINF:-1 tvg-id="16" tvg-name="CCTV15" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV15.png" group-title="央视", CCTV-15音乐 33 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226333/1.m3u8 34 | #EXTINF:-1 tvg-id="17" tvg-name="CCTV17" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV17.png" group-title="央视", CCTV-17农村农业 35 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226318/1.m3u8 36 | #EXTINF:-1 tvg-id="20" tvg-name="CGTN" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/cgtn.png" group-title="央视", CGTN 37 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225867/1.m3u8 38 | #EXTINF:-1 tvg-id="" tvg-name="CGTN记录" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/cgtn.png" group-title="央视", CGTN记录 39 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225866/1.m3u8 40 | #EXTINF:-1 tvg-id="27" tvg-name="湖南卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/hunan.png" group-title="卫视", 湖南卫视 41 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226241/1.m3u8 42 | #EXTINF:-1 tvg-id="28" tvg-name="浙江卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/zhejiang.png" group-title="卫视", 浙江卫视 43 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226247/1.m3u8 44 | #EXTINF:-1 tvg-id="29" tvg-name="江苏卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/jiangsu.png" group-title="卫视", 江苏卫视 45 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226242/1.m3u8 46 | #EXTINF:-1 tvg-id="31" tvg-name="东方卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/dongfang.png" group-title="卫视", 东方卫视 47 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226237/1.m3u8 48 | #EXTINF:-1 tvg-id="38" tvg-name="山东卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/shandong.png" group-title="卫视", 山东卫视 49 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226308/1.m3u8 50 | #EXTINF:-1 tvg-id="30" tvg-name="北京卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/beijing.png" group-title="卫视", 北京卫视 51 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226224/1.m3u8 52 | #EXTINF:-1 tvg-id="36" tvg-name="辽宁卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/liaoning.png" group-title="卫视", 辽宁卫视 53 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226336/1.m3u8 54 | #EXTINF:-1 tvg-id="46" tvg-name="黑龙江卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/heilongjiang.png" group-title="卫视", 黑龙江卫视 55 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226239/1.m3u8 56 | #EXTINF:-1 tvg-id="33" tvg-name="广东卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/guangdong.png" group-title="卫视", 广东卫视 57 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226238/1.m3u8 58 | #EXTINF:-1 tvg-id="32" tvg-name="安徽卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/anhui.png" group-title="卫视", 安徽卫视 59 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226223/1.m3u8 60 | #EXTINF:-1 tvg-id="34" tvg-name="深圳卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/shenzhen.png" group-title="卫视", 深圳卫视 61 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226245/1.m3u8 62 | #EXTINF:-1 tvg-id="39" tvg-name="天津卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/tianjin.png" group-title="卫视", 天津卫视 63 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226246/1.m3u8 64 | #EXTINF:-1 tvg-id="40" tvg-name="重庆卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/chongqing.png" group-title="卫视", 重庆卫视 65 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226337/1.m3u8 66 | #EXTINF:-1 tvg-id="41" tvg-name="东南卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/dongnan.png" group-title="卫视", 东南卫视 67 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225876/1.m3u8 68 | #EXTINF:-1 tvg-id="43" tvg-name="广西卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/guangxi.png" group-title="卫视", 广西卫视 69 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225879/1.m3u8 70 | #EXTINF:-1 tvg-id="45" tvg-name="河北卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/hebei.png" group-title="卫视", 河北卫视 71 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225881/1.m3u8 72 | #EXTINF:-1 tvg-id="47" tvg-name="河南卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/henan.png" group-title="卫视", 河南卫视 73 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225882/1.m3u8 74 | #EXTINF:-1 tvg-id="48" tvg-name="湖北卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/hubei.png" group-title="卫视", 湖北卫视 75 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226310/1.m3u8 76 | #EXTINF:-1 tvg-id="50" tvg-name="江西卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/jiangxi.png" group-title="卫视", 江西卫视 77 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226243/1.m3u8 78 | #EXTINF:-1 tvg-id="51" tvg-name="吉林卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/jilin.png" group-title="卫视", 吉林卫视 79 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225886/1.m3u8 80 | #EXTINF:-1 tvg-id="54" tvg-name="山西卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/shanxi_.png" group-title="卫视", 山西卫视 81 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225895/1.m3u8 82 | #EXTINF:-1 tvg-id="55" tvg-name="陕西卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/shanxi.png" group-title="卫视", 陕西卫视 83 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225896/1.m3u8 84 | #EXTINF:-1 tvg-id="42" tvg-name="甘肃卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/gansu.png" group-title="卫视", 甘肃卫视 85 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225877/1.m3u8 86 | #EXTINF:-1 tvg-id="56" tvg-name="四川卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/sichuan.png" group-title="卫视", 四川卫视 87 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225898/1.m3u8 88 | #EXTINF:-1 tvg-id="58" tvg-name="云南卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/yunnan.png" group-title="卫视", 云南卫视 89 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225902/1.m3u8 90 | #EXTINF:-1 tvg-id="44" tvg-name="贵州卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/guizhou.png" group-title="卫视", 贵州卫视 91 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225880/1.m3u8 92 | #EXTINF:-1 tvg-id="37" tvg-name="旅游卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/lvyou.png" group-title="卫视", 海南卫视 93 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225890/1.m3u8 94 | #EXTINF:-1 tvg-id="53" tvg-name="宁夏卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/ningxia.png" group-title="卫视", 宁夏卫视 95 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225892/1.m3u8 96 | #EXTINF:-1 tvg-id="59" tvg-name="青海卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/qinghai.png" group-title="卫视", 青海卫视 97 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225893/1.m3u8 98 | #EXTINF:-1 tvg-id="52" tvg-name="内蒙古卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/neimeng.png" group-title="卫视", 内蒙古卫视 99 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225891/1.m3u8 100 | #EXTINF:-1 tvg-id="71" tvg-name="西藏卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/xizang.png" group-title="卫视", 西藏卫视 101 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225900/1.m3u8 102 | #EXTINF:-1 tvg-id="57" tvg-name="新疆卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/xinjiang.png" group-title="卫视", 新疆卫视 103 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225901/1.m3u8 104 | #EXTINF:-1 tvg-id="141" tvg-name="凤凰中文" tvg-logo="http://epg.51zmt.top:8000/tb1/gt/fenghuangzhongwen.png" group-title="卫视", 凤凰卫视中文台 105 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225942/1.m3u8 106 | #EXTINF:-1 tvg-id="142" tvg-name="凤凰资讯" tvg-logo="http://epg.51zmt.top:8000/tb1/gt/fenghuangzixun.png" group-title="卫视", 凤凰卫视资讯台 107 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225949/1.m3u8 108 | #EXTINF:-1 tvg-id="1046" tvg-name="优漫卡通" tvg-logo="http://epg.51zmt.top:8000/tb1/qt/youman.png" group-title="卫视", 优漫卡通 109 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225910/1.m3u8 110 | #EXTINF:-1 tvg-id="69" tvg-name="金鹰卡通" tvg-logo="http://epg.51zmt.top:8000/tb1/qt/jinyingkatong.png" group-title="卫视", 金鹰卡通 111 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225906/1.m3u8 112 | #EXTINF:-1 tvg-id="" tvg-name="黑莓动画" tvg-logo="" group-title="卫视", 黑莓动画 113 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225914/1.m3u8 114 | #EXTINF:-1 tvg-id="" tvg-name="黑莓电竞" tvg-logo="" group-title="卫视", 黑莓电竞 115 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225931/1.m3u8 116 | #EXTINF:-1 tvg-id="" tvg-name="黑莓电影" tvg-logo="" group-title="卫视", 黑莓电影 117 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225927/1.m3u8 118 | #EXTINF:-1 tvg-id="73" tvg-name="中国教育1台" tvg-logo="http://epg.51zmt.top:8000/tb1/qt/中国教育1台.png" group-title="卫视", 教育1台 119 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225905/1.m3u8 120 | #EXTINF:-1 tvg-id="" tvg-name="山东教育卫视" tvg-logo="" group-title="卫视", 山东教育卫视 121 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225908/1.m3u8 122 | #EXTINF:-1 tvg-id="" tvg-name="NewTV超级电影" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvdianying.jpg" group-title="NewTV", NewTV超级电影 123 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226233/1.m3u8 124 | #EXTINF:-1 tvg-id="" tvg-name="NewTV超级综艺" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvzongyi.jpg" group-title="NewTV", NewTV超级综艺 125 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226231/1.m3u8 126 | #EXTINF:-1 tvg-id="" tvg-name="NewTV超级体育" tvg-logo="" group-title="NewTV", NewTV超级体育 127 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226232/1.m3u8 128 | #EXTINF:-1 tvg-id="" tvg-name="NewTV超级电视剧" tvg-logo="" group-title="NewTV", NewTV超级电视剧 129 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225864/1.m3u8 130 | #EXTINF:-1 tvg-id="" tvg-name="NewTV中国功夫" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvgongfu.jpg" group-title="NewTV", NewTV中国功夫 131 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226298/1.m3u8 132 | #EXTINF:-1 tvg-id="" tvg-name="NewTV金牌综艺" tvg-logo="" group-title="NewTV", NewTV金牌综艺 133 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226296/1.m3u8 134 | #EXTINF:-1 tvg-id="" tvg-name="NewTV农业致富" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvnongye.jpg" group-title="NewTV", NewTV农业致富 135 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226304/1.m3u8 136 | #EXTINF:-1 tvg-id="" tvg-name="NewTV潮妈辣婆" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvlama.jpg" group-title="NewTV", NewTV潮妈辣婆 137 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226286/1.m3u8 138 | #EXTINF:-1 tvg-id="" tvg-name="NewTV炫舞未来" tvg-logo="" group-title="NewTV", NewTV炫舞未来 139 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226248/1.m3u8 140 | #EXTINF:-1 tvg-id="" tvg-name="NewTV明星大片" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvdapian.jpg" group-title="NewTV", NewTV明星大片 141 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226295/1.m3u8 142 | #EXTINF:-1 tvg-id="" tvg-name="NewTV武博世界" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvboji.jpg" group-title="NewTV", NewTV武博世界 143 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226297/1.m3u8 144 | #EXTINF:-1 tvg-id="" tvg-name="NewTV海外综合" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvhaiwai.jpg" group-title="NewTV", NewTV海外综合 145 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226302/1.m3u8 146 | #EXTINF:-1 tvg-id="" tvg-name="NewTV惊悚悬疑" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjingsong.jpg" group-title="NewTV", NewTV惊悚悬疑 147 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226294/1.m3u8 148 | #EXTINF:-1 tvg-id="" tvg-name="NewTV爱情喜剧" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvxiju.jpg" group-title="NewTV", NewTV爱情喜剧 149 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226299/1.m3u8 150 | #EXTINF:-1 tvg-id="" tvg-name="NewTV精品记录" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjilu.jpg" group-title="NewTV", NewTV精品记录 151 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226293/1.m3u8 152 | #EXTINF:-1 tvg-id="" tvg-name="NewTV精品体育" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjpty.jpg" group-title="NewTV", NewTV精品体育 153 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226328/1.m3u8 154 | #EXTINF:-1 tvg-id="" tvg-name="NewTV精品大剧" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvdaju.jpg" group-title="NewTV", NewTV精品大剧 155 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226331/1.m3u8 156 | #EXTINF:-1 tvg-id="" tvg-name="NewTV古装剧场" tvg-logo="" group-title="NewTV", NewTV古装剧场 157 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226323/1.m3u8 158 | #EXTINF:-1 tvg-id="" tvg-name="NewTV军旅剧场" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjunlv.jpg" group-title="NewTV", NewTV军旅剧场 159 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226324/1.m3u8 160 | #EXTINF:-1 tvg-id="" tvg-name="NewTV军事评论" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjspl.jpg" group-title="NewTV", NewTV军事评论 161 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226326/1.m3u8 162 | #EXTINF:-1 tvg-id="" tvg-name="NewTV怡伴健康" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjiankang.jpg" group-title="NewTV", NewTV怡伴健康 163 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225919/1.m3u8 164 | #EXTINF:-1 tvg-id="" tvg-name="NewTV家庭剧场" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjiating.jpg" group-title="NewTV", NewTV家庭剧场 165 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225918/1.m3u8 166 | #EXTINF:-1 tvg-id="" tvg-name="NewTV动作电影" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvdongzuo.jpg" group-title="NewTV", NewTV动作电影 167 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226288/1.m3u8 168 | -------------------------------------------------------------------------------- /dist/cmvideo.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U url-tvg="http://epg.51zmt.top:8000/e.xml.gz" 2 | #EXTINF:-1 tvg-id="" tvg-name="" tvg-logo="" group-title="URL 已更改", URL 更改请填写新的 URL 3 | http://58.251.112.67/tlivecloud-cdn.ysp.cctv.cn/001/2000210103.m3u8 4 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | README 6 | 7 | 10 | 11 | 12 |

iptv

13 |

iptv 国内视频源

14 |

视频源地址·推荐 (已内置 EPG)(国内 gitee)

15 | 21 |

EPG 地址

22 |
> M3U 视频源已内置 EPG,此地址仅提供给不支持内置 EPG 源的 IPTV 客户端使用
23 |

http://epg.51zmt.top:8000/e.xml.gz

24 |

央视频 URI 来源项目

25 | 34 |

生成新的 m3u 文件

35 |
composer install
36 | php ./bin/iptv.php
37 | 38 | 39 | -------------------------------------------------------------------------------- /dist/iptv.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U url-tvg="http://epg.51zmt.top:8000/e.xml.gz" 2 | #EXTINF:-1 tvg-id="1" tvg-name="CCTV1" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV1.png" group-title="移动·央视", CCTV-1综合 3 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226226/1.m3u8 4 | #EXTINF:-1 tvg-id="2" tvg-name="CCTV2" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV2.png" group-title="移动·央视", CCTV-2财经 5 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226230/1.m3u8 6 | #EXTINF:-1 tvg-id="3" tvg-name="CCTV3" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV3.png" group-title="移动·央视", CCTV-3综艺 7 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225606/1.m3u8 8 | #EXTINF:-1 tvg-id="4" tvg-name="CCTV4" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV4.png" group-title="移动·央视", CCTV-4中文国际 9 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226314/1.m3u8 10 | #EXTINF:-1 tvg-id="5" tvg-name="CCTV5" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV5.png" group-title="移动·央视", CCTV-5体育 11 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225591/1.m3u8 12 | #EXTINF:-1 tvg-id="6" tvg-name="CCTV5+" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV5+.png" group-title="移动·央视", CCTV-5+体育赛事 13 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226225/1.m3u8 14 | #EXTINF:-1 tvg-id="7" tvg-name="CCTV6" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV6.png" group-title="移动·央视", CCTV-6电影 15 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225607/1.m3u8 16 | #EXTINF:-1 tvg-id="8" tvg-name="CCTV7" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV7.png" group-title="移动·央视", CCTV-7国防军事 17 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226234/1.m3u8 18 | #EXTINF:-1 tvg-id="9" tvg-name="CCTV8" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV8.png" group-title="移动·央视", CCTV-8电视剧 19 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225608/1.m3u8 20 | #EXTINF:-1 tvg-id="10" tvg-name="CCTV9" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV9.png" group-title="移动·央视", CCTV-9纪录 21 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226236/1.m3u8 22 | #EXTINF:-1 tvg-id="11" tvg-name="CCTV10" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV10.png" group-title="移动·央视", CCTV-10科教 23 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226227/1.m3u8 24 | #EXTINF:-1 tvg-id="12" tvg-name="CCTV11" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV11.png" group-title="移动·央视", CCTV-11戏曲 25 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226315/1.m3u8 26 | #EXTINF:-1 tvg-id="13" tvg-name="CCTV12" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV12.png" group-title="移动·央视", CCTV-12社会与法 27 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226228/1.m3u8 28 | #EXTINF:-1 tvg-id="14" tvg-name="CCTV13" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV13.png" group-title="移动·央视", CCTV-13新闻 29 | http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225599/1.m3u8 30 | #EXTINF:-1 tvg-id="15" tvg-name="CCTV14" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV14.png" group-title="移动·央视", CCTV-14少儿 31 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226229/1.m3u8 32 | #EXTINF:-1 tvg-id="16" tvg-name="CCTV15" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV15.png" group-title="移动·央视", CCTV-15音乐 33 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226333/1.m3u8 34 | #EXTINF:-1 tvg-id="17" tvg-name="CCTV17" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/CCTV17.png" group-title="移动·央视", CCTV-17农村农业 35 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226318/1.m3u8 36 | #EXTINF:-1 tvg-id="20" tvg-name="CGTN" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/cgtn.png" group-title="移动·央视", CGTN 37 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225867/1.m3u8 38 | #EXTINF:-1 tvg-id="" tvg-name="CGTN记录" tvg-logo="http://epg.51zmt.top:8000/tb1/CCTV/cgtn.png" group-title="移动·央视", CGTN记录 39 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225866/1.m3u8 40 | #EXTINF:-1 tvg-id="27" tvg-name="湖南卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/hunan.png" group-title="移动·卫视", 湖南卫视 41 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226241/1.m3u8 42 | #EXTINF:-1 tvg-id="28" tvg-name="浙江卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/zhejiang.png" group-title="移动·卫视", 浙江卫视 43 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226247/1.m3u8 44 | #EXTINF:-1 tvg-id="29" tvg-name="江苏卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/jiangsu.png" group-title="移动·卫视", 江苏卫视 45 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226242/1.m3u8 46 | #EXTINF:-1 tvg-id="31" tvg-name="东方卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/dongfang.png" group-title="移动·卫视", 东方卫视 47 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226237/1.m3u8 48 | #EXTINF:-1 tvg-id="38" tvg-name="山东卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/shandong.png" group-title="移动·卫视", 山东卫视 49 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226308/1.m3u8 50 | #EXTINF:-1 tvg-id="30" tvg-name="北京卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/beijing.png" group-title="移动·卫视", 北京卫视 51 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226224/1.m3u8 52 | #EXTINF:-1 tvg-id="36" tvg-name="辽宁卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/liaoning.png" group-title="移动·卫视", 辽宁卫视 53 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226336/1.m3u8 54 | #EXTINF:-1 tvg-id="46" tvg-name="黑龙江卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/heilongjiang.png" group-title="移动·卫视", 黑龙江卫视 55 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226239/1.m3u8 56 | #EXTINF:-1 tvg-id="33" tvg-name="广东卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/guangdong.png" group-title="移动·卫视", 广东卫视 57 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226238/1.m3u8 58 | #EXTINF:-1 tvg-id="32" tvg-name="安徽卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/anhui.png" group-title="移动·卫视", 安徽卫视 59 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226223/1.m3u8 60 | #EXTINF:-1 tvg-id="34" tvg-name="深圳卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/shenzhen.png" group-title="移动·卫视", 深圳卫视 61 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226245/1.m3u8 62 | #EXTINF:-1 tvg-id="39" tvg-name="天津卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/tianjin.png" group-title="移动·卫视", 天津卫视 63 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226246/1.m3u8 64 | #EXTINF:-1 tvg-id="40" tvg-name="重庆卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/chongqing.png" group-title="移动·卫视", 重庆卫视 65 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226337/1.m3u8 66 | #EXTINF:-1 tvg-id="41" tvg-name="东南卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/dongnan.png" group-title="移动·卫视", 东南卫视 67 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225876/1.m3u8 68 | #EXTINF:-1 tvg-id="43" tvg-name="广西卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/guangxi.png" group-title="移动·卫视", 广西卫视 69 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225879/1.m3u8 70 | #EXTINF:-1 tvg-id="45" tvg-name="河北卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/hebei.png" group-title="移动·卫视", 河北卫视 71 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225881/1.m3u8 72 | #EXTINF:-1 tvg-id="47" tvg-name="河南卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/henan.png" group-title="移动·卫视", 河南卫视 73 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225882/1.m3u8 74 | #EXTINF:-1 tvg-id="48" tvg-name="湖北卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/hubei.png" group-title="移动·卫视", 湖北卫视 75 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226310/1.m3u8 76 | #EXTINF:-1 tvg-id="50" tvg-name="江西卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/jiangxi.png" group-title="移动·卫视", 江西卫视 77 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226243/1.m3u8 78 | #EXTINF:-1 tvg-id="51" tvg-name="吉林卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/jilin.png" group-title="移动·卫视", 吉林卫视 79 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225886/1.m3u8 80 | #EXTINF:-1 tvg-id="54" tvg-name="山西卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/shanxi_.png" group-title="移动·卫视", 山西卫视 81 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225895/1.m3u8 82 | #EXTINF:-1 tvg-id="55" tvg-name="陕西卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/shanxi.png" group-title="移动·卫视", 陕西卫视 83 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225896/1.m3u8 84 | #EXTINF:-1 tvg-id="42" tvg-name="甘肃卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/gansu.png" group-title="移动·卫视", 甘肃卫视 85 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225877/1.m3u8 86 | #EXTINF:-1 tvg-id="56" tvg-name="四川卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/sichuan.png" group-title="移动·卫视", 四川卫视 87 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225898/1.m3u8 88 | #EXTINF:-1 tvg-id="58" tvg-name="云南卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/yunnan.png" group-title="移动·卫视", 云南卫视 89 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225902/1.m3u8 90 | #EXTINF:-1 tvg-id="44" tvg-name="贵州卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/guizhou.png" group-title="移动·卫视", 贵州卫视 91 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225880/1.m3u8 92 | #EXTINF:-1 tvg-id="37" tvg-name="旅游卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/lvyou.png" group-title="移动·卫视", 海南卫视 93 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225890/1.m3u8 94 | #EXTINF:-1 tvg-id="53" tvg-name="宁夏卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/ningxia.png" group-title="移动·卫视", 宁夏卫视 95 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225892/1.m3u8 96 | #EXTINF:-1 tvg-id="59" tvg-name="青海卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/qinghai.png" group-title="移动·卫视", 青海卫视 97 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225893/1.m3u8 98 | #EXTINF:-1 tvg-id="52" tvg-name="内蒙古卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/neimeng.png" group-title="移动·卫视", 内蒙古卫视 99 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225891/1.m3u8 100 | #EXTINF:-1 tvg-id="71" tvg-name="西藏卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/xizang.png" group-title="移动·卫视", 西藏卫视 101 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225900/1.m3u8 102 | #EXTINF:-1 tvg-id="57" tvg-name="新疆卫视" tvg-logo="http://epg.51zmt.top:8000/tb1/ws/xinjiang.png" group-title="移动·卫视", 新疆卫视 103 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225901/1.m3u8 104 | #EXTINF:-1 tvg-id="141" tvg-name="凤凰中文" tvg-logo="http://epg.51zmt.top:8000/tb1/gt/fenghuangzhongwen.png" group-title="移动·卫视", 凤凰卫视中文台 105 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225942/1.m3u8 106 | #EXTINF:-1 tvg-id="142" tvg-name="凤凰资讯" tvg-logo="http://epg.51zmt.top:8000/tb1/gt/fenghuangzixun.png" group-title="移动·卫视", 凤凰卫视资讯台 107 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225949/1.m3u8 108 | #EXTINF:-1 tvg-id="1046" tvg-name="优漫卡通" tvg-logo="http://epg.51zmt.top:8000/tb1/qt/youman.png" group-title="移动·卫视", 优漫卡通 109 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225910/1.m3u8 110 | #EXTINF:-1 tvg-id="69" tvg-name="金鹰卡通" tvg-logo="http://epg.51zmt.top:8000/tb1/qt/jinyingkatong.png" group-title="移动·卫视", 金鹰卡通 111 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225906/1.m3u8 112 | #EXTINF:-1 tvg-id="" tvg-name="黑莓动画" tvg-logo="" group-title="移动·卫视", 黑莓动画 113 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225914/1.m3u8 114 | #EXTINF:-1 tvg-id="" tvg-name="黑莓电竞" tvg-logo="" group-title="移动·卫视", 黑莓电竞 115 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225931/1.m3u8 116 | #EXTINF:-1 tvg-id="" tvg-name="黑莓电影" tvg-logo="" group-title="移动·卫视", 黑莓电影 117 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225927/1.m3u8 118 | #EXTINF:-1 tvg-id="73" tvg-name="中国教育1台" tvg-logo="http://epg.51zmt.top:8000/tb1/qt/中国教育1台.png" group-title="移动·卫视", 教育1台 119 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225905/1.m3u8 120 | #EXTINF:-1 tvg-id="" tvg-name="山东教育卫视" tvg-logo="" group-title="移动·卫视", 山东教育卫视 121 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225908/1.m3u8 122 | #EXTINF:-1 tvg-id="" tvg-name="NewTV超级电影" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvdianying.jpg" group-title="移动·NewTV", NewTV超级电影 123 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226233/1.m3u8 124 | #EXTINF:-1 tvg-id="" tvg-name="NewTV超级综艺" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvzongyi.jpg" group-title="移动·NewTV", NewTV超级综艺 125 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226231/1.m3u8 126 | #EXTINF:-1 tvg-id="" tvg-name="NewTV超级体育" tvg-logo="" group-title="移动·NewTV", NewTV超级体育 127 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226232/1.m3u8 128 | #EXTINF:-1 tvg-id="" tvg-name="NewTV超级电视剧" tvg-logo="" group-title="移动·NewTV", NewTV超级电视剧 129 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225864/1.m3u8 130 | #EXTINF:-1 tvg-id="" tvg-name="NewTV中国功夫" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvgongfu.jpg" group-title="移动·NewTV", NewTV中国功夫 131 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226298/1.m3u8 132 | #EXTINF:-1 tvg-id="" tvg-name="NewTV金牌综艺" tvg-logo="" group-title="移动·NewTV", NewTV金牌综艺 133 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226296/1.m3u8 134 | #EXTINF:-1 tvg-id="" tvg-name="NewTV农业致富" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvnongye.jpg" group-title="移动·NewTV", NewTV农业致富 135 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226304/1.m3u8 136 | #EXTINF:-1 tvg-id="" tvg-name="NewTV潮妈辣婆" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvlama.jpg" group-title="移动·NewTV", NewTV潮妈辣婆 137 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226286/1.m3u8 138 | #EXTINF:-1 tvg-id="" tvg-name="NewTV炫舞未来" tvg-logo="" group-title="移动·NewTV", NewTV炫舞未来 139 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226248/1.m3u8 140 | #EXTINF:-1 tvg-id="" tvg-name="NewTV明星大片" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvdapian.jpg" group-title="移动·NewTV", NewTV明星大片 141 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226295/1.m3u8 142 | #EXTINF:-1 tvg-id="" tvg-name="NewTV武博世界" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvboji.jpg" group-title="移动·NewTV", NewTV武博世界 143 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226297/1.m3u8 144 | #EXTINF:-1 tvg-id="" tvg-name="NewTV海外综合" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvhaiwai.jpg" group-title="移动·NewTV", NewTV海外综合 145 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226302/1.m3u8 146 | #EXTINF:-1 tvg-id="" tvg-name="NewTV惊悚悬疑" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjingsong.jpg" group-title="移动·NewTV", NewTV惊悚悬疑 147 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226294/1.m3u8 148 | #EXTINF:-1 tvg-id="" tvg-name="NewTV爱情喜剧" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvxiju.jpg" group-title="移动·NewTV", NewTV爱情喜剧 149 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226299/1.m3u8 150 | #EXTINF:-1 tvg-id="" tvg-name="NewTV精品记录" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjilu.jpg" group-title="移动·NewTV", NewTV精品记录 151 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226293/1.m3u8 152 | #EXTINF:-1 tvg-id="" tvg-name="NewTV精品体育" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjpty.jpg" group-title="移动·NewTV", NewTV精品体育 153 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226328/1.m3u8 154 | #EXTINF:-1 tvg-id="" tvg-name="NewTV精品大剧" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvdaju.jpg" group-title="移动·NewTV", NewTV精品大剧 155 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226331/1.m3u8 156 | #EXTINF:-1 tvg-id="" tvg-name="NewTV古装剧场" tvg-logo="" group-title="移动·NewTV", NewTV古装剧场 157 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226323/1.m3u8 158 | #EXTINF:-1 tvg-id="" tvg-name="NewTV军旅剧场" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjunlv.jpg" group-title="移动·NewTV", NewTV军旅剧场 159 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226324/1.m3u8 160 | #EXTINF:-1 tvg-id="" tvg-name="NewTV军事评论" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjspl.jpg" group-title="移动·NewTV", NewTV军事评论 161 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226326/1.m3u8 162 | #EXTINF:-1 tvg-id="" tvg-name="NewTV怡伴健康" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjiankang.jpg" group-title="移动·NewTV", NewTV怡伴健康 163 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225919/1.m3u8 164 | #EXTINF:-1 tvg-id="" tvg-name="NewTV家庭剧场" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvjiating.jpg" group-title="移动·NewTV", NewTV家庭剧场 165 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221225918/1.m3u8 166 | #EXTINF:-1 tvg-id="" tvg-name="NewTV动作电影" tvg-logo="http://www.tvyan.com/uploads/dianshi/newtvdongzuo.jpg" group-title="移动·NewTV", NewTV动作电影 167 | http://otttv.bj.chinamobile.com/PLTV/88888888/224/3221226288/1.m3u8 168 | -------------------------------------------------------------------------------- /dist/ysp.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U url-tvg="http://epg.51zmt.top:8000/e.xml.gz" 2 | #EXTINF:-1 tvg-id="" tvg-name="" tvg-logo="" group-title="失效", 源失效等待更新 3 | http://127.0.0.1/1.ts 4 | -------------------------------------------------------------------------------- /iptv.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U url-tvg="http://epg.51zmt.top:8000/e.xml.gz" 2 | #EXTINF:-1 tvg-id="" tvg-name="" tvg-logo="" group-title="URL 已更改", URL 更改请填写新的 URL 3 | http://58.251.112.67/tlivecloud-cdn.ysp.cctv.cn/001/2000210103.m3u8 -------------------------------------------------------------------------------- /runtime/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FanchangWang/iptv/8d560f6ffbd70f2bf9bb8cd530309e5cba359929/runtime/.gitkeep -------------------------------------------------------------------------------- /runtime/counter/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /runtime/history/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FanchangWang/iptv/8d560f6ffbd70f2bf9bb8cd530309e5cba359929/runtime/history/.gitkeep -------------------------------------------------------------------------------- /runtime/history/china_mobile.json: -------------------------------------------------------------------------------- 1 | {"url":"http:\/\/otttv.bj.chinamobile.com\/PLTV\/88888888\/224\/3221226226\/1.m3u8","time":1596768279,"date":"2020-08-07 10:44:39"} -------------------------------------------------------------------------------- /runtime/history/cmvideo.json: -------------------------------------------------------------------------------- 1 | {"url":"","time":1596768279,"date":"2020-08-13 16:23:39"} -------------------------------------------------------------------------------- /runtime/history/ysp.json: -------------------------------------------------------------------------------- 1 | {"url":"","time":1600917076,"date":"2020-09-24 11:11:16"} -------------------------------------------------------------------------------- /src/AbstractDriver.php: -------------------------------------------------------------------------------- 1 | init(); 36 | } 37 | 38 | /** 39 | * 初始化执行 40 | */ 41 | abstract protected function init(): void; 42 | 43 | /** 44 | * 获取 m3u 文件正文 45 | * 46 | * @param string $url 47 | * @param string $groupPrefix 48 | * @return string 49 | */ 50 | abstract public function getTvM3uContent(string $url, string $groupPrefix = ''): string; 51 | 52 | 53 | /** 54 | * 初始化驱动列表 55 | * 56 | * @param array $drivers 57 | */ 58 | protected function setDrivers(array $drivers) 59 | { 60 | $this->drivers = $drivers; 61 | } 62 | 63 | /** 64 | * 检查 m3u8 url 是否可用 65 | * 66 | * @param string $url 67 | * @return bool 68 | */ 69 | protected function checkM3u8Url(string $url): bool 70 | { 71 | // 防止重复检测 72 | if (in_array($url, $this->checkedUrl)) { 73 | return false; 74 | } 75 | 76 | $this->checkedUrl[] = $url; 77 | 78 | $response = (new Http()) 79 | ->setUri($url) 80 | ->getResponse(); 81 | return $response && strpos($response->getBody()->__toString(), 'EXTM3U') !== false; 82 | } 83 | 84 | /** 85 | * 生成 m3u 单行 86 | * 87 | * @param string $name 88 | * @param string $url 89 | * @param string $groupTitle 90 | * @param string $tvgName 91 | * @param string $tvgId 92 | * @param string $tvgLogo 93 | * @return string 94 | */ 95 | public function getM3uLine( 96 | string $name, 97 | string $url, 98 | string $groupTitle = '', 99 | string $tvgName = '', 100 | string $tvgId = '', 101 | string $tvgLogo = '' 102 | ): string { 103 | $line = '#EXTINF:-1 tvg-id="%s" tvg-name="%s" tvg-logo="%s" group-title="%s", %s' . PHP_EOL . '%s' . PHP_EOL; 104 | return sprintf($line, $tvgId, $tvgName, $tvgLogo, $groupTitle, $name, $url); 105 | } 106 | 107 | /** 108 | * 检查历史或新获取的 109 | * 110 | * @return array 111 | */ 112 | public function check() 113 | { 114 | $data = [ // 失败,历史未改变 115 | 'state' => false, // 成功或失败 116 | 'change' => false, // 是否发生改变 117 | 'url' => '' // m3u8 url 原url 或 新url 118 | ]; 119 | 120 | $historyM3u8Url = $this->_getHistoryM3u8Url(); 121 | $errCount = $this->_getErrCount(); 122 | 123 | if ($historyM3u8Url && $this->checkM3u8Url($historyM3u8Url)) { // 成功,历史未改变 124 | $data['state'] = true; 125 | $data['change'] = false; 126 | $data['url'] = $historyM3u8Url; 127 | if ($errCount > 0) { // 如果存在历史失败计数,进行清除 128 | $this->_saveErrCount(0); 129 | } 130 | return $data; 131 | } 132 | 133 | if ($url = $this->_checkDriverM3u8Url()) { // 成功,改变了新的 url 134 | $data['state'] = true; 135 | $data['change'] = true; 136 | $data['url'] = $url; 137 | $this->_saveHistory($url); 138 | if ($errCount > 0) { // 如果存在历史失败计数,进行清除 139 | $this->_saveErrCount(0); 140 | } 141 | return $data; 142 | } 143 | 144 | if ($historyM3u8Url) { // 失败,历史已改变 145 | $errCount++; 146 | if ($errCount > $this->maxErrCount) { // 失败计数超过上限 147 | $data['state'] = false; 148 | $data['change'] = true; 149 | $this->_saveHistory(''); 150 | } else { // 失败次数未达到累计数值,暂不进行切换处理 151 | $data['state'] = true; 152 | } 153 | $data['url'] = $historyM3u8Url; 154 | $this->_saveErrCount($errCount); 155 | } 156 | 157 | return $data; 158 | } 159 | 160 | /** 161 | * 获取历史保存 m3u8 url 162 | * 163 | * @return string 164 | */ 165 | private function _getHistoryM3u8Url(): string 166 | { 167 | $path = BASE_PATH . $this->historyJsonPath; 168 | if (is_file($path)) { 169 | $content = @file_get_contents($path); 170 | if ($content) { 171 | $jsonArr = json_decode($content, true); 172 | if (is_array($jsonArr) && isset($jsonArr['url'])) { 173 | return $jsonArr['url']; 174 | } 175 | } 176 | } 177 | return ''; 178 | } 179 | 180 | /** 181 | * 获取历史保存 错误计数 182 | * 183 | * @return int 184 | */ 185 | private function _getErrCount(): int 186 | { 187 | $path = BASE_PATH . $this->errCounterPath; 188 | if (is_file($path)) { 189 | $content = @file_get_contents($path); 190 | if ($content) { 191 | $jsonArr = json_decode($content, true); 192 | if (is_array($jsonArr) && isset($jsonArr['err_count'])) { 193 | return $jsonArr['err_count']; 194 | } 195 | } 196 | } 197 | return 0; 198 | } 199 | 200 | /** 201 | * 保存历史记录 202 | * 203 | * @param string $url 204 | */ 205 | private function _saveHistory(string $url) 206 | { 207 | $time = time(); 208 | $data = [ 209 | 'url' => $url, 210 | 'time' => $time, 211 | 'date' => date('Y-m-d H:i:s', $time) 212 | ]; 213 | file_put_contents(BASE_PATH . $this->historyJsonPath, 214 | json_encode($data, JSON_UNESCAPED_UNICODE)); 215 | } 216 | 217 | /** 218 | * 保存错误计数 219 | * 220 | * @param int $err_count 221 | */ 222 | private function _saveErrCount(int $err_count) 223 | { 224 | $time = time(); 225 | $data = [ 226 | 'err_count' => $err_count, 227 | 'time' => $time 228 | ]; 229 | file_put_contents(BASE_PATH . $this->errCounterPath, 230 | json_encode($data, JSON_UNESCAPED_UNICODE)); 231 | } 232 | 233 | /** 234 | * 检查驱动类获取的 m3u8 url 是否可用 235 | * 236 | * @return bool|string 237 | */ 238 | private function _checkDriverM3u8Url() 239 | { 240 | foreach ($this->drivers as $driverClass) { 241 | /** @var AbstractDriver $class */ 242 | $class = new $driverClass(); 243 | $m3u8Arr = $class->getM3u8Array(); 244 | foreach ($m3u8Arr as $m3u8) { 245 | if ($this->checkM3u8Url($m3u8)) { 246 | return $m3u8; 247 | } 248 | } 249 | unset($class); 250 | } 251 | return false; 252 | } 253 | } -------------------------------------------------------------------------------- /src/App.php: -------------------------------------------------------------------------------- 1 | Ysp::class, 'm3uPath' => YspConstant::M3U_PATH, 32 | 'groupPrefix' => 'ysp', 'groupName' => 'ysp' 33 | ], 34 | // [ 35 | // 'className' => Cmvideo::class, 'm3uPath' => CmvideoConstant::M3U_PATH, 36 | // 'groupPrefix' => 'cmvideo', 'groupName' => 'cmvideo' 37 | // ], 38 | [ 39 | 'className' => ChinaMobile::class, 'm3uPath' => ChinaMobileConstant::M3U_PATH, 40 | 'groupPrefix' => '移动', 'groupName' => 'china_mobile' 41 | ] 42 | ]; 43 | 44 | foreach ($factoryList as $factory) { 45 | /** @var bool $state 检查状态 */ 46 | /** @var bool $change 是否改变 */ 47 | /** @var string $prefixContent 正文详情 */ 48 | extract(self::factory($factory['className'], $factory['m3uPath'], $factory['groupPrefix'], $m3uHead)); 49 | 50 | if ($state && $prefixContent) { 51 | $allContent .= $prefixContent; 52 | } 53 | if ($change) { 54 | $changeList[] = $factory['groupName']; 55 | } 56 | } 57 | 58 | if (!empty($changeList)) { 59 | file_put_contents(BASE_PATH . TvConstant::M3U_PATH, $m3uHead . $allContent); 60 | 61 | static::_pushGit(implode(' & ', $changeList)); 62 | 63 | /** 64 | * @deprecated 2020-08-07 废除旧 path 路径 兼容 65 | */ 66 | } 67 | } 68 | 69 | /** 70 | * m3u 工厂 71 | * 72 | * @param string $className 73 | * @param string $m3uPath 74 | * @param string $groupPrefix 75 | * @param string $m3uHead 76 | * @return array 77 | */ 78 | private static function factory(string $className, string $m3uPath, string $groupPrefix, string $m3uHead) 79 | { 80 | $data = [ 81 | 'change' => false, // 是否改变,无论是否成功 82 | 'state' => false, // 是否成功 83 | 'prefixContent' => '', // 带前缀分组的正文 84 | ]; 85 | 86 | /** @var AbstractTv $class */ 87 | $class = new $className(); 88 | 89 | $result = $class->check(); 90 | 91 | logger()->info("factory prefix {$groupPrefix}", $result); 92 | 93 | /** @var bool $state 检查状态 */ 94 | /** @var bool $change 是否改变 */ 95 | /** @var string $url url详情 */ 96 | extract($result); 97 | 98 | if ($change) { // 发生改变 99 | $data['change'] = true; 100 | if ($state) { // 成功 101 | $content = $class->getTvM3uContent($url); 102 | $prefixContent = $class->getTvM3uContent($url, $groupPrefix); 103 | $data['state'] = true; 104 | $data['prefixContent'] = $prefixContent; 105 | } else { // 失败 106 | $content = $class->getM3uLine('源失效等待更新', 'http://127.0.0.1/1.ts', '失效'); 107 | } 108 | $content = $m3uHead . $content; 109 | file_put_contents(BASE_PATH . $m3uPath, $content); 110 | } else { // 未发生改变 111 | if ($state) { // 成功 // 历史可用 112 | $prefixContent = $class->getTvM3uContent($url, $groupPrefix); 113 | $data['state'] = true; 114 | $data['prefixContent'] = $prefixContent; 115 | } 116 | } 117 | 118 | return $data; 119 | } 120 | 121 | /** 122 | * 推送变更到 github & gitee 123 | */ 124 | private static function _pushGit(string $change = '') 125 | { 126 | exec("git add ."); 127 | exec("git commit -m 'change group {$change}'"); 128 | exec("git push"); 129 | exec("git push gitee master"); 130 | } 131 | } -------------------------------------------------------------------------------- /src/ChinaMobile/ChinaMobile.php: -------------------------------------------------------------------------------- 1 | setDrivers($drivers); 28 | } 29 | 30 | /** 31 | * 由于循环检测时易出现 curl connect timeout,且 url 变更可能性不大,暂时忽略检测 32 | * 33 | * @inheritDoc 34 | */ 35 | protected function checkM3u8Url(string $url): bool 36 | { 37 | return true; 38 | } 39 | 40 | /** 41 | * @inheritDoc 42 | */ 43 | function getTvM3uContent(string $url, string $groupPrefix = ''): string 44 | { 45 | $tvList = require(BASE_PATH . ChinaMobileConstant::TV_LIST); 46 | 47 | $epgList = require(BASE_PATH . EpgConstant::EPG_LIST); 48 | $epgTvgNameList = array_column($epgList, 'tvg-name'); 49 | 50 | $content = ''; 51 | foreach ($tvList as $tv) { 52 | $idx = array_search($tv['tvg-name'], $epgTvgNameList); 53 | $tvg = ($idx !== false) ? array_merge($tv, $epgList[$idx]) : $tv; 54 | 55 | if (!isset($tvg['group-title']) || !in_array($tvg['group-title'], ['央视', '卫视', 'NewTV'])) { 56 | $tvg['group-title'] = '卫视'; 57 | } 58 | 59 | if ($groupPrefix) { 60 | $tvg['group-title'] = $groupPrefix . '·' . $tvg['group-title']; 61 | } 62 | 63 | $content .= $this->getM3uLine( 64 | $tvg['name'] ?? $tvg['tvg-name'], 65 | $tvg['url'], 66 | $tvg['group-title'] ?? '', 67 | $tvg['tvg-name'] ?? '', 68 | $tvg['tvg-id'] ?? '', 69 | $tvg['tvg-logo'] ?? '' 70 | ); 71 | } 72 | return $content; 73 | } 74 | } -------------------------------------------------------------------------------- /src/ChinaMobile/Driver/BeijingDriver.php: -------------------------------------------------------------------------------- 1 | setDrivers($drivers); 28 | } 29 | 30 | /** 31 | * 由于循环检测时易出现 curl connect timeout,且 url 变更可能性不大,暂时忽略检测 32 | * 33 | * @inheritDoc 34 | */ 35 | protected function checkM3u8Url(string $url): bool 36 | { 37 | return true; 38 | } 39 | 40 | /** 41 | * @inheritDoc 42 | */ 43 | function getTvM3uContent(string $url, string $groupPrefix = ''): string 44 | { 45 | $tvList = require(BASE_PATH . CmvideoConstant::TV_LIST); 46 | 47 | $epgList = require(BASE_PATH . EpgConstant::EPG_LIST); 48 | $epgTvgNameList = array_column($epgList, 'tvg-name'); 49 | 50 | $content = ''; 51 | foreach ($tvList as $tv) { 52 | $idx = array_search($tv['tvg-name'], $epgTvgNameList); 53 | $tvg = ($idx !== false) ? array_merge($tv, $epgList[$idx]) : $tv; 54 | 55 | if (!isset($tvg['group-title']) || !in_array($tvg['group-title'], ['央视', '卫视', 'NewTV'])) { 56 | $tvg['group-title'] = '卫视'; 57 | } 58 | 59 | if ($groupPrefix) { 60 | $tvg['group-title'] = $groupPrefix . '·' . $tvg['group-title']; 61 | } 62 | 63 | $content .= $this->getM3uLine( 64 | $tvg['name'] ?? $tvg['tvg-name'], 65 | $tvg['url'], 66 | $tvg['group-title'] ?? '', 67 | $tvg['tvg-name'] ?? '', 68 | $tvg['tvg-id'] ?? '', 69 | $tvg['tvg-logo'] ?? '' 70 | ); 71 | } 72 | return $content; 73 | } 74 | } -------------------------------------------------------------------------------- /src/Cmvideo/Driver/CdnDriver.php: -------------------------------------------------------------------------------- 1 | $e->getCode(), 32 | 'file' => $e->getFile() . ':' . $e->getLine(), 33 | 'message' => $e->getMessage(), 34 | 'trace' => $e->getTraceAsString(), 35 | ]; 36 | } 37 | 38 | /** 39 | * 生成 m3u 头 40 | */ 41 | function get_m3u_head(): string 42 | { 43 | return sprintf('#EXTM3U url-tvg="%s"' . PHP_EOL, EpgConstant::EPG_URL); 44 | } -------------------------------------------------------------------------------- /src/Http.php: -------------------------------------------------------------------------------- 1 | uri = $uri; 63 | return $this; 64 | } 65 | 66 | /** 67 | * set query 68 | * 69 | * @param string|array $query 70 | * @return $this 71 | */ 72 | public function setQuery($query): self 73 | { 74 | $this->query = $query; 75 | return $this; 76 | } 77 | 78 | /** 79 | * set headers 80 | * 81 | * @param array $headers 82 | * @return $this 83 | */ 84 | public function setHeaders(array $headers): self 85 | { 86 | $this->headers = $headers; 87 | return $this; 88 | } 89 | 90 | /** 91 | * add header 92 | * 93 | * @param string $key 94 | * @param string $value 95 | * @return $this 96 | */ 97 | public function addHeader(string $key, string $value): self 98 | { 99 | $this->headers[$key] = $value; 100 | return $this; 101 | } 102 | 103 | 104 | /** 105 | * set user-agent 106 | * 107 | * @param string $userAgent 108 | * @return $this 109 | */ 110 | public function setUserAgent(string $userAgent): self 111 | { 112 | $this->addHeader('User-Agent', $userAgent); 113 | return $this; 114 | } 115 | 116 | /** 117 | * set referrer 118 | * 119 | * @param string $referer 120 | * @return $this 121 | */ 122 | public function setReferer(string $referer): self 123 | { 124 | $this->addHeader('referer', $referer); 125 | return $this; 126 | } 127 | 128 | /** 129 | * set cookies 130 | * 131 | * @param CookieJarInterface|false $cookies 132 | * @return $this 133 | */ 134 | public function setCookies($cookies): self 135 | { 136 | $this->cookies = $cookies; 137 | return $this; 138 | } 139 | 140 | /** 141 | * set allow_redirects 142 | * 143 | * @param bool|array $allowRedirects 144 | * @return $this 145 | * @see https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html#allow-redirects 146 | */ 147 | public function setAllowRedirects($allowRedirects): self 148 | { 149 | $this->allowRedirects = $allowRedirects; 150 | return $this; 151 | } 152 | 153 | /** 154 | * set post form params 155 | * 使用此方法时,会自动将 Content-Type 设置为 application/x-www-form-urlencoded 156 | * 157 | * @param array $formParams 158 | * @return $this 159 | */ 160 | public function setFromParams(array $formParams): self 161 | { 162 | $this->formParams = $formParams; 163 | return $this; 164 | } 165 | 166 | /** 167 | * set post json 168 | * 使用此方法时,会自动将 Content-Type 设置为 application/json 169 | * 170 | * @param array $json 171 | * @return $this 172 | */ 173 | public function setJson(array $json): self 174 | { 175 | $this->json = $json; 176 | return $this; 177 | } 178 | 179 | /** 180 | * set body 181 | * formParams 与 body 二选一,formParams 最终会自动转换为 body 182 | * 183 | * @param string $body 184 | * @return $this 185 | */ 186 | public function setBody(string $body): self 187 | { 188 | $this->body = $body; 189 | return $this; 190 | } 191 | 192 | /** 193 | * set curl method 194 | * 195 | * @param string $method 196 | * @return $this 197 | */ 198 | public function setMethod(string $method = 'GET'): self 199 | { 200 | $this->method = $method; 201 | return $this; 202 | } 203 | 204 | 205 | /** 206 | * set timeout 207 | * 208 | * @param float $timeout 209 | * @return $this 210 | */ 211 | public function setTimeout(float $timeout): self 212 | { 213 | $this->timeout = $timeout; 214 | return $this; 215 | } 216 | 217 | /** 218 | * set connect timeout 219 | * 220 | * @param float $connectTimeout 221 | * @return $this 222 | */ 223 | public function setConnectTimeout(float $connectTimeout): self 224 | { 225 | $this->connectTimeout = $connectTimeout; 226 | return $this; 227 | } 228 | 229 | /** 230 | * get client option 231 | * 232 | * @return array 233 | */ 234 | private function getOption(): array 235 | { 236 | $option = [ 237 | 'timeout' => $this->timeout, 238 | 'connect_timeout' => $this->connectTimeout 239 | ]; 240 | 241 | if ($this->query) { 242 | $option['query'] = $this->query; 243 | } 244 | 245 | if ($this->headers) { 246 | $option['headers'] = $this->headers; 247 | } 248 | 249 | if ($this->cookies) { 250 | $option['cookies'] = $this->cookies; 251 | } 252 | 253 | if ($this->allowRedirects) { 254 | $option['allow_redirects'] = $this->allowRedirects; 255 | } 256 | 257 | if ($this->formParams) { 258 | $option['form_params'] = $this->formParams; 259 | } 260 | 261 | if ($this->body) { 262 | $option['body'] = $this->body; 263 | } 264 | 265 | if ($this->json) { 266 | $option['json'] = $this->json; 267 | } 268 | 269 | return $option; 270 | } 271 | 272 | /** 273 | * get guzzle http response 274 | * 275 | * @return bool|ResponseInterface 276 | */ 277 | public function getResponse() 278 | { 279 | try { 280 | $client = new Client(); 281 | 282 | try { 283 | return $client->request( 284 | $this->method, 285 | $this->uri, 286 | $this->getOption() 287 | ); 288 | } catch (ConnectException $e) { 289 | /** 连接超时,增加重试 */ 290 | logger('http')->notice(json_encode(get_throwable_error_log($e))); 291 | return $client->request( 292 | $this->method, 293 | $this->uri, 294 | $this->getOption() 295 | ); 296 | } 297 | // } catch (TransferException $e) { 298 | } catch (\Throwable $t) { 299 | logger('http')->error(json_encode(get_throwable_error_log($t))); 300 | } 301 | return false; 302 | } 303 | } -------------------------------------------------------------------------------- /src/Logger.php: -------------------------------------------------------------------------------- 1 | setFormatter($formatter); 40 | 41 | $handlers[] = $handler; 42 | 43 | $processors[] = new HostnameProcessor(); 44 | $processors[] = new ProcessIdProcessor(); 45 | $processors[] = new MemoryUsageProcessor(); 46 | 47 | $logger = new MonoLogger($name, $handlers, $processors); 48 | static::$monoLogger[$name] = $logger; 49 | return $logger; 50 | } 51 | } -------------------------------------------------------------------------------- /src/Ysp/Driver/Ajh102026Driver.php: -------------------------------------------------------------------------------- 1 | setUri($this->uri) 30 | ->getResponse(); 31 | } 32 | 33 | /** 34 | * 获取 m3u8 链接 35 | * 36 | * @return bool|array 37 | */ 38 | public function getM3u8Array(): array 39 | { 40 | $response = $this->getResponse(); 41 | if ($response) { 42 | if (preg_match_all( 43 | '/(https?:\/\/[\d\.]+\/[\w\-\.]+\.cctv\.cn\/\w+\/)\d{10}\.m3u8/', 44 | $response->getBody()->__toString(), 45 | $matches)) { 46 | if (isset($matches[1]) && $matches[1]) { 47 | return array_unique($matches[1]); 48 | } 49 | } 50 | } 51 | return []; 52 | } 53 | } -------------------------------------------------------------------------------- /src/Ysp/Driver/YuechanDriver.php: -------------------------------------------------------------------------------- 1 | setDrivers($drivers); 40 | } 41 | 42 | /** 43 | * @inheritDoc 44 | */ 45 | protected function checkM3u8Url(string $uri): bool 46 | { 47 | // 用于检测的央视频 vid 48 | $ids = [ 49 | 2000210103, // CCTV 1 50 | // 2000296203, // 湖南卫视 51 | ]; 52 | foreach ($ids as $id) { 53 | $url = $uri . $id . '.m3u8'; 54 | if (!parent::checkM3u8Url($url)) { 55 | return false; 56 | } 57 | } 58 | return true; 59 | } 60 | 61 | /** 62 | * @inheritDoc 63 | */ 64 | function getTvM3uContent(string $url, string $groupPrefix = ''): string 65 | { 66 | $tvList = require(BASE_PATH . YspConstant::TV_LIST); 67 | 68 | $epgList = require(BASE_PATH . EpgConstant::EPG_LIST); 69 | $epgTvgNameList = array_column($epgList, 'tvg-name'); 70 | 71 | $content = ''; 72 | foreach ($tvList as $tv) { 73 | $idx = array_search($tv['tvg-name'], $epgTvgNameList); 74 | $tvg = array_merge($tv, $epgList[$idx]); 75 | 76 | if ($groupPrefix) { 77 | $tvg['group-title'] = $groupPrefix . '·' . $tvg['group-title']; 78 | } 79 | 80 | $m3u8Url = $url . $tvg['vid'] . '.m3u8'; 81 | 82 | $content .= $this->getM3uLine( 83 | $tvg['name'], 84 | $m3u8Url, 85 | $tvg['group-title'], 86 | $tvg['tvg-name'], 87 | $tvg['tvg-id'], 88 | $tvg['tvg-logo'] 89 | ); 90 | } 91 | return $content; 92 | } 93 | } -------------------------------------------------------------------------------- /tests/ChinaMobileDriverTest.php: -------------------------------------------------------------------------------- 1 | getM3u8Array(); 23 | $this->assertIsArray($result); 24 | $this->assertNotEmpty($result); 25 | foreach ($result as $m3u8Url) { 26 | $this->assertIsString($m3u8Url); 27 | $this->testMu38Url($m3u8Url); 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /tests/CmvideoDriverTest.php: -------------------------------------------------------------------------------- 1 | getM3u8Array(); 23 | $this->assertIsArray($result); 24 | $this->assertNotEmpty($result); 25 | foreach ($result as $m3u8Url) { 26 | $this->assertIsString($m3u8Url); 27 | $this->testMu38Url($m3u8Url); 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /tests/CmvideoTvTest.php: -------------------------------------------------------------------------------- 1 | assertIsArray($tv->check()); 17 | } 18 | } -------------------------------------------------------------------------------- /tests/HttpTest.php: -------------------------------------------------------------------------------- 1 | setUri($url) 24 | ->setTimeout(5) 25 | ->setConnectTimeout(5) 26 | ->getResponse(); 27 | $this->assertInstanceOf(ResponseInterface::class, $response); 28 | 29 | $code = $response->getStatusCode(); 30 | $this->assertEquals($code, 200); 31 | 32 | $body = $response->getBody()->__toString(); 33 | $this->assertStringContainsString('EXTM3U', $body); 34 | echo ' assert success' . PHP_EOL; 35 | } catch (Exception $e) { 36 | echo sprintf(' assert exception. file:%s msg:%s trace:%s' . PHP_EOL, 37 | $e->getFile() . ':' . $e->getCode(), 38 | $e->getMessage(), 39 | $e->getTraceAsString()); 40 | } finally { 41 | echo PHP_EOL . '###################################' . PHP_EOL; 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /tests/InitTest.php: -------------------------------------------------------------------------------- 1 | assertTrue($logger instanceof \Monolog\Logger); 17 | } 18 | } -------------------------------------------------------------------------------- /tests/YspDriverTest.php: -------------------------------------------------------------------------------- 1 | getM3u8Array(); 35 | $this->assertIsArray($result); 36 | $this->assertNotEmpty($result); 37 | foreach ($result as $m3u8Url) { 38 | $this->assertIsString($m3u8Url); 39 | foreach ([2000210103, 2000296203] as $vid) { 40 | $this->testMu38Url($m3u8Url . $vid . '.m3u8'); 41 | } 42 | } 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /tests/YspTvTest.php: -------------------------------------------------------------------------------- 1 | assertIsArray($tv->check()); 17 | } 18 | } -------------------------------------------------------------------------------- /ysp.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U url-tvg="http://epg.51zmt.top:8000/e.xml.gz" 2 | #EXTINF:-1 tvg-id="" tvg-name="" tvg-logo="" group-title="URL 已更改", URL 更改请填写新的 URL 3 | http://58.251.112.67/tlivecloud-cdn.ysp.cctv.cn/001/2000210103.m3u8 4 | --------------------------------------------------------------------------------