This commit is contained in:
parent
547d92aa2c
commit
f7397e817f
Binary file not shown.
144
Program.cs
144
Program.cs
|
@ -1,5 +1,6 @@
|
||||||
using CommandLine;
|
using CommandLine;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Pipes;
|
using System.IO.Pipes;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
@ -13,104 +14,56 @@ namespace youtube_downloader
|
||||||
|
|
||||||
class Program
|
class Program
|
||||||
{
|
{
|
||||||
static void SendStringArray(System.IO.Stream s, string[] array)
|
public static string[] ArgsFromString(string s)
|
||||||
{
|
{
|
||||||
s.Write(BitConverter.GetBytes(array.Length), 0, 4);
|
List<string> s2 = new List<string>();
|
||||||
foreach (var item in array)
|
StringBuilder b = new StringBuilder();
|
||||||
|
bool inQuote=false;
|
||||||
|
foreach(var c in s)
|
||||||
{
|
{
|
||||||
byte[] lenOfitem = BitConverter.GetBytes(item.Length);
|
if(c == '\"')
|
||||||
byte[] argtext = System.Text.Encoding.UTF8.GetBytes(item);
|
{
|
||||||
s.Write(lenOfitem, 0, lenOfitem.Length);
|
inQuote = !inQuote;
|
||||||
s.Write(argtext, 0, argtext.Length);
|
continue;
|
||||||
|
}
|
||||||
|
if(c == ' ')
|
||||||
|
{
|
||||||
|
if (!inQuote)
|
||||||
|
{
|
||||||
|
if (b.Length > 0)
|
||||||
|
{
|
||||||
|
s2.Add(b.ToString());
|
||||||
|
b.Clear();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
b.Append(c);
|
||||||
}
|
}
|
||||||
}
|
if (b.Length > 0)
|
||||||
static string[] GetStringArray(System.IO.Stream s)
|
|
||||||
{
|
|
||||||
byte[] items = new byte[4];
|
|
||||||
s.Read(items, 0, items.Length);
|
|
||||||
int items2 = BitConverter.ToInt32(items, 0);
|
|
||||||
|
|
||||||
string[] arraydata = new string[items2];
|
|
||||||
for (int i = 0; i < items2; i++)
|
|
||||||
{
|
{
|
||||||
s.Read(items, 0, 4);
|
s2.Add(b.ToString());
|
||||||
int item3 = BitConverter.ToInt32(items, 0);
|
b.Clear();
|
||||||
byte[] v = new byte[item3];
|
|
||||||
s.Read(v, 0, item3);
|
|
||||||
arraydata[i] = System.Text.Encoding.UTF8.GetString(v);
|
|
||||||
}
|
}
|
||||||
return arraydata;
|
return s2.ToArray();
|
||||||
}
|
}
|
||||||
static string _AppName =
|
|
||||||
Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().GetName().Name);
|
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
// we need to get our app name so that
|
// we need to get our app name so that
|
||||||
// we can create unique names for our mutex and our pipe
|
// we can create unique names for our mutex and our pipe
|
||||||
|
do
|
||||||
var notAlreadyRunning = true;
|
|
||||||
// wrap the meat of the application code with a named mutex so it runs only once
|
|
||||||
using (var mutex = new Mutex(true, _AppName + "Singleton", out notAlreadyRunning))
|
|
||||||
{
|
{
|
||||||
if (notAlreadyRunning)
|
Console.Write("> ");
|
||||||
{
|
var a2 = ArgsFromString(Console.ReadLine());
|
||||||
// do additional work here, startup stuff
|
_ProcessCommandLine(a2);
|
||||||
// Console.WriteLine("Running. Press any key to exit...");
|
} while (true);
|
||||||
// ...
|
|
||||||
// now process our initial main command line
|
|
||||||
_ProcessCommandLine(args);
|
|
||||||
// start the IPC sink.
|
|
||||||
var srv = new NamedPipeServerStream(_AppName + "IPC",
|
|
||||||
PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
|
|
||||||
// it's easier to use the AsyncCallback than it is to use Tasks here:
|
|
||||||
// this can't block, so some form of async is a must
|
|
||||||
|
|
||||||
srv.BeginWaitForConnection(new AsyncCallback(_ConnectionHandler), srv);
|
|
||||||
|
|
||||||
// block here until exit
|
|
||||||
Console.ReadKey();
|
|
||||||
// if this was a windows forms app you would put your
|
|
||||||
// "Applicantion.Run(new MyForm());" here
|
|
||||||
// finally, run any teardown code and exit
|
|
||||||
|
|
||||||
srv.Close();
|
|
||||||
}
|
|
||||||
else // another instance is running
|
|
||||||
{
|
|
||||||
// connect to the main app
|
|
||||||
var cli = new NamedPipeClientStream(".", _AppName + "IPC", PipeDirection.InOut);
|
|
||||||
cli.Connect();
|
|
||||||
SendStringArray(cli, args);
|
|
||||||
byte[] leng = new byte[4];
|
|
||||||
cli.Read(leng, 0, 4);
|
|
||||||
int sz = BitConverter.ToInt32(leng,0);
|
|
||||||
byte[] sdata = new byte[sz];
|
|
||||||
cli.Read(sdata, 0, sz);
|
|
||||||
string strdata = System.Text.Encoding.UTF8.GetString(sdata);
|
|
||||||
Console.Write(strdata);
|
|
||||||
// serialize and send the command line
|
|
||||||
|
|
||||||
cli.Close();
|
|
||||||
// and exit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void _ConnectionHandler(IAsyncResult result)
|
|
||||||
{
|
|
||||||
var srv = result.AsyncState as NamedPipeServerStream;
|
|
||||||
srv.EndWaitForConnection(result);
|
|
||||||
// we're connected, now deserialize the incoming command line
|
|
||||||
|
|
||||||
var inargs = GetStringArray(srv);
|
|
||||||
r = new RESPONSE(srv);
|
|
||||||
// process incoming command line
|
|
||||||
_ProcessCommandLine(inargs);
|
|
||||||
r.SendResponse();
|
|
||||||
srv = new NamedPipeServerStream(_AppName + "IPC", PipeDirection.InOut,
|
|
||||||
1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
|
|
||||||
|
|
||||||
srv.BeginWaitForConnection(new AsyncCallback(_ConnectionHandler), srv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[Verb("exit", HelpText = "Download Video")]
|
[Verb("exit", HelpText = "Download Video")]
|
||||||
|
|
||||||
|
@ -179,7 +132,7 @@ namespace youtube_downloader
|
||||||
public string Page { get; set; }
|
public string Page { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
static RESPONSE r=null;
|
|
||||||
static void _ProcessCommandLine(string[] args)
|
static void _ProcessCommandLine(string[] args)
|
||||||
{
|
{
|
||||||
CommandLine.Parser.Default.ParseArguments<DownloadVideo, DownloadPlaylist, DownloadChannel, DownloadUser, MoveQueue, Info, ExitApp>(args)
|
CommandLine.Parser.Default.ParseArguments<DownloadVideo, DownloadPlaylist, DownloadChannel, DownloadUser, MoveQueue, Info, ExitApp>(args)
|
||||||
|
@ -228,15 +181,16 @@ namespace youtube_downloader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private static int RunInfo(Info opts)
|
private static int RunInfo(Info opts)
|
||||||
{ if (r != null)
|
{
|
||||||
{
|
//if ( != null)
|
||||||
|
|
||||||
switch (opts.Page)
|
switch (opts.Page)
|
||||||
{
|
{
|
||||||
case "progress":
|
case "progress":
|
||||||
if (opts.ForMachine)
|
if (opts.ForMachine)
|
||||||
{
|
{
|
||||||
string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(Server.Functions.Downloader.GetProgress());
|
string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(Server.Functions.Downloader.GetProgress());
|
||||||
r.SendResponse(jsonData);
|
Console.WriteLine(jsonData);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -248,15 +202,15 @@ namespace youtube_downloader
|
||||||
sb.AppendLine();
|
sb.AppendLine();
|
||||||
sb.AppendLine("=======Video Info=======");
|
sb.AppendLine("=======Video Info=======");
|
||||||
WriteVideoInfo(sb, s.Saved, false);
|
WriteVideoInfo(sb, s.Saved, false);
|
||||||
r.SendResponse(sb.ToString());
|
Console.WriteLine(sb.ToString());
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "queue":
|
case "queue":
|
||||||
if (opts.ForMachine)
|
if (opts.ForMachine)
|
||||||
{
|
{
|
||||||
string jsonData = Server.Functions.Downloader.GetQueue();
|
string jsonData = Server.Functions.Downloader.GetQueue();
|
||||||
r.SendResponse(jsonData);
|
Console.WriteLine(jsonData);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -267,17 +221,17 @@ namespace youtube_downloader
|
||||||
WriteVideoInfo(sb, item.Video, false);
|
WriteVideoInfo(sb, item.Video, false);
|
||||||
sb.AppendLine();
|
sb.AppendLine();
|
||||||
}
|
}
|
||||||
r.SendResponse(sb.ToString());
|
Console.WriteLine(sb.ToString());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "location":
|
case "location":
|
||||||
r.SendResponse(Server.Functions.Downloader.DL.StorageLocation);
|
Console.WriteLine(Server.Functions.Downloader.DL.StorageLocation);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
27
RESPONSE.cs
27
RESPONSE.cs
|
@ -1,27 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace youtube_downloader
|
|
||||||
{
|
|
||||||
internal class RESPONSE
|
|
||||||
{
|
|
||||||
public RESPONSE(System.IO.Stream strm)
|
|
||||||
{
|
|
||||||
this.strm = strm;
|
|
||||||
}
|
|
||||||
System.IO.Stream strm;
|
|
||||||
public void SendResponse(string response)
|
|
||||||
{
|
|
||||||
if(strm != null)
|
|
||||||
{
|
|
||||||
strm.Write(BitConverter.GetBytes(response.Length), 0, 4);
|
|
||||||
strm.Write(System.Text.Encoding.UTF8.GetBytes(response), 0, response.Length);
|
|
||||||
strm.Dispose();
|
|
||||||
strm = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void SendResponse()
|
|
||||||
{
|
|
||||||
SendResponse("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
||||||
6acf12007b654605f4a149e8bf10292d9c49014f
|
2a5e8789af6d18f40163043d238b63564245c869
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -88,7 +88,6 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="RESPONSE.cs" />
|
|
||||||
<Compile Include="Server\Functions\Downloader.cs" />
|
<Compile Include="Server\Functions\Downloader.cs" />
|
||||||
<Compile Include="Server\Functions\ffmpeg.cs" />
|
<Compile Include="Server\Functions\ffmpeg.cs" />
|
||||||
<Compile Include="Server\Models\SavedChannel.cs" />
|
<Compile Include="Server\Models\SavedChannel.cs" />
|
||||||
|
|
Loading…
Reference in New Issue