예제 #1
0
static int _BarFlyTagFetchCover(uint8_t** cover_art, size_t* cover_size,
		char const* url, BarSettings_t const* settings)
{
	int exit_status = 0;
	int status;
	uint8_t* tmp_cover_art = NULL;
	size_t tmp_cover_size;

	assert(cover_art != NULL);
	assert(cover_size != NULL);
	assert(url != NULL);
	assert(settings != NULL);

	/*
	 * Fetch the cover art.
	 */
	status = _BarFlyFetchURL(url, &tmp_cover_art, &tmp_cover_size, settings);
	if (status != 0) {
		BarUiMsg(settings, MSG_ERR, "Could not get the cover art.\n");
		goto error;
	}

	*cover_art = tmp_cover_art;
	tmp_cover_art = NULL;
	*cover_size = tmp_cover_size;

	goto end;

error:
	exit_status = -1;

end:
	if (tmp_cover_art != NULL) {
		free(tmp_cover_art);
	}

	return exit_status;
}
예제 #2
0
int BarFlyOpen(BarFly_t* fly, PianoSong_t const* song,
		BarSettings_t const* settings)
{
	char const* const XML_STRING = "/xml/";

	int exit_status = 0;
	int status;
	BarFly_t output_fly;
	char* buffer = NULL;
	char* song_content_url = NULL;
	char* xml_pos;
	char* question_pos;
	int xml_len = strlen(XML_STRING);

	assert(fly != NULL);
	assert(song != NULL);
	assert(settings != NULL);

	/*
	 * Initialize the BarFly_t members.
	 */
	memset(&output_fly, 0, sizeof(BarFly_t));
	output_fly.audio_file = NULL;
	output_fly.completed = false;
	output_fly.status = NOT_RECORDING;

	/*
	 * Copy the artist, album, title, and audio format.
	 */
	strncpy(output_fly.artist, song->artist, BAR_FLY_NAME_LENGTH);
	output_fly.artist[BAR_FLY_NAME_LENGTH - 1] = '\0';
	strncpy(output_fly.album, song->album, BAR_FLY_NAME_LENGTH);
	output_fly.album[BAR_FLY_NAME_LENGTH - 1] = '\0';
	strncpy(output_fly.title, song->title, BAR_FLY_NAME_LENGTH);
	output_fly.title[BAR_FLY_NAME_LENGTH - 1] = '\0';
	output_fly.audio_format = song->audioFormat;

	/*
	 * Get the song content URL and extract the cover art URL.  The song
	 * content URL is the same as the song explorer URL except that "/xml" is
	 * replaced with "/content/".
	 */
	question_pos = strchr(song->songExplorerUrl, '?');
	if (question_pos == NULL) {
		question_pos = song->songExplorerUrl + strlen(song->songExplorerUrl);
	}

	xml_pos = strstr(song->songExplorerUrl, XML_STRING);
	if (xml_pos == NULL) {
		BarUiMsg(settings, MSG_DEBUG, "The song explorer URL did not contain "
				"the expected \"/xml/\" substring.  The cover art will not be "
				"added to the tag.\n");
		exit_status = -1;
	}

	if (xml_pos != NULL) {
		status = BarFlyasprintf(&song_content_url, "%.*s/content/%.*s",
				(int)(xml_pos - song->songExplorerUrl), song->songExplorerUrl,
				(int)(question_pos - xml_pos) - xml_len, xml_pos + xml_len);
		if (status == -1) {
			BarUiMsg(settings, MSG_DEBUG, "Error copying the song content URL.  "
					"The cover art will not be added to the tag.  (%d:%s)\n",
					errno, strerror(errno));
			exit_status = -1;
		}

		if (song_content_url != NULL) {
			status = _BarFlyFetchURL(song_content_url, (uint8_t**)&buffer, NULL,
						settings);
			if (status != 0) {
				BarUiMsg(settings, MSG_DEBUG, "Couldn't get the song content "
						"page.  The cover art will not be added to the tag.\n");
				exit_status = -1;
			}

			if (buffer != NULL) {
//				status = _BarFlyParseYear(album_buf, &output_fly.year,
//						settings);
//				if (status != 0) {
//					BarUiMsg(settings, MSG_DEBUG, "The album release year will "
//							"not be added to the tag.\n");
//					exit_status = -1;
//				}

				output_fly.cover_art_url = _BarFlyParseCoverArtURL(buffer,
						settings);
				if (output_fly.cover_art_url == NULL) {
					BarUiMsg(settings, MSG_DEBUG, "The cover art will not be "
							"addded to the tag.\n");
					exit_status = -1;
				}

				free(buffer);
				buffer = NULL;
			}
		}
	}

	/*
	 * Get the album explorer page and extract the track and disc numbers.
	 */
	status = _BarFlyFetchURL(song->albumExplorerUrl, (uint8_t**)&buffer,
			NULL, settings);
	if (status != 0) {
		BarUiMsg(settings, MSG_DEBUG, "Couldn't get the album explorer page.  "
				"The track and disc numbers will not be added to the tag.\n");
		exit_status = -1;
	}

	if (buffer != NULL) {
		status = _BarFlyParseTrackDisc(song->title, buffer,
				&output_fly.track, &output_fly.disc, settings);
		if (status != 0) {
			BarUiMsg(settings, MSG_DEBUG, "The track and disc numbers will not "
					"be added to the tag.\n");
			exit_status = -1;
		}
	}

	/*
	 * Get the path to the file.
	 */
	output_fly.audio_file_path = _BarFlyFileGetPath(song->artist, song->album,
			song->title, output_fly.year, output_fly.track, output_fly.disc,
			song->audioFormat, settings);
	if (output_fly.audio_file_path == NULL) {
		goto error;
	}
	
	/*
	 * Open a stream to the file.
	 */
	status = _BarFlyFileOpen(&output_fly.audio_file,
			output_fly.audio_file_path, settings);
	if (status == 0) {
		output_fly.status = RECORDING;
	} else if (status == -2) {
		output_fly.status = NOT_RECORDING_EXIST;
		output_fly.completed = true;
	} else {
		output_fly.completed = true;
		goto error;
	}

	/*
	 * All members of the BarFly_t structure were created successfully.  Copy
	 * them from the temporary structure to the one passed in.
	 */
	memcpy(fly, &output_fly, sizeof(BarFly_t));
	memset(&output_fly, 0, sizeof(BarFly_t));

	goto end;

error:
	exit_status = -1;

end:
	if (buffer != NULL) {
		free(buffer);
	}

	if (song_content_url != NULL) {
		free(song_content_url);
	}

	if (output_fly.audio_file != NULL) {
		fclose(output_fly.audio_file);
	}

	if (output_fly.audio_file_path != NULL) {
		free(output_fly.audio_file_path);
	}

	if (output_fly.cover_art_url != NULL) {
		free(output_fly.cover_art_url);
	}

	return exit_status;
}
예제 #3
0
int BarFlyOpen(BarFly_t* fly, PianoSong_t const* song,
		BarSettings_t const* settings)
{
	int exit_status = 0;
	int status;
	BarFly_t output_fly;
	char* album_buf = NULL;

	assert(fly != NULL);
	assert(song != NULL);
	assert(settings != NULL);

	/*
	 * Initialize the BarFly_t members.
	 */
	memset(&output_fly, 0, sizeof(BarFly_t));
	output_fly.audio_file = NULL;
	output_fly.completed = false;
	output_fly.status = NOT_RECORDING;

	/*
	 * Copy the artist, album, title, and audio format.
	 */
	strncpy(output_fly.artist, song->artist, BAR_FLY_NAME_LENGTH);
	output_fly.artist[BAR_FLY_NAME_LENGTH - 1] = '\0';
	strncpy(output_fly.album, song->album, BAR_FLY_NAME_LENGTH);
	output_fly.album[BAR_FLY_NAME_LENGTH - 1] = '\0';
	strncpy(output_fly.title, song->title, BAR_FLY_NAME_LENGTH);
	output_fly.title[BAR_FLY_NAME_LENGTH - 1] = '\0';
	output_fly.audio_format = song->audioFormat;

	/*
	 * Get the album detail page and extract the year and cover art URL.
	 */
	status = _BarFlyFetchURL(song->albumDetailURL, (uint8_t**)&album_buf,
			NULL, settings);
	if (status != 0) {
		BarUiMsg(settings, MSG_DEBUG, "Couldn't get the album detail page.  "
				"The year and cover art will not be added to the tag.\n");
		exit_status = -1;
	}

	if (album_buf != NULL) {
		status = _BarFlyParseYear(album_buf, &output_fly.year, settings);
		if (status != 0) {
			BarUiMsg(settings, MSG_DEBUG, "The album release year will not be "
					"added to the tag.\n");
			exit_status = -1;
		}

		output_fly.cover_art_url = _BarFlyParseCoverArtURL(album_buf, settings);
		if (output_fly.cover_art_url == NULL) {
			BarUiMsg(settings, MSG_DEBUG, "The cover art will not be addded to the "
					"tag.\n");
			exit_status = -1;
		}

		free(album_buf);
		album_buf = NULL;
	}

	/*
	 * Get the album explorer page and extract the track and disc numbers.
	 */
	status = _BarFlyFetchURL(song->albumExplorerUrl, (uint8_t**)&album_buf,
			NULL, settings);
	if (status != 0) {
		BarUiMsg(settings, MSG_DEBUG, "Couldn't get the album explorer page.  "
				"The track and disc numbers will not be added to the tag.\n");
		exit_status = -1;
	}

	if (album_buf != NULL) {
		status = _BarFlyParseTrackDisc(song->title, album_buf,
				&output_fly.track, &output_fly.disc, settings);
		if (status != 0) {
			BarUiMsg(settings, MSG_DEBUG, "The track and disc numbers will not "
					"be added to the tag.\n");
			exit_status = -1;
		}
	}

	/*
	 * Get the path to the file.
	 */
	output_fly.audio_file_path = _BarFlyFileGetPath(song->artist, song->album,
			song->title, output_fly.year, output_fly.track, output_fly.disc,
			song->audioFormat, settings);
	if (output_fly.audio_file_path == NULL) {
		goto error;
	}
	
	/*
	 * Open a stream to the file.
	 */
	status = _BarFlyFileOpen(&output_fly.audio_file,
			output_fly.audio_file_path, settings);
	if (status == 0) {
		output_fly.status = RECORDING;
	} else if (status == -2) {
		output_fly.status = NOT_RECORDING_EXIST;
		output_fly.completed = true;
	} else {
		output_fly.completed = true;
		goto error;
	}

	/*
	 * All members of the BarFly_t structure were created successfully.  Copy
	 * them from the temporary structure to the one passed in.
	 */
	memcpy(fly, &output_fly, sizeof(BarFly_t));
	memset(&output_fly, 0, sizeof(BarFly_t));

	goto end;

error:
	exit_status = -1;

end:
	if (album_buf != NULL) {
		free(album_buf);
	}

	if (output_fly.audio_file != NULL) {
		fclose(output_fly.audio_file);
	}

	if (output_fly.audio_file_path != NULL) {
		free(output_fly.audio_file_path);
	}

	if (output_fly.cover_art_url != NULL) {
		free(output_fly.cover_art_url);
	}

	return exit_status;
}