#include #include #include #include //#include #include #define USERAGENT "libcurl-agent/1.0" struct MemoryStruct { char *memory; size_t size; int tagMatch; char tag[100]; char ignoreTag[100]; } data; int getTag(const char* filename, char* tag, int len) { FILE* f; *tag = 0; if (!access(filename, F_OK)) { if ((f = fopen(filename, "r"))) { char* line = 0; size_t size = 0; if (getline(&line, &size, f) > 0) { sprintf(tag, "%.*s", len, line); tag[strlen(tag)-1] = 0; printf("'%s'\n", tag); } fclose(f); } } return 0; } //*************************************************************************** // //*************************************************************************** static size_t WriteMemoryCallback(void* ptr, size_t size, size_t nmemb, void* data) { size_t realsize = size * nmemb; struct MemoryStruct* mem = (struct MemoryStruct*)data; if (mem->memory) mem->memory = (char*)realloc(mem->memory, mem->size + realsize + 1); else mem->memory = (char*)malloc(mem->size + realsize + 1); if (mem->memory) { memcpy (&(mem->memory[mem->size]), ptr, realsize); mem->size += realsize; mem->memory[mem->size] = 0; } return realsize; } static size_t WriteHeaderCallback(void* ptr, size_t size, size_t nmemb, void* data) { size_t realsize = size * nmemb; struct MemoryStruct* mem = (struct MemoryStruct*)data; char* p; if (ptr && (p = strcasestr((char*)ptr, "ETag: "))) { // etag found ... sprintf(mem->tag, "%s", p+7); if ((p = strchr(mem->tag, '"'))) *p = 0; mem->tagMatch = (strcmp(mem->tag, mem->ignoreTag) == 0); // ignore download if tag matches ... if (mem->tagMatch) return 0; } return realsize; } //*************************************************************************** // //*************************************************************************** int DownloadData(const char* url, int& size, const char* etag) { CURL* curl_handle; long code; long res; // Initialize 'data' struct if (data.memory) free(data.memory); data.memory = 0; data.size = 0; data.tagMatch = 1; *data.ignoreTag = 0; strcpy(data.ignoreTag, etag); if (curl_global_init(CURL_GLOBAL_ALL) != 0) { printf("TVM2VDR: Error, something went wrong with curl_global_init()\n"); return -1; } curl_handle = curl_easy_init(); if (!curl_handle) { printf("TVM2VDR: Error, unable to get handle from curl_easy_init()\n"); return -1; } curl_easy_setopt(curl_handle, CURLOPT_URL, url); // Specify URL to get curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 0); // don't follow redirects curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); // Send all data to this function curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void*)&data); // Pass our 'data' struct to the callback function curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, WriteHeaderCallback); // Send all data to this function curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER, (void*)&data); // Pass our 'data' struct to the callback function curl_easy_setopt(curl_handle, CURLOPT_MAXFILESIZE, 1024*1024); // Set maximum file size to get (bytes) curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); // No progress meter curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1); // No signaling curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 30); // Set timeout to 30 seconds curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, USERAGENT); // Some servers don't like requests that are made without a user-agent field if ((res = curl_easy_perform(curl_handle)) != 0) { curl_easy_cleanup(curl_handle); // Cleanup curl stuff if (data.memory) { free(data.memory); data.memory = 0; data.size = 0; } if (res == CURLE_WRITE_ERROR && data.tagMatch) return -2; printf("TVM2VDR: Error, download of '%s' failed, result was %ld\n", url, res); return -1; } curl_easy_getinfo(curl_handle, CURLINFO_HTTP_CODE, &code); if (code == 404) { if (data.memory) free(data.memory); data.memory = 0; data.size = 0; } curl_easy_cleanup(curl_handle); // Cleanup curl stuff size = data.size; return 0; } //*************************************************************************** // Main //*************************************************************************** int main(int argc, char** argv) { int size = 0; int res; if (argc < 2) { printf("Usage: %s \n", argv[0]); return 1; } // res = DownloadData("http://img.tvmovie.de/imageTransfer/F1_2931803.jpg", size); res = DownloadData("http://wwwa.tvmovie.de/static/tvghost/html/onlinedata/xml-gz5/20120516_190.xml.tvm", size, argv[1]); if (!res) { FILE* fout; printf("Transfered (%d) bytes\n", size); printf("-> (%s) [%.10s...]\n", data.tag, data.memory); if ((fout = fopen("tagfile", "w"))) { fwrite(data.tag, strlen(data.tag), 1, fout); fwrite("\n", 1, 1, fout); fclose(fout); } char tag[100]; getTag("tagfile", tag, 100); } else if (res == -2) printf("Skipping download due to non update\n"); return 0; }