ForeverYoung's blog ยป linux
/atom/linux/?lang=en
2013-07-24T21:44:19Z
Anton Novosyolov
Linux, programming, etc.
blohg
Speeding up films and podcasts, improved
/post/stretch-improved/?lang=en
2013-07-24T21:44:19Z
2013-07-24T21:44:19Z
Anton Novosyolov
anton.novosyolov@gmail.com
<!-- tags: bash,linux -->
<p>Improved version of <a class="reference external" href="/post/stretch-linux/?lang=en">speedup script</a>.</p>
<p>Fancy coloring, progress in percents, command line options, default speedup rate is taken from a file "SPEEDUP", handling Ctrl-C.</p>
<!-- tags: bash,linux -->
<p>Improved version of <a class="reference external" href="/post/stretch-linux/?lang=en">speedup script</a>.</p>
<p>Fancy coloring, progress in percents, command line options, default speedup rate is taken from a file "SPEEDUP", handling Ctrl-C.</p>
<!-- read_more -->
<p>mp3-acceleration script:</p>
<pre class="brush: bash">
#!/bin/bash
dir=`dirname $(realpath $0)`
DEFAULT_SPEEDUP=`cat $dir/SPEEDUP 2> /dev/null`
DEFAULT_SPEEDUP=${DEFAULT_SPEEDUP:-+45}
speedup=${1:-${DEFAULT_SPEEDUP}}
echo "Using tempo change ${speedup}%"
mkdir /tmp/result 2>/dev/null
trap interrupt INT
function interrupt() {
echo -e "\nDeleting unfinished $name"
rm "result/$name" 2> /dev/null
exit 1
}
count=`ls original/*.mp3 2>/dev/null | wc -l`
if [ ! $count -gt 0 ]; then
echo "No input files"
exit 0
fi
i=1
for f in original/*.mp3; do
name=`basename "$f"`
if [ ! -f "result/$name" ]; then
printf "\E[32m%3.0f%%\E[0m Processing %s" "$(($i*100/$count))." "$name"
lame --quiet --decode "$f" - | soundstretch stdin stdout -tempo=$speedup -speech 2>/dev/null | lame --quiet -m a -cbr -b 64 --resample 24 - "result/$name"
echo -e "\E[32m Done\E[0m"
else
printf "\E[32m%3.0f%%\E[0m Skipping %s\n" "$(($i*100/$count))" "$name"
fi
i=$((i+1))
done
</pre>
<p>mp4-sound-extraction and acceleration script:</p>
<pre class="brush: bash">
#!/bin/bash
dir=`dirname $(realpath $0)`
DEFAULT_SPEEDUP=`cat $dir/SPEEDUP 2> /dev/null`
DEFAULT_SPEEDUP=${DEFAULT_SPEEDUP:-+45}
DEFAULT_SOURCE=original
trap interrupt INT
function interrupt() {
echo -e "\nDeleting unfinished $name.mp3"
rm "result/$name.mp3" 2> /dev/null
rm /tmp/temp.wav 2> /dev/null
rm /tmp/temp.mp4a 2> /dev/null
exit 1
}
original=$1
if [ ! -d "$original" ]; then
speedup=${original:-${DEFAULT_SPEEDUP}}
original=${2:-$DEFAULT_SOURCE}
else
speedup=${2:-${DEFAULT_SPEEDUP}}
fi
if [ "$speedup" == "0" ]; then
echo "Only extracting"
else
echo "Using tempo change ${speedup}%"
fi
echo "Using source directory ${original}"
mkdir /tmp/result 2>/dev/null
count=`ls $original/*.mp4 2>/dev/null | wc -l`
if [ ! $count -gt 0 ]; then
echo "No input files"
exit 0
fi
i=1
for f in $original/*.mp4; do
name=`basename "$f" .mp4`
if [ ! -f "result/$name.mp3" ]; then
printf "\E[32m%3.0f%%\E[0m Processing %s. \E[32mExtracting...\E[0m" "$(($i*100/$count))" "$name.mp4"
mplayer "$f" -dumpaudio -dumpfile /tmp/temp.mp4a > /dev/null 2>&1
faad /tmp/temp.mp4a > /dev/null 2>&1
if [ "$speedup" == "0" ]; then
lame --quiet -m a -cbr -b 64 --resample 24 /tmp/temp.wav "result/${name}.mp3"
echo -e "\b\b\b\b\b\b\b\b\b\b\b\b\bExtracting. \E[32mDone\E[0m"
else
echo -en "\b\b\b\b\b\b\b\b\b\b\b\b\bExtracting. \E[32mSpeeding up...\E[0m"
soundstretch /tmp/temp.wav stdout -tempo=$speedup -speech 2>/dev/null | lame --quiet -m a -cbr -b 64 --resample 24 - "result/${name}.mp3"
echo -e "\b\b\b\b\b\b\b\b\b\b\b\b\b\bSpeeding up. \E[32mDone\E[0m"
fi
rm /tmp/temp.wav 2> /dev/null
rm /tmp/temp.mp4a 2> /dev/null
else
printf "\E[32m%3.0f%%\E[0m Skipping %s\n" "$(($i*100/$count))" "$name.mp4"
fi
i=$((i+1))
done
</pre>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>
Copy podcasts back after speeding up
/post/stretch-copy/?lang=en
2013-07-08T06:10:31Z
2013-07-08T06:10:31Z
Anton Novosyolov
anton.novosyolov@gmail.com
<!-- tags: bash,linux -->
<p>Script for moving processed podcasts back to player:</p>
<!-- tags: bash,linux -->
<p>Script for moving processed podcasts back to player:</p>
<!-- read_more -->
<pre class="brush: bash">
#!/bin/bash
for f in result/*; do
base=`basename "$f"`
if [ -L "original/$base" ]; then
orig=`readlink -f "original/$base"`
echo "Moving $base"
mv "$f" "$orig"
rm "original/$base"
else
echo -e "\E[33mSkipping $base, no original file or not a symlink\E[0m"
fi
done
</pre>
<p><strong>UPD</strong>: Added checking for existance of original file and it's a symlink. Added progress display.</p>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>
Speeding up films and podcasts (Linux)
/post/stretch-linux/?lang=en
2013-06-14T21:22:42Z
2013-06-14T21:22:42Z
Anton Novosyolov
anton.novosyolov@gmail.com
<!-- tags: bash,linux -->
<p>Here is version of my <a class="reference external" href="/post/stretch/?lang=en">speedup script</a> for linux:</p>
<!-- tags: bash,linux -->
<p>Here is version of my <a class="reference external" href="/post/stretch/?lang=en">speedup script</a> for linux:</p>
<!-- read_more -->
<p>mp3-acceleration script:</p>
<pre class="brush: bash">
mkdir /tmp/result
for f in original/*.mp3; do
name=`basename "$f"`
lame --quiet --decode "$f" - | soundstretch stdin stdout -tempo=+45 -speech | lame --quiet -m a -cbr -b 64 --resample 24 - "result/$name"
done
</pre>
<p>mp4-sound-extraction and acceleration script:</p>
<pre class="brush: bash">
mkdir /tmp/result
for f in original_flash/*.mp4; do
name=`basename "$f" .mp4`
mplayer "$f" -dumpaudio -dumpfile /tmp/temp.mp4a
faad /tmp/temp.mp4a
soundstretch /tmp/temp.wav stdout -tempo=+45 -speech | lame --quiet -m a -cbr -b 64 --resample 24 - "result/${name}.mp3"
rm /tmp/temp.wav
rm /tmp/temp.mp4a
done
</pre>
<p>For SSD life prolongation, I use /tmp in-memory disk for temporary and result files.
I place softlinks to original mp3 files into 'original' directory, and 'original_flash' is a link to the usual place of mp4 files.</p>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>
ICQ-bot based on micq
/post/icq-bot/?lang=en
2007-10-11T08:02:00Z
2007-10-11T08:02:00Z
Anton Novosyolov
anton.novosyolov@gmail.com
<!-- date: 1192089720 -->
<!-- tags: gentoo,linux,icq,bot,perl -->
<p>I decided to make ICQ-bot, mostly for ping servers in home network using ICQ.</p>
<!-- date: 1192089720 -->
<!-- tags: gentoo,linux,icq,bot,perl -->
<p>I decided to make ICQ-bot, mostly for ping servers in home network using ICQ.</p>
<!-- read_more -->
<p>Micq has such power thing as scripting. By default, named pipe ~/.micq/scripting is created after micq has started. If you write into it, this is as if you enter into micq console. Thus we have one side of interaction. To receive commands we'll read logs of conversations from <em>history</em> dir.</p>
<p>I wrote script in perl using File::Tail module.</p>
<p>Log file has such format:</p>
<pre class="brush: plain">
# 20070629123241/ [icq8:xxxxxxxx]!icqbot@foreveryoung.yar <- xxxxxxxxx[icq8:xxxxxxxxx+10000000 online] +1
</pre>
<p>+1 - means how many lines of message follows.</p>
<p>Here is the script:</p>
<pre class="brush: perl">
#!/usr/bin/perl
$_ = 1;
exit if( $#ARGV < 2 )
name = "/home/icqbot/.micq/history/${ARGV[0]}.log"
file = File::Tail->new( name=>$name, maxinterval=>1, interval=>1, reset_tail=>0 );
open LOG, ">>${ARGV[0]}_bot.log";
$skip = 0;
$cmd = 0;
while( defined( $_ = $file->read ) )
{
if( $skip > 0 )
{
$skip--;
next;
}
# this is sent by bot, just skip
if( $_ =~ /# \d+\/ \[[^]]+\]\S+ -> [^[]*\[[^]]+\] [+](\d+)/ )
{
$skip = $1;
$cmd = 0;
next;
}
# after this maybe goes command
if( $_ =~ /# \d+\/ \[[^]]+\]\S+ <- [^[]*\[[^]]+\] [+](\d+)/ )
{
$cmd = 1;
next;
}
if( !$cmd )
{
next;
}
if( $_ =~ /^ping (.+)$/ )
{
print LOG "Pinging $1\n";
$ping = `ping -c 10 $1 2>&1`;
open OUT, ">.micq/scripting";
print OUT "/msg ${ARGV[0]}\n";
print OUT $ping;
print OUT ".\n";
close OUT;
next;
}
}
</pre>
<p>To run script: <tt class="docutils literal">script &</tt></p>
<p>micq is launched under <a class="reference external" href="http://en.wikipedia.org/wiki/GNU_Screen">screen</a>.</p>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js"></script>
<script type="text/javascript" src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js"></script>
<link type="text/css" rel="stylesheet" href="http://alexgorbatchev.com/pub/sh/current/styles/shCoreDefault.css"/>
<script type="text/javascript">SyntaxHighlighter.defaults.toolbar=false; SyntaxHighlighter.all();</script>