static int open_file(struct demuxer *demuxer, enum demux_check check) { if (stream_get_size(demuxer->stream) == 0) return -1; int flags = 0; if (check <= DEMUX_CHECK_REQUEST) flags |= MP_ARCHIVE_FLAG_UNSAFE; struct mp_archive *mpa = mp_archive_new(demuxer->log, demuxer->stream, flags); if (!mpa) return -1; struct playlist *pl = talloc_zero(demuxer, struct playlist); demuxer->playlist = pl; // make it load archive:// pl->disable_safety = true; char *prefix = mp_url_escape(mpa, demuxer->stream->url, "~|"); char **files = NULL; int num_files = 0; for (;;) { struct archive_entry *entry; int r = archive_read_next_header(mpa->arch, &entry); if (r == ARCHIVE_EOF) break; if (r < ARCHIVE_OK) MP_ERR(demuxer, "libarchive: %s\n", archive_error_string(mpa->arch)); if (r < ARCHIVE_WARN) break; if (archive_entry_filetype(entry) != AE_IFREG) continue; const char *fn = archive_entry_pathname(entry); // Some archives may have no filenames. if (!fn) fn = talloc_asprintf(mpa, "mpv_unknown#%d\n", num_files); // stream_libarchive.c does the real work char *f = talloc_asprintf(mpa, "archive://%s|%s", prefix, fn); MP_TARRAY_APPEND(mpa, files, num_files, f); } if (files) qsort(files, num_files, sizeof(files[0]), cmp_filename); for (int n = 0; n < num_files; n++) playlist_add_file(pl, files[n]); demuxer->filetype = "archive"; demuxer->fully_read = true; mp_archive_free(mpa); return 0; }
static int open_file(struct demuxer *demuxer, enum demux_check check) { if (!demuxer->access_references) return -1; if (RarProbe(demuxer->stream)) return -1; int count; rar_file_t **files; if (RarParse(demuxer->stream, &count, &files)) return -1; void *tmp = talloc_new(NULL); talloc_steal(tmp, files); struct playlist *pl = talloc_zero(demuxer, struct playlist); demuxer->playlist = pl; // make it load rar:// pl->disable_safety = true; char *prefix = mp_url_escape(tmp, demuxer->stream->url, "~|"); for (int n = 0; n < count; n++) { // stream_rar.c does the real work playlist_add_file(pl, talloc_asprintf(tmp, "rar://%s|%s", prefix, files[n]->name)); RarFileDelete(files[n]); } demuxer->filetype = "rar"; demuxer->fully_read = true; talloc_free(tmp); return 0; }