Skip to content

Commit 88b7333

Browse files
committed
Initial commit
1 parent 55b28ae commit 88b7333

File tree

5 files changed

+55
-13
lines changed

5 files changed

+55
-13
lines changed

src/dump.c

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <stdlib.h>
22
#include <stdio.h>
33

4+
#include "m3u8.h"
45
#include "m3u8stream.h"
56
#include "m3u8utils.h"
67
#include "errors.h"
@@ -192,6 +193,8 @@ static void dump_segments(const struct M3U8Stream* const stream) {
192193

193194
int err = M3U8ERR_SUCCESS;
194195

196+
const struct M3U8BaseURI* const base_uri = m3u8playlist_geturi(&stream->playlist);
197+
195198
char* resolved_uri = NULL;
196199

197200
for (index = 0; index < stream->offset; index++) {
@@ -306,7 +309,7 @@ static void dump_segments(const struct M3U8Stream* const stream) {
306309
/* URI */
307310
free(resolved_uri);
308311

309-
err = m3u8uri_resolve(&stream->playlist.uri, segment->key.uri, &resolved_uri);
312+
err = m3u8uri_resolve(base_uri, segment->key.uri, &resolved_uri);
310313

311314
put_jkey(KURI, 6);
312315
put_jvalue_string((err == M3U8ERR_SUCCESS) ? resolved_uri : segment->key.uri);
@@ -375,7 +378,7 @@ static void dump_segments(const struct M3U8Stream* const stream) {
375378
/* URI */
376379
free(resolved_uri);
377380

378-
err = m3u8uri_resolve(&stream->playlist.uri, segment->uri, &resolved_uri);
381+
err = m3u8uri_resolve(base_uri, segment->uri, &resolved_uri);
379382

380383
put_jkey(KURI, 5);
381384
put_jvalue_string((err == M3U8ERR_SUCCESS) ? resolved_uri : segment->uri);
@@ -439,7 +442,7 @@ static void dump_segments(const struct M3U8Stream* const stream) {
439442
/* URI */
440443
free(resolved_uri);
441444

442-
err = m3u8uri_resolve(&stream->playlist.uri, map->uri, &resolved_uri);
445+
err = m3u8uri_resolve(base_uri, map->uri, &resolved_uri);
443446

444447
put_jkey(KURI, 5);
445448
put_jvalue_string((err == M3U8ERR_SUCCESS) ? resolved_uri : map->uri);
@@ -470,8 +473,10 @@ static void dump_media_stream(
470473
int err = M3U8ERR_SUCCESS;
471474

472475
const struct M3U8Media* const media = item->item;
476+
const struct M3U8BaseURI* const base_uri = m3u8playlist_geturi(&stream->playlist);
473477

474478
const char* name = NULL;
479+
475480
char* resolved_uri = NULL;
476481

477482
json_object_begin(2);
@@ -618,7 +623,7 @@ static void dump_media_stream(
618623
put_jdelimiter();
619624

620625
/* URI */
621-
err = m3u8uri_resolve(&stream->playlist.uri, media->uri, &resolved_uri);
626+
err = m3u8uri_resolve(base_uri, media->uri, &resolved_uri);
622627

623628
put_jkey(KURI, 3);
624629
put_jvalue_string((err == M3U8ERR_SUCCESS) ? resolved_uri : media->uri);
@@ -652,6 +657,7 @@ static void dump_variant_stream(
652657
int err = M3U8ERR_SUCCESS;
653658

654659
const struct M3U8VariantStream* const variant_stream = item->item;
660+
const struct M3U8BaseURI* const base_uri = m3u8playlist_geturi(&stream->playlist);
655661

656662
char* resolved_uri = NULL;
657663

@@ -855,7 +861,7 @@ static void dump_variant_stream(
855861

856862
put_jdelimiter();
857863

858-
err = m3u8uri_resolve(&stream->playlist.uri, variant_stream->uri, &resolved_uri);
864+
err = m3u8uri_resolve(base_uri, variant_stream->uri, &resolved_uri);
859865

860866
put_jkey(KURI, 3);
861867
put_jvalue_string((err == M3U8ERR_SUCCESS) ? resolved_uri : variant_stream->uri);

src/m3u8.c

+11-1
Original file line numberDiff line numberDiff line change
@@ -3604,6 +3604,16 @@ int m3u8_dump_file(
36043604

36053605
}
36063606

3607+
const struct M3U8BaseURI* m3u8playlist_geturi(const struct M3U8Playlist* const playlist) {
3608+
/*
3609+
Get the base URI of the M3U8 playlist.
3610+
*/
3611+
3612+
const struct M3U8BaseURI* const base_uri = (playlist->suburi.uri == NULL) ? &playlist->uri : &playlist->suburi;
3613+
return base_uri;
3614+
3615+
}
3616+
36073617
static int m3u8playlist_seturi(
36083618
struct M3U8Playlist* const playlist,
36093619
const enum M3U8BaseURIType type,
@@ -3944,7 +3954,7 @@ int m3u8playlist_load_subresource(
39443954

39453955
int err = 0;
39463956

3947-
const struct M3U8BaseURI* const base_uri = (root->suburi.uri == NULL) ? &root->uri : &root->suburi;
3957+
const struct M3U8BaseURI* const base_uri = m3u8playlist_geturi(root);
39483958

39493959
char* uri = NULL;
39503960

src/m3u8.h

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ struct M3U8Tag* m3u8playlist_igettag(
6060
enum M3U8TagType type
6161
);
6262

63+
const struct M3U8BaseURI* m3u8playlist_geturi(const struct M3U8Playlist* const playlist);
64+
6365
int m3u8playlist_tagexists(
6466
const struct M3U8Playlist* const playlist,
6567
enum M3U8TagType type

src/m3u8utils.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,10 @@ int m3u8uri_resolve(
790790
err = m3u8uri_resolve_url(base->uri, source, destination);
791791
break;
792792
case M3U8_BASE_URI_TYPE_LOCAL_FILE:
793-
err = m3u8uri_resolve_path(base->uri, source, destination);
793+
err = m3u8uri_resolve_file(base->uri, source, destination);
794+
break;
795+
case M3U8_BASE_URI_TYPE_LOCAL_DIRECTORY:
796+
err = m3u8uri_resolve_directory(base->uri, source, destination);
794797
break;
795798
default:
796799
err = M3U8ERR_LOAD_UNSUPPORTED_URI;

src/python-kai.c

+27-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#define PY_SSIZE_T_CLEAN
22
#include <Python.h>
33

4+
#include "m3u8.h"
5+
#include "m3u8utils.h"
46
#include "m3u8stream.h"
57
#include "errors.h"
68

@@ -285,7 +287,14 @@ static PyObject* get_enum(const char* const name, const biguint_t value) {
285287
PyObject* args = NULL;
286288

287289
PyObject* class = NULL;
288-
PyObject* module = PyImport_ImportModule("kai");
290+
PyObject* module = NULL;
291+
292+
if (value == 0) {
293+
result = Py_None;
294+
goto end;
295+
}
296+
297+
module = PyImport_ImportModule("kai");
289298

290299
if (module == NULL) {
291300
goto end;
@@ -326,7 +335,12 @@ static PyObject* get_enum(const char* const name, const biguint_t value) {
326335

327336
}
328337

329-
static PyObject* topy(const void* const object, const enum M3U8StreamItemType ktype) {
338+
static PyObject* topy(
339+
const struct M3U8Stream* const root,
340+
const struct M3U8StreamItem* const item
341+
) {
342+
343+
int err = M3U8ERR_SUCCESS;
330344

331345
PyObject* args = NULL;
332346

@@ -355,15 +369,18 @@ static PyObject* topy(const void* const object, const enum M3U8StreamItemType kt
355369

356370
PyObject* module = NULL;
357371

372+
char* resolved_uri = NULL;
373+
const struct M3U8BaseURI* const base_uri = m3u8playlist_geturi(&root->playlist);
374+
358375
module = PyImport_ImportModule("kai");
359376

360377
if (module == NULL) {
361378
return NULL;
362379
}
363380

364-
switch (ktype) {
381+
switch (item->type) {
365382
case M3U8_STREAM_MEDIA: {
366-
const struct M3U8Media* const media = object;
383+
const struct M3U8Media* const media = item->item;
367384

368385
/* Type */
369386
type = get_enum("M3U8MediaType", media->type);
@@ -373,7 +390,9 @@ static PyObject* topy(const void* const object, const enum M3U8StreamItemType kt
373390
}
374391

375392
/* URI */
376-
uri = get_string(media->uri);
393+
err = m3u8uri_resolve(base_uri, media->uri, &resolved_uri);
394+
395+
uri = get_string((err == M3U8ERR_SUCCESS) ? resolved_uri : media->uri);
377396

378397
if (uri == NULL) {
379398
return NULL;
@@ -511,6 +530,8 @@ static PyObject* topy(const void* const object, const enum M3U8StreamItemType kt
511530
}
512531
}
513532

533+
free(resolved_uri);
534+
514535
Py_DECREF(module);
515536
Py_DECREF(class);
516537

@@ -557,7 +578,7 @@ static PyObject* _m3u8stream_getstream(
557578

558579
switch (item->type) {
559580
case M3U8_STREAM_MEDIA: {
560-
return topy(item->item, item->type);
581+
return topy(stream, item);
561582
}
562583
case M3U8_STREAM_VARIANT_STREAM: {
563584
const struct M3U8VariantStream* const variant = item->item;

0 commit comments

Comments
 (0)