renfiles – rename files command line tool for Windows

This is a simple tool that can help you rename multiple files with a command line pipe. It can also be used to rename a single file. The code used is not particularly optimized, but I am still learning to write in C#. The code can be compiled on any Windows that has the .NET Framework installed.

How to compile

Just open a Windows command prompt and specify the path to your csc.exe. For example:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /t:exe renfiles.cs

Usage

Parameters

-h, –help              Print this help
-s, –search           Search string
-r, –replace          Replace string

Optional

-f, –file          Path to single file

Sample commands

dir /b /s | renfiles -s "search_string" -r "replace_string"
renfiles -s "search_string" -r "replace_string" -f "path_to_file"
cat list_files.txt | renfiles -s "search_string" -r "replace_string"

Download: https://github.com/bained/renfiles

Video tutorial

renfiles – rename multiple files with command line pipe

Share and Enjoy !

Shares

PDFTk Gui – join, rotate and extract pdf files

Simple GUI for pdftk. It can be used only for join, rotate and extract PDF-files. Nothing more. App requires .NET Framework 4.0+. C# source code available as project and can be compiled with SharpDevelop. The reason I wrote this tool is because I couldn’t find an open source GUI that supports the latest versions of pdftk.

PDFTk Gui App

Download: PDFTk_Gui-v.1.01-by_Ned.zip

Source code: PDFTk_Gui-v.1.01-SharpDevelop_project.zip

Share and Enjoy !

Shares

Прихващане на bTV Live stream

bTV имат доста слабичка защита на стрийма. Нова поне ползват криптиране на стрийма с hls.key, което не е никакъв проблем за чупене, но пак е нещо. бТВ се защитават само с един динамично генериран адрес, който обаче е твърде достъпен, поне според мен. Сменят масива с адреси всеки ден, но факта, че присъства статично в ajax адрес, който може да се отвори и прочете от всеки, прави цялата защита смешна. За любителите на кепчъринга и за тираджиите прилагам скромно туториалче. Използваните инструменти са: Firefox, wget, jq, ffmpeg.

И по-лесния вариант за прихващане на видеото само с Firefox.

С тази техника може да се прихване почти всеки видео стрийм или да се свали видео файл. Когато видеото е криптирано, може да се записва стрийма, но по-инстересно е да се свалят всички файлове с високо качество и да се декриптират ръчно, като се ползва hls-ключ и оригиналните ts-файлове.

Ето и простичък PHP-код, който върши цялата работа по екстрактването на линка:

<?php
$wpage = file_get_contents("https://btvplus.bg/live/");

preg_match("@url: +'([^']*)@", $wpage, $m);

$config_page = file_get_contents("https://btvplus.bg".$m[1]);

$j = json_decode($config_page, true);

echo $j['info']['file'];
?>

Трябва да се отбележи, че bTV детектват, дали url-адреса се зарежда от чужбина и го ограничават (с http response code 301), но е много вероятно самия стрийм да не е ограничен. Не съм го пробвал. Хубавото е, че веднъж гепен адреса на стрийма, може да се гледа цял ден.

————————

И един бонус – сорс код за C#, който гепва стринга и го плейва с ffplay. За целта ffplay трябва да е в директорията с компилираното exe или в променливата Path на обкръжението на Win.

using System;
using System.Text.RegularExpressions;
using System.Net;
using System.IO;
using System.Diagnostics;


public class playBtv{
	static void Main(string[] args){
		string baseUrl = "https://btvplus.bg";
		string url1 = baseUrl + "/live/";
		ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
		WebClient client = new WebClient();

		string htmlCode1 = client.DownloadString(url1);
		string pattern = "url:";

		StringReader strReader = new StringReader(htmlCode1);
		string aLine, url2 = null;
		while(strReader.Peek() >= 0){
			aLine = strReader.ReadLine().Trim();

			if(aLine.Contains(pattern)){
				Match match = Regex.Match(aLine, @"([^']*)'([^']*)");
				url2 = baseUrl + match.Groups[2].Value;
				break;
			}
		}
		string htmlCode2 = client.DownloadString(url2);

		Match match2 = Regex.Match(htmlCode2, "(file\":\")([^\"]*)");
		string m3u8 = match2.Groups[2].Value.Replace("\\","");
		Process.Start("ffplay", m3u8);
	}
}

Компилира се с някой от наличните в Windows C# компилатори от .NET Frameworks. Примерно:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc /target:exe btv_play.cs

Share and Enjoy !

Shares

Batch get latest C Sharp compiler from Microsoft.NET directory

Простичък код на batch който взима последния csc.exe от Microsoft.NET\Framework. Кода се пейства в bat-файл и при двоен клик компилира script.cs.

1
2
3
4
5
6
7
@echo off
for /f "TOKENS=1" %%x in ('dir %windir%\Microsoft.Net\framework\v* /b ^| findstr "v[1-9]"') do (
  set myPID=%%x
)
set csc=%windir%\Microsoft.Net\framework\%myPID%\csc.exe
 
%csc% /t:winexe script.cs

Share and Enjoy !

Shares




JScript Dot_NET GUI example

За да се програмира под .NET платформата е достатъчно да се инсталира някоя версия на фреймърка.
След инсталацията на .NET фреймуърк автоматично се инсталират няколко компилатора:
csc.exe – компилатор за C Sharp (C#)
jsc.exe – компилатор за JScript .Net
vbc.exe – компилатор за Visual Basic .Net

В момента имам инсталиран .Net framework 2.0 и работя с него, но предполагам, че и при по-новите версии ситуацията ще е подобна. Компилаторите се намират в директорията: C:\WINDOWS\ServicePackFiles\i386>
Аз харесвам JScript като структуриране на програмите и ще използвам него за конкретния пример. Както и в други GUI-примери, ще използвам и сега примерна програма за конвертиране на температура от Целзий до Фаренхайт.
Преди да поставя реалния код, ще покажа базов, рамкиращ код за това как се програмира подобна програма с графичен интерфейс:

import System;
import System.Drawing;
import System.Collections;
import System.Windows.Forms;
import System.ComponentModel;
import Accessibility;
 
public class Exercise extends System.Windows.Forms.Form {
    // var ...;
 
	function Exercise(){
		InitializeComponent();
		this.button1.add_Click(this.button1_Click);
	}
 
	function button1_Click(sender : Object, e : System.EventArgs){
		//...
	}
 
	function InitializeComponent(){
		// iniciirat se wsi4ki komponenti ot GUI-to
		this.textBox1 = new System.Windows.Forms.TextBox();
		// ...
	}
}
var frmPledge : Exercise = new Exercise();
frmPledge.ShowDialog();

На база на този пример попълваме целия необходим код. Помогнах си за интерфейса с SharpDevelop 3.2 – чудесна програма за .NET програмиране. За съжаления програмата нативно не поддържа JScript, за това от нея копирам само кода за формата, като леко го промених. Програмата изглежда така:
faren_to_celsius

Кода е сравнително лесен за писане и разбиране. Самото exe е едва 8kb. С включения сорс код може да се изтегли от тук: fahrenheit to celsius

import System;
import System.Drawing;
import System.Collections;
import System.Windows.Forms;
import System.ComponentModel;
import Accessibility;
 
public class Exercise extends System.Windows.Forms.Form {
    var button1  : System.Windows.Forms.Button;
    var textBox1 : System.Windows.Forms.TextBox;
    var textBox2 : System.Windows.Forms.TextBox;
 
	function Exercise(){
		InitializeComponent();
		this.button1.add_Click(this.button1_Click);
	}
 
	function button1_Click(sender : Object, e : System.EventArgs){
		var Faren : double;
		var Celsius : double;
		Faren = ConvertToDouble(this.textBox1.Text);
		if(!isNaN(Faren)){
			Celsius = (Faren - 32)*5/9;
			this.textBox2.Text = Celsius.ToString();
		} else {
			this.textBox2.Text = "Wrong format";
		}
	}
 
	function ConvertToDouble(valueto){
		var ddd = valueto.ToString(System.Globalization.CultureInfo.InvariantCulture)
		return ddd;
	}
 
 
	function InitializeComponent(){
		// iniciirat se wsi4ki komponenti ot GUI-to
		this.textBox1 = new System.Windows.Forms.TextBox();
		this.button1 = new System.Windows.Forms.Button();
		this.textBox2 = new System.Windows.Forms.TextBox();
		this.SuspendLayout();
		// 
		// textBox1
		// 
		this.textBox1.Location = new System.Drawing.Point(12, 12);
		this.textBox1.Name = "textBox1";
		this.textBox1.Size = new System.Drawing.Size(100, 20);
		this.textBox1.TabIndex = 0;
		// 
		// button1
		// 
		this.button1.Location = new System.Drawing.Point(118, 10);
		this.button1.Name = "button1";
		this.button1.Size = new System.Drawing.Size(75, 23);
		this.button1.TabIndex = 1;
		this.button1.Text = "Convert";
		this.button1.UseVisualStyleBackColor = true;
		// 
		// textBox2
		// 
		this.textBox2.Location = new System.Drawing.Point(199, 12);
		this.textBox2.Name = "textBox2";
		this.textBox2.Size = new System.Drawing.Size(100, 20);
		this.textBox2.TabIndex = 2;
		// 
		// MainForm
		// 
		this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
		this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
		this.ClientSize = new System.Drawing.Size(311, 46);
		this.Controls.Add(this.textBox2);
		this.Controls.Add(this.button1);
		this.Controls.Add(this.textBox1);
 
		this.Name = "Exercise";
		this.Text = "faren_to_celsius";
		this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
		this.MaximizeBox = false;
		this.MinimizeBox = false;
	}
}
 
var frmPledge : Exercise = new Exercise();
 
frmPledge.ShowDialog();

За да се компилира този код до изпълнимо exe правим следното:

  • запазваме сорс-кода в файла, примерно far_to_cel.js
  • отваряме команден прозорец cmd (Start -> Run -> cmd). Или натискаме шифт и кликаме в директорията със сорс-кода, след това избираме “Open command window here”.
  • след като сме позиционирали cmd в директорията със сорс-файла ще трябва да извикаме компилатора jsc.exe:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\jsc.exe /t:winexe far_to_cel.js

Ако не се покаже грешка, значи сме компилирали всичко нормално.

===================

Прилагам същата програмка, но написана на C#:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Globalization;
 
public class CelToFar : Form {
 
  Button button1;
  TextBox textBox1;
  TextBox textBox2;
 
  public CelToFar() {
    button1 = new Button(); 
    button1.Text = "Calculate";
    button1.AutoSize = false;
    button1.Location = new Point(80, 15);
    button1.Size = new Size(75, 23);
 
    textBox1 = new TextBox();
    textBox1.Location = new Point(12, 12);
    textBox1.Name = "textBox1";
    textBox1.Font = new Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    textBox1.Size = new Size(60, 40);
    textBox1.Text = "";
 
    textBox2 = new TextBox();
    textBox2.Location = new Point(165, 12);
    textBox2.Name = "textBox2";
    textBox2.Font = new Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    textBox2.Size = new Size(60, 40);
    textBox2.Text = "";
 
    button1.Click += new EventHandler(ButtonClicked);
 
    this.Controls.Add(button1);
    this.Controls.Add(textBox1);
    this.Controls.Add(textBox2);
 
    this.Height = 120;
    this.Width = 255;
    this.StartPosition = FormStartPosition.CenterScreen;
    this.Visible = true;
  }
 
  public void ButtonClicked(object source, EventArgs e) {
    string FarenTxt = this.textBox1.Text;
    double Faren;
    double Celsius;
    Regex rgx = new Regex(@"^[\d\.]*$");
 
    if(rgx.IsMatch(FarenTxt) && !String.IsNullOrEmpty(FarenTxt)){
      Faren = Convert.ToDouble(FarenTxt, CultureInfo.InvariantCulture);
      Celsius = (Faren - 32)*5/9;
      this.textBox2.Text = System.Math.Round((decimal)Celsius, 3).ToString(CultureInfo.InvariantCulture);
    } else {
      this.textBox2.Text = "Wrong format";
    }
  }
 
  static void Main() {
    Application.Run(new CelToFar());
  }
}

Запазваме файла с името Far_to_celsius.cs, след което компилиарнето на кода става по подобен начин:

1
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:winexe Far_to_celsius.cs

Share and Enjoy !

Shares