issues

Github, Jira, Gitlab issues from Plan 9's acme
Log | Files | Refs | README | LICENSE

issues.json (26364B)


      1 [
      2   {
      3     "url": "https://api.github.com/repos/untangledco/streaming/issues/43",
      4     "repository_url": "https://api.github.com/repos/untangledco/streaming",
      5     "labels_url": "https://api.github.com/repos/untangledco/streaming/issues/43/labels{/name}",
      6     "comments_url": "https://api.github.com/repos/untangledco/streaming/issues/43/comments",
      7     "events_url": "https://api.github.com/repos/untangledco/streaming/issues/43/events",
      8     "html_url": "https://github.com/untangledco/streaming/pull/43",
      9     "id": 3387677104,
     10     "node_id": "PR_kwDOL1KTdc6nDd3X",
     11     "number": 43,
     12     "title": "Fixed issues with parsing, added parsing of IFrames",
     13     "user": {
     14       "login": "dipoll",
     15       "id": 11376739,
     16       "node_id": "MDQ6VXNlcjExMzc2NzM5",
     17       "avatar_url": "https://avatars.githubusercontent.com/u/11376739?v=4",
     18       "gravatar_id": "",
     19       "url": "https://api.github.com/users/dipoll",
     20       "html_url": "https://github.com/dipoll",
     21       "followers_url": "https://api.github.com/users/dipoll/followers",
     22       "following_url": "https://api.github.com/users/dipoll/following{/other_user}",
     23       "gists_url": "https://api.github.com/users/dipoll/gists{/gist_id}",
     24       "starred_url": "https://api.github.com/users/dipoll/starred{/owner}{/repo}",
     25       "subscriptions_url": "https://api.github.com/users/dipoll/subscriptions",
     26       "organizations_url": "https://api.github.com/users/dipoll/orgs",
     27       "repos_url": "https://api.github.com/users/dipoll/repos",
     28       "events_url": "https://api.github.com/users/dipoll/events{/privacy}",
     29       "received_events_url": "https://api.github.com/users/dipoll/received_events",
     30       "type": "User",
     31       "user_view_type": "public",
     32       "site_admin": false
     33     },
     34     "labels": [],
     35     "state": "open",
     36     "locked": false,
     37     "assignee": null,
     38     "assignees": [],
     39     "milestone": null,
     40     "comments": 2,
     41     "created_at": "2025-09-05T14:02:33Z",
     42     "updated_at": "2025-10-03T19:00:30Z",
     43     "closed_at": null,
     44     "author_association": "NONE",
     45     "type": null,
     46     "active_lock_reason": null,
     47     "draft": false,
     48     "pull_request": {
     49       "url": "https://api.github.com/repos/untangledco/streaming/pulls/43",
     50       "html_url": "https://github.com/untangledco/streaming/pull/43",
     51       "diff_url": "https://github.com/untangledco/streaming/pull/43.diff",
     52       "patch_url": "https://github.com/untangledco/streaming/pull/43.patch",
     53       "merged_at": null
     54     },
     55     "body": "* Added IFrame streams as a separate slice attribute.\r\n* ProgramID parsing, because nowadays, HLS version 3 is very common\r\n* Map parsing with @ sign",
     56     "closed_by": null,
     57     "reactions": {
     58       "url": "https://api.github.com/repos/untangledco/streaming/issues/43/reactions",
     59       "total_count": 0,
     60       "+1": 0,
     61       "-1": 0,
     62       "laugh": 0,
     63       "hooray": 0,
     64       "confused": 0,
     65       "heart": 77,
     66       "rocket": 0,
     67       "eyes": 0
     68     },
     69     "timeline_url": "https://api.github.com/repos/untangledco/streaming/issues/43/timeline",
     70     "performed_via_github_app": null,
     71     "state_reason": null
     72   },
     73   {
     74     "url": "https://api.github.com/repos/untangledco/streaming/issues/40",
     75     "repository_url": "https://api.github.com/repos/untangledco/streaming",
     76     "labels_url": "https://api.github.com/repos/untangledco/streaming/issues/40/labels{/name}",
     77     "comments_url": "https://api.github.com/repos/untangledco/streaming/issues/40/comments",
     78     "events_url": "https://api.github.com/repos/untangledco/streaming/issues/40/events",
     79     "html_url": "https://github.com/untangledco/streaming/issues/40",
     80     "id": 3241836085,
     81     "node_id": "I_kwDOL1KTdc7BOn41",
     82     "number": 40,
     83     "title": "pcap: what is the GlobalHeader.Network field?",
     84     "user": {
     85       "login": "ollytom",
     86       "id": 17470471,
     87       "node_id": "MDQ6VXNlcjE3NDcwNDcx",
     88       "avatar_url": "https://avatars.githubusercontent.com/u/17470471?v=4",
     89       "gravatar_id": "",
     90       "url": "https://api.github.com/users/ollytom",
     91       "html_url": "https://github.com/ollytom",
     92       "followers_url": "https://api.github.com/users/ollytom/followers",
     93       "following_url": "https://api.github.com/users/ollytom/following{/other_user}",
     94       "gists_url": "https://api.github.com/users/ollytom/gists{/gist_id}",
     95       "starred_url": "https://api.github.com/users/ollytom/starred{/owner}{/repo}",
     96       "subscriptions_url": "https://api.github.com/users/ollytom/subscriptions",
     97       "organizations_url": "https://api.github.com/users/ollytom/orgs",
     98       "repos_url": "https://api.github.com/users/ollytom/repos",
     99       "events_url": "https://api.github.com/users/ollytom/events{/privacy}",
    100       "received_events_url": "https://api.github.com/users/ollytom/received_events",
    101       "type": "User",
    102       "user_view_type": "public",
    103       "site_admin": false
    104     },
    105     "labels": [],
    106     "state": "open",
    107     "locked": false,
    108     "assignee": null,
    109     "assignees": [],
    110     "milestone": null,
    111     "comments": 0,
    112     "created_at": "2025-07-18T04:44:52Z",
    113     "updated_at": "2025-07-18T04:44:52Z",
    114     "closed_at": null,
    115     "author_association": "MEMBER",
    116     "type": null,
    117     "active_lock_reason": null,
    118     "sub_issues_summary": {
    119       "total": 0,
    120       "completed": 0,
    121       "percent_completed": 0
    122     },
    123     "issue_dependencies_summary": {
    124       "blocked_by": 0,
    125       "total_blocked_by": 0,
    126       "blocking": 0,
    127       "total_blocking": 0
    128     },
    129     "body": "It's a uint32... what does this number represent?\nLast time I looked at the pcap savefile spec I seem to remember it wasn't really a uint32 at all; it represented something to do with the packet's link layer, and its fields happened to be 4 bytes long (which fits in a uint32).",
    130     "closed_by": null,
    131     "reactions": {
    132       "url": "https://api.github.com/repos/untangledco/streaming/issues/40/reactions",
    133       "total_count": 0,
    134       "+1": 0,
    135       "-1": 0,
    136       "laugh": 0,
    137       "hooray": 0,
    138       "confused": 0,
    139       "heart": 0,
    140       "rocket": 0,
    141       "eyes": 0
    142     },
    143     "timeline_url": "https://api.github.com/repos/untangledco/streaming/issues/40/timeline",
    144     "performed_via_github_app": null,
    145     "state_reason": null
    146   },
    147   {
    148     "url": "https://api.github.com/repos/untangledco/streaming/issues/33",
    149     "repository_url": "https://api.github.com/repos/untangledco/streaming",
    150     "labels_url": "https://api.github.com/repos/untangledco/streaming/issues/33/labels{/name}",
    151     "comments_url": "https://api.github.com/repos/untangledco/streaming/issues/33/comments",
    152     "events_url": "https://api.github.com/repos/untangledco/streaming/issues/33/events",
    153     "html_url": "https://github.com/untangledco/streaming/issues/33",
    154     "id": 2459417610,
    155     "node_id": "I_kwDOL1KTdc6Sl7wK",
    156     "number": 33,
    157     "title": "mpegts: ideas for applications, tooling",
    158     "user": {
    159       "login": "ollytom",
    160       "id": 17470471,
    161       "node_id": "MDQ6VXNlcjE3NDcwNDcx",
    162       "avatar_url": "https://avatars.githubusercontent.com/u/17470471?v=4",
    163       "gravatar_id": "",
    164       "url": "https://api.github.com/users/ollytom",
    165       "html_url": "https://github.com/ollytom",
    166       "followers_url": "https://api.github.com/users/ollytom/followers",
    167       "following_url": "https://api.github.com/users/ollytom/following{/other_user}",
    168       "gists_url": "https://api.github.com/users/ollytom/gists{/gist_id}",
    169       "starred_url": "https://api.github.com/users/ollytom/starred{/owner}{/repo}",
    170       "subscriptions_url": "https://api.github.com/users/ollytom/subscriptions",
    171       "organizations_url": "https://api.github.com/users/ollytom/orgs",
    172       "repos_url": "https://api.github.com/users/ollytom/repos",
    173       "events_url": "https://api.github.com/users/ollytom/events{/privacy}",
    174       "received_events_url": "https://api.github.com/users/ollytom/received_events",
    175       "type": "User",
    176       "user_view_type": "public",
    177       "site_admin": false
    178     },
    179     "labels": [],
    180     "state": "open",
    181     "locked": false,
    182     "assignee": null,
    183     "assignees": [],
    184     "milestone": null,
    185     "comments": 0,
    186     "created_at": "2024-08-11T04:34:47Z",
    187     "updated_at": "2024-08-11T04:34:47Z",
    188     "closed_at": null,
    189     "author_association": "MEMBER",
    190     "type": null,
    191     "active_lock_reason": null,
    192     "sub_issues_summary": {
    193       "total": 0,
    194       "completed": 0,
    195       "percent_completed": 0
    196     },
    197     "issue_dependencies_summary": {
    198       "blocked_by": 0,
    199       "total_blocked_by": 0,
    200       "blocking": 0,
    201       "total_blocking": 0
    202     },
    203     "body": "https://github.com/LTNGlobal-opensource/ltntstools",
    204     "closed_by": null,
    205     "reactions": {
    206       "url": "https://api.github.com/repos/untangledco/streaming/issues/33/reactions",
    207       "total_count": 0,
    208       "+1": 0,
    209       "-1": 0,
    210       "laugh": 0,
    211       "hooray": 0,
    212       "confused": 0,
    213       "heart": 0,
    214       "rocket": 0,
    215       "eyes": 0
    216     },
    217     "timeline_url": "https://api.github.com/repos/untangledco/streaming/issues/33/timeline",
    218     "performed_via_github_app": null,
    219     "state_reason": null
    220   },
    221   {
    222     "url": "https://api.github.com/repos/untangledco/streaming/issues/31",
    223     "repository_url": "https://api.github.com/repos/untangledco/streaming",
    224     "labels_url": "https://api.github.com/repos/untangledco/streaming/issues/31/labels{/name}",
    225     "comments_url": "https://api.github.com/repos/untangledco/streaming/issues/31/comments",
    226     "events_url": "https://api.github.com/repos/untangledco/streaming/issues/31/events",
    227     "html_url": "https://github.com/untangledco/streaming/issues/31",
    228     "id": 2446156154,
    229     "node_id": "I_kwDOL1KTdc6RzWF6",
    230     "number": 31,
    231     "title": "m3u8: import Apple's test samples",
    232     "user": {
    233       "login": "ollytom",
    234       "id": 17470471,
    235       "node_id": "MDQ6VXNlcjE3NDcwNDcx",
    236       "avatar_url": "https://avatars.githubusercontent.com/u/17470471?v=4",
    237       "gravatar_id": "",
    238       "url": "https://api.github.com/users/ollytom",
    239       "html_url": "https://github.com/ollytom",
    240       "followers_url": "https://api.github.com/users/ollytom/followers",
    241       "following_url": "https://api.github.com/users/ollytom/following{/other_user}",
    242       "gists_url": "https://api.github.com/users/ollytom/gists{/gist_id}",
    243       "starred_url": "https://api.github.com/users/ollytom/starred{/owner}{/repo}",
    244       "subscriptions_url": "https://api.github.com/users/ollytom/subscriptions",
    245       "organizations_url": "https://api.github.com/users/ollytom/orgs",
    246       "repos_url": "https://api.github.com/users/ollytom/repos",
    247       "events_url": "https://api.github.com/users/ollytom/events{/privacy}",
    248       "received_events_url": "https://api.github.com/users/ollytom/received_events",
    249       "type": "User",
    250       "user_view_type": "public",
    251       "site_admin": false
    252     },
    253     "labels": [],
    254     "state": "open",
    255     "locked": false,
    256     "assignee": null,
    257     "assignees": [],
    258     "milestone": null,
    259     "comments": 6,
    260     "created_at": "2024-08-03T06:18:25Z",
    261     "updated_at": "2025-07-28T11:36:35Z",
    262     "closed_at": null,
    263     "author_association": "MEMBER",
    264     "type": null,
    265     "active_lock_reason": null,
    266     "sub_issues_summary": {
    267       "total": 0,
    268       "completed": 0,
    269       "percent_completed": 0
    270     },
    271     "issue_dependencies_summary": {
    272       "blocked_by": 0,
    273       "total_blocked_by": 0,
    274       "blocking": 0,
    275       "total_blocking": 0
    276     },
    277     "body": "Apple - you know, the one who basically \"own\" the HLS spec - provide some m3u8 samples at\nhttps://developer.apple.com/streaming/examples/\n\nThese would be good to have in testdata. I saw that Shaka Player have the examples in their test suite.",
    278     "closed_by": null,
    279     "reactions": {
    280       "url": "https://api.github.com/repos/untangledco/streaming/issues/31/reactions",
    281       "total_count": 0,
    282       "+1": 0,
    283       "-1": 0,
    284       "laugh": 0,
    285       "hooray": 0,
    286       "confused": 0,
    287       "heart": 0,
    288       "rocket": 0,
    289       "eyes": 0
    290     },
    291     "timeline_url": "https://api.github.com/repos/untangledco/streaming/issues/31/timeline",
    292     "performed_via_github_app": null,
    293     "state_reason": null
    294   },
    295   {
    296     "url": "https://api.github.com/repos/untangledco/streaming/issues/28",
    297     "repository_url": "https://api.github.com/repos/untangledco/streaming",
    298     "labels_url": "https://api.github.com/repos/untangledco/streaming/issues/28/labels{/name}",
    299     "comments_url": "https://api.github.com/repos/untangledco/streaming/issues/28/comments",
    300     "events_url": "https://api.github.com/repos/untangledco/streaming/issues/28/events",
    301     "html_url": "https://github.com/untangledco/streaming/issues/28",
    302     "id": 2383403962,
    303     "node_id": "I_kwDOL1KTdc6OD9u6",
    304     "number": 28,
    305     "title": "scte35: support decoding splice_schedule command type",
    306     "user": {
    307       "login": "ollytom",
    308       "id": 17470471,
    309       "node_id": "MDQ6VXNlcjE3NDcwNDcx",
    310       "avatar_url": "https://avatars.githubusercontent.com/u/17470471?v=4",
    311       "gravatar_id": "",
    312       "url": "https://api.github.com/users/ollytom",
    313       "html_url": "https://github.com/ollytom",
    314       "followers_url": "https://api.github.com/users/ollytom/followers",
    315       "following_url": "https://api.github.com/users/ollytom/following{/other_user}",
    316       "gists_url": "https://api.github.com/users/ollytom/gists{/gist_id}",
    317       "starred_url": "https://api.github.com/users/ollytom/starred{/owner}{/repo}",
    318       "subscriptions_url": "https://api.github.com/users/ollytom/subscriptions",
    319       "organizations_url": "https://api.github.com/users/ollytom/orgs",
    320       "repos_url": "https://api.github.com/users/ollytom/repos",
    321       "events_url": "https://api.github.com/users/ollytom/events{/privacy}",
    322       "received_events_url": "https://api.github.com/users/ollytom/received_events",
    323       "type": "User",
    324       "user_view_type": "public",
    325       "site_admin": false
    326     },
    327     "labels": [],
    328     "state": "open",
    329     "locked": false,
    330     "assignee": null,
    331     "assignees": [],
    332     "milestone": null,
    333     "comments": 2,
    334     "created_at": "2024-07-01T10:03:58Z",
    335     "updated_at": "2024-11-30T02:30:57Z",
    336     "closed_at": null,
    337     "author_association": "MEMBER",
    338     "type": null,
    339     "active_lock_reason": null,
    340     "sub_issues_summary": {
    341       "total": 0,
    342       "completed": 0,
    343       "percent_completed": 0
    344     },
    345     "issue_dependencies_summary": {
    346       "blocked_by": 0,
    347       "total_blocked_by": 0,
    348       "blocking": 0,
    349       "total_blocking": 0
    350     },
    351     "body": "We support encoding splice_schedule commands (see `packEvents`), but we don't support decoding them yet. For consistency, we could have two functions, `unpackEvent` and `unpackEvents` in command.go after `packEvent`.\n\nWe'll need accompanying tests in command_test.go. For example, a test could encode then decode the same splice_schedule command then test equality of the returned `[]Event`.",
    352     "closed_by": null,
    353     "reactions": {
    354       "url": "https://api.github.com/repos/untangledco/streaming/issues/28/reactions",
    355       "total_count": 0,
    356       "+1": 0,
    357       "-1": 0,
    358       "laugh": 0,
    359       "hooray": 0,
    360       "confused": 0,
    361       "heart": 0,
    362       "rocket": 0,
    363       "eyes": 0
    364     },
    365     "timeline_url": "https://api.github.com/repos/untangledco/streaming/issues/28/timeline",
    366     "performed_via_github_app": null,
    367     "state_reason": null
    368   },
    369   {
    370     "url": "https://api.github.com/repos/untangledco/streaming/issues/20",
    371     "repository_url": "https://api.github.com/repos/untangledco/streaming",
    372     "labels_url": "https://api.github.com/repos/untangledco/streaming/issues/20/labels{/name}",
    373     "comments_url": "https://api.github.com/repos/untangledco/streaming/issues/20/comments",
    374     "events_url": "https://api.github.com/repos/untangledco/streaming/issues/20/events",
    375     "html_url": "https://github.com/untangledco/streaming/issues/20",
    376     "id": 2337150284,
    377     "node_id": "I_kwDOL1KTdc6LThVM",
    378     "number": 20,
    379     "title": "m3u8: hlssdump? End-to-end package test",
    380     "user": {
    381       "login": "ollytom",
    382       "id": 17470471,
    383       "node_id": "MDQ6VXNlcjE3NDcwNDcx",
    384       "avatar_url": "https://avatars.githubusercontent.com/u/17470471?v=4",
    385       "gravatar_id": "",
    386       "url": "https://api.github.com/users/ollytom",
    387       "html_url": "https://github.com/ollytom",
    388       "followers_url": "https://api.github.com/users/ollytom/followers",
    389       "following_url": "https://api.github.com/users/ollytom/following{/other_user}",
    390       "gists_url": "https://api.github.com/users/ollytom/gists{/gist_id}",
    391       "starred_url": "https://api.github.com/users/ollytom/starred{/owner}{/repo}",
    392       "subscriptions_url": "https://api.github.com/users/ollytom/subscriptions",
    393       "organizations_url": "https://api.github.com/users/ollytom/orgs",
    394       "repos_url": "https://api.github.com/users/ollytom/repos",
    395       "events_url": "https://api.github.com/users/ollytom/events{/privacy}",
    396       "received_events_url": "https://api.github.com/users/ollytom/received_events",
    397       "type": "User",
    398       "user_view_type": "public",
    399       "site_admin": false
    400     },
    401     "labels": [],
    402     "state": "open",
    403     "locked": false,
    404     "assignee": null,
    405     "assignees": [],
    406     "milestone": null,
    407     "comments": 0,
    408     "created_at": "2024-06-06T01:59:36Z",
    409     "updated_at": "2024-06-06T01:59:36Z",
    410     "closed_at": null,
    411     "author_association": "MEMBER",
    412     "type": null,
    413     "active_lock_reason": null,
    414     "sub_issues_summary": {
    415       "total": 0,
    416       "completed": 0,
    417       "percent_completed": 0
    418     },
    419     "issue_dependencies_summary": {
    420       "blocked_by": 0,
    421       "total_blocked_by": 0,
    422       "blocking": 0,
    423       "total_blocking": 0
    424     },
    425     "body": "[hls.js] maintains a list of active HLS streams available over the Internet at \nhttps://raw.githubusercontent.com/video-dev/hls.js/v1.5.11/tests/test-streams.js\n\nWe have unit tests and there's a bunch of code we're not testing. But it would be a good exercise in dev tooling development to write a real-world application which exercises our m3u8 package more thoroughly. \nFrom there that focusses efforts on where in the package we should write tests.\n\nFor example, a tool which reads a master HLS playlist, and writes the contents of each media playlist to the filesystem.\nThat can involve decoding then re-encoding the playlist. If we hit things like tags or attributes  we don't recognise or can't handle well, we can terminate the program. This also lets us spot bad error messages from our package.\n\n[hls.js]: https://hlsjs.video-dev.org",
    426     "closed_by": null,
    427     "reactions": {
    428       "url": "https://api.github.com/repos/untangledco/streaming/issues/20/reactions",
    429       "total_count": 0,
    430       "+1": 0,
    431       "-1": 0,
    432       "laugh": 0,
    433       "hooray": 0,
    434       "confused": 0,
    435       "heart": 0,
    436       "rocket": 0,
    437       "eyes": 0
    438     },
    439     "timeline_url": "https://api.github.com/repos/untangledco/streaming/issues/20/timeline",
    440     "performed_via_github_app": null,
    441     "state_reason": null
    442   },
    443   {
    444     "url": "https://api.github.com/repos/untangledco/streaming/issues/19",
    445     "repository_url": "https://api.github.com/repos/untangledco/streaming",
    446     "labels_url": "https://api.github.com/repos/untangledco/streaming/issues/19/labels{/name}",
    447     "comments_url": "https://api.github.com/repos/untangledco/streaming/issues/19/comments",
    448     "events_url": "https://api.github.com/repos/untangledco/streaming/issues/19/events",
    449     "html_url": "https://github.com/untangledco/streaming/issues/19",
    450     "id": 2332869135,
    451     "node_id": "I_kwDOL1KTdc6LDMIP",
    452     "number": 19,
    453     "title": "m3u8: Finish TODOs in writeDateRange()",
    454     "user": {
    455       "login": "ollytom",
    456       "id": 17470471,
    457       "node_id": "MDQ6VXNlcjE3NDcwNDcx",
    458       "avatar_url": "https://avatars.githubusercontent.com/u/17470471?v=4",
    459       "gravatar_id": "",
    460       "url": "https://api.github.com/users/ollytom",
    461       "html_url": "https://github.com/ollytom",
    462       "followers_url": "https://api.github.com/users/ollytom/followers",
    463       "following_url": "https://api.github.com/users/ollytom/following{/other_user}",
    464       "gists_url": "https://api.github.com/users/ollytom/gists{/gist_id}",
    465       "starred_url": "https://api.github.com/users/ollytom/starred{/owner}{/repo}",
    466       "subscriptions_url": "https://api.github.com/users/ollytom/subscriptions",
    467       "organizations_url": "https://api.github.com/users/ollytom/orgs",
    468       "repos_url": "https://api.github.com/users/ollytom/repos",
    469       "events_url": "https://api.github.com/users/ollytom/events{/privacy}",
    470       "received_events_url": "https://api.github.com/users/ollytom/received_events",
    471       "type": "User",
    472       "user_view_type": "public",
    473       "site_admin": false
    474     },
    475     "labels": [],
    476     "state": "open",
    477     "locked": false,
    478     "assignee": null,
    479     "assignees": [],
    480     "milestone": null,
    481     "comments": 0,
    482     "created_at": "2024-06-04T08:19:01Z",
    483     "updated_at": "2024-06-04T08:19:01Z",
    484     "closed_at": null,
    485     "author_association": "MEMBER",
    486     "type": null,
    487     "active_lock_reason": null,
    488     "sub_issues_summary": {
    489       "total": 0,
    490       "completed": 0,
    491       "percent_completed": 0
    492     },
    493     "issue_dependencies_summary": {
    494       "blocked_by": 0,
    495       "total_blocked_by": 0,
    496       "blocking": 0,
    497       "total_blocking": 0
    498     },
    499     "body": "Fields of DateRange that we're not writing out as text include:\n\n- Duration, Planned\n- Custom attributes\n- CueCommand\n\n## CueCommand\n\nNeed to work out under which conditions to write it out. If CuiIn or CueOut are set, we cannot write out CueCommand as that's invalid.\n\nAnother bit of error handling might be to check that CueCommand and/or CueIn/Out have a valid value set in the Splice.Type.\n\n## Custom\n\nWe'll need a type switch on the value, and error out if we get anything we can't reliably turn into text.\nI don't think we'll be able quoted versus unquoted strings. Quick sketch:\n\n\tswitch v.(type) {\n\tcase float32:\n\t\treturn fmt.Sprintf(\"%03f\"...\n\tcase string:\n\t\treturn fmt.Sprintf(\"%q\" ...)\n\tcase int:\n\t\treturn fmt.Sprintf(\"%d\", ...\n\tdefault:\n\t\treturn fmt.Errorf(\"attribute %s: cannot marshal %T to text\", v)\n\t}",
    500     "closed_by": null,
    501     "reactions": {
    502       "url": "https://api.github.com/repos/untangledco/streaming/issues/19/reactions",
    503       "total_count": 0,
    504       "+1": 0,
    505       "-1": 0,
    506       "laugh": 0,
    507       "hooray": 0,
    508       "confused": 0,
    509       "heart": 0,
    510       "rocket": 0,
    511       "eyes": 0
    512     },
    513     "timeline_url": "https://api.github.com/repos/untangledco/streaming/issues/19/timeline",
    514     "performed_via_github_app": null,
    515     "state_reason": null
    516   },
    517   {
    518     "url": "https://api.github.com/repos/untangledco/streaming/issues/12",
    519     "repository_url": "https://api.github.com/repos/untangledco/streaming",
    520     "labels_url": "https://api.github.com/repos/untangledco/streaming/issues/12/labels{/name}",
    521     "comments_url": "https://api.github.com/repos/untangledco/streaming/issues/12/comments",
    522     "events_url": "https://api.github.com/repos/untangledco/streaming/issues/12/events",
    523     "html_url": "https://github.com/untangledco/streaming/issues/12",
    524     "id": 2327047060,
    525     "node_id": "I_kwDOL1KTdc6Ks-uU",
    526     "number": 12,
    527     "title": "m3u8: higher-level validation of Variant before returning",
    528     "user": {
    529       "login": "ollytom",
    530       "id": 17470471,
    531       "node_id": "MDQ6VXNlcjE3NDcwNDcx",
    532       "avatar_url": "https://avatars.githubusercontent.com/u/17470471?v=4",
    533       "gravatar_id": "",
    534       "url": "https://api.github.com/users/ollytom",
    535       "html_url": "https://github.com/ollytom",
    536       "followers_url": "https://api.github.com/users/ollytom/followers",
    537       "following_url": "https://api.github.com/users/ollytom/following{/other_user}",
    538       "gists_url": "https://api.github.com/users/ollytom/gists{/gist_id}",
    539       "starred_url": "https://api.github.com/users/ollytom/starred{/owner}{/repo}",
    540       "subscriptions_url": "https://api.github.com/users/ollytom/subscriptions",
    541       "organizations_url": "https://api.github.com/users/ollytom/orgs",
    542       "repos_url": "https://api.github.com/users/ollytom/repos",
    543       "events_url": "https://api.github.com/users/ollytom/events{/privacy}",
    544       "received_events_url": "https://api.github.com/users/ollytom/received_events",
    545       "type": "User",
    546       "user_view_type": "public",
    547       "site_admin": false
    548     },
    549     "labels": [],
    550     "state": "open",
    551     "locked": false,
    552     "assignee": null,
    553     "assignees": [],
    554     "milestone": null,
    555     "comments": 0,
    556     "created_at": "2024-05-31T06:18:53Z",
    557     "updated_at": "2024-05-31T06:18:53Z",
    558     "closed_at": null,
    559     "author_association": "MEMBER",
    560     "type": null,
    561     "active_lock_reason": null,
    562     "sub_issues_summary": {
    563       "total": 0,
    564       "completed": 0,
    565       "percent_completed": 0
    566     },
    567     "issue_dependencies_summary": {
    568       "blocked_by": 0,
    569       "total_blocked_by": 0,
    570       "blocking": 0,
    571       "total_blocking": 0
    572     },
    573     "body": "In parseVariant(), we don't do much validation beyond type checking and parsing tokens before returning a Variant.\nFor example, Apple HLS authoring spec mentions that the `CODECS` attribute must be set for all variants.\n\nThere's some easy validation. After we've broken out of the loop reading items from the lexer, have a bunch of basic if statements checking stuff:\n\n\tfunc parseVariant() {\n\t\tvar v Variant\n\t\tfor it := range items {\n\t\t\tswitch ... {\n\t\t\t}\n\t\t}\n\t\tif v.Codecs == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"codecs not set\")\n\t\t}\n\t\treturn v, nil\n\t}\n\nNot sure how to test this exactly. Two ways off the top of my head:\n\n1. make a `chan item` and send items through it. Pass the chan to parseVariant().\n2. decode simple playlists which have different \"bad\" variants in them.\n\nHowever we do it, as long as it's easy to add new, readable test cases.\nMy first instinct is to go for option 2 as it feels clearer to have bad playlist specified as text as opposed to code with structs sent through channels.",
    574     "closed_by": null,
    575     "reactions": {
    576       "url": "https://api.github.com/repos/untangledco/streaming/issues/12/reactions",
    577       "total_count": 0,
    578       "+1": 0,
    579       "-1": 0,
    580       "laugh": 0,
    581       "hooray": 0,
    582       "confused": 0,
    583       "heart": 0,
    584       "rocket": 0,
    585       "eyes": 0
    586     },
    587     "timeline_url": "https://api.github.com/repos/untangledco/streaming/issues/12/timeline",
    588     "performed_via_github_app": null,
    589     "state_reason": null
    590   }
    591 ]