├── .gitattributes ├── .gitignore ├── C# WeebIRC Backend (local) ├── Linux │ ├── AnimeInfo.cs │ ├── AnimeSeasons.cs │ ├── FileInformation.cs │ ├── HtmlParser.cs │ ├── HttpServer.cs │ ├── Lib │ │ ├── Newtonsoft.Json.dll │ │ └── SimpleIRCLib.dll │ ├── NiblSearchInformation.cs │ ├── Program.cs │ └── WebPage.cs └── Windows │ ├── AnimeInfo.cs │ ├── AnimeSeasons.cs │ ├── App.config │ ├── Debug.Designer.cs │ ├── Debug.cs │ ├── Debug.resx │ ├── FileInformation.cs │ ├── Home.Designer.cs │ ├── Home.cs │ ├── Home.resx │ ├── HtmlParser.cs │ ├── HttpServer.cs │ ├── NiblSearchInformation.cs │ ├── Program.cs │ ├── WebPage.cs │ ├── WeebIRCServerTray.csproj │ ├── packages.config │ └── w5 blue.png.ico ├── Executables and Archives ├── WeebIRC.zip ├── WeebIRCServerLinux.tar ├── WeebIRCServerWin.exe ├── WeebIRCSetup.msi └── mkvextract.exe ├── Interface Source ├── Css │ ├── SubPlayerJS.css │ └── style.css ├── FileDownload │ ├── WeebIRCServerLinux.tar │ └── WeebIRCSetup.msi ├── Image │ ├── afterstart.png │ ├── beforestart.png │ ├── loading.svg │ ├── logo los.svg │ ├── start scherm.svg │ ├── w1.svg │ ├── w2.svg │ ├── w3 blue.svg │ ├── w4.svg │ └── w5 blue.svg ├── Javascript │ ├── CSWebServerDetection.js │ ├── SubPlayerJS.js │ ├── SubtitlePlayer.js │ ├── WeebIRC.js │ ├── WeebIRC.min.js │ ├── aboutCtrl.js │ ├── animeCtrl.js │ ├── app.js │ ├── appv2.js.js │ ├── chatCtrl.js │ ├── comServerService.js │ ├── comServerServices.js │ ├── downloadCtrl.js │ ├── historyCtrl.js │ ├── homeCtrl.js │ ├── localServerService.js │ ├── playerCtrl.js │ ├── seasonsCtrl.js │ ├── serverDetectionService.js │ ├── serverDiscoveryCtrl.js │ ├── serverDownloadCtrl.js │ ├── settingsCtrl.js │ ├── statusService.js │ └── storageService.js ├── Partials │ ├── about.html │ ├── anime.html │ ├── chat.html │ ├── download.html │ ├── history.html │ ├── home.html │ ├── player.html │ ├── seasons.html │ ├── serverdiscovery.html │ ├── serverdownload.html │ └── settings.html ├── SubPlayerJS.css ├── SubPlayerJS.js ├── home.html ├── index.html └── materialize │ ├── LICENSE │ ├── css │ ├── materialize.css │ └── materialize.min.css │ ├── font │ ├── material-design-icons │ │ ├── LICENSE.txt │ │ ├── Material-Design-Icons.eot │ │ ├── Material-Design-Icons.svg │ │ ├── Material-Design-Icons.ttf │ │ ├── Material-Design-Icons.woff │ │ └── Material-Design-Icons.woff2 │ └── roboto │ │ ├── Roboto-Bold.eot │ │ ├── Roboto-Bold.ttf │ │ ├── Roboto-Bold.woff │ │ ├── Roboto-Bold.woff2 │ │ ├── Roboto-Light.eot │ │ ├── Roboto-Light.ttf │ │ ├── Roboto-Light.woff │ │ ├── Roboto-Light.woff2 │ │ ├── Roboto-Medium.eot │ │ ├── Roboto-Medium.ttf │ │ ├── Roboto-Medium.woff │ │ ├── Roboto-Medium.woff2 │ │ ├── Roboto-Regular.eot │ │ ├── Roboto-Regular.ttf │ │ ├── Roboto-Regular.woff │ │ ├── Roboto-Regular.woff2 │ │ ├── Roboto-Thin.eot │ │ ├── Roboto-Thin.ttf │ │ ├── Roboto-Thin.woff │ │ └── Roboto-Thin.woff2 │ └── js │ ├── materialize.js │ └── materialize.min.js ├── LICENSE.md ├── OLD ├── README.md ├── Source │ ├── WeebIRC.sln │ └── WeebIRC │ │ ├── 80px-Anime-stub.svg.ico │ │ ├── App.config │ │ ├── Form1.Designer.cs │ │ ├── Form1.cs │ │ ├── Form1.resx │ │ ├── Program.cs │ │ ├── Properties │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ │ ├── Setup.cs │ │ ├── WeebIRC.csproj │ │ └── packages.config └── WeebIRC.exe ├── README.md └── SCREENSHOTS.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.suo## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | 84 | # Visual Studio profiler 85 | *.psess 86 | *.vsp 87 | *.vspx 88 | *.sap 89 | 90 | # TFS 2012 Local Workspace 91 | $tf/ 92 | 93 | # Guidance Automation Toolkit 94 | *.gpState 95 | 96 | # ReSharper is a .NET coding add-in 97 | _ReSharper*/ 98 | *.[Rr]e[Ss]harper 99 | *.DotSettings.user 100 | 101 | # JustCode is a .NET coding add-in 102 | .JustCode 103 | 104 | # TeamCity is a build add-in 105 | _TeamCity* 106 | 107 | # DotCover is a Code Coverage Tool 108 | *.dotCover 109 | 110 | # NCrunch 111 | _NCrunch_* 112 | .*crunch*.local.xml 113 | nCrunchTemp_* 114 | 115 | # MightyMoose 116 | *.mm.* 117 | AutoTest.Net/ 118 | 119 | # Web workbench (sass) 120 | .sass-cache/ 121 | 122 | # Installshield output folder 123 | [Ee]xpress/ 124 | 125 | # DocProject is a documentation generator add-in 126 | DocProject/buildhelp/ 127 | DocProject/Help/*.HxT 128 | DocProject/Help/*.HxC 129 | DocProject/Help/*.hhc 130 | DocProject/Help/*.hhk 131 | DocProject/Help/*.hhp 132 | DocProject/Help/Html2 133 | DocProject/Help/html 134 | 135 | # Click-Once directory 136 | publish/ 137 | 138 | # Publish Web Output 139 | *.[Pp]ublish.xml 140 | *.azurePubxml 141 | # TODO: Comment the next line if you want to checkin your web deploy settings 142 | # but database connection strings (with potential passwords) will be unencrypted 143 | *.pubxml 144 | *.publishproj 145 | 146 | # NuGet Packages 147 | *.nupkg 148 | # The packages folder can be ignored because of Package Restore 149 | **/packages/* 150 | # except build/, which is used as an MSBuild target. 151 | !**/packages/build/ 152 | # Uncomment if necessary however generally it will be regenerated when needed 153 | #!**/packages/repositories.config 154 | # NuGet v3's project.json files produces more ignoreable files 155 | *.nuget.props 156 | *.nuget.targets 157 | 158 | # Microsoft Azure Build Output 159 | csx/ 160 | *.build.csdef 161 | 162 | # Microsoft Azure Emulator 163 | ecf/ 164 | rcf/ 165 | 166 | # Windows Store app package directories and files 167 | AppPackages/ 168 | BundleArtifacts/ 169 | Package.StoreAssociation.xml 170 | _pkginfo.txt 171 | 172 | # Visual Studio cache files 173 | # files ending in .cache can be ignored 174 | *.[Cc]ache 175 | # but keep track of directories ending in .cache 176 | !*.[Cc]ache/ 177 | 178 | # Others 179 | ClientBin/ 180 | ~$* 181 | *~ 182 | *.dbmdl 183 | *.dbproj.schemaview 184 | *.pfx 185 | *.publishsettings 186 | node_modules/ 187 | orleans.codegen.cs 188 | 189 | # Since there are multiple workflows, uncomment next line to ignore bower_components 190 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 191 | #bower_components/ 192 | 193 | # RIA/Silverlight projects 194 | Generated_Code/ 195 | 196 | # Backup & report files from converting an old project file 197 | # to a newer Visual Studio version. Backup files are not needed, 198 | # because we have git ;-) 199 | _UpgradeReport_Files/ 200 | Backup*/ 201 | UpgradeLog*.XML 202 | UpgradeLog*.htm 203 | 204 | # SQL Server files 205 | *.mdf 206 | *.ldf 207 | 208 | # Business Intelligence projects 209 | *.rdl.data 210 | *.bim.layout 211 | *.bim_*.settings 212 | 213 | # Microsoft Fakes 214 | FakesAssemblies/ 215 | 216 | # GhostDoc plugin setting file 217 | *.GhostDoc.xml 218 | 219 | # Node.js Tools for Visual Studio 220 | .ntvs_analysis.dat 221 | 222 | # Visual Studio 6 build log 223 | *.plg 224 | 225 | # Visual Studio 6 workspace options file 226 | *.opt 227 | 228 | # Visual Studio LightSwitch build output 229 | **/*.HTMLClient/GeneratedArtifacts 230 | **/*.DesktopClient/GeneratedArtifacts 231 | **/*.DesktopClient/ModelManifest.xml 232 | **/*.Server/GeneratedArtifacts 233 | **/*.Server/ModelManifest.xml 234 | _Pvt_Extensions 235 | 236 | # Paket dependency manager 237 | .paket/paket.exe 238 | paket-files/ 239 | 240 | # FAKE - F# Make 241 | .fake/ 242 | 243 | # JetBrains Rider 244 | .idea/ 245 | *.sln.iml 246 | *.suo -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Linux/AnimeInfo.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace WeebIRCWebEdition 4 | { 5 | class AnimeInfo 6 | { 7 | 8 | public string id{get; set;} 9 | public string title{get; set;} 10 | public string cover {get; set;} 11 | public string synopsis{get; set;} 12 | public string genres{get; set;} 13 | public string score {get; set;} 14 | 15 | } 16 | } -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Linux/AnimeSeasons.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace WeebIRCWebEdition 4 | { 5 | class AnimeSeasons 6 | { 7 | 8 | public string season{get; set;} 9 | public string url{get; set;} 10 | } 11 | } -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Linux/FileInformation.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace WeebIRCWebEdition 4 | { 5 | class FileInformation 6 | { 7 | public string fileName {get; set;} 8 | public string fileSize {get; set;} 9 | public string downloadStatus {get; set;} 10 | public string downloadProgress {get; set;} 11 | public string downloadSpeed {get; set;} 12 | public string downloadUrl {get; set;} 13 | public string streamUrl {get; set;} 14 | public string downloadPack {get; set;} 15 | public string fileId {get; set;} 16 | } 17 | } -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Linux/HtmlParser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Net; 4 | using System.Text.RegularExpressions; 5 | 6 | namespace WeebIRCWebEdition 7 | { 8 | class HtmlParser 9 | { 10 | 11 | public string html { get; set; } 12 | 13 | /// 14 | /// 15 | /// Constructor to setup the dictionarys and lists 16 | /// 18 | public HtmlParser() 19 | { 20 | } 21 | 22 | /// 23 | /// 24 | /// Gets html content from url 25 | /// 27 | public string ParseUrl(string url) 28 | { 29 | using (WebClient webclient = new WebClient()) 30 | { 31 | html = webclient.DownloadString(url); 32 | return html; 33 | } 34 | } 35 | 36 | /// 37 | /// 38 | /// Cuts the html into an array, using a unique string, then parses all tags and text inside those tags into a dictionary, which is publicly available 39 | /// 41 | public string[,,] CutHtml(string uniqueString) 42 | { 43 | string[] htmlSplitted = html.Split(new string[] { uniqueString }, StringSplitOptions.None); 44 | 45 | string[,,] tagsAndTheirInsidesPerPart = new string[htmlSplitted.Length, 200,2]; 46 | for (int a = 1; a < htmlSplitted.Length - 1; a++) 47 | { 48 | try 49 | { 50 | string[] startTags = htmlSplitted[a].Split('<'); 51 | for (int i = 0; i < startTags.Length - 1; i++) 52 | { 53 | try 54 | { 55 | 56 | string tagName = startTags[i].Split('>')[0]; 57 | string dataInTag = startTags[i].Split('>')[1].Split(new string[] { " 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Windows/Debug.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace WeebIRCServerTray 2 | { 3 | partial class Debug 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Debug)); 32 | this.pictureBox2 = new System.Windows.Forms.PictureBox(); 33 | this.SaveToLog = new MaterialSkin.Controls.MaterialCheckBox(); 34 | this.DebugWindow = new System.Windows.Forms.RichTextBox(); 35 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); 36 | this.SuspendLayout(); 37 | // 38 | // pictureBox2 39 | // 40 | this.pictureBox2.BackColor = System.Drawing.Color.Transparent; 41 | this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image"))); 42 | this.pictureBox2.Location = new System.Drawing.Point(3, 3); 43 | this.pictureBox2.Name = "pictureBox2"; 44 | this.pictureBox2.Size = new System.Drawing.Size(16, 16); 45 | this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; 46 | this.pictureBox2.TabIndex = 9; 47 | this.pictureBox2.TabStop = false; 48 | // 49 | // SaveToLog 50 | // 51 | this.SaveToLog.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 52 | this.SaveToLog.AutoSize = true; 53 | this.SaveToLog.Depth = 0; 54 | this.SaveToLog.Font = new System.Drawing.Font("Roboto", 10F); 55 | this.SaveToLog.Location = new System.Drawing.Point(22, 488); 56 | this.SaveToLog.Margin = new System.Windows.Forms.Padding(0); 57 | this.SaveToLog.MouseLocation = new System.Drawing.Point(-1, -1); 58 | this.SaveToLog.MouseState = MaterialSkin.MouseState.HOVER; 59 | this.SaveToLog.Name = "SaveToLog"; 60 | this.SaveToLog.Ripple = true; 61 | this.SaveToLog.Size = new System.Drawing.Size(106, 30); 62 | this.SaveToLog.TabIndex = 10; 63 | this.SaveToLog.Text = "Save To Log"; 64 | this.SaveToLog.UseVisualStyleBackColor = true; 65 | this.SaveToLog.CheckedChanged += new System.EventHandler(this.SaveToLog_CheckedChanged); 66 | // 67 | // DebugWindow 68 | // 69 | this.DebugWindow.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 70 | | System.Windows.Forms.AnchorStyles.Left) 71 | | System.Windows.Forms.AnchorStyles.Right))); 72 | this.DebugWindow.Font = new System.Drawing.Font("Roboto Condensed", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 73 | this.DebugWindow.Location = new System.Drawing.Point(22, 81); 74 | this.DebugWindow.Margin = new System.Windows.Forms.Padding(0); 75 | this.DebugWindow.Name = "DebugWindow"; 76 | this.DebugWindow.ReadOnly = true; 77 | this.DebugWindow.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; 78 | this.DebugWindow.Size = new System.Drawing.Size(585, 393); 79 | this.DebugWindow.TabIndex = 11; 80 | this.DebugWindow.Text = "Welcome to the debug heaven :D This wall of text is a feast to read for developer" + 81 | "s with no life... so keep at it :D"; 82 | // 83 | // Debug 84 | // 85 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 86 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 87 | this.ClientSize = new System.Drawing.Size(631, 527); 88 | this.Controls.Add(this.DebugWindow); 89 | this.Controls.Add(this.SaveToLog); 90 | this.Controls.Add(this.pictureBox2); 91 | this.Name = "Debug"; 92 | this.Text = "Debug"; 93 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Debug_FormClosing); 94 | this.Load += new System.EventHandler(this.Debug_Load); 95 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); 96 | this.ResumeLayout(false); 97 | this.PerformLayout(); 98 | 99 | } 100 | 101 | #endregion 102 | 103 | private System.Windows.Forms.PictureBox pictureBox2; 104 | private MaterialSkin.Controls.MaterialCheckBox SaveToLog; 105 | private System.Windows.Forms.RichTextBox DebugWindow; 106 | } 107 | } -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Windows/Debug.cs: -------------------------------------------------------------------------------- 1 | using MaterialSkin; 2 | using MaterialSkin.Controls; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.ComponentModel; 6 | using System.Data; 7 | using System.Drawing; 8 | using System.Linq; 9 | using System.Runtime.InteropServices; 10 | using System.Text; 11 | using System.Threading.Tasks; 12 | using System.Windows.Forms; 13 | 14 | namespace WeebIRCServerTray 15 | { 16 | public partial class Debug : MaterialForm 17 | { 18 | public Debug() 19 | { 20 | InitializeComponent(); 21 | var materialSkinManager = MaterialSkinManager.Instance; 22 | materialSkinManager.AddFormToManage(this); 23 | materialSkinManager.ColorScheme = new ColorScheme(Primary.Blue600, Primary.Blue900, Primary.Blue500, Accent.Blue200, TextShade.WHITE); 24 | } 25 | 26 | private void Debug_Load(object sender, EventArgs e) 27 | { 28 | 29 | } 30 | 31 | [DllImport("user32.dll", CharSet = CharSet.Auto)] 32 | private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 33 | private const int WM_VSCROLL = 277; 34 | private const int SB_PAGEBOTTOM = 7; 35 | 36 | public static void ScrollToBottom(RichTextBox MyRichTextBox) 37 | { 38 | SendMessage(MyRichTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero); 39 | } 40 | 41 | public void AppendToDebug(string debugmessage) 42 | { 43 | 44 | if (this.DebugWindow.InvokeRequired) 45 | { 46 | this.DebugWindow.BeginInvoke(new MethodInvoker(() => AppendToDebug(debugmessage))); 47 | } 48 | else 49 | { 50 | try 51 | { 52 | this.DebugWindow.AppendText(debugmessage + "\n"); 53 | ScrollToBottom(DebugWindow); 54 | } catch (Exception derp) 55 | { 56 | 57 | } 58 | 59 | } 60 | } 61 | 62 | private void SaveToLog_CheckedChanged(object sender, EventArgs e) 63 | { 64 | if (SaveToLog.Checked) 65 | { 66 | Home.saveDebug = true; 67 | } else 68 | { 69 | Home.saveDebug = false; 70 | } 71 | } 72 | 73 | private void Debug_FormClosing(object sender, FormClosingEventArgs e) 74 | { 75 | if (e.CloseReason == CloseReason.UserClosing) 76 | { 77 | e.Cancel = true; 78 | Hide(); 79 | } 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Windows/FileInformation.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace WeebIRCServerTray 4 | { 5 | class FileInformation 6 | { 7 | public string fileName {get; set;} 8 | public string fileSize {get; set;} 9 | public string downloadStatus {get; set;} 10 | public string downloadProgress {get; set;} 11 | public string downloadSpeed {get; set;} 12 | public string downloadUrl {get; set;} 13 | public string streamUrl {get; set;} 14 | public string downloadPack {get; set;} 15 | public string fileId {get; set;} 16 | } 17 | } -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Windows/HtmlParser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Net; 4 | using System.Text.RegularExpressions; 5 | 6 | namespace WeebIRCServerTray 7 | { 8 | class HtmlParser 9 | { 10 | 11 | public string html { get; set; } 12 | 13 | /// 14 | /// 15 | /// Constructor to setup the dictionarys and lists 16 | /// 18 | public HtmlParser() 19 | { 20 | } 21 | 22 | /// 23 | /// 24 | /// Gets html content from url 25 | /// 27 | public string ParseUrl(string url) 28 | { 29 | using (WebClient webclient = new WebClient()) 30 | { 31 | html = webclient.DownloadString(url); 32 | return html; 33 | } 34 | } 35 | 36 | /// 37 | /// 38 | /// Cuts the html into an array, using a unique string, then parses all tags and text inside those tags into a dictionary, which is publicly available 39 | /// 41 | public string[,,] CutHtml(string uniqueString) 42 | { 43 | string[] htmlSplitted = html.Split(new string[] { uniqueString }, StringSplitOptions.None); 44 | 45 | string[,,] tagsAndTheirInsidesPerPart = new string[htmlSplitted.Length, 200,2]; 46 | for (int a = 1; a < htmlSplitted.Length - 1; a++) 47 | { 48 | try 49 | { 50 | string[] startTags = htmlSplitted[a].Split('<'); 51 | for (int i = 0; i < startTags.Length - 1; i++) 52 | { 53 | try 54 | { 55 | 56 | string tagName = startTags[i].Split('>')[0]; 57 | string dataInTag = startTags[i].Split('>')[1].Split(new string[] { " 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new Home()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Windows/WeebIRCServerTray.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {9A565C3A-D1BC-4F3F-91DC-452A458A418F} 8 | WinExe 9 | Properties 10 | WeebIRCServerTray 11 | WeebIRCServerTray 12 | v4.5.2 13 | 512 14 | true 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | w5 blue.png.ico 37 | 38 | 39 | 40 | ..\packages\MaterialSkin.0.2.1\lib\MaterialSkin.dll 41 | True 42 | 43 | 44 | ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll 45 | True 46 | 47 | 48 | False 49 | ..\..\..\..\GitHub\SimpleIRCLib\SimpleIRCLib\bin\Debug\SimpleIRCLib.dll 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | Form 69 | 70 | 71 | Debug.cs 72 | 73 | 74 | 75 | Form 76 | 77 | 78 | Home.cs 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | Debug.cs 88 | 89 | 90 | Home.cs 91 | 92 | 93 | ResXFileCodeGenerator 94 | Resources.Designer.cs 95 | Designer 96 | 97 | 98 | True 99 | Resources.resx 100 | 101 | 102 | 103 | SettingsSingleFileGenerator 104 | Settings.Designer.cs 105 | 106 | 107 | True 108 | Settings.settings 109 | True 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 126 | -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Windows/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /C# WeebIRC Backend (local)/Windows/w5 blue.png.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/C# WeebIRC Backend (local)/Windows/w5 blue.png.ico -------------------------------------------------------------------------------- /Executables and Archives/WeebIRC.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Executables and Archives/WeebIRC.zip -------------------------------------------------------------------------------- /Executables and Archives/WeebIRCServerLinux.tar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Executables and Archives/WeebIRCServerLinux.tar -------------------------------------------------------------------------------- /Executables and Archives/WeebIRCServerWin.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Executables and Archives/WeebIRCServerWin.exe -------------------------------------------------------------------------------- /Executables and Archives/WeebIRCSetup.msi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Executables and Archives/WeebIRCSetup.msi -------------------------------------------------------------------------------- /Executables and Archives/mkvextract.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Executables and Archives/mkvextract.exe -------------------------------------------------------------------------------- /Interface Source/Css/SubPlayerJS.css: -------------------------------------------------------------------------------- 1 | 2 | .inner-container-SPJS { 3 | display: inline-block; 4 | position: relative; 5 | } 6 | .video-overlay-SPJS { 7 | text-align: center; 8 | z-index: 1; 9 | position: absolute; 10 | width: 100%; 11 | left: 0px; 12 | top: 80%; 13 | padding: 5px 5px; 14 | color: white; 15 | text-shadow: 16 | -1px -1px 0 #000, 17 | 1px -1px 0 #000, 18 | -1px 1px 0 #000, 19 | 1px 1px 0 #000; 20 | font-size: 24pt; 21 | font-size: 1.5vw; 22 | font-family: Helvetica; 23 | } 24 | .control-SPJS { 25 | text-align: center; 26 | z-index: 1; 27 | position: absolute; 28 | width: 100%; 29 | left: 0px; 30 | top: 85%; 31 | padding: 5px 5px; 32 | background-color: rgb(0,0,0,0.5); 33 | color: white; 34 | font-size: 24pt; 35 | } -------------------------------------------------------------------------------- /Interface Source/Css/style.css: -------------------------------------------------------------------------------- 1 | .input-field input[type=search] { 2 | min-height: 64px; 3 | } 4 | 5 | /* 6 | * Custom Container 7 | */ 8 | @media only screen and (min-width: 993px) { 9 | .customContainer { 10 | width: 60%; 11 | } 12 | } 13 | 14 | /* cards */ 15 | 16 | .card .card-image .card-title { 17 | position: absolute; 18 | bottom: 0; 19 | left: 0; 20 | padding: 10px; 21 | 22 | } 23 | 24 | .custom-title{ 25 | margin-bottom: 10px; 26 | } 27 | 28 | .selectionHover:hover{ 29 | background-color: rgba(0, 0, 0, 0.1); 30 | cursor:pointer; 31 | } 32 | 33 | .card-banner{ 34 | position: absolute; 35 | top: 0; 36 | left: 0; 37 | padding: 10px; 38 | } 39 | .customCard { 40 | max-width: 225px; 41 | height: 300px; 42 | float: left; 43 | margin-left: 10px; 44 | } 45 | .customCard-image { 46 | height: 300px; 47 | width: 225px; 48 | } 49 | .customCardDetail-image { 50 | height: 300px; 51 | width: 225px; 52 | } 53 | 54 | .customCardMob { 55 | max-width: 225px; 56 | height: 300px; 57 | float: left; 58 | margin-left: 10px; 59 | } 60 | .customCardMob-image { 61 | height: 140px; 62 | width: 100px; 63 | } 64 | .customCardMobDetail-image { 65 | height: 300px; 66 | width: 225px; 67 | } 68 | 69 | .customCard-title { 70 | width: 100%; 71 | } 72 | 73 | .alpha60 { 74 | /* Fallback for web browsers that don't support RGBa */ 75 | 76 | background-color: rgb(0, 0, 0); 77 | /* RGBa with 0.6 opacity */ 78 | 79 | background-color: rgba(0, 0, 0, 0.6); 80 | /* For IE 5.5 - 7*/ 81 | 82 | filter: progid: DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000); 83 | /* For IE 8*/ 84 | 85 | -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"; 86 | } 87 | 88 | .customBlue{ 89 | background-color: #32465D; 90 | } 91 | 92 | .mobileCustomImg{ 93 | width:auto; 94 | height: 50%; 95 | } 96 | 97 | /* 98 | * hiding scrollbar 99 | */ 100 | .container1{ 101 | height: 60%; 102 | /* center the div */ 103 | right: 0; 104 | left: 0; 105 | margin-right: auto; 106 | margin-left: auto; 107 | /* give it dimensions */ 108 | min-height: 10em; 109 | max-width: 90%; 110 | /* just for example presentation */ 111 | top: 2.5em; 112 | position: relative; 113 | background: rgba(255, 255, 255, 1); 114 | z-index: 0; 115 | } 116 | 117 | #chat{ 118 | width: 100%; 119 | height: 80%; 120 | overflow-y: scroll; 121 | border: 1px; 122 | overflow: auto; 123 | padding-right: 15px; 124 | margin-top: 5%; 125 | } 126 | 127 | .dropdown-content { 128 | background-color: #FFFFFF; 129 | margin: 0; 130 | display: none; 131 | min-width: 200px; /* Changed this to accomodate content width */ 132 | max-height: auto; 133 | margin-left: -1px; /* Add this to keep dropdown in line with edge of navbar */ 134 | overflow: hidden; /* Changed this from overflow-y:auto; to overflow:hidden; */ 135 | opacity: 0; 136 | position: absolute; 137 | white-space: nowrap; 138 | z-index: 1; 139 | will-change: width, height; 140 | } 141 | 142 | .fixedCircularButton { 143 | position:fixed; 144 | top:90%; 145 | right:2%; 146 | } 147 | 148 | .fixedButtonSize { 149 | min-width: 100%; 150 | max-width: 100%; 151 | } 152 | 153 | .dropdown{ 154 | max-height: 400px; 155 | z-index: 10; 156 | } 157 | 158 | .modal{ 159 | background-color: rgba(0,0,0,0); 160 | border-radius: 0px; 161 | box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0), 0 0px 0px 0 rgba(0, 0, 0, 0); 162 | } 163 | 164 | .logo { 165 | background-color: rgba(0,0,0,0); 166 | background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGFhZ18xIiBkYXRhLW5hbWU9IkxhYWcgMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNTMwLjcxIDUzMC43MSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMwNjYwOTI7fS5jbHMtMntmaWxsOiMxZDcxYjg7fS5jbHMtM3tmaWxsOiMwMjcwNjg7fS5jbHMtNHtmaWxsOiMwZDNiNWY7fS5jbHMtNXtmaWxsOiMzMzM7fS5jbHMtNntmaWxsOiM1Yzk1YmM7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT53NSBibHVlPC90aXRsZT48cmVjdCBjbGFzcz0iY2xzLTEiIHg9IjE5Mi4xNyIgeT0iMTE4LjM1IiB3aWR0aD0iMjYzLjkyIiBoZWlnaHQ9IjI3OS4zOCIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTI5NS4yNiwxMTQuNmEyNjQuMDUsMjY0LjA1LDAsMCwwLTE0Ni4wNyw0My44NWw0NS40NCwyNjguOTJMMjQ4LjQ3LDI4My4zaDY4LjhsMC4xMi0uMTgsMC4wNiwwLjE4aDEuMDVsMTUsNDUuODFoMjQuMjlMMzk3LjUyLDQ0Mi41bDM5LjY5LTExMy4zOWgzN2wtMC4yMy42NCw1Ni45NCwxNzIuMTFBMjY0LjEsMjY0LjEsMCwwLDAsNTYwLjYxLDM4MEM1NjAuNjEsMjMzLjQsNDQxLjgxLDExNC42LDI5NS4yNiwxMTQuNloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOS45MSAtMTE0LjYpIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOTYuMTMsMjA0LjY3QTI2NC4yNywyNjQuMjcsMCwwLDAsMjkuOTEsMzgwYzAsMTE0LjM0LDcyLjMzLDIxMS43OSwxNzMuNzIsMjQ5LjFMMTc0LDQ5OC4wOFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOS45MSAtMTE0LjYpIi8+PHBvbHlnb24gY2xhc3M9ImNscy0zIiBwb2ludHM9IjI4Ny40OSAxNjguNTIgMjg3LjM3IDE2OC43IDI4Ny41NSAxNjguNyAyODcuNDkgMTY4LjUyIi8+PHBhdGggY2xhc3M9ImNscy00IiBkPSJNNDEyLjc1LDQ5OC4xNUgzNzAuNDd2LTAuMDdoLTMxLjJ2MC4wN0gzMTkuNDhsLTUuNjYtLjA3SDI3My42OUwyNTIuNTEsMzgzbC0yMS4xOCwxMTUuMUgxNzRsMjkuNjUsMTMxYTI2NS40OSwyNjUuNDksMCwwLDAsMzI3LjMtMTI3LjE5TDQ3NCwzMjkuNzVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjkuOTEgLTExNC42KSIvPjxwb2x5Z29uIGNsYXNzPSJjbHMtNSIgcG9pbnRzPSIyODkuNTcgMzgzLjU1IDMwOS4zNSAzODMuNTUgMzA5LjM2IDM4My40OCAyODMuOTEgMzgzLjQ4IDI4OS41NyAzODMuNTUiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Ik0yMzEuMzMsNDk4LjA4TDI1Mi41MSwzODNsMjEuMTgsMTE1LjFIMzg4Ljc2bDAuMTQtLjQyLTkuMDYtMjcuNTktNDYuMjktMTQxLTE1LTQ1LjgxaC03MEwxOTQuNjMsNDI3LjM3LDE0OS4xOSwxNTguNDVhMjY2LjYxLDI2Ni42MSwwLDAsMC01My4wNiw0Ni4yMkwxNzQsNDk4LjA4aDU3LjM1WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjkxIC0xMTQuNikiLz48L3N2Zz4=); 167 | background-size: 90%; 168 | background-repeat: no-repeat; 169 | background-position: center; 170 | } 171 | 172 | .text-blue{ 173 | color: white; 174 | } 175 | 176 | .text-blue:hover{ 177 | color: #2196F3; 178 | } 179 | 180 | .btn{ 181 | 182 | background-color: #2196F3; 183 | } 184 | .btn:hover{ 185 | background-color: #FFFFFF; 186 | } 187 | 188 | #sidenav-overlay{ 189 | background-color: rgba(0,0,0,0); 190 | z-index: -10; 191 | } 192 | 193 | .ng-scope{ 194 | z-index: 0; 195 | } 196 | 197 | .custom-textarea{ 198 | font: 90%/1.3 robotolight, monospace; 199 | background: #FAFAFA; 200 | margin: 2em 0; 201 | padding: 1em; 202 | overflow: auto; 203 | max-width: 100%; 204 | color: #424242; 205 | -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); 206 | -moz-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); 207 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); 208 | overflow: auto; 209 | max-width: 100%; 210 | letter-spacing: .02em; 211 | } 212 | 213 | nav{ 214 | height: 64px; 215 | } 216 | 217 | 218 | .absoluteCenter{ 219 | bottom: 0; 220 | height: 128px; 221 | left: 0; 222 | margin: auto; 223 | position: absolute; 224 | top: 50%; 225 | right: 0; 226 | width: 128px; 227 | } -------------------------------------------------------------------------------- /Interface Source/FileDownload/WeebIRCServerLinux.tar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/FileDownload/WeebIRCServerLinux.tar -------------------------------------------------------------------------------- /Interface Source/FileDownload/WeebIRCSetup.msi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/FileDownload/WeebIRCSetup.msi -------------------------------------------------------------------------------- /Interface Source/Image/afterstart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/Image/afterstart.png -------------------------------------------------------------------------------- /Interface Source/Image/beforestart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/Image/beforestart.png -------------------------------------------------------------------------------- /Interface Source/Image/loading.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Interface Source/Image/logo los.svg: -------------------------------------------------------------------------------- 1 | logo los -------------------------------------------------------------------------------- /Interface Source/Image/start scherm.svg: -------------------------------------------------------------------------------- 1 | start schermwelcome to WeebIRCin order to idjfosjfsiojfosiejiojf j ijdlifj i jlsjdfij osjfjldj j slfzl.lejflsfljfi ejfoijs oijfsoifj elsjflijslejfle jfls ijfdil sjfdosjfdijfdlfjs kldjlsjfls jl j dlijfldjf ldjfelj jldjslifj lselkfjli ldjf. WeebIRC servernextwelcome to WeebIRCin order to idjfosjfsiojfosiejiojf j ijdlifj i jlsjdfij osjfjldj j slfzl.lejflsfljfi ejfoijs oijfsoifj elsjflijslejfle jfls ijfdil sjfdosjfdijfdlfjs kldjlsjfls jl j dlijfldjf ldjfelj jldjslifj lselkfjli ldjf. WeebIRC servernext -------------------------------------------------------------------------------- /Interface Source/Image/w1.svg: -------------------------------------------------------------------------------- 1 | w1 -------------------------------------------------------------------------------- /Interface Source/Image/w2.svg: -------------------------------------------------------------------------------- 1 | w2 -------------------------------------------------------------------------------- /Interface Source/Image/w3 blue.svg: -------------------------------------------------------------------------------- 1 | w3 blue -------------------------------------------------------------------------------- /Interface Source/Image/w4.svg: -------------------------------------------------------------------------------- 1 | w4 -------------------------------------------------------------------------------- /Interface Source/Image/w5 blue.svg: -------------------------------------------------------------------------------- 1 | w5 blue -------------------------------------------------------------------------------- /Interface Source/Javascript/CSWebServerDetection.js: -------------------------------------------------------------------------------- 1 | /* 2 | LIBRARY FOR DETECTING LOCAL HOSTED SERVERS 3 | 4 | BE AWARE THAT THIS LIBRARY IS DESIGNED TO WORK WITH THE FOLLOWING BROWSERS: Mozilla, Chrome & Opera AND DEFAULT BROWSERS RUNNING ON THE FOLLOWING OSSES: Android and iOS 5 | IN CASE YOU WANT TO USE THIS LIBRARY WITH OTHER BROWSERS, YOU NEED TO MANUALLY DEFINE A BASE IP, A EXAMPLE FOR A BASE IP IS GIVEN BELOW: 6 | 7 | server ip: a.x.d.f - client(local) ip: a.x.d.g (or in numbers, server ip: 192.168.65.5 - client ip(local): 192.168.65.132) 8 | base ip: a.x.d (or in numbers: 192.168.65) 9 | 10 | YOU DO NEED JQUERY FOR THIS TO WORK... just in case... 11 | 12 | Released under MIT License. Enjoy! 13 | Eldin Zenderink 02-07-2016 14 | */ 15 | 16 | function ClientSideServerDetection (){ 17 | 18 | //just some default value 19 | var localIpReturned = false; 20 | var serversFound = []; 21 | var tested = ["test"]; 22 | var serversFound = []; 23 | var portsToCheck = ["80", "8080"]; 24 | var partials = ["/"]; 25 | var endAddress = 255; 26 | var startAddress = 1; 27 | var timeout = 2000; 28 | var baseIp = "0.0.0"; 29 | var newServerFound = false; 30 | var localIp = "0.0.0.0"; 31 | var callbackToRun = function(){return;}; 32 | 33 | //some setters 34 | this.setPorts= function(portsToCheckInput){ 35 | portsToCheck = portsToCheckInput; 36 | } 37 | 38 | this.setPortRange = function(from, to){ 39 | portsToCheck = []; 40 | for(var x = from; x <= to; x++){ 41 | portsToCheck.push(x.toString()); 42 | } 43 | } 44 | this.setPartials = function(partialsInput){ 45 | partials = partialsInput; 46 | } 47 | this.setStartEnd = function(start, end){ 48 | startAddress = start; 49 | endAddress = end; 50 | } 51 | this.setTimeOut = function(timeoutInput){ 52 | timeout = timeoutInput; 53 | } 54 | this.setBaseIp = function(baseipInput){ 55 | baseIp = baseipInput; 56 | } 57 | 58 | this.getFullLocalIp = function(){ 59 | return localIp; 60 | } 61 | 62 | //starts the procedure to locate and retreive the responding servers on a local network 63 | this.runDetection = function(callback){ 64 | serversFound = []; 65 | callbackToRun = callback; 66 | //you can only retreive your local ip once, to make it run more often without pager refresh i had to store the base ip. 67 | if(baseIp != "0.0.0"){ 68 | console.log("CSWebServerDetection: starting detection with baseip: " + baseIp); 69 | this.runAjaxRequests(baseIp, searchingServers, portsToCheck, partials, startAddress, endAddress, timeout, serversFound); 70 | function searchingServers(servers){ 71 | callbackToRun (servers); 72 | } 73 | } else { 74 | console.log("CSWebServerDetection: retreiving base ip"); 75 | this.getLocalIp(this.gotIp, this.runAjaxRequests); 76 | } 77 | 78 | } 79 | 80 | //callback function for when the local ip has been retreived 81 | this.gotIp = function (ip, runAjaxFunction){ 82 | console.log("IP RETURNED 2"); 83 | console.log(ip); 84 | var ipParts = ip.split('.'); 85 | baseIp = ""; 86 | for(var x = 0; x < 3; x++){ 87 | baseIp = baseIp + ipParts[x] + "."; 88 | } 89 | baseIp = baseIp.substr(0, baseIp.length - 1); 90 | 91 | console.log("CSWebServerDetection: starting detection with baseip: " + baseIp); 92 | runAjaxFunction(baseIp, searchingServers, portsToCheck, partials, startAddress, endAddress, timeout, serversFound); 93 | function searchingServers(servers){ 94 | callbackToRun (servers); 95 | } 96 | } 97 | 98 | 99 | //we need to get our local ip on our network, your wannabe detected server has to run on the same network with the same base ip as your client 100 | //for example, server: a.x.d.f - client: a.x.d.g (or in numbers, server: 192.168.65.5 - client: 192.168.65.132) 101 | //local ip detection done by WebRTC stun request, only available on chrome,firefox, opera, android & iOS. 102 | //example used: https://github.com/diafygi/webrtc-ips 103 | this.getLocalIp = function(callback, runAjaxFunction){ 104 | console.log("CSWebServerDetection: running retreival for base ip"); 105 | //contains every ip found 106 | var arrayWithIps = []; 107 | //compatibility for firefox and chrome 108 | var RTCPeerConnection = window.RTCPeerConnection 109 | || window.mozRTCPeerConnection 110 | || window.webkitRTCPeerConnection; 111 | var useWebKit = !!window.webkitRTCPeerConnection; 112 | 113 | //minimal requirements for data connection 114 | var mediaConstraints = { 115 | optional: [{RtpDataChannels: true}] 116 | }; 117 | 118 | var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]}; 119 | 120 | //construct a new RTCPeerConnection 121 | var pc = new RTCPeerConnection(servers, mediaConstraints); 122 | 123 | function handleCandidate(candidate){ 124 | //match just the IP address 125 | try{ 126 | var ip_regex = /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/; 127 | console.log("CANDIDATE:"); 128 | console.log(candidate); 129 | var ip_addr = candidate.match(ip_regex)[0]; 130 | console.log("IP:"); 131 | console.log(ip_addr); 132 | 133 | return ip_addr; 134 | } catch (E){ 135 | return false; 136 | } 137 | 138 | } 139 | 140 | 141 | //listen for candidate events 142 | pc.onicecandidate = function(ice){ 143 | //skip non-candidate events 144 | if(ice.candidate && !localIpReturned){ 145 | var ip = handleCandidate(ice.candidate.candidate); 146 | console.log("IP RETURNED"); 147 | console.log(ip); 148 | //arrayWithIps.push(ip); 149 | //call callback and return ip, which is in most cases local ip 150 | localIp = ip; 151 | localIpReturned = true; 152 | callback(ip, runAjaxFunction); 153 | } 154 | }; 155 | 156 | 157 | //create a bogus data channel 158 | pc.createDataChannel(""); 159 | 160 | //create an offer sdp 161 | pc.createOffer(function(result){ 162 | //trigger the stun server request 163 | pc.setLocalDescription(result, function(){}, function(){}); 164 | 165 | }, function(){}); 166 | 167 | //read candidate info from local description 168 | var lines = pc.localDescription.sdp.split('\n'); 169 | lines.forEach(function(line){ 170 | if(line.indexOf('a=candidate:') === 0){ 171 | handleCandidate(line); 172 | } 173 | }); 174 | } 175 | 176 | 177 | //run the ajax calls for every port, ip between default 1 - 254, or your specific range, and for every partial, you can also make it detect servers which return error response, but it will always exlcude servers which timeout (basically are unreachable, errors mean that the server IS reachable) 178 | this.runAjaxRequests = function(baseIp, callback, portsToCheck, partials, startAddress, endAddress, timeout, serversFound){ 179 | //async ajax requests, you can specify timeout and such, be aware that checking multiple ports significantly increases waiting time 180 | console.log("CSWebServerDetection: running ajax request"); 181 | function ajaxRequest(ip, port, partial, timetotimeout, serversFound){ 182 | 183 | $.when( $.ajax({url: 'http://'+ ip + ":" + port + partial, timeout: timetotimeout})).then(function( data, textStatus, jqXHR) { 184 | var serverInfo = { 185 | ip: ip, 186 | port: port, 187 | partial: partial, 188 | data: data 189 | } 190 | var addIfNotFound = true; 191 | $.each(serversFound, function(key, val){ 192 | if(val.ip == ip && val.port == port){ 193 | addIfNotFound = false; 194 | return; 195 | } 196 | }); 197 | if(addIfNotFound){ 198 | serversFound.push(serverInfo); 199 | } 200 | setTimeout(function(){ 201 | callback(serversFound); 202 | }, 0); 203 | }, function (xhr, ajaxOptions, thrownError){ 204 | if(xhr.status > 0){ 205 | var serverInfo = { 206 | ip: ip, 207 | port: port, 208 | partial: partial, 209 | data: xhr 210 | } 211 | var addIfNotFound = true; 212 | $.each(serversFound, function(key, val){ 213 | if(val.ip == ip && val.port == port){ 214 | addIfNotFound = false; 215 | return; 216 | } 217 | }); 218 | if(addIfNotFound){ 219 | serversFound.push(serverInfo); 220 | } 221 | setTimeout(function(){ 222 | callback(serversFound); 223 | }, 0); 224 | } 225 | }); 226 | } 227 | 228 | //runs ajax request for every for every port, for every partial and port and for every partial, port and ip 229 | for(var b = 0; b < portsToCheck.length; b++){ 230 | for(var c = 0; c < partials.length; c++){ 231 | for(var a = startAddress; a < endAddress; a++){ 232 | ajaxRequest(baseIp+'.' + a, portsToCheck[b], partials[c], timeout, serversFound); 233 | } 234 | } 235 | } 236 | 237 | } 238 | } 239 | -------------------------------------------------------------------------------- /Interface Source/Javascript/SubtitlePlayer.js: -------------------------------------------------------------------------------- 1 | var timeStamp = 0 + ":" + 0 + ":" + 0 + "." + 0; 2 | var subtitleArray = []; 3 | var lineNumber = 0; 4 | var currentTime = 0; 5 | var interval; 6 | var subtitleIsSet = false; 7 | 8 | function getSubtitle(subtitleurl, vid) { 9 | 10 | $.ajax({ 11 | url: subtitleurl, 12 | type: 'get', 13 | async: false, 14 | success: function (data) { 15 | var lines = data.split("\n"); 16 | $.each(lines, function (key, line) { 17 | if (line.indexOf("Dialogue") > -1) { 18 | var parts = line.split(','); 19 | parts[parts.indexOf(parts[1])] = timeStampToSeconds(parts[1]); 20 | parts[parts.indexOf(parts[2])] = timeStampToSeconds(parts[2]); 21 | subtitleArray.push(parts); 22 | } 23 | }); 24 | console.log("Succesfully read subtitle!"); 25 | subtitleIsSet = true; 26 | }, 27 | error: function (err) { 28 | subtitleIsSet = false; 29 | } 30 | }); 31 | 32 | if (subtitleIsSet) { 33 | console.log("Starting timer"); 34 | getTimeStamp(vid); 35 | 36 | vid.onseeking = function () { 37 | var index = 0; 38 | var time = vid.currentTime; 39 | $.each(subtitleArray, function (curText) { 40 | var timeStart = curText[1]; 41 | var timeEnd = curText[2]; 42 | console.log("INDEX SEARCH ON TIMESTART: " + timeStart + ", TIMEEND: " + timeEnd + " WITH CURRENT TIME: " + curText); 43 | if (time > timeStart && time < timeEnd) { 44 | console.log("FOUND SUB POS AT: " + index); 45 | lineNumber = index; 46 | return index; 47 | } else { 48 | index++; 49 | } 50 | 51 | }); 52 | } 53 | } 54 | return subtitleIsSet; 55 | } 56 | 57 | function resetSubtitle() { 58 | subtitleIsSet = false; 59 | subtitleArray = []; 60 | $('#subtitle').html(''); 61 | try{ 62 | clearInterval(interval); 63 | } catch (e) { 64 | console.log("no interval running"); 65 | } 66 | } 67 | 68 | function timeStampToSeconds(timestamp) { 69 | var parts = timestamp.split(':'); 70 | var hour = parts[0]; 71 | var minute = parts[1]; 72 | var second = parts[2]; 73 | var totalSeconds = hour * 3600 + minute * 60 + parseInt(second); 74 | return totalSeconds; 75 | } 76 | 77 | function getTimeStamp(vid) { 78 | interval = setInterval(function () { 79 | if (video.ended) { 80 | clearInterval(interval); 81 | } 82 | var curTimeSecond = vid.currentTime; 83 | currentTime = curTimeSecond; 84 | setTimeout(showSubtitle(curTimeSecond, vid), 0); 85 | }, 100); 86 | } 87 | 88 | function showSubtitle(time, vid) { 89 | 90 | try{ 91 | var currentText = subtitleArray[lineNumber]; 92 | var secondOfTimeStart = currentText[1]; 93 | var secondOfTimeEnd = currentText[2]; 94 | 95 | if (time < secondOfTimeStart) { 96 | $('#subtitle').html(''); 97 | } else { 98 | 99 | if (time > secondOfTimeEnd) { 100 | lineNumber++; 101 | } else { 102 | var fullText = ""; 103 | for (var i = 9; i < currentText.length; i++) { 104 | fullText = fullText + "," + currentText[i]; 105 | } 106 | $('#subtitle').html(fullText.substring(1).replace("\\N", "
")); 107 | } 108 | } 109 | } catch (e) { 110 | clearInterval(interval); 111 | } 112 | 113 | } 114 | -------------------------------------------------------------------------------- /Interface Source/Javascript/aboutCtrl.js: -------------------------------------------------------------------------------- 1 | app.controller("aboutCtrl",["$rootScope","$scope","storage",function(b,a,c){a.$emit("changeConfig",{pageTitle:"WeebIRC | About",navbarTitle:"About",navbarColor:"yellow"})}]); -------------------------------------------------------------------------------- /Interface Source/Javascript/animeCtrl.js: -------------------------------------------------------------------------------- 1 | app.controller('animeCtrl', ['$rootScope', '$scope', '$http', '$location', '$sce', '$compile', '$filter', 'comServer', 'storage', 'localServer', function ($rootScope, $scope, $http, $location, $sce, $compile, $filter, comServer, storage, localServer) { 2 | 3 | 4 | 5 | //insert loader for the anime page 6 | $rootScope.insertLoader(128, "anime", "#placeForLoader") ; 7 | 8 | 9 | //things that have to load before showing anime page: 1. anime data, 2. xdcc data, 3. local files data, 4. irc status, where 3 & 4 have to be requested from the server 10 | 11 | //listener that listens for server retreival messages that contains download updates, when progress exceeds 5%, it will set the storage for the streamurl to the currently downloading file and redirect to the stream page (media player) 12 | $rootScope.$on('CurrentDownloadUpdated', function (event, args) { 13 | console.log(args); 14 | if(parseInt(args.downloadProgress) > 1 || args.downloadStatus == "COMPLETED"){ 15 | if(waitingForStream){ 16 | $rootScope.removeLoader("waitingforstream"); 17 | localServer.play($scope.baseUrl + ':8081/' + animeInfo.animeTitle.replace(/[^\w\s]/gi, '') + "_" + animeInfo.animeId + '/' + args.fileName); 18 | waitingForStream = false; 19 | } 20 | } 21 | }); 22 | 23 | //irc connected checker 24 | $rootScope.$on('ircclientisconnected', function (event, args) { 25 | $('.collapsible').collapsible(); 26 | $scope.ircNotConnected = ""; 27 | }); 28 | 29 | //irc connected checker 30 | $rootScope.$on('ircclientisnotconnected', function(event, args){ 31 | $scope.ircNotConnected = "Please connect to a IRC server by reloading the page or going to the settings page!"; 32 | }); 33 | 34 | //this var is used to wait with starting the stream until > 5% has been downloaded 35 | var waitingForStream = false; 36 | 37 | //load information stored in anime_info into the object 38 | var animeInfo = storage.retreiveFromStorage('anime_info')[0]; 39 | 40 | //set the title of the page and title in navbar to corresponding information 41 | $scope.$emit('changeConfig', { 42 | pageTitle: 'WeebIRC | ' + animeInfo.animeTitle, 43 | navbarTitle: animeInfo.animeTitle, 44 | navbarColor: 'blue' 45 | }); 46 | //if nothing has been opened before, return to home page 47 | if(animeInfo.animeId == ""){ 48 | window.location.replace("#/home"); 49 | } 50 | //will check if the current anime is already on the last added index of the history, and will append it to the history if its not. 51 | var currentHistory = storage.retreiveFromStorage('history'); 52 | var lastAdded = storage.retreiveFromStorage('history')[currentHistory.length - 1]; 53 | if(lastAdded.animeId != animeInfo.animeId){ 54 | storage.appendToStorage('history', animeInfo); 55 | } 56 | 57 | //var for containing botlist from nibl 58 | var niblBotList; 59 | 60 | //checks if storage for botlist from nibl exists, if not request the botlist 61 | if(!storage.doesStorageExist('nibl_botlist')){ 62 | $http({method: 'GET', url: 'http://api.nibl.co.uk:8080/getallbots'}). 63 | then(function(response) { 64 | storage.createStorage('nibl_botlist', response.data); 65 | niblBotList = storage.retreiveFromStorage('nibl_botlist')[0]; 66 | }, function(response) { 67 | console.log(response.data || 'Request failed'); 68 | }); 69 | } else { 70 | niblBotList = storage.retreiveFromStorage('nibl_botlist')[0]; 71 | } 72 | 73 | //function to add synonyms to the synonyms storage by creating a seperate storage spot distinguised by the id of the anime 74 | //also loads the existing synonyms from the storage into a certains spot on the page 75 | $scope.addSynonym= function(keyEvent) { 76 | if (keyEvent.which === 13){ 77 | if(!storage.doesStorageExist(animeInfo.animeId)){ 78 | storage.createStorage(animeInfo.animeId, $scope.synonyminput.text + "~~"); 79 | } else { 80 | var synonyms = storage.retreiveFromStorage(animeInfo.animeId); 81 | synonyms = synonyms + "~~" + $scope.synonyminput.text; 82 | storage.resetStorage(animeInfo.animeId, synonyms); 83 | } 84 | $scope.animeSynonyms = storage.retreiveFromStorage(animeInfo.animeId).split('~~'); 85 | } 86 | } 87 | 88 | //decode synopsis to get rid of html encoded special chars (') for example 89 | var elem = document.createElement('textarea'); 90 | elem.innerHTML = animeInfo.animeSynopsis; 91 | var decoded = $('

' + elem.value + '

').text(); 92 | 93 | //loads the rest of the information about the anime from the object retreived earlier. 94 | $scope.animeId = animeInfo.animeId; 95 | $scope.animeCover = animeInfo.animeCover; 96 | $scope.animeTitle = animeInfo.animeTitle; 97 | $scope.animeSynopsis = decoded; 98 | $scope.animeGenres = animeInfo.animeGenres; 99 | $scope.animeUrl = "http://myanimelist.net/search/all?q=" + animeInfo.animeTitle; 100 | 101 | //load localfiles, ng repeat checks if files are episodes for this anime 102 | $scope.localFiles = storage.retreiveFromStorage('local_files')[0]; 103 | 104 | //initiate array with every episode found on nibl, start parsing nibl search results for initial anime title, then look up episodes for each synonyms and append to array with every episode found on nibl 105 | var allEpisodesFound; 106 | var synonyms = storage.retreiveFromStorage(animeInfo.animeId); 107 | var currentResolution = storage.retreiveFromStorage('default_resolution'); 108 | $scope.baseUrl = storage.retreiveFromStorage('weebirc_server_address'); 109 | var searchQuery = "~" + animeInfo.animeTitle; 110 | 111 | //default resolution - to be changed on settings page 112 | if(currentResolution == '1080'){ 113 | $scope.resB1 = "green"; 114 | $scope.resB2 = "blue"; 115 | $scope.resB3 = "blue"; 116 | $scope.resB4 = "blue"; 117 | } else if(currentResolution == '720'){ 118 | $scope.resB1 = "blue"; 119 | $scope.resB2 = "green"; 120 | $scope.resB3 = "blue"; 121 | $scope.resB4 = "blue"; 122 | }else if(currentResolution == '480'){ 123 | $scope.resB1 = "blue"; 124 | $scope.resB2 = "blue"; 125 | $scope.resB3 = "green"; 126 | $scope.resB4 = "blue"; 127 | }else if(currentResolution == 'unknown'){ 128 | $scope.resB1 = "blue"; 129 | $scope.resB2 = "blue"; 130 | $scope.resB3 = "blue"; 131 | $scope.resB4 = "green"; 132 | } 133 | 134 | 135 | //search nibl for packs and bots 136 | $http({method: 'GET', url: 'http://api.nibl.co.uk:8080/search?s=' + animeInfo.animeTitle}). 137 | then(function(response) { 138 | console.log("nibl api:"); 139 | var data = response.data; 140 | console.log(data); 141 | 142 | var animeBotsAndPacks = data.data; 143 | var botName = "None"; 144 | $.each(data.data, function(key, value){ 145 | var botId = value[0]; 146 | var botData = $filter('filter')(niblBotList, {id:botId})[0]; 147 | if(botData !== undefined){ 148 | botName = botData.name; 149 | animeBotsAndPacks[key][0] = botName; 150 | } else { 151 | botName = "Unknown"; 152 | animeBotsAndPacks[key][0] = botName; 153 | } 154 | }); 155 | $scope.currentBot = { name: botName , amountoffiles: 0}; 156 | 157 | 158 | var tempData = []; 159 | $.each(animeBotsAndPacks, function(key, value){ 160 | if(tempData.indexOf(value[0]) > -1){ 161 | } else { 162 | tempData.push(value[0]); 163 | } 164 | }); 165 | 166 | var newData = $filter('filter')(animeBotsAndPacks, function(value, index, array){ 167 | if(value[2].indexOf(currentResolution) > -1 || currentResolution == "unknown"){ 168 | return true; 169 | } else { 170 | return false; 171 | } 172 | }); 173 | $scope.niblSearchResults = newData; 174 | $scope.animebotsandpacks = tempData; 175 | allEpisodesFound = animeBotsAndPacks; 176 | 177 | $rootScope.removeLoader("anime"); 178 | }, function(response) { 179 | console.log(response.data || 'Request failed'); 180 | }); 181 | 182 | //DONT FORGET TO FINISH THIS!!! 183 | if(synonyms != null){ 184 | $scope.animeSynonyms = synonyms.split("~~"); 185 | var allSynonyms = synonyms.split("~~"); 186 | $.each(allSynonyms, function( i, val ) { 187 | searchQuery = "~" + val; 188 | $http({method: 'GET', url: 'http://api.nibl.co.uk:8080/search?s=' + val}). 189 | then(function(response) { 190 | console.log(response.data); 191 | }, function(response) { 192 | console.log(response.data || 'Request failed'); 193 | }); 194 | }); 195 | } 196 | 197 | //listener that listens for comserver retreivals, which may contain th episodes found results from NIBL, will push it to the array with every episode found on nibl and update the ng-repeat for this array 198 | $scope.updateFileList = function(valueIndex){ 199 | try{ 200 | $('#botsclick').click(); 201 | $scope.currentBot = {name: valueIndex , amountoffiles: 0}; 202 | var newData = $filter('filter')(allEpisodesFound, function(value, index, array){ 203 | if(value[0] == valueIndex && (value[2].indexOf(currentResolution) > -1 || currentResolution == "unknown")){ 204 | return true; 205 | } else { 206 | return false; 207 | } 208 | }); 209 | 210 | $scope.niblSearchResults = newData; 211 | } catch (E){ 212 | console.log("Error on updating filelist:"); 213 | console.log(E); 214 | } 215 | } 216 | 217 | //changes resolution, compares the filenames within json array containing all the available bot for every bot to the resolution parameter, 218 | //will also take into account if you selected a bot or not. 219 | $scope.changeResolution = function(res){ 220 | var resolutions = ["unknown", "480", "720", "1080"]; 221 | $.each(resolutions, function(i, val){ 222 | $('#' + val).removeClass("blue"); 223 | if(val == res){ 224 | $('#' + val).addClass("blue"); 225 | } 226 | }) 227 | var resolution = res; 228 | if(resolution == '1080'){ 229 | $scope.resB1 = "green"; 230 | $scope.resB2 = "blue"; 231 | $scope.resB3 = "blue"; 232 | $scope.resB4 = "blue"; 233 | } else if(resolution == '720'){ 234 | $scope.resB1 = "blue"; 235 | $scope.resB2 = "green"; 236 | $scope.resB3 = "blue"; 237 | $scope.resB4 = "blue"; 238 | }else if(resolution == '480'){ 239 | $scope.resB1 = "blue"; 240 | $scope.resB2 = "blue"; 241 | $scope.resB3 = "green"; 242 | $scope.resB4 = "blue"; 243 | }else if(resolution == 'unknown'){ 244 | $scope.resB1 = "blue"; 245 | $scope.resB2 = "blue"; 246 | $scope.resB3 = "blue"; 247 | $scope.resB4 = "green"; 248 | } 249 | try{ 250 | 251 | var newData = $filter('filter')(allEpisodesFound, function(value, index, array){ 252 | if(value[0] == $scope.currentBot.name && (value[2].indexOf(resolution) > -1 || resolution == "unknown")){ 253 | return true; 254 | } else { 255 | return false; 256 | } 257 | }); 258 | $scope.niblSearchResults = newData; 259 | } catch (E){ 260 | 261 | } 262 | $scope.resolution = resolution; 263 | } 264 | 265 | //will send irc command for xdcc download, retreived from nibl search results, will then redirect to download page 266 | $scope.sendDownloadRequest = function(bot, packnumber){ 267 | var dldir = storage.retreiveFromStorage('download_directory') + "/"; 268 | comServer.setDownloadDirectoryPerDownload(dldir + animeInfo.animeTitle.replace(/[^\w\s]/gi, '').trim() + "_" + animeInfo.animeId.trim()); 269 | comServer.sendIrcMessage('/msg ' + bot + ' XDCC SEND #' + packnumber); 270 | console.log("Download request send: " + 'irc: /msg ' + bot + ' xdcc send #' + packnumber); 271 | window.location = "/#/download"; 272 | } 273 | 274 | //will send a request to the server to create/change download directory for the anime about to be downloaded, will send irc command for xdcc download, set the waiting for stream variable to true 275 | $scope.sendPlayRequest = function(bot, packnumber, filename){ 276 | waitingForStream = true; 277 | var dldir = storage.retreiveFromStorage('download_directory') + "/"; 278 | comServer.setDownloadDirectoryPerDownload(dldir + animeInfo.animeTitle.replace(/[^\w\s]/gi, '').trim() + "_" + animeInfo.animeId.trim()); 279 | comServer.sendIrcMessage('/msg ' + bot + ' XDCC SEND #' + packnumber); 280 | $('#' + packnumber).hide(); 281 | $rootScope.insertLoader(64, "waitingforstream", "#placeForLoaderStream_" + packnumber) ; 282 | } 283 | 284 | //will sstart playing the url immidiately 285 | $scope.startPlayStream = function(url){ 286 | console.log("START STREAM FROM ANIME PAGE WITH URL: " + url); 287 | localServer.play(url); 288 | } 289 | 290 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/chatCtrl.js: -------------------------------------------------------------------------------- 1 | /* global app, $ */ 2 | 3 | app.controller('chatCtrl', ['$rootScope', '$scope', 'comServer', 'storage', function ($rootScope, $scope, comServer, storage) { 4 | 5 | //irc_messages STORAGE WILL BE CREATED WHEN YOU LOAD WEEBIRC INTERFACE, CODE CAN BE FOUND IN app.js 6 | 7 | //change page title and navbar title to this page 8 | $scope.$emit('changeConfig', { 9 | pageTitle: 'WeebIRC | Chat', 10 | navbarTitle: 'Chat', 11 | navbarColor: 'blue' 12 | }); 13 | 14 | //array that contains messages 15 | $scope.ircMessages = storage.retreiveFromStorage('irc_messages').split('~~'); 16 | 17 | //apparantly this keeps firing even if the view is closed... fine by me :3 18 | //listener for servermessages containing irc messages, appends it to the irc_messages storage if it is not present already 19 | $rootScope.$on('ServerMessageReceived', function (event, args) { 20 | if(args.indexOf("irc:") > -1){ 21 | if($scope.ircMessages.indexOf(args.replace("irc:", "")) == -1){ 22 | $scope.ircMessages.push(args.replace("irc:", "")); 23 | if(storage.retreiveFromStorage('irc_messages').split('~~').indexOf(args.replace("irc:", "")) < 0){ 24 | storage.appendToStorage('irc_messages', args.replace("irc:", "~~")); 25 | } 26 | } 27 | } 28 | }); 29 | 30 | //jquery (stupid) function that listens for a enter press on ircmessageinput text tag, sends message to weebirc server to request it to send the message to the irc server 31 | $('#ircMessageInput').keyup(function(event){ 32 | if(event.which == 13){ 33 | var input = $("#ircMessageInput").val(); 34 | console.log(input); 35 | 36 | if(input.indexOf("/connect") > -1){ 37 | var values = input.split(' '); 38 | var ircServer = values[1]; 39 | var ircChannels = values[2]; 40 | var ircUsername = values[3]; 41 | if(ircServer != "" && ircChannels != "" && ircUsername != ""){ 42 | var connectionString = "server: " + ircServer + " channel: " + ircChannels + " username: " + ircUsername + " junk: this is junk"; 43 | comServer.sendMessage(connectionString); 44 | } 45 | } else { 46 | var message = "irc: " + input; 47 | if(message.length > 5){ 48 | comServer.sendMessage(message); 49 | } 50 | } 51 | $("#ircMessageInput").val(""); 52 | } 53 | }); 54 | 55 | 56 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/comServerService.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('weebIrc'); 2 | 3 | // COMMUNICATION SERVICE FOR WEEBIRC SERVER 4 | app.service('comServer', ['$rootScope', '$http', '$interval', '$location', 'storage', 'serverDetection', function ($rootScope, $http, $interval, $location, storage, serverDetection) { 5 | 6 | //initiate values for comserver 7 | //var msg = ""; 8 | var previousMessageReceived = ""; 9 | var messagesToBeSend = []; 10 | 11 | //create storage containing value to check if connected to backend 12 | var firstRun = true; 13 | 14 | //by then, we want to know if we are already connected to a irc server 15 | sendMessageLocal("ISIRCCLIENTRUNNING"); 16 | //first of, we want to know where the download directory is set to 17 | //second, we want to know all the files within that directory 18 | sendMessageLocal("GETLOCALFILES"); 19 | //first of, we want to know where the download directory is set to 20 | sendMessageLocal("GETDLDIR"); 21 | //function to be used as interval 22 | function comServerConnection(msg) { 23 | 24 | var baseUrl = storage.retreiveFromStorage('weebirc_server_address') + ":8080"; 25 | //console.log(messagesToBeSend); 26 | console.log(msg); 27 | //console.log(messagesToBeSend); 28 | if(storage.retreiveFromStorage('weebirc_server_address') !== null){ 29 | $.get(baseUrl + "/?message=" +encodeURIComponent(msg)).done(function(data){successCallback(data)}).fail(function(response){failCallback(response);}); 30 | } 31 | 32 | function failCallback(response){ 33 | if(storage.retreiveFromStorage('weebirc_server_connected')[0].isconnected && response.statusText != "OK"){ 34 | Materialize.toast("Lost Connection To WeebIRC Server", 4000); 35 | storage.resetStorage('weebirc_server_connected', {isconnected: false}); 36 | } 37 | $rootScope.$emit('comserver_notconnected'); 38 | } 39 | 40 | function successCallback(data){ 41 | ; 42 | $rootScope.$emit('comserver_connected'); 43 | 44 | if(!storage.retreiveFromStorage('weebirc_server_connected')[0].isconnected || firstRun){ 45 | storage.resetStorage('weebirc_server_connected', {isconnected: true}); 46 | Materialize.toast("Connected to WeebIRC Server!", 4000); 47 | firstRun = false; 48 | } 49 | 50 | //parse the incomming json message 51 | var parsedJson = data; 52 | console.log(parsedJson) 53 | //console.log(data); 54 | angular.forEach(parsedJson.messages, function(value){ 55 | //if(value != "" && value != previousMessageReceived){ 56 | $rootScope.$broadcast('ServerMessageReceived', value); 57 | 58 | //check for version 59 | if(value.indexOf("WEEB HERE") > -1){ 60 | var version = value.split("~~")[1]; 61 | if(version != currentVersion){ 62 | var $toastContent = $('
You are currently running a outdated server(' + version + ')! New version available here (' + currentVersion +')!
'); 63 | Materialize.toast($toastContent, 5000); 64 | } 65 | } 66 | if(value.indexOf("clientisnotrunning") > -1){ 67 | $rootScope.$emit('ircclientisnotconnected'); 68 | } else if(value.indexOf("clientisrunning") > -1){ 69 | $rootScope.$emit('ircclientisconnected'); 70 | } 71 | if(value.indexOf("ABORTED") > -1 ){ 72 | $rootScope.$emit('downloadaborted'); 73 | } 74 | if(value.indexOf("CURRENTDLDIR") > -1 ){ 75 | console.log("Cur dir: " + decodeURIComponent(value)); 76 | storage.resetStorage('download_directory', decodeURIComponent(value.split('~')[1])); 77 | $rootScope.$emit('downloaddirreceived'); 78 | } 79 | 80 | //} 81 | previousMessageReceived = value; 82 | }); 83 | 84 | //new 85 | if(parsedJson.hasOwnProperty('rawjson')){ 86 | if(parsedJson.rawjson[0].hasOwnProperty('Anime')){ 87 | $rootScope.$broadcast('AnimeSeasonReceived', parsedJson.rawjson[0].Anime); 88 | } else if(parsedJson.rawjson[0].hasOwnProperty('allSeasons')){ 89 | $rootScope.$broadcast('AllSeasonsReceived', parsedJson.rawjson[0].allSeasons); 90 | } else if(parsedJson.rawjson[0].hasOwnProperty('currentDownload')){ 91 | $rootScope.$broadcast('CurrentDownloadUpdated', parsedJson.rawjson[0].currentDownload); 92 | } else if(parsedJson.rawjson[0].hasOwnProperty('LocalFiles')){ 93 | console.log(data); 94 | console.log("FOUND LOCAL FILES UPDATE!"); 95 | $rootScope.$broadcast('LocalFiles', parsedJson.rawjson[0].LocalFiles); 96 | } else if(parsedJson.rawjson[0].hasOwnProperty('NIBL')){ 97 | $rootScope.$broadcast('NiblSearchResults', parsedJson.rawjson[0].NIBL); 98 | } 99 | } 100 | } 101 | }; 102 | 103 | function sendMessageLocal(msg){ 104 | comServerConnection(msg); 105 | } 106 | 107 | //appends messages to the tobesend array 108 | this.sendMessage = function(message){ 109 | sendMessageLocal(message); 110 | } 111 | 112 | this.startComServer = function(){ 113 | //by then, we want to know if we are already connected to a irc server 114 | sendMessageLocal("ISIRCCLIENTRUNNING"); 115 | //first of, we want to know where the download directory is set to 116 | //second, we want to know all the files within that directory 117 | sendMessageLocal("GETLOCALFILES"); 118 | //first of, we want to know where the download directory is set to 119 | sendMessageLocal("GETDLDIR"); 120 | //first of, we want to know where the download directory is set to 121 | sendMessageLocal("GETCURRENTSEASON"); 122 | } 123 | 124 | this.isConnected= function(){ 125 | sendMessageLocal("ISCONNECTED"); 126 | } 127 | 128 | this.abortDownload= function(){ 129 | sendMessageLocal("ABORTDOWNLOAD"); 130 | } 131 | 132 | this.getCurrentSeason = function(){ 133 | console.log("I ASKED FOR THE MOFO CURRENT SEASON, NIGGA"); 134 | sendMessageLocal("GETCURRENTSEASON"); 135 | } 136 | 137 | this.getAllSeasons = function(){ 138 | sendMessageLocal("GETALLSEASONS"); 139 | } 140 | 141 | this.getSeason = function(season){ 142 | sendMessageLocal("GETSEASON~" + season); 143 | } 144 | 145 | this.searchAnime = function(searchInput){ 146 | var url = "http://myanimelist.net/anime.php?q=" + encodeURI(searchInput); 147 | sendMessageLocal("SEARCHANIME~"+url); 148 | } 149 | 150 | this.getLocalFiles = function(){ 151 | sendMessageLocal("GETLOCALFILES"); 152 | } 153 | 154 | this.setDownloadDirectory = function(downloadDir){ 155 | sendMessageLocal("SETDLDIR~" + downloadDir); 156 | } 157 | 158 | this.isIrcClientRunning = function(){ 159 | sendMessageLocal("ISIRCCLIENTRUNNING"); 160 | } 161 | 162 | this.closeIrcClient = function(){ 163 | sendMessageLocal("CLOSEIRC"); 164 | } 165 | 166 | this.setupIrcClient = function(server, channels, username){ 167 | var setupstring = "server: " + server + " channel: " + channels + ",#weebirc username: " + username + " junk: this is junk"; 168 | sendMessageLocal(setupstring); 169 | } 170 | 171 | this.sendIrcMessage = function(message){ 172 | sendMessageLocal("irc:" + message); 173 | } 174 | 175 | this.setDownloadDirectoryPerDownload = function(downloadDir){ 176 | sendMessageLocal("SETCURDLDLDIR~" + downloadDir); 177 | } 178 | 179 | this.getDownloadDir = function(){ 180 | sendMessageLocal("GETDLDIR"); 181 | } 182 | }]); 183 | -------------------------------------------------------------------------------- /Interface Source/Javascript/comServerServices.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('weebIrc'); 2 | 3 | // COMMUNICATION SERVICE FOR WEEBIRC SERVER 4 | app.service('comServer', ['$rootScope', '$http', '$interval', '$location', 'storage', 'serverDetection', function ($rootScope, $http, $interval, $location, storage, serverDetection) { 5 | 6 | //initiate values for comserver 7 | var msg = ""; 8 | var previousMessageReceived = ""; 9 | var messagesToBeSend = []; 10 | 11 | //create storage containing value to check if connected to backend 12 | var firstRun = true; 13 | //function to be used as interval 14 | var putThisInInterval = function comServerConnection() { 15 | //(ajax) request to the comserver, using a get to send and receive information 16 | 17 | var baseUrl = storage.retreiveFromStorage('weebirc_server_address') + ":8080"; 18 | var req = { 19 | method: 'GET', 20 | url: baseUrl, 21 | params: { message: msg} 22 | } 23 | 24 | if(storage.retreiveFromStorage('weebirc_server_address') !== null){ 25 | $http(req).then(function(data){successCallback(data)}, function(response){ failCallback(response);}); 26 | } 27 | 28 | function failCallback(response){ 29 | if(storage.retreiveFromStorage('weebirc_server_connected')[0].isconnected){ 30 | Materialize.toast("Lost Connection To WeebIRC Server", 4000); 31 | storage.resetStorage('weebirc_server_connected', {isconnected: false}); 32 | } 33 | $rootScope.$emit('comserver_notconnected'); 34 | } 35 | 36 | function successCallback(data){ 37 | 38 | $rootScope.$emit('comserver_connected'); 39 | 40 | if(!storage.retreiveFromStorage('weebirc_server_connected')[0].isconnected ){ 41 | storage.resetStorage('weebirc_server_connected', {isconnected: true}); 42 | Materialize.toast("Connected to WeebIRC Server!", 4000); 43 | //run setup 44 | serverSetup(); 45 | firstRun = false; 46 | } 47 | 48 | //parse the incomming json message 49 | var parsedJson = data.data; 50 | angular.forEach(parsedJson.messages, function(value){ 51 | if(value != "" && value != previousMessageReceived){ 52 | $rootScope.$broadcast('ServerMessageReceived', value); 53 | 54 | //check for version 55 | if(value.indexOf("WEEB HERE") > -1){ 56 | var version = args.split("~~")[1]; 57 | if(version != currentVersion){ 58 | var $toastContent = $('
You are currently running a outdated server(' + version + ')! New version available here (' + currentVersion +')!
'); 59 | Materialize.toast($toastContent, 5000); 60 | } 61 | } else if(value.indexOf("clientisnotrunning") > -1){ 62 | $rootScope.$emit('ircclientisnotconnected'); 63 | } else if(value.indexOf("clientisrunning") > -1){ 64 | $rootScope.$emit('ircclientisconnected'); 65 | } else if(value.indexOf("ABORTED") > -1 ){ 66 | $rootScope.$emit('downloadaborted'); 67 | } 68 | 69 | } 70 | previousMessageReceived = value; 71 | }); 72 | 73 | //new 74 | if(parsedJson.hasOwnProperty('rawjson')){ 75 | if(parsedJson.rawjson[0].hasOwnProperty('Anime')){ 76 | $rootScope.$broadcast('AnimeSeasonReceived', parsedJson.rawjson[0].Anime); 77 | msg = ""; 78 | } else if(parsedJson.rawjson[0].hasOwnProperty('allSeasons')){ 79 | $rootScope.$broadcast('AllSeasonsReceived', parsedJson.rawjson[0].allSeasons); 80 | msg = ""; 81 | } else if(parsedJson.rawjson[0].hasOwnProperty('currentDownload')){ 82 | $rootScope.$broadcast('CurrentDownloadUpdated', parsedJson.rawjson[0].currentDownload); 83 | msg = ""; 84 | } else if(parsedJson.rawjson[0].hasOwnProperty('LocalFiles')){ 85 | console.log("FOUND LOCAL FILES UPDATE!"); 86 | $rootScope.$broadcast('LocalFiles', parsedJson.rawjson[0].LocalFiles); 87 | msg = ""; 88 | } else if(parsedJson.rawjson[0].hasOwnProperty('NIBL')){ 89 | $rootScope.$broadcast('NiblSearchResults', parsedJson.rawjson[0].NIBL); 90 | msg = ""; 91 | } 92 | } 93 | 94 | 95 | } 96 | 97 | //if interface requests multiple things within a second, it will append messages to the array, which will be shifted everyt time a messages is send 98 | if(messagesToBeSend[0] != "" || messagesToBeSend[0] != null || messagesToBeSend[0] !== undefined){ 99 | msg = messagesToBeSend[0]; 100 | messagesToBeSend.shift(); 101 | } else { 102 | msg = "GIMMEMORE"; 103 | } 104 | if(msg === undefined){ 105 | msg = "GIMMEMORE"; 106 | } 107 | }; 108 | 109 | //appends messages to the tobesend array 110 | this.sendMessage = function(message){ 111 | messagesToBeSend.push(message); 112 | } 113 | 114 | this.startComServer = function(){ 115 | //run comserver method every second 116 | $interval(putThisInInterval, 500); 117 | } 118 | 119 | //all the data we need upon succesfull connection with the comserver 120 | this.serverSetup = function(){ 121 | //first of, we want to know where the download directory is set to 122 | messagesToBeSend.push("GETDLDIR"); 123 | //second, we want to know all the files within that directory 124 | messagesToBeSend.push("GETLOCALFILES"); 125 | //by then, we want to know if we are already connected to a irc server 126 | messagesToBeSend.push("ISIRCCLIENTRUNNING"); 127 | } 128 | 129 | this.isConnected= function(){ 130 | messagesToBeSend.push("ISCONNECTED"); 131 | } 132 | 133 | this.abortDownload= function(){ 134 | messagesToBeSend.push("ABORTDOWNLOAD"); 135 | } 136 | 137 | this.getCurrentSeason = function(){ 138 | messagesToBeSend.push("GETCURRENTSEASON"); 139 | } 140 | 141 | this.getAllSeasons = function(){ 142 | messagesToBeSend.push("GETALLSEASONS"); 143 | } 144 | 145 | this.getSeason = function(season){ 146 | messagesToBeSend.push("GETSEASON~" + season); 147 | } 148 | 149 | this.searchAnime = function(searchInput){ 150 | var url = "http://myanimelist.net/anime.php?q=" + encodeURI(searchInput); 151 | messagesToBeSend.push("SEARCHANIME~"+url); 152 | } 153 | 154 | this.getLocalFiles = function(){ 155 | messagesToBeSend.push("GETLOCALFILES"); 156 | } 157 | 158 | this.setDownloadDirectory = function(downloadDir){ 159 | messagesToBeSend.push("SETDLDIR~" + downloadDir); 160 | } 161 | 162 | this.isIrcClientRunning = function(){ 163 | messagesToBeSend.push("ISIRCCLIENTRUNNING"); 164 | } 165 | 166 | this.closeIrcClient = function(){ 167 | messagesToBeSend.push("CLOSEIRC"); 168 | } 169 | 170 | this.setupIrcClient = function(server, channels, username){ 171 | messagesToBeSend.push("server: " + server + " channel: " + channels + ",#weebirc username: " + username + " junk: this is junk"); 172 | } 173 | 174 | this.sendIrcMessage = function(message){ 175 | messagesToBeSend.push("irc:" + message); 176 | } 177 | 178 | this.setDownloadDirectoryPerDownload = function(downloadDir){ 179 | messagesToBeSend.push("SETDLDIR~" + downloadDir); 180 | } 181 | }]); 182 | -------------------------------------------------------------------------------- /Interface Source/Javascript/downloadCtrl.js: -------------------------------------------------------------------------------- 1 | /* global app, $ */ 2 | app.controller('downloadCtrl', ['$rootScope', '$scope', '$location', 'localServer', 'comServer', 'storage', function ($rootScope, $scope, $location, localServer, comServer, storage) { 3 | 4 | //local_files STORAGE WILL BE CREATED WHEN YOU LOAD WEEBIRC INTERFACE, CODE CAN BE FOUND IN app.js 5 | 6 | //set navbar title and page title to this page 7 | $scope.$emit('changeConfig', { 8 | pageTitle: 'WeebIRC | Downloads', 9 | navbarTitle: 'Downloads', 10 | navbarColor: 'purple' 11 | }); 12 | 13 | //all the server requests here! Soon to be replaced by functions in comserver 14 | 15 | //listener for download updates 16 | $rootScope.$on('CurrentDownloadUpdated', function (event, args) { 17 | if(args.downloadProgress < 100 && args.downloadStatus != "COMPLETED"){ 18 | $scope.dlVisible = "visible"; 19 | } else { 20 | isDownloading = false; 21 | $scope.dlVisible = "hidden"; 22 | comServer.getLocalFiles(); 23 | } 24 | 25 | $scope.download = args; 26 | //set storage variable for currently downloading to true when its not true, and show toast message that download has started 27 | if(!isDownloading){ 28 | Materialize.toast('Started Download'); 29 | comServer.getLocalFiles(); 30 | isDownloading = true; 31 | } 32 | }); 33 | 34 | //update the local files when download abort has happend (as abort means remove as well) 35 | $rootScope.$on('downloadaborted', function (event, args) { 36 | comServer.getLocalFiles(); 37 | isDownloading = false; 38 | }); 39 | 40 | //set local files 41 | $rootScope.$on('LocalFiles', function (event, args) { 42 | console.log(args); 43 | storage.resetStorage('local_files', args); 44 | $scope.localFiles = args; 45 | $scope.$apply(); 46 | }); 47 | 48 | //ask weebirc server for the currently present local files 49 | comServer.getLocalFiles(); 50 | 51 | 52 | //set isdownloading for to the value inside of the storage 53 | var isDownloading = false; 54 | $scope.localFiles = storage.retreiveFromStorage('local_files')[0]; 55 | $scope.baseUrl = storage.retreiveFromStorage('weebirc_server_address'); 56 | $scope.dlVisible = "hidden"; 57 | 58 | //saves url for stream in storage and opens media player page to start viewing the stream 59 | $scope.sendPlayRequest = function(url){ 60 | localServer.sendMessage("PLAY~" + url); 61 | } 62 | 63 | $scope.abortDownload = function(){ 64 | comServer.abortDownload(); 65 | $scope.dlVisible = "hidden"; 66 | } 67 | 68 | 69 | }]); 70 | -------------------------------------------------------------------------------- /Interface Source/Javascript/historyCtrl.js: -------------------------------------------------------------------------------- 1 | app.controller('historyCtrl', ['$rootScope', '$scope', 'comServer', 'storage', function ($rootScope, $scope, comServer, storage) { 2 | 3 | //HISTORY STORAGE WILL BE CREATED WHEN YOU LOAD WEEBIRC INTERFACE, CODE CAN BE FOUND IN app.js 4 | 5 | //set navbar title and page title to this page 6 | $scope.$emit('changeConfig', { 7 | pageTitle: 'WeebIRC | History', 8 | navbarTitle: "History", 9 | navbarColor: 'blue' 10 | }); 11 | 12 | //retreives object containing all anime cover click history, reverses it so it is shown in the correct order 13 | var currentHistory = storage.retreiveFromStorage('history').reverse(); 14 | $scope.animeHistory = currentHistory; 15 | 16 | //see homeCtrl.js 17 | $scope.animeClicked = function(animeId, animeCover, animeTitle, animeSynopsis, animeGenres){ 18 | storage.resetStorage('anime_info', { 19 | animeId: animeId, 20 | animeCover: animeCover, 21 | animeTitle: animeTitle, 22 | animeSynopsis: animeSynopsis, 23 | animeGenres: animeGenres 24 | }); 25 | window.location = "/#/anime"; 26 | } 27 | 28 | //function deletes the history storage 29 | $scope.deleteHistory = function(){ 30 | storage.resetStorage('history', {}); 31 | currentHistory = storage.retreiveFromStorage('history').reverse(); 32 | $scope.animeHistory = {}; 33 | $scope.animeHistory = currentHistory; 34 | Materialize.toast('History succesfully deleted!', 4000); 35 | } 36 | 37 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/homeCtrl.js: -------------------------------------------------------------------------------- 1 | 2 | app.controller('homeCtrl', ['$rootScope', '$scope', '$location', 'comServer', 'storage', function ($rootScope, $scope, $location, comServer, storage) { 3 | 4 | 5 | $rootScope.insertLoader(128, "home", "#placeForLoader") ; 6 | //load everything from storage 7 | var currentSeason = storage.retreiveFromStorage('current_season'); 8 | var currentSeasonUrl = storage.retreiveFromStorage('current_season_url'); 9 | var animeCurrentSeason = storage.retreiveFromStorage('anime_of_current_season')[0]; 10 | var previousSeason = storage.retreiveFromStorage('previous_season'); 11 | 12 | 13 | $scope.animeOfThisSeason = ""; 14 | 15 | //listener for messages from weebirc server, will load retreived anime into the storage and updates page, will close loading screen 16 | $rootScope.$on('AnimeSeasonReceived', function (event, args) { 17 | console.log(args); 18 | currentSeason = storage.retreiveFromStorage('current_season'); 19 | currentSeasonUrl = storage.retreiveFromStorage('current_season_url'); 20 | animeCurrentSeason = storage.retreiveFromStorage('anime_of_current_season')[0]; 21 | previousSeason = storage.retreiveFromStorage('previous_season'); 22 | $scope.$emit('changeConfig', { 23 | pageTitle: 'WeebIRC | Home', 24 | navbarTitle: 'Home | ' + currentSeason, 25 | navbarColor: 'pink' 26 | }); 27 | $scope.animeOfThisSeason = args; 28 | animeCurrentSeason = args; 29 | storage.resetStorage('anime_of_current_season', args); 30 | $rootScope.removeLoader("home"); 31 | }); 32 | 33 | $rootScope.$on('searching', function(){ 34 | $scope.animeOfThisSeason = ""; 35 | $scope.$apply(); 36 | $rootScope.insertLoader(128, "home", "#placeForLoader") ; 37 | }); 38 | //checks if storage for isSearched exists, code below makes sure that search state will remain until a new season opens, even after page reload 39 | if(!storage.doesStorageExist('isSearched')){ 40 | storage.createStorage('isSearched', {isSearched: false}); 41 | 42 | //set navbar title and page title to the current available season 43 | $scope.$emit('changeConfig', { 44 | pageTitle: 'WeebIRC | Home', 45 | navbarTitle: 'Home | ' + currentSeason, 46 | navbarColor: 'indigo' 47 | }); 48 | } else { 49 | var config = storage.retreiveFromStorage('isSearched')[0]; 50 | if(config.isSearched){ 51 | //if indeed search action was last action, load search information and set navbar title and page title to the search specifics 52 | 53 | storage.resetStorage('previous_season', config.navbarTitle); 54 | $scope.$emit('changeConfig', { 55 | pageTitle: config.pageTitle, 56 | navbarTitle: config.navbarTitle, 57 | navbarColor: config.navbarColor 58 | }); 59 | } else { 60 | //set navbar title and page title to the current available season 61 | $scope.$emit('changeConfig', { 62 | pageTitle: 'WeebIRC | Home', 63 | navbarTitle: 'Home | ' + currentSeason, 64 | navbarColor: 'blue' 65 | }); 66 | } 67 | } 68 | //if a new season loads, check if its not the same as the current season, if true, ask weebirc server for the anime information for the requested season, else load anime for this season from storage 69 | if(previousSeason != currentSeason){ 70 | if(currentSeason == "Currently Airing"){ 71 | comServer.getCurrentSeason(); 72 | } else { 73 | comServer.getSeason(currentSeasonUrl + "~" + currentSeason); 74 | } 75 | storage.resetStorage('previous_season', currentSeason); 76 | } else { 77 | if(animeCurrentSeason.length > 10){ 78 | $scope.animeOfThisSeason = animeCurrentSeason; 79 | $rootScope.removeLoader("home"); 80 | } else { 81 | if(currentSeason == "Currently Airing"){ 82 | comServer.getCurrentSeason(); 83 | } else { 84 | comServer.getSeason(currentSeasonUrl + "~" + currentSeason); 85 | } 86 | } 87 | 88 | } 89 | 90 | //function for when a cover has been clicked, set storage for anime_info to its values and redirect to the anime vie 91 | $scope.animeClicked = function(animeId, animeCover, animeTitle, animeSynopsis, animeGenres){ 92 | 93 | storage.resetStorage('anime_info', { 94 | animeId: animeId, 95 | animeCover: animeCover, 96 | animeTitle: animeTitle, 97 | animeSynopsis: animeSynopsis, 98 | animeGenres: animeGenres 99 | }); 100 | window.location = "/#/anime"; 101 | } 102 | 103 | 104 | 105 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/localServerService.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('weebIrc'); 2 | 3 | 4 | // COMMUNICATION SERVICE FOR WEEBIRC SERVER 5 | app.service('localServer', ['$rootScope', '$http', '$interval', '$location', 'storage', 'serverDetection', function ($rootScope, $http, $interval, $location, storage, serverDetection) { 6 | 7 | var userAgent = navigator.userAgent || navigator.vendor || window.opera; 8 | 9 | 10 | 11 | var firstRun = true; 12 | 13 | //function to be used as interval 14 | function localServerConnection(msg) { 15 | //(ajax) request to the comserver, using a get to send and receive information 16 | 17 | var baseUrl = storage.retreiveFromStorage('weebirc_local_server_address') + ":8080"; 18 | if(baseUrl.indexOf("http://") < 0){ 19 | baseUrl = "http://" + baseUrl; 20 | } 21 | if(storage.retreiveFromStorage('weebirc_local_server_address') !== null || storage.retreiveFromStorage('weebirc_local_server_address') != "0.0.0.0"){ 22 | $.get(baseUrl + "/?message=" +encodeURIComponent(msg)).done(function(data){successCallback(data)}).fail(function(response){failCallback(response);}); 23 | } 24 | 25 | function failCallback(response){ 26 | if(storage.retreiveFromStorage('weebirc_local_server_connected')[0].isconnected && response.statusText != "OK"){ 27 | Materialize.toast("Lost Connection To Local Weeb Server", 4000); 28 | storage.resetStorage('weebirc_local_server_connected', {isconnected: false}); 29 | 30 | var firstLaunch = storage.doesStorageExist('firstlaunch'); 31 | if(firstLaunch){ 32 | if(!storage.retreiveFromStorage('firstlaunch')[0].firstlaunch){ 33 | $('#norunninglocalserver').openModal(); 34 | } 35 | } 36 | $rootScope.$emit('localserver_notconnected'); 37 | } 38 | } 39 | 40 | function successCallback(data){ 41 | $rootScope.$emit('localserver_connected'); 42 | if(!storage.retreiveFromStorage('weebirc_local_server_connected')[0].isconnected || firstRun == true){ 43 | storage.resetStorage('weebirc_local_server_connected', {isconnected: true}); 44 | Materialize.toast("Connected to Local WeebIRC Server!", 4000); 45 | firstRun = false; 46 | } 47 | } 48 | }; 49 | 50 | //appends messages to the tobesend array 51 | this.sendMessage = function(message){ 52 | if (!/android/i.test(userAgent)) { 53 | localServerConnection(message); 54 | } 55 | } 56 | 57 | this.startLocalServer = function(){ 58 | if (!/android/i.test(userAgent)) { 59 | //run comserver method every second 60 | var intervalcheckinglocalip = $interval(function(){ 61 | var localip = serverDetection.getLocalIp(); 62 | console.log(localip); 63 | if(localip != "0.0.0.0"){ 64 | 65 | storage.resetStorage('weebirc_local_server_address', localip); 66 | $interval(function(){localServerConnection("ISCONNECTED")}, 5000); 67 | $interval.cancel(intervalcheckinglocalip); 68 | } 69 | }, 100); 70 | } 71 | } 72 | 73 | this.play = function(url){ 74 | localServerConnection("PLAY~" + url); 75 | } 76 | 77 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/playerCtrl.js: -------------------------------------------------------------------------------- 1 | app.controller('playerCtrl', ['$rootScope', '$scope', 'localServer', 'comServer', 'storage', function ($rootScope, $scope, localServer, comServer, storage) { 2 | //STREAM URL STORAGE WILL BE CREATED WHEN YOU LOAD WEEBIRC INTERFACE, CODE CAN BE FOUND IN app.js 3 | 4 | //set navbar title and page title to the current page 5 | $scope.$emit('changeConfig', { 6 | pageTitle: 'WeebIRC | Media Player', 7 | navbarTitle: 'Media Player', 8 | navbarColor: 'black' 9 | }); 10 | //set baseUrl to the host url 11 | $scope.baseUrl = storage.retreiveFromStorage('weebirc_server_address'); 12 | 13 | comServer.getLocalFiles(); 14 | $rootScope.$on('LocalFiles', function (event, args) { 15 | console.log(args); 16 | storage.resetStorage('local_files', args); 17 | $scope.localFiles = args; 18 | }); 19 | 20 | //saves url for stream in storage and opens media player page to start viewing the stream 21 | $scope.sendPlayRequest = function(url){ 22 | localServer.play(url); 23 | } 24 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/seasonsCtrl.js: -------------------------------------------------------------------------------- 1 | app.controller('seasonsCtrl', ['$rootScope', '$scope', 'comServer', 'storage', function ($rootScope, $scope, comServer, storage) { 2 | //set navbar title and page title to the current page 3 | $scope.$emit('changeConfig', { 4 | pageTitle: 'WeebIRC | Seasons', 5 | navbarTitle: 'Seasons', 6 | navbarColor: 'blue' 7 | }); 8 | 9 | //wait for comserver to send the "allseasons" json 10 | $rootScope.$on('AllSeasonsReceived', function (event, args) { 11 | console.log(args); 12 | allSeasonsJson = args; 13 | $scope.seasons = args; 14 | storage.resetStorage('all_seasons', args); 15 | }); 16 | 17 | //get value from storage 18 | var allSeasonsJson = storage.retreiveFromStorage('all_seasons')[0]; 19 | 20 | //checks if there are less than 5 seasons available (cannot be the case), if true, ask for all anime seasons recorded to date from the server when it hasn't be done yet, else load seasons from local storage 21 | if(allSeasonsJson[0] === undefined){ 22 | comServer.getAllSeasons(); 23 | } else { 24 | if(allSeasonsJson.length > 10){ 25 | $scope.seasons = allSeasonsJson; 26 | } else { 27 | comServer.getAllSeasons(); 28 | } 29 | } 30 | 31 | //when a seasons has been clicked, show loading screen and set search storage to false and set the storage for season and url for its season, then redirect to home page. 32 | $scope.loadSeason = function(url, season) { 33 | 34 | console.log("URL FOR SEASiON " + season + " IS " + url ); 35 | storage.resetStorage('isSearched', {isSearched: false}); 36 | console.log("request to load season"); 37 | storage.resetStorage('current_season_url', url); 38 | storage.resetStorage('current_season', season); 39 | //comServer.getSeason(url + "~" + season); 40 | 41 | comServer.getSeason(currentSeasonUrl + "~" + currentSeason); 42 | window.location = "/#/home"; 43 | }; 44 | 45 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/serverDetectionService.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('weebIrc'); 2 | 3 | 4 | //SERVICE FOR DETECTING WEEB IRC SERVERS 5 | app.service('serverDetection', ['$rootScope', '$http', '$interval', '$location', 'storage', function ($rootScope, $http, $interval, $location, storage) { 6 | 7 | 8 | var serverDetectionLib = new ClientSideServerDetection(); 9 | serverDetectionLib.setPorts(["8080"]); 10 | serverDetectionLib.setPartials(["/?message=ISCONNECTED"]); 11 | 12 | 13 | function debug(msg){ 14 | storage.appendToStorage('debug_messages', {view:"service-serverDetection", message: msg}); 15 | } 16 | 17 | //get local ip for local control of mediaplayer/server, this is needed to play files on the client machine, as inbrowser playback is a nogo 18 | 19 | 20 | this.detectServers = function(){ 21 | 22 | console.log("RUNNING SERVER DETECTIOn"); 23 | Materialize.toast("Running server detection!", 2000); 24 | 25 | var foundServers = []; 26 | 27 | serverDetectionLib.runDetection(gotServers); 28 | //callback function, needs a parameter which will contain server data *read more down below 29 | //in its current state, the callback function will be ran every single time a new unique server has been detected 30 | function gotServers(serverInfo){ 31 | console.log("DATA OF FOUND SERVER: "); console.log(serverInfo); 32 | $.each(serverInfo, function(key, val){ 33 | try{ 34 | 35 | var serverversion = "unknown"; 36 | if(val.data.messages[1].indexOf("~~") > -1){ 37 | serverversion = val.data.messages[1].split('~~')[1]; 38 | } 39 | var serverInfoToStore = {name: val.data.messages[2].split(':')[1], ip: val.ip, version: serverversion }; 40 | foundServers.push(serverInfoToStore); 41 | } catch (e){ 42 | 43 | } 44 | 45 | }); 46 | console.log(foundServers); 47 | $rootScope.$broadcast('FoundServers', foundServers); 48 | 49 | } 50 | 51 | 52 | } 53 | 54 | this.getLocalIp = function(){ 55 | serverDetectionLib.getLocalIp(); 56 | return serverDetectionLib.getFullLocalIp(); 57 | } 58 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/serverDiscoveryCtrl.js: -------------------------------------------------------------------------------- 1 | app.controller('serverDiscoveryCtrl', ['$rootScope', '$scope', '$http', 'storage', function ($rootScope, $scope, $http, storage ) { 2 | //STREAM URL STORAGE WILL BE CREATED WHEN YOU LOAD WEEBIRC INTERFACE, CODE CAN BE FOUND IN app.js 3 | 4 | //set navbar title and page title to the current page 5 | $scope.$emit('changeConfig', { 6 | pageTitle: 'WeebIRC | Server Discovery', 7 | navbarTitle: 'Server Discovery', 8 | navbarColor: 'grey' 9 | }); 10 | 11 | function debug(msg){ 12 | storage.appendToStorage('debug_messages', {view: "server discovery", message: msg}); 13 | } 14 | 15 | var localIp =storage.retreiveFromStorage('local_ip'); 16 | 17 | window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome 18 | var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){}; 19 | pc.createDataChannel(""); //create a bogus data channel 20 | pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description 21 | pc.onicecandidate = function(ice){ //listen for candidate events 22 | if(!ice || !ice.candidate || !ice.candidate.candidate) return; 23 | var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1]; 24 | storage.resetStorage('local_ip', myIP); 25 | $scope.$emit('ipReceived'); 26 | console.log('my IP: ', myIP); 27 | pc.onicecandidate = noop; 28 | }; 29 | 30 | $scope.$on('ipReceived', function(){ 31 | console.log("RUNNING DISCOVERY !"); 32 | localIp =storage.retreiveFromStorage('local_ip'); 33 | debug("local ip:" + localIp); 34 | var baseIp = localIp.split('.')[0] + "." + localIp.split('.')[1] + "." + localIp.split('.')[2]; 35 | debug("base ip:" + baseIp); 36 | 37 | var ipAddressess = []; 38 | for(var x = 0; x < 256; x++){ 39 | ipAddressess.push(baseIp + "." + x); 40 | } 41 | debug("new list of addresses to check:" + ipAddressess); 42 | 43 | setTimeout(function(){ 44 | var found = false; 45 | storage.resetStorage('server_ip', ''); 46 | $.each(ipAddressess, function(i, val){ 47 | (function(i) { 48 | setTimeout(function(i) { 49 | var req = { 50 | method: 'GET', 51 | url: 'http://' + val + ":8080", 52 | params: { message: "ISCONNECTED"}, 53 | timeout: 25 54 | } 55 | $http(req).then(function(data){ 56 | found = true; 57 | console.log('found server :D at ' + val); 58 | debug("Found Server at: " + val); 59 | storage.appendToStorage('server_ip', val + "~~"); 60 | }); 61 | 62 | debug('running ajax for ip: ' + val); 63 | }, 0) 64 | })(i) 65 | 66 | if(found){ 67 | return val; 68 | } 69 | }); 70 | $scope.$apply(); 71 | }, 0); 72 | 73 | var interval = setInterval(function(){ 74 | $scope.servers = storage.retreiveFromStorage('server_ip').split('~~'); 75 | if($scope.servers.length > 0){ 76 | console.log("SERVERS FOUND, CLEARING INTERVAL"); 77 | clearInterval(interval); 78 | } 79 | }, 1000); 80 | 81 | 82 | }); 83 | 84 | /* 85 | 86 | window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome 87 | var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){}; 88 | pc.createDataChannel(""); //create a bogus data channel 89 | pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description 90 | pc.onicecandidate = function(ice){ //listen for candidate events 91 | if(!ice || !ice.candidate || !ice.candidate.candidate) return; 92 | localIp = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1]; 93 | pc.onicecandidate = noop; 94 | 95 | 96 | 97 | 98 | }; 99 | */ 100 | 101 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/serverDownloadCtrl.js: -------------------------------------------------------------------------------- 1 | app.controller('serverDownloadCtrl', ['$rootScope', '$scope', 'storage', function ($rootScope, $scope, storage ) { 2 | $('#firstLaunch').closeModal(); 3 | 4 | $scope.choose = true; 5 | $scope.windows = false; 6 | $scope.linux = false; 7 | $scope.showWindowsTutorial = function(){ 8 | $scope.windows = true; 9 | $scope.linux = false; 10 | $scope.choose = false; 11 | } 12 | 13 | $scope.showLinuxTutorial = function(){ 14 | $scope.windows = false; 15 | $scope.linux = true; 16 | $scope.choose = false; 17 | } 18 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/settingsCtrl.js: -------------------------------------------------------------------------------- 1 | app.controller('settingsCtrl', ['$rootScope', '$scope', '$location', 'comServer', 'storage', 'serverDetection', function ($rootScope, $scope, $location, comServer, storage, serverDetection ) { 2 | //change page title and navbar title to this page 3 | $scope.$emit('changeConfig', { 4 | pageTitle: 'WeebIRC | Settings', 5 | navbarTitle: 'Settings', 6 | navbarColor: 'green' 7 | }); 8 | 9 | updateStoragePrinter(); 10 | 11 | serverDetection.detectServers(); 12 | 13 | comServer.getDownload 14 | 15 | $rootScope.$on('ircclientisconnected', function () { 16 | $scope.ircClientConnectionStatus = "Connected"; 17 | $scope.connectOrReconnect = "Reconnect"; 18 | storage.resetStorage('irc_connection', {connected: true}); 19 | }); 20 | 21 | $rootScope.$on('ircclientisnotconnected', function(){ 22 | $scope.ircClientConnectionStatus = "Not Connected"; 23 | $scope.connectOrReconnect = "Connect"; 24 | storage.resetStorage('irc_connection', {connected: false}); 25 | }); 26 | 27 | $rootScope.$on('comserver_connected', function () { 28 | $scope.serverConnectionStatus = "Connected"; 29 | }); 30 | 31 | $rootScope.$on('comserver_notconnected', function(){ 32 | $scope.serverConnectionStatus = "Not Connected"; 33 | }); 34 | 35 | $rootScope.$on('FoundServers', function () { 36 | $scope.servers = storage.retreiveFromStorage('server_ip'); 37 | }); 38 | 39 | var settings = storage.retreiveFromStorage('settings')[0]; 40 | $scope.server = settings.server; 41 | $scope.channels = settings.channels; 42 | $scope.username = settings.username; 43 | $scope.autoConnect = settings.autoConnect 44 | $scope.Directory = storage.retreiveFromStorage('download_directory'); 45 | 46 | $scope.generateUsername = function(){ 47 | var text = ""; 48 | var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 49 | 50 | for( var i=0; i < 5; i++ ){ 51 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 52 | } 53 | $scope.username = "WeebIRC_" + text; 54 | 55 | } 56 | 57 | $scope.saveAndReConnectIRC = function(){ 58 | 59 | comServer.closeIrcClient(); 60 | 61 | var server = $scope.server; 62 | var channels = $scope.channels; 63 | var username = $scope.username; 64 | var autoConnect = $scope.autoConnect; 65 | 66 | var newSettings = { 67 | autoConnect: autoConnect, 68 | server: server, 69 | channels: channels, 70 | username: username 71 | } 72 | 73 | storage.resetStorage('settings', newSettings); 74 | 75 | comServer.setupIrcClient(server, channels, username); 76 | $scope.connectOrReconnect = "Reconnecting"; 77 | setTimeout(comServer.isIrcClientRunning, 500); 78 | } 79 | 80 | $scope.disconnectIRC = function(){ 81 | comServer.closeIrcClient(); 82 | } 83 | 84 | $scope.setAsDefaultServer = function(button, value){ 85 | $.each($scope.servers, function(i, val){ 86 | if(button == i){ 87 | $('#server_' + button).addClass('blue'); 88 | } else { 89 | $('#server_' + button).removeClass('blue'); 90 | } 91 | }); 92 | if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(value)) 93 | { 94 | storage.resetStorage('weebirc_server_address', 'http://' + value); 95 | Materialize.toast("Server address " + value + " is valid!", 4000); 96 | } 97 | else if(value.match(/http\:\/\/www\.mydomain\.com\/version\.php/i)) 98 | { 99 | storage.resetStorage('weebirc_server_address','http://' + value); 100 | Materialize.toast("Server address " + value+ " is valid!", 4000); 101 | } else { 102 | Materialize.toast("Server address " + value + " is not valid!", 4000); 103 | } 104 | $scope.weebserveraddress = storage.retreiveFromStorage('weebirc_server_address'); 105 | } 106 | 107 | $scope.weebserveraddress = storage.retreiveFromStorage('weebirc_server_address'); 108 | 109 | 110 | $scope.saveAddressKey = function(event){ 111 | if(event.which === 13){ 112 | storage.resetStorage('weebirc_server_address', $scope.weebserveraddress); 113 | $scope.$apply(); 114 | } 115 | } 116 | 117 | $scope.saveAddressButton = function(){ 118 | storage.resetStorage('weebirc_server_address', $scope.weebserveraddress); 119 | $scope.$apply(); 120 | } 121 | 122 | $scope.resetAddress = function(){ 123 | storage.resetStorage('weebirc_server_address', "http://" + $location.host()); 124 | $scope.weebserveraddress = "http://" + $location.host(); 125 | $scope.$apply(); 126 | } 127 | 128 | $scope.setCustomDlDir = function(){ 129 | console.log("Custom dir: " + $scope.Directory); 130 | comServer.setDownloadDirectory($scope.Directory); 131 | storage.resetStorage('download_directory', $scope.Directory); 132 | Materialize.toast("Download Directory: " + $scope.Directory + " succesfully saved!"); 133 | } 134 | 135 | //Delete storage things 136 | $scope.allStorages = storage.getCurrentAvailableStorages(); 137 | $scope.deleteCertainStorage = function(thatcertainstorage){ 138 | storage.deleteStorage(thatcertainstorage); 139 | $scope.allStorages = storage.getCurrentAvailableStorages(); 140 | 141 | $scope.$apply(); 142 | } 143 | 144 | $scope.deleteEverything = function(){ 145 | var maxDeletes = 100; 146 | $.each($scope.allStorages, function(i, val){ 147 | storage.deleteStorage(val); 148 | maxDeletes = maxDeletes - 1; 149 | if(maxDeletes == 0){ 150 | return; 151 | } 152 | }); 153 | $scope.allStorages = storage.getCurrentAvailableStorages(); 154 | $scope.$apply(); 155 | } 156 | 157 | //Default resolution 158 | var currentResolution = storage.retreiveFromStorage('default_resolution'); 159 | if(currentResolution == '1080'){ 160 | $scope.resB1 = "blue"; 161 | $scope.resB2 = ""; 162 | $scope.resB3 = ""; 163 | $scope.resB4 = ""; 164 | } else if(currentResolution == '720'){ 165 | $scope.resB1 = ""; 166 | $scope.resB2 = "blue"; 167 | $scope.resB3 = ""; 168 | $scope.resB4 = ""; 169 | }else if(currentResolution == '480'){ 170 | $scope.resB1 = ""; 171 | $scope.resB2 = ""; 172 | $scope.resB3 = "blue"; 173 | $scope.resB4 = ""; 174 | }else if(currentResolution == ''){ 175 | $scope.resB1 = ""; 176 | $scope.resB2 = ""; 177 | $scope.resB3 = ""; 178 | $scope.resB4 = "blue"; 179 | } 180 | 181 | 182 | $scope.changeResolution = function(res){ 183 | var resolutions = ["unknown", "480", "720", "1080"]; 184 | $.each(resolutions, function(i, val){ 185 | $('#' + val).removeClass("blue"); 186 | if(val == res){ 187 | $('#' + val).addClass("blue"); 188 | } 189 | }) 190 | 191 | storage.resetStorage('default_resolution', res); 192 | $scope.$apply(); 193 | } 194 | 195 | //Debug console 196 | $scope.debugmessages = storage.retreiveFromStorage('debug_messages').reverse(); 197 | 198 | //Show data from storage 199 | function updateStoragePrinter(){ 200 | var allDataPerStorage = []; 201 | try{ 202 | 203 | $.each($scope.allStorages, function(i, val){ 204 | if(val != ""){ 205 | var tempobj = { 206 | storage: val, 207 | storagevalue: storage.retreiveFromStorage(val) 208 | 209 | }; 210 | allDataPerStorage.push(tempobj); 211 | } 212 | }); 213 | $scope.allDataPerStorageValues = allDataPerStorage; 214 | $scope.allStorages = storage.getCurrentAvailableStorages(); 215 | } catch(e){ 216 | console.log("apparantly not today"); 217 | } 218 | } 219 | 220 | //update those things 221 | setInterval(function(){ 222 | updateStoragePrinter(); 223 | $scope.debugmessages = storage.retreiveFromStorage('debug_messages').reverse(); 224 | }, 2000); 225 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/statusService.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('weebIrc'); 2 | 3 | app.service('status', ['$rootScope', '$http', '$interval', '$location', 'comServer', 'localServer', 'storage', function ($rootScope, $http, $interval, $location, comServer, localServer, storage) { 4 | 5 | 6 | //debug messages storage 7 | if(!storage.doesStorageExist('debug_messages')){ 8 | var debugmessagesStorage = { 9 | view: "ROOT", 10 | message: "Debug message storage created!" 11 | } 12 | storage.createStorage('debug_messages', debugmessagesStorage); 13 | } else { 14 | var debugmessagesStorage = { 15 | view: "ROOT", 16 | message: "Debug message storage resetted!" 17 | } 18 | storage.resetStorage('debug_messages', debugmessagesStorage); 19 | } 20 | 21 | //create storage for containing all available server ips 22 | if(!storage.doesStorageExist('server_ip')){ 23 | storage.createStorage('server_ip', {}); 24 | } 25 | 26 | //creates irc messages storage to save irc messages received when not on view page 27 | if(!storage.doesStorageExist('irc_messages')){ 28 | storage.createStorage('irc_messages', "~~"); 29 | } else { 30 | storage.resetStorage('irc_messages', "~~"); 31 | } 32 | 33 | //creates the history database 34 | if(!storage.doesStorageExist('history')){ 35 | storage.createStorage('history', {}); 36 | } 37 | 38 | //creates storage that contains the local files currently present on server 39 | if(!storage.doesStorageExist('local_files')){ 40 | storage.createStorage('local_files', {}); 41 | } 42 | 43 | //create storage for variable to detect if the server is connected or not 44 | if(!storage.doesStorageExist('weebirc_server_connected')){ 45 | storage.createStorage('weebirc_server_connected', {isconnected: false}); 46 | } 47 | 48 | //create storage which will contain the ip address of the chosen download server. 49 | if(!storage.doesStorageExist('weebirc_server_address')){ 50 | storage.createStorage('weebirc_server_address', 'noserverset'); 51 | } 52 | 53 | //create storage which will contain the local control server address 54 | if(!storage.doesStorageExist('weebirc_local_server_address')){ 55 | storage.createStorage('weebirc_local_server_address', 'noserverset'); 56 | } 57 | 58 | //create storage containing value to check if connected to local backend 59 | if(!storage.doesStorageExist('weebirc_local_server_connected')){ 60 | storage.createStorage('weebirc_local_server_connected', {isconnected: false}); 61 | } 62 | 63 | //create default resolution storage 64 | if(!storage.doesStorageExist('default_resolution')){ 65 | storage.createStorage('default_resolution', '720'); 66 | } 67 | 68 | //create storage to contain bool for checking irc connection 69 | if(!storage.doesStorageExist('irc_connection')){ 70 | storage.createStorage('irc_connection', {connected: false}); 71 | } 72 | 73 | //creates settings database, will generate settings if storage does not exist 74 | if(!storage.doesStorageExist('settings')){ 75 | 76 | //generate username 77 | var text = ""; 78 | var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 79 | 80 | for( var i=0; i < 5; i++ ){ 81 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 82 | } 83 | 84 | storage.createStorage('settings', { 85 | autoConnect: false, 86 | server: "irc.rizon.net", 87 | channels: "#horriblesubs,#news,#nibl,#intel,#Ginpachi-Sensei", 88 | username: "WeebIRC_" + text, 89 | download_directory: "" 90 | }); 91 | 92 | } 93 | 94 | //sets firstlaunch to true, definately true if this doesn't exist 95 | if(!storage.doesStorageExist('firstlaunch')){ 96 | storage.createStorage('firstlaunch', {firstlaunch: true}); 97 | $('#firstLaunch').openModal(); 98 | } else if(storage.retreiveFromStorage('firstlaunch')[0].firstlaunch){//checks if firstlaunch should be open 99 | $('#firstLaunch').openModal(); 100 | } else if(!storage.retreiveFromStorage('firstlaunch')[0].firstlaunch){ 101 | comServer.startComServer(); 102 | localServer.startLocalServer(); 103 | } 104 | 105 | //checks if storage for current_season exists, if not, create storage and set initial value to Currently Airing 106 | if(!storage.doesStorageExist('current_season')){ 107 | storage.createStorage('current_season', "Currently Airing"); 108 | } 109 | 110 | //checks if storage for current_season_url exists, if not, create storage and set initial value to the url for Currently Airing season 111 | if(!storage.doesStorageExist('current_season_url')){ 112 | storage.createStorage('current_season_url', ""); 113 | } 114 | 115 | //checks if storage for anime_of_current_season exists, if not, create storage and tell it that it is a object storage 116 | if(!storage.doesStorageExist('anime_of_current_season')){ 117 | storage.createStorage('anime_of_current_season', {}); 118 | } 119 | 120 | //checks if storage for previous_season exists, if not create storage and tell it that it is a string storage 121 | if(!storage.doesStorageExist('previous_season')){ 122 | storage.createStorage('previous_season', ""); 123 | } 124 | 125 | //checks if storage for all_seasons exists, if not, create storage and tell it that it is an object storage 126 | if(!storage.doesStorageExist('all_seasons')){ 127 | storage.createStorage('all_seasons', {}); 128 | } 129 | 130 | //checks if storage for anime_info exists already, if not, create storage with default object for anime information 131 | if(!storage.doesStorageExist('anime_info')){ 132 | storage.createStorage('anime_info', { 133 | animeId: "", 134 | animeCover: "", 135 | animeTitle: "", 136 | animeSynopsis: "", 137 | animeGenres: "" 138 | }); 139 | } 140 | 141 | //download directory 142 | if(!storage.doesStorageExist('download_directory')){ 143 | storage.createStorage('download_directory', 'default'); 144 | } 145 | 146 | //set the issearch value to false 147 | if(!storage.doesStorageExist('isSearched')){ 148 | storage.createStorage('isSearched', {isSearched: false}); 149 | } 150 | 151 | //checks if storage for anime information exists (used by home/anime view) 152 | if(!storage.doesStorageExist('anime_info')){ 153 | storage.createStorage('anime_info', {}); 154 | } 155 | 156 | var userAgent = navigator.userAgent || navigator.vendor || window.opera; 157 | 158 | setInterval(function(){ 159 | comServer.isConnected(); 160 | comServer.isIrcClientRunning(); 161 | }, 1000); 162 | 163 | var settings = storage.retreiveFromStorage('settings')[0]; 164 | 165 | var isRunning = false; 166 | $('#connectToIrc').css('opacity', 0); 167 | $rootScope.$on('ircclientisnotconnected', function(){ 168 | if(!settings.autoConnect){ 169 | var firstLaunch = storage.retreiveFromStorage('firstlaunch')[0].firstlaunch; 170 | if(!firstLaunch){ 171 | if($('#connectToIrc').css('opacity') != 1){ 172 | $('#connectToIrc').openModal(); 173 | } 174 | } 175 | } else { 176 | comServer.setupIrcClient(settings.server, settings.channels, settings.username); 177 | } 178 | 179 | if(isRunning){ 180 | Materialize.toast('Not connected to IRC Server!', 4000); 181 | isRunning = false; 182 | } 183 | }); 184 | 185 | 186 | $rootScope.$on('ircclientisconnected', function(){ 187 | if(!isRunning){ 188 | Materialize.toast('Connected to IRC Server!', 4000); 189 | isRunning = true; 190 | } 191 | }); 192 | }]); -------------------------------------------------------------------------------- /Interface Source/Javascript/storageService.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('weebIrc'); 2 | 3 | //CUSTOM STORAGE SERVICE 4 | app.service('storage', ['$rootScope', '$http', '$interval', '$location', function ($rootScope, $http, $interval, $location) { 5 | 6 | 7 | //check if localstorage is available 8 | var localStorage; 9 | var x; 10 | try { 11 | localStorage = window["localStorage"], 12 | x = '__storage_test__'; 13 | localStorage.setItem(x, x); 14 | localStorage.removeItem(x); 15 | } 16 | catch (e) { 17 | localStorage = false; 18 | } 19 | 20 | if(localStorage != false){ 21 | try{ 22 | if(localStorage.getItem('CurrentSubStorages') == null){ 23 | localStorage.setItem('CurrentSubStorages', '~~'); 24 | } 25 | } catch(e){ 26 | } 27 | } 28 | //checks if given storage exists, returns bool 29 | this.doesStorageExist = function(storageType){ 30 | if(localStorage != false){ 31 | if(localStorage.getItem(storageType) != null){ 32 | return true; 33 | } else { 34 | return false; 35 | } 36 | } else { 37 | return false; 38 | } 39 | } 40 | 41 | //creates storage for given name, checks if data is object or string, returns true on succes, returns false if it aint working 42 | this.createStorage = function(storageType, dataToStore){ 43 | var currentStorages = localStorage.getItem('CurrentSubStorages'); 44 | 45 | if(localStorage != false){ 46 | if(currentStorages.indexOf(storageType) < 0){ 47 | if(typeof dataToStore === 'object'){ 48 | localStorage.setItem(storageType, "[" + JSON.stringify(dataToStore) + "]"); 49 | } else { 50 | localStorage.setItem(storageType, dataToStore); 51 | } 52 | currentStorages = currentStorages + "~~" + storageType; 53 | localStorage.setItem('CurrentSubStorages', currentStorages); 54 | return true; 55 | } else { 56 | return false; 57 | } 58 | } else { 59 | return false; 60 | } 61 | } 62 | 63 | //deletes storage for given name, returns true on succes, returns false if it aint working 64 | this.deleteStorage = function(storageType){ 65 | var currentStorages = localStorage.getItem('CurrentSubStorages'); 66 | if(localStorage != false){ 67 | if(currentStorages.indexOf(storageType) > 0){ 68 | currentStorages = currentStorages.replace("~~" + storageType, ""); 69 | localStorage.removeItem(storageType); 70 | localStorage.setItem('CurrentSubStorages', currentStorages); 71 | } else { 72 | return false; 73 | } 74 | return true; 75 | } else { 76 | return false; 77 | } 78 | } 79 | 80 | //resets the storage for given name, will put new value inside storage and erases the old value, returns true on succes, returns false if it aint working 81 | this.resetStorage = function(storageType, dataToStore){ 82 | if(localStorage != false){ 83 | localStorage.removeItem(storageType); 84 | if(typeof dataToStore === 'object'){ 85 | localStorage.setItem(storageType, "[" + JSON.stringify(dataToStore) + "]"); 86 | } else { 87 | localStorage.setItem(storageType, dataToStore); 88 | } 89 | return true; 90 | } else { 91 | return false; 92 | } 93 | } 94 | 95 | //gets value from storage for given name, returns object if value == object, returns string if value == string, returns false if it aint working 96 | this.retreiveFromStorage = function(storageType){ 97 | if(localStorage != false){ 98 | try{ 99 | return JSON.parse(localStorage.getItem(storageType)); 100 | } catch (E){ 101 | return localStorage.getItem(storageType); 102 | } 103 | } else { 104 | return false; 105 | } 106 | } 107 | 108 | //appends to storage for given name, objects are seperate objects in one big object, strings are just added to each other, returns true on succes, returns false if it aint working 109 | this.appendToStorage = function(storageType, dataToStore){ 110 | if(localStorage != false){ 111 | if(typeof dataToStore === 'object'){ 112 | var currentDataInLocalStorage = localStorage.getItem(storageType); 113 | try { 114 | JSON.parse(currentDataInLocalStorage); 115 | } catch (e) { 116 | return false; 117 | } 118 | var newDataForLocalStorage = currentDataInLocalStorage.substr(0, currentDataInLocalStorage.length - 1) + "," + JSON.stringify(dataToStore) + "]"; 119 | localStorage.setItem(storageType, newDataForLocalStorage); 120 | } else { 121 | var currentDataInLocalStorage = localStorage.getItem(storageType); 122 | var newDataForLocalStorage = currentDataInLocalStorage + dataToStore; 123 | localStorage.setItem(storageType, newDataForLocalStorage); 124 | } 125 | 126 | return true; 127 | } else { 128 | return false; 129 | } 130 | } 131 | 132 | //removes from data in given storage, returns true on succes, returns false if it aint working 133 | this.removeFromStorage = function(storageType, dataToRemove){ 134 | if(localStorage != false){ 135 | if(typeof dataToRemove === 'object'){ 136 | var currentDataInLocalStorage = localStorage.getItem(storageType); 137 | try { 138 | JSON.parse(currentDataInLocalStorage); 139 | } catch (e) { 140 | return false; 141 | } 142 | var newDataForLocalStorage = currentDataInLocalStorage.substr(0, currentDataInLocalStorage.length - 1).replace(JSON.stringify(dataToRemove)) + "]"; 143 | localStorage.setItem(storageType, newDataForLocalStorage); 144 | } else { 145 | var currentDataInLocalStorage = localStorage.getItem(storageType); 146 | var newDataForLocalStorage =currentDataInLocalStorage.replace(dataToRemove, ""); 147 | localStorage.setItem(storageType, newDataForLocalStorage); 148 | } 149 | return true; 150 | } else { 151 | return false; 152 | } 153 | } 154 | 155 | this.getCurrentAvailableStorages = function(){ 156 | return localStorage.getItem('CurrentSubStorages').split('~~'); 157 | } 158 | }]); -------------------------------------------------------------------------------- /Interface Source/Partials/about.html: -------------------------------------------------------------------------------- 1 |
2 |

To Be Written :D

3 |
4 |
5 |
-------------------------------------------------------------------------------- /Interface Source/Partials/anime.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 | 8 |
9 | 10 |
{{animeTitle}}
11 |
12 |
13 | 14 |
{{animeTitle}}
15 |
16 |
17 |
18 | 19 |
{{animeGenres}}
20 |
21 |
22 |
23 | 24 | 25 |
26 |
{{synonym}}
27 |
28 |
29 |
30 |
31 |
32 |
33 |

{{animeTitle}}

34 |
{{animeSynopsis}} 35 |
36 |
37 |
38 |
39 |
40 |
41 | 42 |
43 | 44 |
{{animeTitle}}
45 |
46 |
47 | 48 |
{{animeTitle}}
49 |
50 |
51 |
52 | 53 |
{{animeGenres}}
54 |
55 |
56 |
57 | 58 | 59 |
60 |
{{synonym}}
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |

{{animeTitle}}

69 |
{{animeSynopsis}} 70 |
71 |
72 |
73 |
74 |
75 |
76 | 77 |
78 | 79 | 80 | 81 | 82 |
83 |
84 |
85 |
86 |
87 |
88 | 89 |
90 |
    91 |
  • 92 |
    93 | Select your bot here! 94 |
    95 |
    96 |
    97 | 98 |
    99 |
    100 |
  • 101 |
102 |
103 |
104 |
105 | 106 | 111 |
112 |
113 |
114 | 115 |
116 |
    117 |
  • 118 |
    119 | folder 120 | {{value2.fileName}} 121 |
    122 |
    123 | 124 | 125 | Get File 126 |
    127 |
  • 128 |
129 |
130 |
131 |
132 |
133 |
134 |
{{ircNotConnected}}
135 |
136 |
137 |
138 | 139 |
140 |

141 |

    142 |
  • 143 |
    144 | cloud 145 | {{value[0]}} | {{value[2]}} 146 |
    147 |
    148 |
    149 | 150 | 151 | 152 |
    153 |
    154 |
    155 |
  • 156 |
157 |

158 |
159 | 160 |

161 |

162 |

163 |
164 |
165 |
166 |
-------------------------------------------------------------------------------- /Interface Source/Partials/chat.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
{{message}}
7 |
8 |
9 | 10 |
11 |
12 |
13 | 14 |
-------------------------------------------------------------------------------- /Interface Source/Partials/download.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |

Files on Server

5 | 6 |
7 | 8 |
    9 |
  • 10 |
    11 | folder 12 | {{key}} 13 |
    14 |
    15 |
      16 |
    • 17 |
      18 | folder 19 | {{value2.fileName}} 20 |
      21 |
      22 | 23 | 24 | Get File 25 |
      26 |
    • 27 |
    28 | 35 |
    36 |
  • 37 |
38 |
39 |
40 |

Currently Downloading

41 |
42 | 43 |
44 |
45 |
46 | {{download.fileName}} {{download.downloadSpeed}} kb/s 47 |
48 |
{{download.downloadProgress}}%
49 |
50 |
51 |
52 |
53 | Get File 54 |
55 |
56 | Play 57 |
58 |
59 | Abort Download 60 |
61 |
62 |
63 |
64 |
65 | 66 | -------------------------------------------------------------------------------- /Interface Source/Partials/history.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 | 8 | 9 |
{{value.animeTitle}}
10 |
11 |
12 |
13 |
14 |
15 |
16 | delete 17 |
-------------------------------------------------------------------------------- /Interface Source/Partials/home.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 | 8 | 9 |
{{value.title}}
10 |
11 |
12 |
13 |
14 |
15 |
16 | 17 |
18 |
19 |
20 |
{{value.title}}
21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 | 29 | -------------------------------------------------------------------------------- /Interface Source/Partials/player.html: -------------------------------------------------------------------------------- 1 |
2 |

{{videoLoaded}}

3 |

4 |

5 |

6 |

7 |

    8 |
  • 9 |
    10 | folder 11 | {{key}} 12 |
    13 |
    14 |
      15 |
    • 16 |
      17 | folder 18 | {{value2.fileName}} 19 |
      20 |
      21 | 22 | 23 | Get File 24 |
      25 |
    • 26 |
    27 | 34 |
    35 |
  • 36 |
37 |

38 |
39 |
-------------------------------------------------------------------------------- /Interface Source/Partials/seasons.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | Currently Airing 4 | 7 |
8 |
9 | 10 | -------------------------------------------------------------------------------- /Interface Source/Partials/serverdiscovery.html: -------------------------------------------------------------------------------- 1 |
2 |

Server Discovery:

3 |
4 | {{server}}
5 |
6 |
7 |
-------------------------------------------------------------------------------- /Interface Source/Partials/settings.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
IRC Settings
5 |
6 |
7 |
8 |

Connection Status: {{ircClientConnectionStatus}}

9 | 10 |
11 |

Server Address:

12 | 13 |

IRC Channels:

14 | 15 |

Username:

16 | 17 | 18 |

Auto Connect on Startup:

19 |
20 |

21 |

22 | 28 |
29 | 30 |

31 |
32 |
33 |

34 |

35 | 36 |
37 |

38 |
39 |
40 | 41 |
42 |
43 |

44 |

WeebIRC Server Settings
45 |
46 |

47 | 48 |
49 |
50 |

51 | Connection Status: {{serverConnectionStatus}} 52 |

53 |
54 | 55 |
56 |
Available Servers:
57 |

58 |

59 | 60 |
61 |

62 | 63 |
64 | 65 |

Server IP address:

66 | 67 | 68 |
69 |
Download Directory
70 |

71 | 72 | 73 | 74 |

75 | 76 |
77 | 78 |
79 |
80 |
81 |
82 |
General Settings
83 |
84 |
85 |
86 |

87 |

Delete / Reset storage...
88 |

89 |

90 | 91 | 92 | 93 |

94 |

95 | 96 | 97 | 98 |

99 |
100 |
101 |

102 |

Default Resolution:
103 |

104 |

105 | 106 | 107 | 108 | 109 | 110 |

111 |
112 |
113 |
114 |
115 |
116 |
Developer Debugging
117 |
118 |
119 | 120 |
121 |

122 |

Console:
123 |
124 |
125 |
126 | {{key}} | {{value.view}} | {{value.message}} 127 |
128 |
129 |
130 |

131 |
132 |
133 |
134 |
135 |
136 |
Data in Storage
137 |
138 |
139 | 140 |
141 |
142 |

143 |

Storage: {{test.storage}}
144 |
145 |
146 |                     {{ test.storagevalue | json }}
147 |                     
148 |
149 |

150 |
151 |
152 |
-------------------------------------------------------------------------------- /Interface Source/SubPlayerJS.css: -------------------------------------------------------------------------------- 1 | 2 | .inner-container-SPJS { 3 | display: inline-block; 4 | position: relative; 5 | } 6 | .video-overlay-SPJS { 7 | text-align: center; 8 | z-index: 1; 9 | position: absolute; 10 | width: 100%; 11 | left: 0px; 12 | top: 80%; 13 | padding: 5px 5px; 14 | color: white; 15 | text-shadow: 16 | -1px -1px 0 #000, 17 | 1px -1px 0 #000, 18 | -1px 1px 0 #000, 19 | 1px 1px 0 #000; 20 | font-size: 24pt; 21 | font-size: 1.7vw; 22 | font-family: Helvetica; 23 | } 24 | .control-SPJS { 25 | text-align: center; 26 | z-index: 1; 27 | position: absolute; 28 | width: 100%; 29 | left: 0px; 30 | top: 85%; 31 | padding: 5px 5px; 32 | background-color: rgb(0,0,0,0.5); 33 | color: white; 34 | font-size: 24pt; 35 | } -------------------------------------------------------------------------------- /Interface Source/materialize/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014-2015 Materialize 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Interface Source/materialize/font/material-design-icons/Material-Design-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/material-design-icons/Material-Design-Icons.eot -------------------------------------------------------------------------------- /Interface Source/materialize/font/material-design-icons/Material-Design-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/material-design-icons/Material-Design-Icons.ttf -------------------------------------------------------------------------------- /Interface Source/materialize/font/material-design-icons/Material-Design-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/material-design-icons/Material-Design-Icons.woff -------------------------------------------------------------------------------- /Interface Source/materialize/font/material-design-icons/Material-Design-Icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/material-design-icons/Material-Design-Icons.woff2 -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Bold.eot -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Bold.woff -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Light.eot -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Light.ttf -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Light.woff -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Light.woff2 -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Medium.eot -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Medium.woff -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Regular.eot -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Regular.woff -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Thin.eot -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Thin.ttf -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Thin.woff -------------------------------------------------------------------------------- /Interface Source/materialize/font/roboto/Roboto-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/Interface Source/materialize/font/roboto/Roboto-Thin.woff2 -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) [2016] [Eldin Zenderink] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /OLD/README.md: -------------------------------------------------------------------------------- 1 | # WeebIRC 2 | 3 | WeebIRC is a simple and small IRC client heavily focussed on anime watchers which use XDCC (DCC) to get their anime. 4 | It's main features are: 5 | 6 | - Search directly on nibl.co.uk within the application 7 | - Start download by selecting/clicking on a search result 8 | - Batch download by downloading your selection/ search result one by one(no ques). 9 | - Stream/Watch your anime while it is downloading (by double clicking on the item in the downloadlist) 10 | 11 | 12 | ### Version 13 | 0.0.1 14 | 15 | ### Installation 16 | 17 | This application works as a stand-alone application. It does require acces to your folder system. On launch it wants to create it's own download directory in your "C:\Users\\*Your Username\*\Downloads" directory. If the program is not able to find this directory it will prompt you to select your own specified download folder on where he can put his files. In this folder a map will be created by the name WeebIRC, this map also contains a Settings map containing ah Settings.conf. **Do not change this file if you do not know what you are doing!** 18 | 19 | ### Development 20 | You can do with it whatever you want :D. I will be updating this application and add more features when I find the time for it. 21 | 22 | ### Todos 23 | 24 | - Redo chat output, its now raw text from the irc on certain channels. 25 | - **A bot that goes by the name "CS|Tori" is currently not working!** - fixing that soon(hopefully) 26 | - Gui improvements along the way. 27 | 28 | ### Disclaimer 29 | This application is still in alpha stadium, many things might go wrong and therefore I am not 30 | responsible for whatever happens while you use this application. 31 | 32 | Things that might happen: 33 | 34 | - Due to an something bla bla it keeps spamming the bot with xdcc send messages (once every 2 seconds) which could result in a (temporary) ban 35 | - Downloading anime is at your own risk :X. 36 | - Due to your computer being a cardbox it might catch fire and burn your whole place down 37 | - Due to you not paying attention you might suddenly download a virus... shit happens. 38 | - Due to you being at the wrong place, at the wrong time, you might die... 39 | 40 | 41 | 42 | License 43 | ---- 44 | 45 | MIT 46 | 47 | 48 | **Free Software, Hell Yeah!** 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.23107.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BatchIRC", "WeebIRC\WeebIRC.csproj", "{A1C7FE0B-BB63-409D-B0DE-3150BEAFBD55}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {A1C7FE0B-BB63-409D-B0DE-3150BEAFBD55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {A1C7FE0B-BB63-409D-B0DE-3150BEAFBD55}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {A1C7FE0B-BB63-409D-B0DE-3150BEAFBD55}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {A1C7FE0B-BB63-409D-B0DE-3150BEAFBD55}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/80px-Anime-stub.svg.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/OLD/Source/WeebIRC/80px-Anime-stub.svg.ico -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace WeebIRC 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new Form1()); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("WeebIRC")] 9 | [assembly: AssemblyDescription("Simple IRC Client for Anime Fans")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("RareAMV Productions")] 12 | [assembly: AssemblyProduct("WeebIRC")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("a1c7fe0b-bb63-409d-b0de-3150beafbd55")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WeebIRC.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WeebIRC.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WeebIRC.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/Setup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | 8 | 9 | 10 | namespace CMDIRC 11 | { 12 | class Setup 13 | { 14 | static void Main(string[] args) 15 | { 16 | //setup vars 17 | string ip; 18 | int port; 19 | string username; 20 | string password; 21 | string channel; 22 | 23 | //setup screen: 24 | Console.WriteLine("Server IP(default is : 54.229.0.87(irc.rizon.net)) = "); 25 | if ((ip = Console.ReadLine()) == "") 26 | { 27 | ip = "54.229.0.87"; 28 | } 29 | 30 | Console.WriteLine("Server Port(default is : 6667) = "); 31 | if (Console.ReadLine() != "") 32 | { 33 | port = Convert.ToInt32(Console.ReadLine()); 34 | } 35 | else 36 | { 37 | port = 6667; 38 | } 39 | 40 | Console.WriteLine("Username(default is : RareIRC_Client) = "); 41 | if ((username = Console.ReadLine()) == "") 42 | { 43 | username = "RareIRC_Client"; 44 | } 45 | 46 | Console.WriteLine("Password(not working yet, default is : ) = "); 47 | if ((password = Console.ReadLine()) == "") 48 | { 49 | password = ""; 50 | } 51 | 52 | Console.WriteLine("Channel(default is : #RareIRC) = "); 53 | if ((channel = Console.ReadLine()) == "") 54 | { 55 | channel = "#RareIRC"; 56 | } 57 | 58 | //irc client executing: 59 | IrcClient irc = new IrcClient(ip, port, username, password, channel); 60 | irc.IrcClientRun(); 61 | 62 | Console.ReadLine(); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/WeebIRC.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {A1C7FE0B-BB63-409D-B0DE-3150BEAFBD55} 8 | WinExe 9 | Properties 10 | WeebIRC 11 | WeebIRC 12 | v4.5.2 13 | 512 14 | true 15 | publish\ 16 | true 17 | Disk 18 | false 19 | Foreground 20 | 7 21 | Days 22 | false 23 | false 24 | true 25 | 0 26 | 1.0.0.%2a 27 | false 28 | false 29 | true 30 | 31 | 32 | AnyCPU 33 | true 34 | full 35 | false 36 | bin\Debug\ 37 | DEBUG;TRACE 38 | prompt 39 | 4 40 | 41 | 42 | AnyCPU 43 | pdbonly 44 | true 45 | bin\Release\ 46 | TRACE 47 | prompt 48 | 4 49 | 50 | 51 | 80px-Anime-stub.svg.ico 52 | 53 | 54 | 55 | ..\packages\SimpleIRCLib.1.1.2\lib\net451\SimpleIRCLib.dll 56 | True 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | Form 73 | 74 | 75 | Form1.cs 76 | 77 | 78 | 79 | 80 | Form1.cs 81 | 82 | 83 | ResXFileCodeGenerator 84 | Resources.Designer.cs 85 | Designer 86 | 87 | 88 | True 89 | Resources.resx 90 | True 91 | 92 | 93 | 94 | SettingsSingleFileGenerator 95 | Settings.Designer.cs 96 | 97 | 98 | True 99 | Settings.settings 100 | True 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | False 109 | Microsoft .NET Framework 4.5.2 %28x86 and x64%29 110 | true 111 | 112 | 113 | False 114 | .NET Framework 3.5 SP1 115 | false 116 | 117 | 118 | 119 | 120 | 121 | 122 | 129 | -------------------------------------------------------------------------------- /OLD/Source/WeebIRC/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /OLD/WeebIRC.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrRare96/WeebIRC/8ab2475fc896d082781df3a7ecfb595ce1aae508/OLD/WeebIRC.exe -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WeebIRC version 3 2 | 3 | **This application is very rough and still in WIP, it is not meant as a final product, do not use this with that mind set!** 4 | 5 | WeebIRC is a multiplatform anime watcher, using your browser for the interface, driven by a local server running IRC XDCC for its file transfer process. A short list with its capabilities: 6 | 7 | - Simplistic looking interface 8 | - Click and Play* 9 | - Click and Download*** 10 | - Anime sorted by seasons 11 | - Custom synonym per anime**** 12 | - Stream/Watch your anime while it is downloading 13 | - Choose which bot you want for you anime source 14 | - Select your favorite resolution (480p, 720p, 1080p, Everything else) 15 | - Multi-Platform server, it runs on anything which supports [c# mono](http://www.mono-project.com/docs/about-mono/)***** 16 | - Many more to come! 17 | 18 | Yay, the interface now runs seperate from your local server, making updates easier :D. This also means that you do not have to download the whole interface. You only need to run a local server for doing the heavy work now! 19 | 20 | You can play around with the alpha via this website: 21 | 22 | [WeebIRC Alhpa](http://weebircalpha.tk) 23 | 24 | Keep in mind that the site is hosted on my cheap ass VPS, which is not meant for large amount of web traffic! Please be gentle ^^. 25 | 26 | For discussions you can go to the subreddit especially created for this application: 27 | 28 | [WeebIRC](https://www.reddit.com/r/weebirc/) 29 | 30 | ***= Click and Download, this option is just a url to the file which is/still being downloaded, in chrome it downloads this file, but it can also be used to stream the file in your local player! 31 | 32 | ****= In case no episodes can be found for the current name of a Anime (provided by MAL); Horriblesubs releases Fiary Tail (2014) as Fairy Tail S2 for example 33 | 34 | *****= Tested on RPi 2b, running the latest OSMC version (by 8th of april 2016) 35 | 36 | ### Screenshots and Showcases 37 | 38 | #### [Showcase 1 - older version](https://www.youtube.com/watch?v=BFUbyjH4Ufg) 39 | #### [Showcase 2 - current](https://www.youtube.com/watch?v=ZD6BYFVe8dk) 40 | #### [Screenshots - older version](https://github.com/RareAMV/WeebIRC/blob/master/SCREENSHOTS.md) 41 | 42 | ### Trello - Track Progress 43 | 44 | I finally got time to work on this again, there is a somewhat big update comming up where I and partially a friend of mine are rewriting the whole interface to make the code more managable and stable, you can follow the progress on this trello, where I will provide weekly the plannings (ETA of the new update should be in ~3 weeks :D ). 45 | 46 | [Trello](https://trello.com/b/HZmrwqma/weebirc) 47 | 48 | ### Version 49 | 50 | - 3.0 51 | - **NEW FEATURES:** 52 | - Server Detection (no more manual insertion of IP) 53 | - Installation Tutorial 54 | - No local interface anymore (easier with updates) 55 | - Nibl search results parsed server side 56 | - Version detection (will tell you when running older version of server) 57 | - Seperate Windows and Linux server version (Windows has a Interface, linux still console) 58 | - Settings page (very helpfull when things do not work like they should) 59 | - Downloads can be aborted now. 60 | - Awesome Logo :D. 61 | - **UPDATES:** 62 | - Fully rewritten interface in angular. (still a bit of a mess) 63 | - **TECHNICAL UPDATES:** 64 | - Server reworked: http server redone. 65 | - All information now being presented as json. 66 | - Nibl search results parsed server side. 67 | 68 | - 2.1 69 | - **NEW FEATURES**: 70 | - History of watched anime 71 | - Currently Watching (goes to lastest clicked anime) 72 | - Html5 Video Player with subtitle (.ass) support* 73 | - Logging system (server side) 74 | - **UPDATES** 75 | - Refreshed User Interface (menu icons, hiding search bar, etc) 76 | - Html5 Video stream seekable video stream** 77 | - **TECHNICAL UPDATES** 78 | - Server reworked: mal parsing serverside, filestream server added (html5 seekable) 79 | 80 | 81 | - 2.0.0 - Initial Release 82 | 83 | *= Subitle playback requires third party application 'mkvextract' from mkvtoolnix, which is also included in the zip file. If not found, it will ask you if it should download it when starting the server! Furthermore, subtitle playback DOES NOT WORK IN FULLSCREEN MODE! This is very much in WIP state, and due to timelimits, couldn't fully test it. You may encounter some issues here! 84 | 85 | **= This feature can be very unstable, it may hang up on you without notice, you will need to manually restart the server unfortunately. 86 | 87 | ### Installation 88 | 89 | WeebIRC requires a server to run on your local network. This server will do all the heavy work for you, like parsing all the anime information from different resources (Myanimelist, Nibl) and download/stream them. It's absolutely essential that you read the tutorial to ensure that everything works like it should! 90 | 91 | [Full installation guide.](http://146.185.133.105/#/serverdownload) 92 | 93 | ### Tech 94 | 95 | WeebIRC uses a number of open source projects to work properly: 96 | 97 | **Scripts:** 98 | 99 | *Interface:* 100 | 101 | * [MaterializeCSS](http://materializecss.com/) - awesome css framwork 102 | * [Material Icons](https://design.google.com/icons/) - awesome free icons 103 | * [jQuery](https://jquery.com/) - duh 104 | * [SubPlayerJS](https://github.com/EldinZenderink/SubPlayerJS) - A subtitle video player :D 105 | * [CSWebServerDetection](https://github.com/EldinZenderink/CSWebServerDetection) *customized - Detecting local running servers 106 | * [AngularJS](https://angularjs.org/) - awesome JavaScript frameworks makes managing my code easier :D 107 | * [Angular Material](https://material.angularjs.org) - some parts of MaterializeCSS hate angular so I used a bit of this. 108 | 109 | 110 | *Backend Server:* 111 | 112 | * [Newtonsoft Json.NET](http://www.newtonsoft.com/json) - awesome json framework for C#, works with mono :D. 113 | * [SimpleIRC](https://github.com/EldinZenderink/SimpleIRCLib) - very easy to use IRC library 114 | * [MaterialSkin](https://github.com/IgnaceMaes/MaterialSkin) - for creating the Windows interface. 115 | 116 | 117 | ### Todos 118 | 119 | - MAKE CODE MORE MANAGEABLE 120 | - Fix a ton of bugs and glitches. 121 | - Make option for list view on cover view. 122 | - Real Time Latest released updater. 123 | - Make information from MAL more detialed (genres are only parsed per season, on search no genres are present) 124 | - Search by genre 125 | - Gui improvements along the way. 126 | - Get a real domain ^^. 127 | 128 | ### Disclaimer 129 | This application is still in alpha stadium, many things might go wrong and therefore I am not 130 | responsible for whatever happens while you use this application. 131 | 132 | Things that might happen: 133 | 134 | - Downloading anime is at your own risk :X. 135 | - Due to your computer being a cardbox it might catch fire and burn your whole place down 136 | - Due to you not paying attention you might suddenly download a virus... shit happens. 137 | - Due to you being at the wrong place, at the wrong time, you might die... 138 | 139 | License 140 | ---- 141 | 142 | MIT 143 | 144 | 145 | **Free Software, Hell Yeah!** 146 | 147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /SCREENSHOTS.md: -------------------------------------------------------------------------------- 1 | # Screenshots 2 | 3 | ![Scr1](http://s17.postimg.org/eakazvadr/63ee0abc7636d9e50dffd2de6b3a5ebe2.png) 4 | ![Scr2](http://s17.postimg.org/tyli6npzj/233d99909917fa57e64212e01b890954.png) 5 | ![Scr3](http://s17.postimg.org/g7h14g11r/021906b36c5daba3a848235f1629075e.png) 6 | ![Scr4](http://s17.postimg.org/4ej8084lr/a930c1aee44ae6554432dcbf6b48b187.png) 7 | ![Scr5](http://s17.postimg.org/vex0osswf/c8565798a7209a7018a3810fbf6f04ff.png) 8 | --------------------------------------------------------------------------------