Ejemplo n.º 1
0
/* Save plist in m3u format. Strip paths by strip_path bytes.
 * If save_serial is not 0, the playlist serial is saved in a
 * comment. */
static int plist_save_m3u (struct plist *plist, const char *fname,
		const int strip_path, const int save_serial)
{
	FILE *file;
	int i;

	debug ("Saving playlist to '%s'", fname);

	if (!(file = fopen(fname, "w"))) {
		error ("Can't save playlist: %s", strerror(errno));
		return 0;
	}

	if (flock(fileno(file), LOCK_EX) == -1)
		logit ("Can't flock() the playlist file: %s", strerror(errno));

	if (fprintf(file, "#EXTM3U\r\n") < 0) {
		error ("Error writing playlist: %s", strerror(errno));
		fclose (file);
		return 0;
	}

	if (save_serial && fprintf(file, "#MOCSERIAL: %d\r\n",
				plist_get_serial(plist)) < 0) {
		error ("Error writing playlist: %s", strerror(errno));
		fclose (file);
		return 0;
	}

	for (i = 0; i < plist->num; i++) {
		if (!plist_deleted(plist, i)) {
			int ret;

			/* EXTM3U */
			if (plist->items[i].tags)
				ret = fprintf (file, "#EXTINF:%d,%s\r\n",
						plist->items[i].tags->time,
						plist->items[i].title_tags ?
						plist->items[i].title_tags
						: plist->items[i].title_file);
			else
				ret = fprintf (file, "#EXTINF:%d,%s\r\n", 0,
						plist->items[i].title_file);

			if (ret < 0) {
				error ("Error writing playlist: %s",
						strerror(errno));
				fclose (file);
				return 0;
			}

			/* file */
			if (fprintf(file, "%s\r\n", plist->items[i].file
						+ strip_path) < 0) {
				error ("Error writing playlist: %s",
						strerror(errno));
				fclose (file);
				return 0;
			}
		}
	}

	if (flock(fileno(file), LOCK_UN) == -1)
		logit ("Can't flock() (unlock) the playlist file: %s",
				strerror(errno));
	if (fclose(file)) {
		error ("Error writing playlist: %s", strerror(errno));
		return 0;
	}
	return 1;
}
Ejemplo n.º 2
0
/* Save plist in m3u format. Strip paths by strip_path bytes.
 * If save_serial is not 0, the playlist serial is saved in a
 * comment. */
static int plist_save_m3u (struct plist *plist, const char *fname,
                           const int strip_path, const int save_serial)
{
    FILE *file = NULL;
    int i, ret, result = 0;

    debug ("Saving playlist to '%s'", fname);

    file = fopen (fname, "w");
    if (!file) {
        error_errno ("Can't save playlist", errno);
        return 0;
    }

    /* Lock gets released by fclose(). */
    if (lockf (fileno (file), F_LOCK, 0) == -1)
        log_errno ("Can't lock the playlist file", errno);

    if (fprintf (file, "#EXTM3U\r\n") < 0) {
        error_errno ("Error writing playlist", errno);
        goto err;
    }

    if (save_serial && fprintf (file, "#MOCSERIAL: %d\r\n",
                                plist_get_serial (plist)) < 0) {
        error_errno ("Error writing playlist", errno);
        goto err;
    }

    for (i = 0; i < plist->num; i++) {
        if (!plist_deleted (plist, i)) {

            /* EXTM3U */
            if (plist->items[i].tags)
                ret = fprintf (file, "#EXTINF:%d,%s\r\n",
                               plist->items[i].tags->time,
                               plist->items[i].title_tags ?
                               plist->items[i].title_tags
                               : plist->items[i].title_file);
            else
                ret = fprintf (file, "#EXTINF:%d,%s\r\n", 0,
                               plist->items[i].title_file);

            /* file */
            if (ret >= 0)
                ret = fprintf (file, "%s\r\n",
                               plist->items[i].file + strip_path);

            if (ret < 0) {
                error_errno ("Error writing playlist", errno);
                goto err;
            }
        }
    }

    ret = fclose (file);
    file = NULL;
    if (ret)
        error_errno ("Error writing playlist", errno);
    else
        result = 1;

err:
    if (file)
        fclose (file);
    return result;
}