This is a y0u tub3 Video Uploader. It was a quick little project
I made to show everyone how to do it in FreePascal.
I made sure that it ran on windows (XP Pro).
This is a command line program. You will need
FreePascal (FPC): h**p://www.freepascal.org/
and cUrl: h**p://curl.haxx.se/
I use Arch Linux, but this code should compile and run, with minimal modification, on
any OS that you can install FPC and cUrl.
Save the 2 code blocks into text files called:
youtubecliupload.pas
and
nusecurl.pas
You will need to edit one line in the youtubecliupload.pas file.
Line #12 holds the path to your cUrl executable. You will need to
set this to the path of cUrl on your system.
On my windows box:
cUrlLocation : string = 'C:\curl_718_2\curl.exe';
On my Linux box:
cUrlLocation : string = '/usr/bin/curl';
NOTE: On Linux, in a terminal type "which curl" and it *should* tell you
where it is.
On Linux:
Open a terminal, cd into the folder that has youtubecliupload.pas & nusecurl.pas and type:
"fpc youtubecliupload.pas"
and it will compile.
On windows:
Find out where your fpc.exe is. Mine is at
C:\FPC\2.1.4\bin\i386-win32\fpc.exe
The 2 sources file are in a folder at:
C:\projects\tubeupper\
Click the Start button, click on Run, type "cmd" and hit Enter.
In the cmd.exe window type:
C:\FPC\2.1.4\bin\i386-win32\fpc.exe C:\projects\tubeupper\youtubecliupload.pas
I am not sure how it is done on OSX. It should be the same as linux. I do have a couple
OSX machines here, if anyone needs to know I will try it out.
After you compile it, run the program.
windows: youtubecliupload.exe -h
Linux: youtubecliupload -h
And it will tell you how to use it to upload a video.
Save this as "youtubecliupload.pas"
Save this as "nusecurl.pas"
I made to show everyone how to do it in FreePascal.
I made sure that it ran on windows (XP Pro).
This is a command line program. You will need
FreePascal (FPC): h**p://www.freepascal.org/
and cUrl: h**p://curl.haxx.se/
I use Arch Linux, but this code should compile and run, with minimal modification, on
any OS that you can install FPC and cUrl.
Save the 2 code blocks into text files called:
youtubecliupload.pas
and
nusecurl.pas
You will need to edit one line in the youtubecliupload.pas file.
Line #12 holds the path to your cUrl executable. You will need to
set this to the path of cUrl on your system.
On my windows box:
cUrlLocation : string = 'C:\curl_718_2\curl.exe';
On my Linux box:
cUrlLocation : string = '/usr/bin/curl';
NOTE: On Linux, in a terminal type "which curl" and it *should* tell you
where it is.
On Linux:
Open a terminal, cd into the folder that has youtubecliupload.pas & nusecurl.pas and type:
"fpc youtubecliupload.pas"
and it will compile.
On windows:
Find out where your fpc.exe is. Mine is at
C:\FPC\2.1.4\bin\i386-win32\fpc.exe
The 2 sources file are in a folder at:
C:\projects\tubeupper\
Click the Start button, click on Run, type "cmd" and hit Enter.
In the cmd.exe window type:
C:\FPC\2.1.4\bin\i386-win32\fpc.exe C:\projects\tubeupper\youtubecliupload.pas
I am not sure how it is done on OSX. It should be the same as linux. I do have a couple
OSX machines here, if anyone needs to know I will try it out.
After you compile it, run the program.
windows: youtubecliupload.exe -h
Linux: youtubecliupload -h
And it will tell you how to use it to upload a video.
Save this as "youtubecliupload.pas"
Code:
program youtubecliupload;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Classes, SysUtils, StrUtils, nusecurl;
const
cUrlLocation : string = 'C:\curl_718_2\curl.exe';
beverbose: boolean = False;
usethehelp: boolean = True;
appdirname: string = 'ytcliupload';
appname: string = 'youtubecliupload';
aproxy: string = '';
aproxytype: string = '0';
isgoogle: boolean = False;
var
MycUrl: AbuseCurl;
workfolder, cookiesflli: string;
vidtitle, viddescription, vidcategory, vidtags: string;
usernamep, passwordp, thevideop, infofilep, getbackurl: string;
vcategory, proxyport, proxytype, loggedin, savtafille: string;
getback, durle, reffer, formdata, sessiontken, aserver: string;
i, ig: integer;
tmpstrlst: TStringList;
procedure WriteHelp;
begin
writeln('Usage: ' + appname + ' -u [username] -p [password] -vp [/path/to/video] -inf [/path/to/infofile]');
writeln(appname + ': the name of this program');
writeln('-u [username]: your youtube login username');
writeln('-p [password]: your youtube login password');
writeln('-vp [/path/to/video]: the video you want to upload to youtube');
writeln('-inf [/path/to/infofile]: the file that holds info on video');
writeln('If you want this program to give updates add the -v option');
writeln('Example:');
writeln(' ' + appname + ' -u bobbygreen -p koolpass24 -vp /home/bobby/videos/wombat.avi -inf /home/bobby/infofile.txt -v');
writeln(' ');
writeln('If you want to use a proxy:');
writeln('-px [proxy:port]: the proxy to use');
writeln('-pt [proxytype]: the type of proxy. Types are http, socks4 and socks5');
writeln('Example:');
writeln(' ' + appname + ' -u bobbygreen -p koolpass24 -vp /home/bobby/videos/wombat.avi -inf /home/bobby/infofile.txt -px 24.125.45.112:3190 -pt http');
writeln(' ');
writeln('If you do not want to use the info file then give these options:');
writeln('-t [title]: your youtube video title');
writeln(' use the "@" in front of a file path to read your youtube video title from a file.');
writeln('-d [description]: your youtube video description');
writeln(' use the "@" in front of a file path to read your youtube video description from a file.');
writeln('-vc [videocategory]: your youtube video category');
writeln(' use the "@" in front of a file path to read your youtube video category from a file.');
writeln('-tg [tags]: your youtube video tags');
writeln(' use the "@" in front of a file path to read your youtube video tags from a file.');
writeln('Example:');
writeln(' ' + appname + ' -u bobbygreen -p koolpass24 -vp /home/bobby/videos/wombat.avi -t "Super Cool Video" -d "This is my new super cool video. Check out my others" -vc "Film & Animation" -tg "new, awesome, cool, fabulous, hip, happening, boobs"');
writeln(' ');
writeln(' ' + appname + ' -u bobbygreen -p koolpass24 -vp /home/bobby/videos/wombat.avi -t @/home/bobby/titlefile.txt -d @/home/bobby/descriptionfile.txt -vc "Film & Animation" -tg @/home/bobby/tagfile.txt');
writeln(' ');
writeln('Note: Put quote marks "" around items that have spaces in them.');
writeln(' ');
writeln('Note 2: If you use google to log into youtube, put "google=" in front of your username.');
writeln('Example:');
writeln(' ' + appname + ' -u google=bobbygreen -p koolpass24 -vp /home/bobby/videos/wombat.avi -inf /home/bobby/infofile.txt -v');
writeln(' ');
writeln('Note 3: If you do not want to see the help when an error occurs, add "-nh" to the command line.');
writeln(' ');
writeln('to see help on the info file, type:');
writeln(' ' + appname + ' -infohelp');
end;
procedure WriteInfoHelp;
begin
writeln('Info file help');
writeln('The info file is a text file that holds video info that can be randomized.');
writeln('Each item on a seperate line.');
writeln(' ');
writeln('Example contents of an info file:');
writeln('Title=Super awesome vid!');
writeln('Title=Hot nasty MILF!');
writeln('Title=Spongebob smokes pot! Serious!');
writeln('Description=This is a howto video on self healing with the power of homemade beer.');
writeln('Description=Here is a look at my last night at my aunts nudist ranch.');
writeln('Description=My GF has 6 toes on each foot. this is a short vid of her showing off her new toenail job.');
writeln('Description=Nothing special. Just sitting around talking with my dog..');
writeln('Video Category=Entertainment');
writeln('Video Category=Pets & Animals');
writeln('Tags=spongebob, patrick, dogs, toes, boobs');
writeln('Tags=beer, howto, pot, milf, dilf, nasty, nudist');
writeln(' ');
writeln('when you give the info file option, one Title, Description, Video Category and Tags line');
writeln('will be chosen at random and used for the video you want to upload.');
writeln(' ');
writeln('Video Categories that can be used:');
writeln('Autos & Vehicles');
writeln('Comedy');
writeln('Education');
writeln('Entertainment');
writeln('Film & Animation');
writeln('Gaming');
writeln('Howto & Style');
writeln('Music');
writeln('News & Politics');
writeln('Nonprofits & Activism');
writeln('People & Blogs');
writeln('Pets & Animals');
writeln('Science & Technology');
writeln('Sports');
writeln('Travel & Events');
writeln(' ');
end;
function MakeRandomString: string;
const
Chars = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var
S: string;
i, N: integer;
begin
Randomize;
S := '';
for i := 1 to 6 do
begin
N := Random(Length(Chars)) + 1;
S := S + Chars[N];
end;
result := S;
end;
function TellMeCatagory: string;
begin
if (vidcategory = 'Autos & Vehicles') then result := '2';
if (vidcategory = 'Comedy') then result := '23';
if (vidcategory = 'Education') then result := '27';
if (vidcategory = 'Entertainment') then result := '24';
if (vidcategory = 'Film & Animation') then result := '1';
if (vidcategory = 'Gaming') then result := '20';
if (vidcategory = 'Howto & Style') then result := '26';
if (vidcategory = 'Music') then result := '10';
if (vidcategory = 'News & Politics') then result := '25';
if (vidcategory = 'Nonprofits & Activism') then result := '29';
if (vidcategory = 'People & Blogs') then result := '22';
if (vidcategory = 'Pets & Animals') then result := '15';
if (vidcategory = 'Science & Technology') then result := '28';
if (vidcategory = 'Sports') then result := '17';
if (vidcategory = 'Travel & Events') then result := '19';
end;
function GiveMeTheSessionToken(Linput: string): string;
var
turetrun: string;
begin
Linput := StringReplace(Linput, '"', '', [rfReplaceAll, rfIgnoreCase]);
Linput := StringReplace(Linput, '''', '', [rfReplaceAll, rfIgnoreCase]);
Linput := StringReplace(Linput, ' gXSRF_token = ', 'DEJSUSER=', [rfReplaceAll]);
turetrun := Copy(Linput, pos('DEJSUSER=', Linput) + 9, Length(Linput));
turetrun := Copy(turetrun, 1, pos(';', turetrun) - 1);
result := turetrun;
end;
function GiveMeTheAddresserToken(Linput: string): string;
var
turetrun: string;
begin
Linput := StringReplace(Linput, '"', '', [rfReplaceAll, rfIgnoreCase]);
Linput := StringReplace(Linput, '''', '', [rfReplaceAll, rfIgnoreCase]);
Linput := StringReplace(Linput, '<input type=hidden name=addresser value=', 'DEJSUSER=', [rfReplaceAll]);
turetrun := Copy(Linput, pos('DEJSUSER=', Linput) + 9, Length(Linput));
turetrun := Copy(turetrun, 1, pos('>', turetrun) - 1);
result := turetrun;
end;
function GiveMeTheServer(Linput: string): string;
var
turetrun: string;
begin
Linput := StringReplace(Linput, '"', '', [rfReplaceAll, rfIgnoreCase]);
Linput := StringReplace(Linput, '''', '', [rfReplaceAll, rfIgnoreCase]);
Linput := StringReplace(Linput, 'enctype=multipart/form-data action=', 'DEJSUSER=', [rfReplaceAll]);
turetrun := Copy(Linput, pos('DEJSUSER=', Linput) + 9, Length(Linput));
turetrun := Copy(turetrun, 1, pos(' name=theForm', turetrun) - 1);
result := turetrun;
end;
function GiveMeTheVideoUrl(Linput: string): string;
var
turetrun: string;
begin
Linput := StringReplace(Linput, '"', '', [rfReplaceAll, rfIgnoreCase]);
Linput := StringReplace(Linput, '''', '', [rfReplaceAll, rfIgnoreCase]);
Linput := StringReplace(Linput, '<embed src=', 'DEJSUSER=', [rfReplaceAll]);
turetrun := Copy(Linput, pos('DEJSUSER=', Linput) + 9, Length(Linput));
turetrun := Copy(turetrun, 1, pos(' ', turetrun) - 1);
result := turetrun;
end;
procedure LoadInfoFile(thefille: string);
var
infofille: TStringList;
titles, descrips, tags, categores: TStringList;
i: integer;
begin
titles := TStringList.Create;
descrips := TStringList.Create;
tags := TStringList.Create;
categores := TStringList.Create;
infofille := TStringList.Create;
infofille.LoadFromFile(thefille);
for i := 0 to infofille.count - 1 do
begin
if (pos('Title=', Trim(infofille[i])) = 1) then
titles.Add(Copy(Trim(infofille[i]), Length('Title=')+1, Length(Trim(infofille[i]))));
if (pos('Description=', Trim(infofille[i])) = 1) then
descrips.Add(Copy(Trim(infofille[i]), Length('Description=')+1, Length(Trim(infofille[i]))));
if (pos('Video Category=', Trim(infofille[i])) = 1) then
categores.Add(Copy(Trim(infofille[i]), Length('Video Category=')+1, Length(Trim(infofille[i]))));
if (pos('Tags=', Trim(infofille[i])) = 1) then
tags.Add(Copy(Trim(infofille[i]), Length('Tags=')+1, Length(Trim(infofille[i]))));
end;
if (titles.Count > 1) then
begin
vidtitle := titles[Random(titles.Count)];
end else if (titles.Count = 0) then begin
vidtitle := '#!NONE';
end else begin
vidtitle := titles[0];
end;
if (descrips.Count > 1) then
begin
viddescription := descrips[Random(descrips.Count)];
end else if (descrips.Count = 0) then begin
viddescription := '#!NONE';
end else begin
viddescription := descrips[0];
end;
if (categores.Count > 1) then
begin
vidcategory := categores[Random(categores.Count)];
end else if (categores.Count = 0) then begin
vidcategory := '#!NONE';
end else begin
vidcategory := categores[0];
end;
if (tags.Count > 1) then
begin
vidtags := tags[Random(tags.Count)];
end else if (tags.Count = 0) then begin
vidtags := '#!NONE';
end else begin
vidtags := tags[0];
end;
FreeAndNil(titles);
FreeAndNil(descrips);
FreeAndNil(categores);
FreeAndNil(tags);
FreeAndNil(infofille);
end;
function LoadTheRequatedFile(descstr, thefille: string; addnewlines: boolean): string;
var
tmpfille: TStringList;
tmpstr: string;
ig: integer;
begin
if (FileExists(thefille) = False) then
begin
writeln('Error: The ' + descstr + ' file does not exist: ' + thefille);
if (usethehelp = True) then WriteHelp;
Halt;
end
else
begin
tmpfille := TStringList.Create;
tmpfille.LoadFromFile(thefille);
tmpstr := '';
for ig := 0 to tmpfille.count - 1 do
begin
if (addnewlines = True) then
tmpstr := tmpstr + Trim(tmpfille[ig]) + #13+#10
else
tmpstr := tmpstr + Trim(tmpfille[ig]) + ' ';
end;
FreeAndNil(tmpfille);
if (Trim(tmpstr) = '') then
begin
writeln('Error: The ' + descstr + ' file is empty: ' + thefille);
if (usethehelp = True) then WriteHelp;
Halt;
end
end;
result := Trim(tmpstr);
end;
function SaveAllThisToFile(errmessage, savfoldr, thistosave: string): string;
var
myFile : TextFile;
newfile: string;
begin
repeat
newfile := savfoldr + '/error-' + MakeRandomString + '.txt';
until (FileExists(newfile) = False);
AssignFile(myFile, newfile);
ReWrite(myFile);
WriteLn(myFile, errmessage + #13+#10);
WriteLn(myFile, ' ' + #13+#10);
WriteLn(myFile, thistosave);
CloseFile(myFile);
result := newfile;
end;
begin
for i := 0 to ParamCount do
begin
if (ParamStr(i)='-h') then
begin
WriteHelp;
Halt;
end;
if (ParamStr(i)='-infohelp') then
begin
WriteInfoHelp;
Halt;
end;
if (ParamStr(i)='-v') then
begin
beverbose := True;
end;
if (ParamStr(i)='-nh') then
begin
usethehelp := False;
end;
end;
tmpstrlst := TStringList.create;
usernamep := Trim(GetCmdLineArg('u', ['-']));
passwordp := Trim(GetCmdLineArg('p', ['-']));
thevideop := Trim(GetCmdLineArg('vp', ['-']));
infofilep := Trim(GetCmdLineArg('inf', ['-']));
vidtitle := Trim(GetCmdLineArg('t', ['-']));
viddescription := Trim(GetCmdLineArg('d', ['-']));
vidcategory := Trim(GetCmdLineArg('vc', ['-']));
if (pos('@', vidcategory) = 1) then
vidcategory := LoadTheRequatedFile('Category', Copy(Trim(vidcategory), 2, Length(Trim(vidcategory))), False);
vcategory := TellMeCatagory;
vidtags := Trim(GetCmdLineArg('tg', ['-']));
proxyport := Trim(GetCmdLineArg('px', ['-']));
proxytype := Trim(GetCmdLineArg('pt', ['-']));
if (FileExists(thevideop) = False) then
begin
writeln('Error: The file does not exist: ' + thevideop);
if (usethehelp = True) then WriteHelp;
Halt;
end;
if (infofilep = '') then
begin
if (vidtitle = '') or (viddescription = '') or (vcategory = '') or (vidtags = '') then
begin
if (vidtitle = '') then writeln('Error: Title is blank');
if (viddescription = '') then writeln('Error: Description is blank');
if (vcategory = '') then writeln('Error: Video Category is blank');
if (vidtags = '') then writeln('Error: Tag is blank');
if (vidtitle = '') and (viddescription = '') and (vcategory = '') and (vidtags = '') and (infofilep = '') then
writeln('Error: You have to supply the info file or the seperate items. See the help.');
if (usethehelp = True) then WriteHelp;
Halt;
end
else
begin
if (pos('@', viddescription) = 1) then
begin
viddescription := Copy(Trim(viddescription), 2, Length(Trim(viddescription)));
viddescription := LoadTheRequatedFile('Description', viddescription, True);
end;
if (pos('@', vidtitle) = 1) then
begin
vidtitle := Copy(Trim(vidtitle), 2, Length(Trim(vidtitle)));
vidtitle := LoadTheRequatedFile('Title', vidtitle, False);
end;
if (pos('@', vidtags) = 1) then
begin
vidtags := Copy(Trim(vidtags), 2, Length(Trim(vidtags)));
vidtags := LoadTheRequatedFile('Tag', vidtags, False);
end;
end;
end
else if (FileExists(infofilep) = False) then
begin
writeln('Error: The file does not exist: ' + infofilep);
if (usethehelp = True) then WriteHelp;
Halt;
end;
if not (proxyport = '') then
begin
if (proxytype = '') then
begin
writeln('Error: You have to supply the proxy type.');
if (usethehelp = True) then WriteHelp;
Halt;
end;
aproxytype := '9';
if (LowerCase(proxytype) = 'http') then
aproxytype := '2';
if (LowerCase(proxytype) = 'socks4') then
aproxytype := '4';
if (LowerCase(proxytype) = 'socks5') then
aproxytype := '5';
if (aproxytype = '9') then
begin
writeln('Error: Unknown proxy type ', proxytype, ' use only http, socks4 or socks5');
if (usethehelp = True) then WriteHelp;
Halt;
end;
aproxy := proxyport;
end;
if (pos('google=', usernamep) > 0) then
begin
usernamep := Copy(Trim(usernamep), Length('google=')+1, Length(Trim(usernamep)));
isgoogle := True;
end;
if (beverbose = True) then writeln('Username: ' + usernamep);
if (beverbose = True) then writeln('Password: ' + passwordp);
if (beverbose = True) and (isgoogle = True) then writeln(' Google login');
if (beverbose = True) then writeln('Video: ' + thevideop);
if not (infofilep = '') then
begin
if (beverbose = True) then writeln('Info: ' + infofilep);
LoadInfoFile(infofilep);
end;
if (vidtitle <> '#!NONE') and (viddescription <> '#!NONE') and (vidcategory <> '#!NONE') and (vidtags <> '#!NONE') then
begin
if (beverbose = True) then writeln('Title: ' + vidtitle);
if (beverbose = True) then writeln('Description: ' + viddescription);
if (beverbose = True) then writeln('Category: ' + vidcategory + '(' + TellMeCatagory + ')');
if (beverbose = True) then writeln('Tags: ' + vidtags);
end
else
begin
if (vidtitle = '#!NONE') then writeln('Error: Title is blank');
if (viddescription = '#!NONE') then writeln('Error: Description is blank');
if (vidcategory = '#!NONE') then writeln('Error: #! Video Category is blank');
if (vidtags = '#!NONE') then writeln('Error: Tag is blank');
if (usethehelp = True) then WriteHelp;
Halt;
end;
if (beverbose = True) and (aproxytype <> '0') then
begin
if (aproxytype = '2') then
writeln('Proxy: ' + aproxy);
if (aproxytype = '4') then
writeln('Socks4: ' + aproxy);
if (aproxytype = '5') then
writeln('Socks5: ' + aproxy);
end;
workfolder := Trim(GetEnvironmentVariable('HOME')) + '/' + appdirname;
if DirectoryExists(workfolder) = False then
begin
CreateDir(workfolder);
end;
repeat
cookiesflli := workfolder + '/cookie-' + MakeRandomString + '.txt';
until (FileExists(cookiesflli) = False);
savtafille := workfolder + '/thesavtafille.txt';
loggedin := 'NO';
if (isgoogle = True) then
begin
if (beverbose = True) then writeln('Logging in through Google');
durle := 'https://www.google.com/accounts/ServiceLoginAuth?service=youtube';
reffer := 'https://www.google.com/accounts/ServiceLogin?service=youtube&hl=en_US&passive=true&continue=http%3A//www.youtube.com/signup%3Fhl%3Den_US%26next%3D/';
formdata := 'continue=http%3A%2F%2Fwww.youtube.com%2Fsignup%3Fhl%3Den_US%26next%3D%2F&service=youtube&hl=en_US&Email='+ usernamep + '&Passwd='+ passwordp + '&PersistentCookie=yes&rmShown=1&signIn=Sign+in&asts=';
if (FileExists(savtafille)) then DeleteFile(savtafille);
getback := MycUrl.DoTheCurl(durle, cUrlLocation, cookiesflli, reffer, formdata, aproxytype, aproxy, savtafille, 30, 30, 0);
if (FileExists(savtafille)) then
begin
tmpstrlst.Clear;
tmpstrlst.LoadFromFile(savtafille);
getback := '';
for ig := 0 to tmpstrlst.Count - 1 do
getback := getback + tmpstrlst[ig];
DeleteFile(savtafille);
end;
if (pos('language="javascript"> location.replace("', getback) <> 0) then
begin
durle := Copy(getback, pos('language="javascript"> location.replace("', getback) + Length('language="javascript"> location.replace("'), Length(getback));
durle := Copy(durle, 1, pos('") </script><', durle)-1);
durle := StringReplace(durle, '\x3d', '=', [rfReplaceAll, rfIgnoreCase]);
durle := StringReplace(durle, '\x26next=/\x26', '&', [rfReplaceAll, rfIgnoreCase]);
reffer := 'https://www.google.com/accounts/ServiceLoginAuth?service=youtube';
formdata := '';
if (FileExists(savtafille)) then DeleteFile(savtafille);
getback := MycUrl.DoTheCurl(durle, cUrlLocation, cookiesflli, reffer, formdata, aproxytype, aproxy, savtafille, 30, 30, 0);
if (FileExists(savtafille)) then DeleteFile(savtafille);
end
else
begin
writeln('Error: check your usernameand/or password.');
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
Halt;
end;
end
else
begin
if (beverbose = True) then writeln('Logging in');
durle := 'http://www.youtube.com/login?next=/';
reffer := 'http://www.youtube.com/login?next=/';
formdata := 'next=/&username='+ usernamep + '&password='+ passwordp + '&action_login=Log In';
if (FileExists(savtafille)) then DeleteFile(savtafille);
getback := MycUrl.DoTheCurl(durle, cUrlLocation, cookiesflli, reffer, formdata, aproxytype, aproxy, savtafille, 30, 30, 0);
if (FileExists(savtafille)) then
begin
tmpstrlst.Clear;
tmpstrlst.LoadFromFile(savtafille);
getback := '';
for ig := 0 to tmpstrlst.Count - 1 do
getback := getback + tmpstrlst[ig];
DeleteFile(savtafille);
end;
getback := StringReplace(getback, '''', '', [rfReplaceAll, rfIgnoreCase]);
if (pos('UtilLinks/Channel);">' + usernamep + '</a>', getback) <> 0) then loggedin := 'YES';
if (pos('Sorry, your login was incorrect.', getback) <> 0) then
begin
writeln('Error: Sorry, your login was incorrect.');
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
Halt;
end;
if (pos('Please check your username.', getback) <> 0) then
begin
writeln('Error: Please check your username.');
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
Halt;
end;
end;
if not (loggedin = 'YES') then
begin
writeln('Error: reply saved to ' + SaveAllThisToFile('Error after login', workfolder, getback));
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
Halt;
end;
sessiontken := '';
if (beverbose = True) then writeln('Getting session token');
durle := 'http://www.youtube.com/my_videos_upload';
reffer := 'http://www.youtube.com/';
formdata := '';
if (FileExists(savtafille)) then DeleteFile(savtafille);
getback := MycUrl.DoTheCurl(durle, cUrlLocation, cookiesflli, reffer, formdata, aproxytype, aproxy, savtafille, 30, 30, 0);
if (FileExists(savtafille)) then
begin
tmpstrlst.Clear;
tmpstrlst.LoadFromFile(savtafille);
getback := '';
for ig := 0 to tmpstrlst.Count - 1 do
getback := getback + tmpstrlst[ig];
DeleteFile(savtafille);
end;
sessiontken := GiveMeTheSessionToken(getback);
if (sessiontken = '') then
begin
writeln('Error: no sessiontoken, reply saved to ' + SaveAllThisToFile('Error: no sessiontoken', workfolder, getback));
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
Halt;
end;
if (beverbose = True) then writeln('Getting upload server');
durle := 'http://www.youtube.com/my_videos_upload';
reffer := 'http://www.youtube.com/my_videos_upload';
formdata := '--form-string "field_myvideo_title=' + vidtitle + '" ';
formdata := formdata + '--form-string "field_myvideo_descr=' + viddescription + '" ';
formdata := formdata + '--form-string "language=EN" ';
formdata := formdata + '--form-string "field_myvideo_categories=' + TellMeCatagory + '" ';
formdata := formdata + '--form-string "field_myvideo_keywords=' + vidtags + '" ';
formdata := formdata + '--form-string "ignore_broadcast_settings=0" ';
formdata := formdata + '--form-string "field_privacy=public" ';
formdata := formdata + '--form-string "field_date_mon=0" ';
formdata := formdata + '--form-string "field_date_day=0" ';
formdata := formdata + '--form-string "field_date_yr=0" ';
formdata := formdata + '--form-string "location=" ';
formdata := formdata + '--form-string "allow_comments=Yes" ';
formdata := formdata + '--form-string "allow_comment_ratings=Yes" ';
formdata := formdata + '--form-string "allow_responses=Yes" ';
formdata := formdata + '--form-string "allow_ratings=Yes" ';
formdata := formdata + '--form-string "allow_embedding=Yes" ';
formdata := formdata + '--form-string "allow_syndication=Yes" ';
formdata := formdata + '--form-string "action_upload=Upload a video..." ';
formdata := formdata + '--form-string "session_token=' + sessiontken + '" ';
if (FileExists(savtafille)) then DeleteFile(savtafille);
getback := MycUrl.DoTheCurl(durle, cUrlLocation, cookiesflli, reffer, formdata, aproxytype, aproxy, savtafille, 30, 30, 0);
if (FileExists(savtafille)) then
begin
tmpstrlst.Clear;
tmpstrlst.LoadFromFile(savtafille);
getback := '';
for ig := 0 to tmpstrlst.Count - 1 do
getback := getback + tmpstrlst[ig];
DeleteFile(savtafille);
end;
sessiontken := '';
sessiontken := GiveMeTheAddresserToken(getback);
if (sessiontken = '') then
begin
writeln('Error: no sessiontoken, reply saved to ' + SaveAllThisToFile('Error: no sessiontoken after Getting upload server', workfolder, getback));
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
Halt;
end;
aserver := '';
aserver := GiveMeTheServer(getback);
if (aserver = '') then
begin
writeln('Error: no aserver, reply saved to ' + SaveAllThisToFile('Error: no aserver', workfolder, getback));
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
Halt;
end;
if (beverbose = True) then writeln('Uploading video');
durle := aserver;
reffer := 'http://www.youtube.com/my_videos_upload';
formdata := '-F "field_uploadfile=@' + thevideop + ';type=video/x-msvideo" ';
formdata := formdata + '--form-string "field_command=myvideo_submit" ';
formdata := formdata + '--form-string "field_myvideo_keywords=' + vidtags + '" ';
formdata := formdata + '--form-string "field_myvideo_title=' + vidtitle + '" ';
formdata := formdata + '--form-string "field_myvideo_descr=' + viddescription + '" ';
formdata := formdata + '--form-string "field_myvideo_categories=' + TellMeCatagory + '" ';
formdata := formdata + '--form-string "language=EN" ';
formdata := formdata + '--form-string "field_privacy=public" ';
formdata := formdata + '--form-string "field_private_share_entities=" ';
formdata := formdata + '--form-string "addresser=' + sessiontken + '" '; // see if this is the session token....or should i look for it
formdata := formdata + '--form-string "contact=" ';
formdata := formdata + '--form-string "field_date_day=0" ';
formdata := formdata + '--form-string "field_date_yr=0" ';
formdata := formdata + '--form-string "field_date_mon=0" ';
formdata := formdata + '--form-string "location=" ';
formdata := formdata + '--form-string "allow_comments=Yes" ';
formdata := formdata + '--form-string "allow_comment_ratings=Yes" ';
formdata := formdata + '--form-string "allow_responses=Yes" ';
formdata := formdata + '--form-string "allow_embedding=Yes" ';
formdata := formdata + '--form-string "allow_offweb=" ';
formdata := formdata + '--form-string "allow_ratings=Yes" ';
formdata := formdata + '--form-string "allow_syndication=Yes" ';
if (FileExists(savtafille)) then DeleteFile(savtafille);
getback := MycUrl.DoTheCurl(durle, cUrlLocation, cookiesflli, reffer, formdata, aproxytype, aproxy, savtafille, 30, 600, 0);
if (FileExists(savtafille)) then
begin
tmpstrlst.Clear;
tmpstrlst.LoadFromFile(savtafille);
getback := '';
for ig := 0 to tmpstrlst.Count - 1 do
getback := getback + tmpstrlst[ig];
DeleteFile(savtafille);
end;
if (beverbose = True) then writeln('Finished');
getbackurl := '';
getbackurl := GiveMeTheVideoUrl(getback);
if (getbackurl = '') then
begin
writeln('Error: no url, reply saved to ' + SaveAllThisToFile('Error: no url', workfolder, getback));
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
Halt;
end;
writeln('File Url: ' + getbackurl);
if FileExists(cookiesflli) then DeleteFile(cookiesflli);
end.
Save this as "nusecurl.pas"
Code:
unit nusecurl;
{$mode objfpc}{$H+}
interface
uses
Classes, Process, SysUtils;
type
AbuseCurl = class
private
{ private declarations }
public
function DoTheCurl(URL, curlpath, cookyfile, repherer, postvarstr, proxytype, proxieport, fillename: string; conntimeout, jobtimeout, index: integer) : string;
function NexecuteProgram(execstr: string) : string;
end;
implementation
function AbuseCurl.DoTheCurl(URL, curlpath, cookyfile, repherer, postvarstr, proxytype, proxieport, fillename: string; conntimeout, jobtimeout, index: integer) : string;
var
headers: string;
begin
headers := curlpath + ' ';
headers := headers + '--header "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" ';
headers := headers + '--header "Accept-Language: en-us,en;q=0.5" ';
headers := headers + '--header "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" ';
if (postvarstr <> '') and (pos('-F ', postvarstr) = 1) then
begin
headers := headers + '--header "Keep-Alive: 300" ';
headers := headers + '--header "Connection: keep-alive" ';
headers := headers + '--header "Expect:" ';
end
else
begin
headers := headers + '--header "Connection: Close" ';
end;
if (postvarstr <> '') and ((pos('--form-string ', postvarstr) = 1) or (pos('-F ', postvarstr) = 1)) then
headers := headers + '--header "Content-Type: multipart/form-data" ';
headers := headers + '--user-agent "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11" ';
if (repherer <> '') then
headers := headers + '--referer "' + repherer + '" ';
if (proxytype = '4') then
headers := headers + '--socks4 "' + proxieport + '" ';
if (proxytype = '5') then
headers := headers + '--socks5 "' + proxieport + '" ';
if (proxytype = '2') then
headers := headers + '--proxy "' + proxieport + '" ';
headers := headers + '--connect-timeout "' + inttostr(conntimeout) + '" ';
headers := headers + '--max-time "' + inttostr(jobtimeout) + '" ';
headers := headers + '--insecure ';
headers := headers + '--location ';
headers := headers + '--compressed ';
headers := headers + '--cookie "' + cookyfile + '" ';
headers := headers + '--cookie-jar "' + cookyfile + '" ';
if not (postvarstr = '') then
begin
if (pos('--form-string ', postvarstr) = 1) or (pos('-F ', postvarstr) = 1) then
headers := headers + postvarstr
else
headers := headers + '--data "' + postvarstr + '" ';
end;
if not (fillename = '') then
begin
headers := headers + '--output "' + fillename + '" ';
headers := headers + '--write-out "' + fillename + '" ';
end;
headers := headers + '--url "' + URL + '"';
// writeln(headers);
result := NexecuteProgram(headers);
end;
function AbuseCurl.NexecuteProgram(execstr: string) : string;
const
READ_BYTES = 2048;
var
S: TStringList;
M: TMemoryStream;
P: TProcess;
n: LongInt;
BytesRead: LongInt;
GiveBack: string;
begin
M := TMemoryStream.Create;
BytesRead := 0;
GiveBack := '';
P := TProcess.Create(nil);
P.CommandLine := execstr;
P.Options := [poUsePipes];
P.Execute;
while P.Running do
begin
M.SetSize(BytesRead + READ_BYTES);
n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0 then
begin
Inc(BytesRead, n);
end
else
begin
Sleep(100);
end;
end;
repeat
M.SetSize(BytesRead + READ_BYTES);
n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0 then
begin
Inc(BytesRead, n);
end;
until n <= 0;
M.SetSize(BytesRead);
S := TStringList.Create;
S.LoadFromStream(M);
for n := 0 to S.Count - 1 do
begin
GiveBack := GiveBack +S[n];
end;
S.Free;
P.Free;
M.Free;
result := GiveBack;
end;
end.