mpg123-1.30.1

This commit is contained in:
Ozkan Sezer
2022-07-13 03:25:24 +03:00
parent c46daebce1
commit 586c237857
8 changed files with 156 additions and 79 deletions

View File

@@ -18,8 +18,9 @@ You really need:
- For other exotic platforms, also see ports/
- If building from direct SCM checkout, you need GNU autotools installed
(see developer build below).
- If building from direct source code repository checkout, as opposed to
a release or snapshot tarball, you need GNU autotools installed
(see Developer Build below).
You want:

12
NEWS
View File

@@ -1,3 +1,15 @@
1.30.1
------
- mpg123:
-- Show stderr of network helpers in -vvv mode.
-- Use curl --http0.9, if available, to support shoutcast v1 streams
without wget (wget not needing such switch, yet).
-- Support file:// URLs for local access as was intended with the last
release.
-- Give more helpful error message if neither wget nor curl are usable, also
allow error messages from curl to appear when not --quiet.
-- Update the man page.
1.30.0
------
- build:

22
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for mpg123 1.30.0.
# Generated by GNU Autoconf 2.69 for mpg123 1.30.1.
#
# Report bugs to <maintainer@mpg123.org>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='mpg123'
PACKAGE_TARNAME='mpg123'
PACKAGE_VERSION='1.30.0'
PACKAGE_STRING='mpg123 1.30.0'
PACKAGE_VERSION='1.30.1'
PACKAGE_STRING='mpg123 1.30.1'
PACKAGE_BUGREPORT='maintainer@mpg123.org'
PACKAGE_URL=''
@@ -1683,7 +1683,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures mpg123 1.30.0 to adapt to many kinds of systems.
\`configure' configures mpg123 1.30.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1754,7 +1754,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of mpg123 1.30.0:";;
short | recursive ) echo "Configuration of mpg123 1.30.1:";;
esac
cat <<\_ACEOF
@@ -1988,7 +1988,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
mpg123 configure 1.30.0
mpg123 configure 1.30.1
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2594,7 +2594,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by mpg123 $as_me 1.30.0, which was
It was created by mpg123 $as_me 1.30.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3553,7 +3553,7 @@ fi
# Define the identity of the package.
PACKAGE='mpg123'
VERSION='1.30.0'
VERSION='1.30.1'
cat >>confdefs.h <<_ACEOF
@@ -19559,7 +19559,7 @@ $as_echo_n "checking for automatic network support... " >&6; }
if test "x$have_fork" = "xyes"; then
network_type=exec
elif test "x$win32_specific_codes" = "xenabled"; then
network_type=winhttp
network_type=wininet
elif test "x$have_network" = "xyes"; then
network_type="internal"
else
@@ -20656,7 +20656,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by mpg123 $as_me 1.30.0, which was
This file was extended by mpg123 $as_me 1.30.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -20722,7 +20722,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
mpg123 config.status 1.30.0
mpg123 config.status 1.30.1
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"

View File

@@ -9,7 +9,7 @@ dnl 2.69 at least.
AC_PREREQ([2.69])
dnl ############# Initialisation
AC_INIT([mpg123], [1.30.0], [maintainer@mpg123.org])
AC_INIT([mpg123], [1.30.1], [maintainer@mpg123.org])
dnl Increment API_VERSION when the API gets changes (new functions).
dnl libmpg123
@@ -2619,7 +2619,7 @@ if test x$network_type = xauto; then
if test "x$have_fork" = "xyes"; then
network_type=exec
elif test "x$win32_specific_codes" = "xenabled"; then
network_type=winhttp
network_type=wininet
elif test "x$have_network" = "xyes"; then
network_type="internal"
else

View File

@@ -1,4 +1,4 @@
.TH mpg123 1 "26 Apr 2020"
.TH mpg123 1 "11 Jul 2022"
.SH NAME
mpg123 \- play audio MPEG 1.0/2.0/2.5 stream (layers 1, 2 and 3)
.SH SYNOPSIS
@@ -25,9 +25,10 @@ The path name(s) of one or more input files. They must be
valid MPEG-1.0/2.0/2.5 audio layer 1, 2 or 3 bit streams.
If a dash ``\-'' is specified, MPEG data will
be read from the standard input. Furthermore, any name
starting with ``http://'' is recognized as
starting with ``http://'' or ``https://'' is recognized as
.I URL
(see next section).
(see next section), while a leading ``file://'' is being stripped for
normal local file access, for consistency (since mpg123 1.30.1).
.SH OPTIONS
.B mpg123
options may be either the traditional POSIX one letter options,
@@ -72,27 +73,20 @@ This comes a bit closer to the notion of a MP3 file as a defined collection
of MPEG frames that belong together, but gets rid of the flexibility that can be fun at times but
mostly is hell for the programmer of the parser and decoder ...
.TP
\fB\-\^\-network \fI backend
Select network backend (helper program), choices are usually auto, wget, and curl.
Auto means to try the first available backend.
.TP
\fB\-\^-resync\-limit \fIbytes\fR
Set number of bytes to search for valid MPEG data once lost in stream; <0 means search whole stream.
If you know there are huge chunks of invalid data in your files... here is your hammer.
Note: Only since version 1.14 this also increases the amount of junk skipped on beginning.
.TP
\fB\-p \fIURL \fR| \fBnone\fR, \fB\-\^\-proxy \fIURL \fR| \fBnone
The specified
.I proxy
will be used for HTTP requests. It
should be specified as full URL (``http://host.domain:port/''),
but the ``http://'' prefix, the port number and the trailing
slash are optional (the default port is 80). Specifying
.B none
means not to use any proxy, and to retrieve files directly
from the respective servers. See also the
``HTTP SUPPORT'' section.
.TP
\fB\-u \fIauth\fR, \fB\-\^\-auth \fIauth
HTTP authentication to use when receiving files via HTTP.
The format used is user:password. Mpg123 will clear this quickly, but it may still appear
in sight of other users or even just in your shell history.
in sight of other users or even just in your shell history. You may seek alternative ways
to specify that to your network backend.
.TP
\fB\-\^\-auth-file \fIauthfile
Provide the authentication info via given file instead of command line directly.
@@ -469,28 +463,25 @@ Print the version string.
In addition to reading MPEG audio streams from ordinary
files and from the standard input,
.B mpg123
supports retrieval of MPEG audio files or playlists via the HTTP protocol,
supports retrieval of MPEG audio streams or playlists via the HTTP protocol,
which is used in the World Wide Web (WWW). Such files are
specified using a so-called URL, which starts with ``http://''. When a file with
that prefix is encountered,
specified using a so-called URL, which starts with http:// or https://.
When a file with that prefix is encountered,
.B mpg123
attempts to open an HTTP connection to the server in order to
retrieve that file to decode and play it.
.P
It is often useful to retrieve files through a WWW cache or
so-called proxy. To accomplish this,
since 1.30.0 will by default call an external helper program (either
.BR wget (1)
or
.BR curl (1),
see the
.B \-\^\-network
option)
to retrieve the resource. You can configure access via a proxy
server using the standard environment variables those programs support. The
.BR \-\^\-proxy
option that
.B mpg123
examines the environment for variables named
.BR MP3_HTTP_PROXY ", " http_proxy " and " HTTP_PROXY ,
in this order. The value of the first one that is set will
be used as proxy specification. To override this, you can
use the
.B \-p
command line option (see the ``OPTIONS'' section). Specifying
.B "\-p none"
will enforce contacting the server directly without using
any proxy, even if one of the above environment variables
is set.
before 1.30.0 used for its internal network code is gone
in the default build now and will probably disappear for good with 1.31.1.
.P
Note that, in order to play MPEG audio files from a WWW
server, it is necessary that the connection to that server
@@ -506,9 +497,8 @@ to your local harddisk (e.g. using
.BR wget (1))
and then play them from there.
.P
If authentication is needed to access the file it can be
specified with the
.BR "\-u user:pass".
Streams with embedded ICY metadata are supported, the interval being communicated via HTTP
headers or \fB\-\^\-icy-interval\fR.
.SH INTERRUPT
When in terminal control mode, you can quit via pressing the q key,
while any time you can abort
@@ -622,7 +612,9 @@ input side.
Mostly MPEG-1 layer 2 and 3 are tested in real life.
Please report any issues and provide test files to help fixing them.
.P
No CRC error checking is performed.
No CRC error checking is performed. But the decoder is built and tested
to behave nicely with damaged streams. Mostly, damaged frames will just be
silent.
.P
Some platforms lack audio hardware support; you may be able to use the
.B -s

View File

@@ -3,7 +3,7 @@
# - devel packages for alsa, sdl, etc... to build the respective output modules.
Summary: The fast console mpeg audio decoder/player.
Name: mpg123
Version: 1.30.0
Version: 1.30.1
Release: 1
URL: http://www.mpg123.org/
License: GPL

View File

@@ -65,12 +65,28 @@ static char *catstr(const char *par, const char *value)
static int got_curl = -1;
static int got_wget = -1;
static int check_program(char **argv)
// Check if program executes, also test if given token occurs in its output.
// Returns 0 if not, 1 if exec works, 2 if also token found.
// Token has to be < 1024 characters in length.
static int check_program(char * const *argv, const char *token)
{
int fd[2];
int gottoken = 0;
if(token)
{
if(pipe(fd))
return 0;
compat_binmode(fd[0], TRUE);
compat_binmode(fd[1], TRUE);
}
pid_t pid = fork();
if(pid == 0)
{
int outfd = open("/dev/null", O_WRONLY);
int outfd = fd[1];
if(token)
close(fd[0]);
else
outfd = open("/dev/null", O_WRONLY);
dup2(outfd, STDOUT_FILENO);
int infd = open("/dev/null", O_RDONLY);
dup2(infd, STDIN_FILENO);
@@ -81,10 +97,41 @@ static int check_program(char **argv)
}
else if(pid > 0)
{
if(token)
{
char buf[1024];
close(fd[1]);
size_t toklen = strlen(token);
if(toklen > 0 && toklen < sizeof(buf))
{
size_t bufoff = 0;
size_t got;
while( (got = unintr_read(fd[0], buf+bufoff, sizeof(buf)-1-bufoff)) )
{
bufoff += got;
buf[bufoff] = 0; // Now it's a terminated string.
if(!gottoken && strstr(buf, token))
gottoken = 1;
if(gottoken)
bufoff = 0; // just forget everything
else if(bufoff > toklen)
{
// Remember the last toklen-1 bytes to compare later.
memmove(buf, buf+bufoff-toklen+1, toklen-1);
bufoff = toklen-1;
}
}
}
close(fd[0]);
}
int stat;
if( (waitpid(pid, &stat, 0) == pid)
&& WIFEXITED(stat) && WEXITSTATUS(stat)==0 )
return 1;
return 1+gottoken;
} else if(token)
{
close(fd[0]);
close(fd[1]);
}
return 0; // false, not there
}
@@ -147,6 +194,9 @@ static char **curl_argv(const char *url, const char * const * client_head)
"curl" // begins with program name
#ifdef DEBUG
, "--verbose"
#else
, "--silent"
, "--show-error"
#endif
, "--dump-header"
, "-"
@@ -156,6 +206,8 @@ static char **curl_argv(const char *url, const char * const * client_head)
// Get the count of argument strings right!
// Fixed args + agent + client headers [+ auth] + URL + NULL
int argc = sizeof(base_args)/sizeof(char*)+2+2*cheads+1+1;
if(got_curl > 1)
argc++; // add --http0.9
char *httpauth = NULL;
if(param.httpauth && (httpauth = compat_strdup(param.httpauth)))
argc += 2;
@@ -168,6 +220,8 @@ static char **curl_argv(const char *url, const char * const * client_head)
int an = 0;
for(;an<sizeof(base_args)/sizeof(char*); ++an)
argv[an] = compat_strdup(base_args[an]);
if(got_curl > 1)
argv[an++] = compat_strdup("--http0.9");
argv[an++] = compat_strdup("--user-agent");
argv[an++] = compat_strdup(PACKAGE_NAME "/" PACKAGE_VERSION);
for(size_t ch=0; ch < cheads; ++ch)
@@ -188,29 +242,38 @@ static char **curl_argv(const char *url, const char * const * client_head)
net123_handle *net123_open(const char *url, const char * const * client_head)
{
int use_curl = 0;
char * const curl_check_argv[] = { "curl", "--help", "all", NULL };
char * const wget_check_argv[] = { "wget", "--version", NULL };
// Semi-threadsafe: The check might take place multiple times, but writing the integer
// should be safe enough.
if(!strcmp("auto",param.network_backend))
{
char *curl_argv[] = { "curl", "--version", NULL };
char *wget_argv[] = { "wget", "--version", NULL };
if(got_curl < 0)
got_curl = check_program(curl_argv);
if(got_wget < 0)
got_wget = check_program(wget_argv);
if(got_wget < 1 && got_curl == 1)
got_wget = check_program(wget_check_argv, NULL);
if(!got_wget && got_curl < 0)
got_curl = check_program(curl_check_argv, "--http0.9");
if(got_wget < 1 && got_curl)
use_curl = 1;
} else if(!strcmp("curl", param.network_backend))
{
if(got_curl < 0) // Still need to know if HTTP/0.9 option is there.
got_curl = check_program(curl_check_argv, "--http0.9");
use_curl = 1;
} else if(!strcmp("wget", param.network_backend))
{
if(got_wget < 0)
got_wget = check_program(wget_check_argv, NULL);
use_curl = 0;
} else
{
merror("invalid network backend specified: %s", param.network_backend);
return NULL;
}
if((!use_curl && !got_wget) || (use_curl && !got_curl))
{
error("missing working network helper program (wget or curl)");
return NULL;
}
int fd[2];
int hi = -1; // index of header value that might get a continuation line
@@ -252,6 +315,8 @@ net123_handle *net123_open(const char *url, const char * const * client_head)
if(!argv)
exit(1);
errno = 0;
if(!param.quiet)
{
if(param.verbose > 2)
{
char **a = argv;
@@ -262,10 +327,11 @@ net123_handle *net123_open(const char *url, const char * const * client_head)
++a;
}
}
#ifndef DEBUG
} else
{
int errfd = open("/dev/null", O_WRONLY);
dup2(errfd, STDERR_FILENO);
#endif
}
execvp(argv[0], argv);
merror("cannot execute %s: %s", argv[0], strerror(errno));
exit(1);

View File

@@ -159,9 +159,11 @@ int stream_parse_headers(struct stream *sd)
int hn = sizeof(head)/sizeof(char*);
int hi = -1;
int got_ok = 0;
int got_line = 0;
debug("parsing headers");
while(stream_getline(sd, &line) > 0)
{
got_line = 1;
mdebug("HTTP in: %s", line.p);
if(line.p[0] == 0)
{
@@ -239,7 +241,11 @@ int stream_parse_headers(struct stream *sd)
if(param.verbose > 1)
fprintf(stderr, "Info: ICY interval %li\n", (long)sd->htd.icy_interval);
}
if(!got_ok)
if(!got_line)
{
error("no data at all from network resource");
ret = -1;
} else if(!got_ok)
{
error("missing positive server response");
ret = -1;
@@ -273,8 +279,6 @@ struct stream *stream_open(const char *url)
sd->fd = STDIN_FILENO;
compat_binmode(STDIN_FILENO, TRUE);
}
else if(!strncasecmp("file://", url, 7))
url+= 7; // use local file access for files, the scheme may be useful
#ifdef NET123
else if(!strncasecmp("http://", url, 7) || !strncasecmp("https://", url, 8))
{
@@ -287,7 +291,7 @@ struct stream *stream_open(const char *url)
append_accept(&accept);
client_head[1] = accept.p;
sd->nh = net123_open(url, client_head);
if(stream_parse_headers(sd))
if(!sd->nh || stream_parse_headers(sd))
{
stream_close(sd);
return NULL;
@@ -311,11 +315,13 @@ struct stream *stream_open(const char *url)
else
{
// plain file access
if(!strncasecmp("file://", url, 7))
url+= 7; // Might be useful to prepend file scheme prefix for local stuff.
errno = 0;
sd->fd = compat_open(url, O_RDONLY|O_BINARY);
if(sd->fd < 0)
{
merror("failed to open file: %s", strerror(errno));
merror("failed to open file: %s: %s", url, strerror(errno));
stream_close(sd);
return NULL;
}