/*
* YouGrabber
*
* A lightweight, command line YouTube.com video downloader, made from scratch
* in ANSI C.
*
* Copyright (C) 2006-2008 Quetzy Garcia, <quetzyg@users.sourceforge.net>
* For news and updates, see <http://yougrabber.sourceforge.net/>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "include/common.h"
static const char __FILE_CONFIG[] = {".yg.conf"};
static const char __FILE_COOKIE[] = {"cookie.yg"};
static const char __FILE_LOGIN[] = {"login.yg"};
static const char __YOUTUBE_URL_LOGIN[] = {"http://www.youtube.com/login"};
/* key file groups/keys */
static const char __GROUP_PROXY[] = {"proxy"};
static const char __GROUP_YOUTUBE[] = {"youtube"};
static const char __GROUP_DOWNLOAD[] = {"download"};
static const char __KEY_PROXY_HOST[] = {"host"};
static const char __KEY_PROXY_PORT[] = {"port"};
static const char __KEY_PROXY_TYPE[] = {"type"};
static const char __KEY_PROXY_USR[] = {"username"};
static const char __KEY_PROXY_PWD[] = {"password"};
static const char __KEY_YOUTUBE_USR[] = {"username"};
static const char __KEY_YOUTUBE_PWD[] = {"password"};
static const char __KEY_DOWNLOAD_DIR[] = {"directory"};
struct __yg_config
{
char *file;
char *agent;
char *cookie;
struct
{
char *host;
long port;
long type;
char *credentials; /* username + password */
} proxy;
struct
{
char *username;
char *password;
unsigned short status;
} youtube;
struct
{
char *dir;
} download;
};
/* create configuration settings and return pointer */
YGC *yg_config_new(void)
{
/* download directories read/write status */
unsigned short int dldir_rw_cwd = 0;
unsigned short int dldir_rw_cfg = 0;
GKeyFile *kf = NULL;
char *ptr1 = NULL;
char *ptr2 = NULL;
YGC *c_ptr = NULL;
if (!(c_ptr = (YGC*) malloc(sizeof(*c_ptr))))
return NULL;
/* file path */
c_ptr->file = g_strdup_printf("%s/%s", g_get_home_dir(), __FILE_CONFIG);
/* user agent */
c_ptr->agent = g_strdup_printf("%s/%s", YG_STRING, YG_VERSION);
/* proxy */
c_ptr->proxy.host = NULL;
c_ptr->proxy.port = 8080;
c_ptr->proxy.type = CURLPROXY_HTTP;
c_ptr->proxy.credentials = NULL;
/* youtube */
c_ptr->youtube.username = NULL;
c_ptr->youtube.password = NULL;
c_ptr->youtube.status = YG_LOGIN_OK_CONNECTING;
/* download dir (CWD) */
c_ptr->download.dir = g_get_current_dir();
dldir_rw_cwd = !access(c_ptr->download.dir, R_OK | W_OK);
/* cookie */
c_ptr->cookie = g_strdup_printf("%s/%s", c_ptr->download.dir, __FILE_COOKIE);
kf = g_key_file_new();
/* open configuration file */
if (!g_key_file_load_from_file(kf, c_ptr->file, G_KEY_FILE_NONE, NULL))
{
free(c_ptr->file);
c_ptr->file = NULL;
g_key_file_free(kf);
if (!dldir_rw_cwd)
{
yg_config_free(c_ptr);
return NULL;
}
return c_ptr;
}
/* proxy group */
if (g_key_file_has_group(kf, __GROUP_PROXY))
{
if (g_key_file_has_key(kf, __GROUP_PROXY, __KEY_PROXY_HOST, NULL))
c_ptr->proxy.host = g_key_file_get_value(kf, __GROUP_PROXY,
__KEY_PROXY_HOST, NULL);
if (g_key_file_has_key(kf, __GROUP_PROXY, __KEY_PROXY_PORT, NULL))
{
ptr1 = g_key_file_get_value(kf, __GROUP_PROXY, __KEY_PROXY_PORT, NULL);
c_ptr->proxy.port = atol(ptr1);
free(ptr1);
}
if (g_key_file_has_key(kf, __GROUP_PROXY, __KEY_PROXY_TYPE, NULL))
{
ptr1 = g_key_file_get_value(kf, __GROUP_PROXY, __KEY_PROXY_TYPE, NULL);
if (!g_ascii_strcasecmp(ptr1, "HTTP"))
c_ptr->proxy.type = CURLPROXY_HTTP;
if (!g_ascii_strcasecmp(ptr1, "SOCKS4"))
c_ptr->proxy.type = CURLPROXY_SOCKS4;
if (!g_ascii_strcasecmp(ptr1, "SOCKS5"))
c_ptr->proxy.type = CURLPROXY_SOCKS5;
free(ptr1);
}
if (g_key_file_has_key(kf, __GROUP_PROXY, __KEY_PROXY_USR, NULL)
&& g_key_file_has_key(kf, __GROUP_PROXY, __KEY_PROXY_PWD, NULL))
{
ptr1 = g_key_file_get_value(kf, __GROUP_PROXY, __KEY_PROXY_USR, NULL);
ptr2 = g_key_file_get_value(kf, __GROUP_PROXY, __KEY_PROXY_PWD, NULL);
c_ptr->proxy.credentials = g_strdup_printf("%s:%s", ptr1, ptr2);
free(ptr1);
free(ptr2);
}
}
/* youtube group */
if (g_key_file_has_group(kf, __GROUP_YOUTUBE))
{
if (g_key_file_has_key(kf, __GROUP_YOUTUBE, __KEY_YOUTUBE_USR, NULL))
c_ptr->youtube.username = g_key_file_get_value(kf,
__GROUP_YOUTUBE, __KEY_YOUTUBE_USR, NULL);
if (g_key_file_has_key(kf, __GROUP_YOUTUBE, __KEY_YOUTUBE_PWD, NULL))
c_ptr->youtube.password = g_key_file_get_value(kf,
__GROUP_YOUTUBE, __KEY_YOUTUBE_PWD, NULL);
}
/* download group */
if (g_key_file_has_group(kf, __GROUP_DOWNLOAD))
{
if (g_key_file_has_key(kf, __GROUP_DOWNLOAD, __KEY_DOWNLOAD_DIR, NULL))
{
free(c_ptr->download.dir);
c_ptr->download.dir = g_key_file_get_value(kf,
__GROUP_DOWNLOAD, __KEY_DOWNLOAD_DIR, NULL);
dldir_rw_cfg = !access(c_ptr->download.dir, R_OK | W_OK);
}
}
g_key_file_free(kf);
/* try fallbacking to CWD */
if (dldir_rw_cwd && !dldir_rw_cfg)
{
free(c_ptr->download.dir);
c_ptr->download.dir = g_get_current_dir();
}
if (!dldir_rw_cwd && !dldir_rw_cfg)
{
yg_config_free(c_ptr);
return NULL;
}
/* cookie */
free(c_ptr->cookie);
c_ptr->cookie = g_strdup_printf("%s/%s", c_ptr->download.dir, __FILE_COOKIE);
return c_ptr;
}
/* free configuration resources */
void yg_config_free(YGC *c_ptr)
{
if (!access(c_ptr->cookie, F_OK))
unlink(c_ptr->cookie);
free(c_ptr->file);
free(c_ptr->agent);
free(c_ptr->cookie);
free(c_ptr->proxy.host);
free(c_ptr->proxy.credentials);
free(c_ptr->youtube.username);
free(c_ptr->youtube.password);
free(c_ptr->download.dir);
free(c_ptr);
}
/* login to youtube */
int yg_config_login_perform(YGC *c_ptr)
{
FILE *stream = NULL;
CURL *handle = NULL;
char *post = NULL;
char *url = NULL;
if (!c_ptr->youtube.username || !c_ptr->youtube.password)
return c_ptr->youtube.status = YG_LOGIN_OK_SKIPPED;
if (!(stream = fopen(__FILE_LOGIN, "w+")))
return c_ptr->youtube.status = YG_LOGIN_ERROR_FAILED;
if ((handle = curl_easy_init()))
{
post = g_strdup_printf(
"current_form=loginForm&username=%s&password=%s&action_login=Log+In",
c_ptr->youtube.username, c_ptr->youtube.password);
handle = yg_handle_config(handle, c_ptr, stream, __YOUTUBE_URL_LOGIN,
NULL, 0, NULL, NULL, post);
/* check if we're logged */
if (curl_easy_perform(handle) == CURLE_OK)
{
curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
c_ptr->youtube.status = (strstr(url, __YOUTUBE_URL_LOGIN))
? YG_LOGIN_ERROR_FAILED : YG_LOGIN_OK_LOGGED;
}
else
c_ptr->youtube.status = YG_LOGIN_ERROR_CONNECT;
curl_easy_cleanup(handle);
}
free(post);
fclose(stream);
unlink(__FILE_LOGIN);
return c_ptr->youtube.status;
}
/* get youtube login status */
int yg_config_login_status(YGC *c_ptr)
{
return c_ptr->youtube.status;
}
/* get the cookie file */
char *yg_config_cookie(YGC *c_ptr)
{
return c_ptr->cookie;
}
/* get yg user agent */
char *yg_config_agent(YGC *c_ptr)
{
return c_ptr->agent;
}
/* get configuration file */
char *yg_config_file(YGC *c_ptr)
{
return c_ptr->file;
}
/* get proxy host */
char *yg_config_proxy_host(YGC *c_ptr)
{
return c_ptr->proxy.host;
}
/* g
urlgfe:轻易获得资源的URL
需积分: 10 180 浏览量
2008-12-29
21:43:17
上传
评论
收藏 30KB ZIP 举报
newHung
- 粉丝: 98
- 资源: 5
最新资源
- 基于MIC+NE555光敏电阻的声光控电路Multisim仿真原理图
- python tkinter-08-盒子模型.ev4.rar
- Doozy UI Manager 2023
- 基于matlab实现夜间车牌识别程序(1).rar
- 基于matlab实现无线传感器网络无需测距定位算法matlab源代码 包括apit,dv-hop,amorphous在内的共7个
- 基于python的yolov5实现的旋转目标检测
- 基于matlab实现无线传感器网络 CAB定位仿真程序 这是无线传感器节点定位CAB算法的仿真程序,由matlab完成.rar
- 基于matlab实现图像处理,本程序使用背景差分法对来往车辆进行检测和跟踪.rar
- 基于matlab实现视频监控中车型识别代码,自己写的,希望和大家多多交流.rar
- springcodespringcodespringcodespringcode
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈