{"id":13549703,"url":"https://github.com/freearhey/iptv-checker","last_synced_at":"2025-05-16T11:03:47.198Z","repository":{"id":41390226,"uuid":"176995275","full_name":"freearhey/iptv-checker","owner":"freearhey","description":"Node.js CLI tool for checking links in IPTV playlists","archived":false,"fork":false,"pushed_at":"2025-03-15T02:43:25.000Z","size":708,"stargazers_count":549,"open_issues_count":0,"forks_count":91,"subscribers_count":23,"default_branch":"master","last_synced_at":"2025-05-09T22:05:31.419Z","etag":null,"topics":["checker","iptv","m3u","playlist"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/freearhey.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["https://www.paypal.me/arhey","https://www.buymeacoffee.com/arhey"]}},"created_at":"2019-03-21T17:40:48.000Z","updated_at":"2025-05-06T13:02:00.000Z","dependencies_parsed_at":"2023-02-17T22:30:43.324Z","dependency_job_id":"6c7edf26-256c-44ae-8438-c73669f6110c","html_url":"https://github.com/freearhey/iptv-checker","commit_stats":{"total_commits":350,"total_committers":4,"mean_commits":87.5,"dds":0.3314285714285714,"last_synced_commit":"31af48be5687a1f22f13016f9cdb4c9343dde482"},"previous_names":[],"tags_count":36,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freearhey%2Fiptv-checker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freearhey%2Fiptv-checker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freearhey%2Fiptv-checker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freearhey%2Fiptv-checker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freearhey","download_url":"https://codeload.github.com/freearhey/iptv-checker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254518383,"owners_count":22084374,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["checker","iptv","m3u","playlist"],"created_at":"2024-08-01T12:01:24.603Z","updated_at":"2025-05-16T11:03:47.177Z","avatar_url":"https://github.com/freearhey.png","language":"JavaScript","funding_links":["https://www.paypal.me/arhey","https://www.buymeacoffee.com/arhey"],"categories":["JavaScript"],"sub_categories":[],"readme":"# IPTV Checker [![Build Status](https://app.travis-ci.com/freearhey/iptv-checker.svg?branch=master)](https://app.travis-ci.com/freearhey/iptv-checker)\n\nNode.js CLI tool for checking links in IPTV playlists.\n\nThis tool is based on the `ffprobe` library, so you need to install it on your computer first. You can find the right installer for your system here: https://www.ffmpeg.org/download.html\n\n## Usage\n\n### CLI\n\n```sh\nnpm install -g iptv-checker\n```\n\n#### Check local playlist file:\n\n```sh\niptv-checker /path-to-playlist/example.m3u\n```\n\n#### Check playlist URL:\n\n```sh\niptv-checker https://some-playlist.lol/list.m3u\n```\n\n#### Pipe playlist from `stdin`:\n\n```sh\ncat ~/some-playlist.m3u | iptv-checker\n```\n\nArguments:\n\n- `-o, --output`: output directory (default: `iptv-checker_20250314093952`)\n- `-t, --timeout`: the number of milliseconds before the request will be aborted (default: `60000`)\n- `-p, --parallel`: batch size of channels to check concurrently (default: CPU core count)\n- `-r, --retry`: the number of retries for failed requests (default: `0`)\n- `-d, --delay`: delay between requests in milliseconds (default: `0`)\n- `-x, --proxy`: HTTP proxy to tunnel through (example: `http://username@password@127.0.0.1:1234`)\n- `-a, --user-agent`: HTTP User-Agent (default: `IPTVChecker/0.29.0 (https://github.com/freearhey/iptv-checker)`)\n- `-k, --insecure`: allow insecure connections when using SSL (default: `false`)\n- `-D, --debug`: enable debug mode (default: `false`)\n\n### Module\n\n```sh\nnpm install iptv-checker\n```\n\n#### Check playlist:\n\n```js\nimport { IPTVChecker } from 'iptv-checker'\n\nconst checker = new IPTVChecker()\n\n// using playlist url\nchecker.checkPlaylist('https://example.com/playlist.m3u').then(results =\u003e {\n  console.log(results)\n})\n\n// using local path\nchecker.checkPlaylist('path/to/playlist.m3u').then(results =\u003e {\n  console.log(results)\n})\n\n// using playlist as string\nchecker.checkPlaylist(string).then(results =\u003e {\n  console.log(results)\n})\n```\n\n#### Results\n\n_On success:_\n\n```js\n{\n  header: {\n    attrs: {},\n    raw: '#EXTM3U x-tvg-url=\"\"'\n  },\n  items: [\n    {\n      name: 'KBSV/AssyriaSat (720p) [Not 24/7]',\n      tvg: {\n        id: 'KBSVAssyriaSat.us',\n        name: '',\n        logo: 'https://i.imgur.com/zEWSSdf.jpg',\n        url: '',\n        rec: ''\n      },\n      group: {\n        title: 'General'\n      },\n      http: {\n        referrer: '',\n        'user-agent': ''\n      },\n      url: 'http://66.242.170.53/hls/live/temp/index.m3u8',\n      raw: '#EXTINF:-1 tvg-id=\"KBSVAssyriaSat.us\" tvg-logo=\"https://i.imgur.com/zEWSSdf.jpg\" group-title=\"General\",KBSV/AssyriaSat (720p) [Not 24/7]\\r\\nhttp://66.242.170.53/hls/live/temp/index.m3u8',\n      line: 2,\n      catchup: {\n        type: '',\n        days: '',\n        source: ''\n      },\n      timeshift: '',\n      status: {\n        ok: true,\n        metadata: {\n          streams: [\n            {\n              index: 0,\n              codec_name: 'h264',\n              codec_long_name: 'H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10',\n              profile: 'High',\n              codec_type: 'video',\n              codec_tag_string: '[27][0][0][0]',\n              codec_tag: '0x001b',\n              width: 1280,\n              height: 720,\n              coded_width: 1280,\n              coded_height: 720,\n              closed_captions: 0,\n              has_b_frames: 2,\n              pix_fmt: 'yuv420p',\n              level: 31,\n              chroma_location: 'left',\n              refs: 1,\n              is_avc: 'false',\n              nal_length_size: '0',\n              r_frame_rate: '30/1',\n              avg_frame_rate: '0/0',\n              time_base: '1/90000',\n              start_pts: 943358850,\n              start_time: '10481.765000',\n              bits_per_raw_sample: '8',\n              disposition: {\n                default: 0,\n                dub: 0,\n                original: 0,\n                comment: 0,\n                lyrics: 0,\n                karaoke: 0,\n                forced: 0,\n                hearing_impaired: 0,\n                visual_impaired: 0,\n                clean_effects: 0,\n                attached_pic: 0,\n                timed_thumbnails: 0\n              },\n              tags: {\n                variant_bitrate: '400000'\n              }\n            },\n            //...\n          ],\n          format: {\n            filename: 'http://66.242.170.53/hls/live/temp/index.m3u8',\n            nb_streams: 2,\n            nb_programs: 1,\n            format_name: 'hls',\n            format_long_name: 'Apple HTTP Live Streaming',\n            start_time: '10481.560589',\n            size: '214',\n            probe_score: 100\n          },\n          requests: [\n            {\n              method: 'GET',\n              url: 'http://66.242.170.53/hls/live/temp/index.m3u8',\n              headers: {\n                'User-Agent': 'Lavf/58.76.100',\n                Accept: '*/*',\n                Range: 'bytes=0-',\n                Connection: 'close',\n                Host: '66.242.170.53',\n                'Icy-MetaData': '1'\n              }\n            },\n            //...\n          ]\n        }\n      }\n    },\n    //...\n  ]\n}\n```\n\n_On error:_\n\n```js\n{\n  header: {\n    attrs: {},\n    raw: '#EXTM3U x-tvg-url=\"\"'\n  },\n  items: [\n    {\n      name: 'Addis TV (720p)',\n      tvg: {\n        id: 'AddisTV.et',\n        name: '',\n        logo: 'https://i.imgur.com/KAg6MOI.png',\n        url: '',\n        rec: ''\n      },\n      group: {\n        title: ''\n      },\n      http: {\n        referrer: '',\n        'user-agent': ''\n      },\n      url: 'https://rrsatrtmp.tulix.tv/addis1/addis1multi.smil/playlist.m3u8',\n      raw: '#EXTINF:-1 tvg-id=\"AddisTV.et\" tvg-logo=\"https://i.imgur.com/KAg6MOI.png\" group-title=\"Undefined\",Addis TV (720p)\\\\r\\\\nhttps://rrsatrtmp.tulix.tv/addis1/addis1multi.smil/playlist.m3u8',\n      line: 2,\n      catchup: {\n        type: '',\n        days: '',\n        source: ''\n      },\n      timeshift: '',\n      status: {\n        ok: false,\n        code: 'HTTP_REQUEST_TIMEOUT',\n        message: 'HTTP 408 Request Timeout',\n      }\n    },\n    //...\n  ]\n}\n```\n\n#### Check stream:\n\n```js\nimport { IPTVChecker } from 'iptv-checker'\n\nconst checker = new IPTVChecker()\n\n// using stream url\nchecker.checkStream('https://example.com/stream.m3u8').then(results =\u003e {\n  console.log(results)\n})\n\n// using stream object\nchecker\n  .checkStream({\n    url: 'https://example.com/stream.m3u8',\n    http: {\n      referrer: 'https://example.com',\n      'user-agent':\n        'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 9_7_6; en-US) Gecko/20100101 Firefox/69.5'\n    }\n  })\n  .then(results =\u003e {\n    console.log(results)\n  })\n```\n\n#### Results\n\n_On success:_\n\n```js\n{\n  url: 'https://example.com/stream.m3u8',\n  http: {\n    referrer: 'https://example.com',\n    'user-agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 9_7_6; en-US) Gecko/20100101 Firefox/69.5'\n  },\n  status: {\n    ok: true,\n    metadata: {\n      streams: [\n        {\n          index: 0,\n          codec_name: 'h264',\n          codec_long_name: 'H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10',\n          profile: 'High',\n          codec_type: 'video',\n          codec_tag_string: '[27][0][0][0]',\n          codec_tag: '0x001b',\n          width: 1280,\n          height: 720,\n          coded_width: 1280,\n          coded_height: 720,\n          closed_captions: 0,\n          has_b_frames: 2,\n          pix_fmt: 'yuv420p',\n          level: 31,\n          chroma_location: 'left',\n          refs: 1,\n          is_avc: 'false',\n          nal_length_size: '0',\n          r_frame_rate: '30/1',\n          avg_frame_rate: '0/0',\n          time_base: '1/90000',\n          start_pts: 943358850,\n          start_time: '10481.765000',\n          bits_per_raw_sample: '8',\n          disposition: {\n            default: 0,\n            dub: 0,\n            original: 0,\n            comment: 0,\n            lyrics: 0,\n            karaoke: 0,\n            forced: 0,\n            hearing_impaired: 0,\n            visual_impaired: 0,\n            clean_effects: 0,\n            attached_pic: 0,\n            timed_thumbnails: 0\n          },\n          tags: {\n            variant_bitrate: '400000'\n          }\n        },\n        //...\n      ],\n      format: {\n        filename: 'http://66.242.170.53/hls/live/temp/index.m3u8',\n        nb_streams: 2,\n        nb_programs: 1,\n        format_name: 'hls',\n        format_long_name: 'Apple HTTP Live Streaming',\n        start_time: '10481.560589',\n        size: '214',\n        probe_score: 100\n      },\n      requests: [\n        {\n          method: 'GET',\n          url: 'http://66.242.170.53/hls/live/temp/index.m3u8',\n          headers: {\n            'User-Agent': 'Lavf/58.76.100',\n            Accept: '*/*',\n            Range: 'bytes=0-',\n            Connection: 'close',\n            Host: '66.242.170.53',\n            'Icy-MetaData': '1'\n          }\n        },\n        //...\n      ]\n    }\n  }\n}\n```\n\n_On error:_\n\n```js\n{\n  url: 'https://example.com/stream.m3u8',\n  http: {\n    referrer: 'https://example.com',\n    'user-agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 9_7_6; en-US) Gecko/20100101 Firefox/69.5'\n  },\n  status: {\n    ok: false,\n    code: 'HTTP_REQUEST_TIMEOUT',\n    message: 'HTTP 408 Request Timeout',\n  }\n}\n```\n\n### Configuration\n\n```js\nnew IPTVChecker({\n  timeout,\n  parallel,\n  delay,\n  retry,\n  userAgent,\n  proxy,\n  insecure,\n  setUp,\n  afterEach,\n  beforeEach\n})\n```\n\nOptions:\n\n| Name       | Type       | Default                                                          | Description                                                                       |\n| ---------- | ---------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------- |\n| timeout    | `number`   | `60000`                                                          | The number of milliseconds before the request will be aborted                     |\n| parallel   | `number`   | CPU core count                                                   | Batch size of channels to check concurrently                                      |\n| delay      | `number`   | `0`                                                              | Delay between requests in milliseconds                                            |\n| retry      | `number`   | `0`                                                              | The number of retries for failed requests                                         |\n| userAgent  | `string`   | `IPTVChecker/0.29.0 (https://github.com/freearhey/iptv-checker)` | HTTP User-Agent                                                                   |\n| proxy      | `string`   | `''`                                                             | HTTP proxy to tunnel through (example: `http://username@password@127.0.0.1:1234`) |\n| insecure   | `boolean`  | `false`                                                          | Allow insecure connections when using SSL                                         |\n| debug      | `boolean`  | `false`                                                          | Enable debug mode                                                                 |\n| setUp      | `function` | `(playlist) =\u003e {}`                                               | Runs before the start of the playlist check                                       |\n| beforeEach | `function` | `(stream) =\u003e {}`                                                 | Runs before the start of the stream check                                         |\n| afterEach  | `function` | `(stream) =\u003e {}`                                                 | Runs after the stream check is complete                                           |\n\n### Error codes\n\nA full list of the error codes used and their descriptions can be found [here](.readme/errors.md).\n\n## Contribution\n\nIf you find a bug or want to contribute to the code or documentation, you can help by submitting an [issue](https://github.com/freearhey/iptv-checker/issues) or a [pull request](https://github.com/freearhey/iptv-checker/pulls).\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreearhey%2Fiptv-checker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreearhey%2Fiptv-checker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreearhey%2Fiptv-checker/lists"}